我试图理解这段代码
但是我无法理解这部分代码。
#define cbi(sfr, bit) (_SFR_BYTE(sfr) &= -_BV(bit))
#define sbi(sfr, bit) (_SFR_BYTE(sfr) |= _BV(bit))
sbi
并且cbi
稍后在代码中用作
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
,我阅读了数据表,我知道所有这些类似MCCUR
等ADCSRA
都是寄存器。它还指出有两种指令SBI
和CBI
.
我还阅读了一些关于使用 C 进行微控制器编程的教程,并了解每个寄存器都有8
位。这些位中的每一个都可以使用针对不同功能的编程来设置。此外PUD
,PCIE
这些寄存器的不同位是在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 头文件,在那里我发现_BV
但不确定它在做什么。