目录
一、寄存器和寄存器映射
给有特定功能的内存单元取一个别名,这个别名就是我们常说的寄存器,取名的过程就叫寄存器映射。寄存器的功能是存储二进制代码,它是由具有存储功能的触发器组合起来构成的。一个触发器可以存储1位二进制代码,故存放n位二进制代码的寄存器,需用n个触发器来构成。
二、寄存器的相关配置
1.配置时钟
为什么配置时钟?为了省电,默认的时钟都是关闭的。配置STM32的任何资源前,都必须首先使能时钟。
时钟控制名字叫做RCC,属于AHB总线。GPIOB属于APB2。
时钟系统框图:
2.配置输出
控制LED需要输出高电平或是低电平,所以需要配置为输出。
由于STM32的每个IO都需要4个位来配置,所以一个32位的寄存器最大只能配置8个IO(32位的单片机的寄存器就是32位的)。STM32中,用端口配置低寄存器(GPIOx_CRL)来配置引脚Px0-Px7, 用端口配置高寄存器(GPIOx_CRH)来配置引脚Px8-Px15。
STM32的四种输出方式
1、普通推挽输出(GPIO_Mode_Out_PP):
使用场合:一般用在0V和3.3V的场合。线路经过两个P_MOS 和N_MOS 管,负责上拉和下拉电流。
使用方法:直接使用
输出电平:推挽输出的低电平是0V,高电平是3.3V。
2、普通开漏输出(GPIO_Mode_Out_OD):
使用场合:一般用在电平不匹配的场合,如需要输出5V的高电平。
使用方法:就需要再外部接一个上拉电阻,电源为5V,把GPIO设置为开漏模式, 当输出高组态时,由上拉电阻和电源向外输出5V的电压。
输出电平:在开漏输出模式时,如果输出为0,低电平,则使N_MOS 导通,使输 出接地。若控制输出为1(无法直接输出高电平),则既不输出高电平 也不输出低电平,为高组态。为正常使用,必须在外部接一个上拉电 阻。
特性: 它具“线与”特性,即很多个开漏模式 引脚连接到一起时,只有当所有 引脚都输出高阻态,才由上拉电阻提供高电平,此高电平的电压为外部 上拉电阻所接的电源的电压。若其中一个引脚为低电平,那线路就相当 于短路接地,使得整条线路都为低电平,0 伏。
3、复用推挽输出(GPIO_Mode_AF_PP):用作串口的输出。
4、复用开漏输出(GPIO_Mode_AF_OD):用在IIC。
所有的开漏输出都需要接上拉电阻。
我这里设置为普通推挽输出
三、用C语言代码实现流水灯
1.代码如下:
#define RCC_APB2ENR *(unsigned int*)0x40021018
#define GPIOA_CRL *(unsigned int*)0x40010800
#define GPIOB_CRL *(unsigned int*)0x40010C00
#define GPIOC_CRH *(unsigned int*)0x40011004
#define GPIOA_ODR *(unsigned int*)0x4001080C
#define GPIOB_ODR *(unsigned int*)0x40010C0C
#define GPIOC_ODR *(unsigned int*)0x4001100C
int Delay_ms(volatile unsigned int time)
{
int i;
while(time--)
{
i=20000;
while(i--) ;
}
return 0;
}
int main()
{
RCC_APB2ENR |=(1<<2);
RCC_APB2ENR |=(1<<3);
RCC_APB2ENR |=(1<<4);
while(1)
{
GPIOA_CRL &=0xFFFFFFF0;
GPIOA_CRL |=0xFFFFFFF3;
GPIOA_ODR =0x0<<0;
Delay_ms(10000000);
GPIOA_ODR =0x1<<0;
Delay_ms(10000000);
GPIOB_CRL &=0xFFFFFFF0;
GPIOB_CRL |=0xFFFFFFF3;
GPIOB_ODR =0;
Delay_ms(10000000);
GPIOB_ODR =1;
Delay_ms(10000000);
GPIOC_CRH &=0xF0FFFFFF;
GPIOC_CRH |=0xF3FFFFFF;
GPIOC_ODR =0<<14;
Delay_ms(10000000);
GPIOC_ODR =1<<14;
Delay_ms(10000000);
}
}
2.烧录程序
注意:要在keil中生成hex文件
我这里使用的mcusip烧录软件
1.运行mcuisp
2.点击搜索串口,将自动找到电路板串口
3.在 bps 中选择 波特率为 256000,左下角设置:DTR 的低电平复位,RTS 高电平进 BootLoader。
4.读器件信息
5.选择一个 hex 文件
6.点击开始编程就可以下载程序(此过程不需要按复位键)
四、结果演示
五、总结
本次实验用寄存器方式实现了流水灯,了解了寄存器的相关知识和使用方法,并进行了实践操作,加深了对STM32的了解
六、参考文献
STM32寄存器的简介、地址查找,与直接操作寄存器_geekYatao-CSDN博客_stm32寄存器