Embedded 检查avr中的睡眠模式

Embedded 检查avr中的睡眠模式,embedded,avr,Embedded,Avr,目前我正在使用avr微处理器atmega644p,并试图将其置于睡眠模式(模式:空闲) 为此:我设置SE位=1,其他3位SM0 SM1和SM2为0,然后当我调用函数sleep\u cpu(),cpu将处于空闲模式 我使用中断来执行代码中定义的任务,因此如果我想执行它,我必须禁用睡眠模式。这意味着函数sleep\u disable()必须放在ISR(vector\u name)函数的第一行 我的逻辑正确吗 如何检查CPU是否处于睡眠模式?我试着做到如下: if (SM0 == 0 &&am

目前我正在使用avr微处理器atmega644p,并试图将其置于睡眠模式(模式:空闲)

为此:我设置SE位=1,其他3位SM0 SM1和SM2为0,然后当我调用函数
sleep\u cpu()
,cpu将处于空闲模式

我使用中断来执行代码中定义的任务,因此如果我想执行它,我必须禁用睡眠模式。这意味着函数
sleep\u disable()
必须放在
ISR(vector\u name)
函数的第一行

我的逻辑正确吗

如何检查CPU是否处于睡眠模式?我试着做到如下:

if (SM0 == 0 && SM1 == 0 && SM2 == 0){

   printf("Sleep mode begin");
}
因为我非常频繁地使用中断,所以if语句将位于
main()
函数的循环中,但putty终端上没有打印任何内容

为什么会发生这种情况?我认为这是因为if语句由于错误的条件而从未执行

编辑

if语句的位置在
sleep\u cpu()
函数中循环内的
main()
上方,因此在cpu进入睡眠模式之前,应该打印“sleep mode begin”行,但在第41页的putty terminal上仍然没有打印出任何内容,是描述中断如何从睡眠模式唤醒处理器的段落

如果MCU处于睡眠模式时发生启用的中断,MCU将唤醒。微控制器 然后,除启动时间外,停止四个周期,执行中断例程,并 从睡眠后的指令恢复执行

因此,您不需要在中断例程中唤醒处理器


但是,如果您希望处理器返回睡眠状态,则必须在ISR返回后采取额外的步骤,例如将sleep()函数放入循环中。

正如“嘿,Trung,您睡着了吗?”是一个无法(准确地)回答“是”的问题一样,您的处理器无法告诉您它当前处于睡眠状态,因为如果是这样,它就无法执行代码来告诉您。通常情况下(取决于处理器和详细配置),中断会将其从睡眠模式唤醒。哈哈,伙计,发现一个错误!我这样做是因为数据表中的信息,当cpu空闲时,SPI、USART、ADC、计时器/计数器。。。还在工作!那么,是否还有其他方法来检查cpu是否处于休眠状态?否则就无法检查输出是否正确…我已经更新了if语句在循环体中的位置!请看一看!