[APM32F1] 我才发现GPIO还能这么玩

[复制链接]
 楼主| 转瞬回声 发表于 2025-6-30 20:25 | 显示全部楼层 |阅读模式
我一直以为GPIO的输出高低电平是通过ODATA寄存器的值来控制。比如在做LED的闪烁时使用的LED_Toggle()的函数如下面所写:
  1. void APM_TINY_LEDToggle(LED_T Led)
  2. {
  3.     GPIO_PORT[Led]->ODATA ^= GPIO_PIN[Led];
  4. }
这里包含“读-改-写”的操作步骤。我觉得非常平常,也一直这么使用着。但我发现,其实APM32系列还有两个寄存器可以直接输出的电平高低,分别是BSC和BR寄存器,即直接往上述寄存器写对应GPIO引脚的Bit位将对此引脚做高低电平的输出控制,而不影响其它引脚。它只有一个步骤的操作!
  1. void APM_TINY_LEDOn(LED_T Led)
  2. {
  3.     GPIO_PORT[Led]->BR = GPIO_PIN[Led];
  4. }

  5. void APM_TINY_LEDOff(LED_T Led)
  6. {
  7.     GPIO_PORT[Led]->BSC = GPIO_PIN[Led];
  8. }
简单的事情简单着来做,不要把事情搞复杂!毕竟 极海的设计人员已经为大家提前考虑了!



评论

一般都是这样的  发表于 2025-7-1 11:16
夜幕叙事曲 发表于 2025-7-1 10:18 | 显示全部楼层
这两个寄存器的操作还是原子操作。
那个ODATA寄存器用来按Port端口写入
梦塑者 发表于 2025-7-1 15:56 | 显示全部楼层
唉!一直是直接调用官方的标准库。
还没有太多的时间仔细阅读手册
死不低头 发表于 2025-7-2 18:36 | 显示全部楼层
这和2025年发现交通工具里有一种东西叫飞机一样稀奇
DawnFervor 发表于 2025-7-2 23:47 | 显示全部楼层
平时只用驱动库,不去看手册。
jobszheng 发表于 2025-7-3 09:52 | 显示全部楼层
这就是典型的位操作示例。
体现了硬件之美
VelvetNight 发表于 2025-7-3 10:30 | 显示全部楼层
多看手册。玩嵌入式一定要多看手册。
驱动库是驱动库,不能替代技术手册。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

3

主题

15

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部

3

主题

15

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部