赞
踩
1、学习和理解STM32F103系列芯片的地址映射和寄存器映射原理;了解GPIO端口的初始化设置三步骤(时钟配置、输入输出模式设置、最大速率设置)。
2、以 STM32最小系统核心板(STM32F103C8T6)+面板板+3只红绿蓝LED 搭建电路,使用GPIOB、GPIOC、GPIOD这3个端口控制LED灯,轮流闪烁,间隔时长1秒。
1)写出程序设计思路,包括GPIOx端口的各寄存器地址和详细参数;
2)分别用汇编语言,C语言编程实现。
1)地址映射
地址映射,也被称为存储器映射。存储器本身不具有地址信息,它的地址是由芯片厂商或用户分配,给存储器分配地址的过程称为存储器映射,如果再分配一个地址就叫重映射。
ARM 将 4GB 的存储器空间,平均分成 8 块区域,每块区域的大小是 512MB,STM32 芯片只用其中一部分。ARM 对 4GB 容量分块是按照其功能划分,每块都有特殊的用途。
在 8 个 Block 里面,Block0、Block1 和 Block2包含了 STM32 芯片的内部 Flash、RAM 和片上外设。
存储器 Block0 内部区域功能划分
Block0 主要用于设计片内的 FLASH,STM32F103 系列芯片内部 FLASH 最大是 512KB。在芯片内部集成更大的 FLASH 或者 SRAM ,意味着芯片成本的增加,所以片内集成的FLASH 都不会太大。
存储器Block1内部区域功能划分
Block1用于设计片内的SRAM。
存储器Block2内部区域功能划分
Block2 用于设计片内外设,根据外设总线速度的不同,Block2 被划分为 AHB 和 APB 两部分,APB 又被分成 APB1 和 APB2 总线。
Block3/4/5中包含了FSMC扩展区域,可用于扩展外部存储器,比如 SRAM,NORFLASH 和 NANDFLASH 等。
2)寄存器映射
寄存器映射是在存储器映射的基础上进行的。
在存储器片上外设区域,以四个字节为一个单元,每个单元对应不同的功能。当我们控制这些单元时就可驱动外设工作,找到每个单元的起始地址,然后通过C 语言指针的操作方式来访问这些单元。但若每次都是通过这种方式访问地址,不好记忆且易出错。因此,我们根据每个单元功能的不同,以功能为名给内存单元取一个别名,其实质就是寄存器名字。给已分配好地址(通过存储器映射实现)的有特定功能的内存单元取别名的过程就是寄存器映射。
1)时钟
STM32的时钟是由内部或外部振荡器产生的“频率”,被称为“系统时钟”。最大为72MHz,换成周期T约为13.9ns。
2)GPIO工作模式
GPIO_Mode_AIN 模拟输入(应用ADC模拟输入,或者低功耗下省电)
GPIO_Mode_IN_FLOATING 浮空输入(浮空就是浮在半空,可以被其他物体拉上或者拉下,可以用于按键输入)
GPIO_Mode_IPD 下拉输入(IO内部下拉电阻输入)
GPIO_Mode_IPU 上拉输入(IO内部上拉电阻输入)
GPIO_Mode_Out_OD 开漏输出(开漏输出:输出端相当于三极管的集电极. 要得到高电平状态需要上拉电阻才行)
GPIO_Mode_Out_PP 推挽输出(推挽就是有推有拉电平都是确定的,不需要上拉和下拉,IO输出0-接GND, IO输出1 -接VCC,读输入值是未知的 )
GPIO_Mode_AF_OD 复用开漏输出(片内外设功能(I2C的SCL,SDA))
GPIO_Mode_AF_PP 复用推挽输出(片内外设功能TX1,MOSI,MISO.SCK.SS)
3)GPIO初始化步骤
第一步:使能GPIOx口的时钟。
第二步:指明GPIOx口的哪一位,这一位的速度大小以及模式。
第三步:调用GPIOx口初始化函数,进行初始化。
第四步:调用GPIO-SetBits函数,进行相应为的置位。
对于单个GPIO口的初始化如下
GPIO_InitTypeDef GPIO_InitStructure;
第一步:使能GPIOA的时钟:
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
第二步:设置GPIOA参数:输出OR输入,工作模式,端口翻转速率
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_6| GPIO_Pin_7| GPIO_Pin_8; //设定要操作的管脚
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //设置为推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; // IO口速度为50MHz
第三步:调用GPIOA口初始化函数,进行初始化。
GPIO_Init(GPIOA, &GPIO_InitStructure); //根据设定参数初始化GPIOA
第四步:调用GPIO-SetBits函数,进行相应为的置位。
GPIO_SetBits(GPIOA,GPIO_Pin_0); //输出高
对于多个GPIO口的初始化如下
GPIO_InitTypeDef GPIO_InitStructure;
第一步:使能GPIOA,GPIOE的时钟:
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE, ENABLE);
第二步:设置GPIOA,GPIOE参数:输出OR输入,工作模式,端口翻转速率
第三步:调用GPIOA口初始化函数,进行初始化。
第四步:调用GPIO-SetBits函数,进行相应为的置位。
▶把第二、三、四步合并分别设置GPIOA和GPIOE
先设置GPIOA
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4; // 第四个口,PA4
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //设置为推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; // IO口速度为50MHz
GPIO_Init(GPIOA,&GPIO-InitST); //根据设定参数初始化GPIOA
GPIO_SetBits(GPIOA,GPIO_Pin_4); //输出高
再设置GPIOE
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3; // 第三个口,PE3
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //设置为推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; // IO口速度为50MHz
GPIO_Init(GPIOE,&GPIO-InitST); //根据设定参数初始化GPIOE
GPIO_SetBits(GPIOE,GPIO_Pin_3); //输出高
核心板原理图:
查看寄存器组起始地址表,发现:RCC地址范围、寄存器地址范围。
寄存器地址:端口起始地址+偏移地址
1)时钟
2)GPIOx端口
端口配置寄存器有两个,分别为端口配置低寄存器(CRL)和端口配置高寄存器(CRH),每四位配置一个端口。
端口输出寄存器(ORD)在相应的位赋值可以控制输出电压,0为低电压,1为高电压。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。