打印
[PIC®/AVR®/dsPIC®产品]

使用变参数函数置位或清零寄存器的位

[复制链接]
1651|7
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
wgtwgtwgt|  楼主 | 2023-7-12 18:53 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
针对avr-libc框架,代码如下:

void set_register_bits(volatile uint8_t *mcu_register, int n, ...)
{
    uint8_t i = 0, temp = 0x00;
    va_list pointer;
    va_start(pointer, n);
    for( i = 0; i < n; i++)
    {
        temp |= _BV( va_arg(pointer, int) );
    }
    *mcu_register |= temp;
}
void clear_register_bits(volatile uint8_t *mcu_register, int n, ...)
{
    uint8_t i = 0, temp = 0xff;
    va_list pointer;
    va_start(pointer, n);
    for( i = 0; i < n; i++)
    {
        temp &= ~_BV( va_arg(pointer, int) );
    }
    *mcu_register &= temp;
}
代码中的n表示要置位或清零的位个数。
例如,设置寄存器PORTB的bit5为1:
set_register_bits(&PORTB, 1, PB5); 
设置PORTB寄存器的bit5、bit4为1:
set_register_bits(&PORTB, 2, PB4, PB5);


清零寄存器的某些位clear_register_bits()函数用法类似。

这种方法的优点是直观,缺点是增加了代码开销。

使用特权

评论回复
沙发
wakayi| | 2024-6-5 09:13 | 只看该作者
个人感觉使用这个函数的意义并不是很大

使用特权

评论回复
板凳
tpgf| | 2024-6-5 09:53 | 只看该作者
这样做首先就是要对寄存器的各个位非常的熟悉

使用特权

评论回复
地板
guanjiaer| | 2024-6-5 10:26 | 只看该作者
这种操作方式适用于所有不同的寄存器吗

使用特权

评论回复
5
木木guainv| | 2024-6-5 12:32 | 只看该作者
有些寄存器不能手动清零的 会产生报错信息吗

使用特权

评论回复
6
xiaoqizi| | 2024-6-5 22:50 | 只看该作者
总感觉不如直接上寄存器的那种直观

使用特权

评论回复
7
wowu| | 2024-6-5 23:23 | 只看该作者
wakayi 发表于 2024-6-5 09:13
个人感觉使用这个函数的意义并不是很大

当然有好处了  每次调用都能明确是对哪个进行的操作

使用特权

评论回复
8
原来是wjc| | 2024-9-28 22:48 | 只看该作者
充分体验3 nm工艺技术提供高性能和低功耗性能。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

45

主题

191

帖子

3

粉丝