因为我写寄存器的操作不太熟练,所以最近腾出时间学习了一下怎么写寄存器,现在把我的经验贴出来,如有不足请指正
我使用的板子是stm32F103C8T6(也就是最常用的板子),现在要通过写GPIO的寄存器来实现点亮LED灯
查阅原理图可得,板子的PC13引脚外接了一个LED灯,也就是说我们接下来的操作是针对PC13这个引脚的
我们首先要找到GPIOC管脚的首地址(如下图所示)
所以我们GPIOC的地址是从0x40011000开始的
通过查阅手册,我们可以得知可以通过写BSRR寄存器来达到我们的目的,然后我们需要查找这个寄存器的地址
这里有个地址偏移量,也就是这个寄存器相对于起始地址的偏移量,所以BSRR寄存器的地址就是0x40011010
然后我们需要写对应的第13位(因为我们要操作的是PC13,第13号管脚),把第13位写成1,其他的保持0
根据换算可得,我们要写的是0x2000
这样就完成我们的点灯操作了
与之相对的,我们可以通过写右移16位丢弃所有1来全部置0
现在可以通过写寄存器来实现闪灯~
代码如下(超级简单的~)
unsigned int *PC13_BSRR = (unsigned int*)0x40011010; // 确定好BSRR的地址
*PC13_BSRR = (uint32_t)0x2000; // 向第13位写1,其余位不变
HAL_Delay(500); // 延时500ms
*PC13_BSRR = (uint32_t)0x2000 << 16u; // 移位操作,16u表示十进制的16,后面的u表示unsigned,这里是表示将低16位移至高16位,因为BSRR寄存器是高位控制置0,低位控制置1
//当高位和低位一起写入产生冲突时,以低位为准
HAL_Delay(500); // 延时500ms
当然方法不止一种,我们也可以通过写ODR寄存器来达到相同的效果
这两个寄存器操作大同小异,我就直接放代码了
这里也可以通过写0x0来全部置零
代码如下(一样简单的~)
unsigned int *PC13_ODR = (unsigned int*)0x4001100c; // 确定ODR的地址
*PC13_ODR = (uint32_t)0x2000; // 第13位写1,其余位保持0
HAL_Delay(500); // 延时500ms
*PC13_ODR = (uint32_t)0x0; // 全部置零
HAL_Delay(500); //延时500ms
这两种寄存器都可以用来点亮我们的小LED