stm32F103C8T6通过写寄存器点亮LED灯

因为我写寄存器的操作不太熟练,所以最近腾出时间学习了一下怎么写寄存器,现在把我的经验贴出来,如有不足请指正

我使用的板子是stm32F103C8T6(也就是最常用的板子),现在要通过写GPIO的寄存器来实现点亮LED灯

 

 

查阅原理图可得,板子的PC13引脚外接了一个LED灯,也就是说我们接下来的操作是针对PC13这个引脚的

我们首先要找到GPIOC管脚的首地址(如下图所示)

 

所以我们GPIOC的地址是从0x40011000开始的

通过查阅手册,我们可以得知可以通过写BSRR寄存器来达到我们的目的,然后我们需要查找这个寄存器的地址

 

 这里有个地址偏移量,也就是这个寄存器相对于起始地址的偏移量,所以BSRR寄存器的地址就是0x40011010

 然后我们需要写对应的第13位(因为我们要操作的是PC13,第13号管脚),把第13位写成1,其他的保持0

根据换算可得,我们要写的是0x2000

 

 

 这样就完成我们的点灯操作了

与之相对的,我们可以通过写右移16位丢弃所有1来全部置0

现在可以通过写寄存器来实现闪灯~

代码如下(超级简单的~)

1 unsigned int *PC13_BSRR = (unsigned int*)0x40011010;  // 确定好BSRR的地址
2 *PC13_BSRR = (uint32_t)0x2000;  // 向第13位写1,其余位不变
3 HAL_Delay(500);  // 延时500ms
4 *PC13_BSRR = (uint32_t)0x2000 << 16u;  // 移位操作,16u表示十进制的16,后面的u表示unsigned,这里是表示丢弃所有的1,全部换为0
5 HAL_Delay(500);  // 延时500ms

当然方法不止一种,我们也可以通过写ODR寄存器来达到相同的效果

这两个寄存器操作大同小异,我就直接放代码了

这里也可以通过写0x0来全部置零

代码如下(一样简单的~)

1 unsigned int *PC13_ODR = (unsigned int*)0x4001100c;  // 确定ODR的地址
2 *PC13_ODR = (uint32_t)0x2000;  // 第13位写1,其余位保持0
3 HAL_Delay(500);  // 延时500ms
4 *PC13_ODR = (uint32_t)0x0;  // 全部置零
5 HAL_Delay(500);  //延时500ms

这两种寄存器都可以用来点亮我们的小LED

posted @ 2022-02-28 23:09  砕月之殇  阅读(462)  评论(0编辑  收藏  举报
/*粒子线条,鼠标移动会以鼠标为中心吸附的特效*/