gpt4 book ai didi

C 语法/AVR header

转载 作者:太空宇宙 更新时间:2023-11-04 01:37:21 24 4
gpt4 key购买 nike

我正在努力理解 this代码

但是我无法理解这部分代码。

#define cbi(sfr, bit) (_SFR_BYTE(sfr) &= -_BV(bit))
#define sbi(sfr, bit) (_SFR_BYTE(sfr) |= _BV(bit))

sbicbi 稍后在代码中用作

void system_sleep()
{
sbi(MCUCR,PUD); //Disables All Internal Pullup Resistors
sbi(GIMSK,PCIE); //Enable Pin Change Interrupts Interrups
sbi(PCMSK,PCINT0); //Changes Interrupt to PIN1 (PCINT1)
cbi(ADCSRA,ADEN); //switch Analog to Digital Converter OFF
cbi(MCUCR,SM0); //Power Down Mode
sbi(MCUCR,SM1); //Power Down Mode
sbi(MCUCR,SE); //sleep Mode Power down enable (Sleep_enable(); should set this-- not tested yet)
sleep_enable(); //Sets the Sleep Enable bit in the MCUCR Register (SE BIT)
sleep_mode(); //sleep begins here
sleep_disable(); //Coming out of sleep
sbi(ADCSRA,ADEN); //switch Analog to Digital Converter ON
cbi(MCUCR,PUD); //Enables Pullup Resistors Again
}

代码是给ATtiny85的,我看了数据表,才知道MCCURADCSRA等都是寄存器。它还指出有两种指令 SBICBI

我还阅读了一些有关使用 C 进行微 Controller 编程的教程,了解到每个寄存器都有 8 位。这些位中的每一个都可以使用针对不同功能的编程来设置。此外,PUDPCIE 是这些寄存器的不同位,它们在 system_sleep 函数中设置。所以我明白了 system_sleep 函数在做什么,它正在设置寄存器中的位。

我唯一不能理解的部分是

#define cbi(sfr, bit) (_SFR_BYTE(sfr) &= -_BV(bit))
#define sbi(sfr, bit) (_SFR_BYTE(sfr) |= _BV(bit))

数据表中没有_SFR_BYTE_BV 之类的内容。我查看了 AVR/libc header ,在那里我找到了 _BV 但不确定它在做什么。

最佳答案

宏的名称应该会给您一些提示。 cbi 代表Clear Bitsbi 代表Set Bitcbi(sfr, bit) 清除寄存器 sfr 中由 bit 指示的位数。 sbi 的类似解释。

如果你有整个工程,你可以搜索_SFR_BYTE_BV的定义。但本质上它们大致转化为

#define  cbi(sfr, bit)   ((sfr) &= ~(1 << (bit)))

#define sbi(sfr, bit) ((sfr) |= (1 << (bit)))

阅读更多关于 bit-masking 的信息.

关于C 语法/AVR header ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12255218/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com