stm32F103C8T6通过写寄存器点亮LED灯

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

我使用的板子是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 

  • 3
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

砕月之殇

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值