stm32 寄存器操作一看就会
1. 寄存器是什么?
可以查百度,查看详情。。。。。。。。。我的总结:在嵌入式里面寄存器非常非常重要重,就是实现软硬件的接口,几乎所有的功能操作都是通过操作寄存器来实现的。
2. 寄存器操作,点亮一盏led灯。
以stm32f103为例,点亮PB8控制的led灯,PB8输出高电平led灯亮,输入低电平led灭。
查看参考手册,一定学会阅读手册。
操作分为四步。
第一步 开启外设时钟使能寄存器,当外设时钟没有启用时,软件不能读写外设寄存器数值。返回值始终为0x00.
第二步 配置引脚工作模式,推挽输出。
第三步就是控制引脚电平输出。查看手册寄存器的ODR和BSRR(BRR只能清楚寄存器)都可以控制输出。相对来说控制BSRR更快一点,因为控制bsrr是直接写寄存器,而控制ODR需要先读出寄存器,然后操作后,再写入寄存器。
第四步,最后一步,查看存储映像图结合上面图中的偏移地址,准去的找到寄存器的地址。
接下来让我们用代码实现,点亮一张led灯。
/*
定义寄存器,三个寄存器,时钟RCC_APB2ENR,配置GPIOB_CRH,输出GPIOB_BSRR
*/
#define RCC_APB2ENR *((volatile unsigned int *) (0x40021000 + 0x18))
#define GPIOB_CRH *((volatile unsigned int *) (0x40010C00 + 0x04))
#define GPIOB_BSRR *((volatile unsigned int *) (0x40010C00 + 0x10))
int main(void)
{
//开启时钟
RCC_APB2ENR | = 1<<3;
//配置推挽输出
GPIOB_CRH &= 0xFFFFFFF0;
GPIOB_CRH |= 0x00000003; // 3 = 0011 注意 crh默认值0x44444444
//点亮led
GPIOB_BSRR = 1<<8;
while(1)
{
}
return 0;
}
注: 第一次写这个,若有不对的地方,请斧正。