转瞬回声 发表于 2025-6-30 20:25

我才发现GPIO还能这么玩

我一直以为GPIO的输出高低电平是通过ODATA寄存器的值来控制。比如在做LED的闪烁时使用的LED_Toggle()的函数如下面所写:
void APM_TINY_LEDToggle(LED_T Led)
{
    GPIO_PORT->ODATA ^= GPIO_PIN;
}这里包含“读-改-写”的操作步骤。我觉得非常平常,也一直这么使用着。但我发现,其实APM32系列还有两个寄存器可以直接输出的电平高低,分别是BSC和BR寄存器,即直接往上述寄存器写对应GPIO引脚的Bit位将对此引脚做高低电平的输出控制,而不影响其它引脚。它只有一个步骤的操作!
void APM_TINY_LEDOn(LED_T Led)
{
    GPIO_PORT->BR = GPIO_PIN;
}

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



夜幕叙事曲 发表于 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

多看手册。玩嵌入式一定要多看手册。
驱动库是驱动库,不能替代技术手册。
页: [1]
查看完整版本: 我才发现GPIO还能这么玩