硬汉嵌入式论坛

 找回密码
 立即注册
查看: 5041|回复: 2
收起左侧

[有问必答] 寄存器不太理解

[复制链接]

2

主题

2

回帖

8

积分

新手上路

积分
8
发表于 2019-9-10 17:56:46 | 显示全部楼层 |阅读模式
void bsp_LedToggle(uint8_t _no)
{
        if (_no == 1)
        {
                GPIO_PORT_LED1->ODR ^= GPIO_PIN_LED1;
        }
        else if (_no == 2)
        {
                GPIO_PORT_LED2->ODR ^= GPIO_PIN_LED2;
        }
        else if (_no == 3)
        {
                GPIO_PORT_LED3->ODR ^= GPIO_PIN_LED3;
        }
        else if (_no == 4)
        {
                GPIO_PORT_LED4->ODR ^= GPIO_PIN_LED4;
        }
}
我看资料记得ORD是数据输出寄存器,它怎么实现跑马灯的翻转或者说怎么实现gpio口输出电平

回复

使用道具 举报

6

主题

122

回帖

140

积分

初级会员

积分
140
发表于 2019-9-11 08:48:11 | 显示全部楼层
如果你想改变某个位的状态而不影响其他的,那用BSRR或BRR就很容易了。直接操作ODR需要“读-操作-写”的过程,速度反而变慢了。  比如说让PA1、PA3、PA7清零而不影响其他位的状态,那就是: GPIOA->BRR=PA1|PA3|PA7; 你要用ODR来操作的话,那就变成这样了: GPIOA->ODR&=~(PA1|PA3|PA7); 虽然C的语句都只有一个,但你看汇编代码,就发现使用BRR比ODR快的多。
回复

使用道具 举报

6

主题

122

回帖

140

积分

初级会员

积分
140
发表于 2019-9-11 08:49:06 | 显示全部楼层
我只是个搬运工,摆渡了一下
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2025-11-22 17:06 , Processed in 0.038071 second(s), 22 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表