在avr中检查睡眠模式

时间:2014-02-28 16:36:16

标签: embedded avr

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

要执行此操作:我将SE位设置为1,其他3位SM0 SM1和SM2为0,然后当我调用函数sleep_cpu()时,CPU将处于空闲模式。

我使用中断来执行我的代码中定义的任务,这样如果我想执行它,我必须禁用睡眠模式。这意味着函数sleep_disable()必须放在ISR(vector_name)函数的第一行。

我的逻辑是否正确?

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

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

   printf("Sleep mode begin");
}

因为我使用了一个中断,所以if语句将在main()函数的循环中,但在putty终端上没有打印。

为什么会这样?我认为这是因为if语句永远不会因错误的条件而被执行

修改

if语句的位置在sleep_cpu()函数的循环内高于main(),以便行"睡眠模式开始"应该在CPU进入睡眠模式之前打印出来,但是在putty终端上仍然没有打印出来

1 个答案:

答案 0 :(得分:1)

this document第41页的底部,是一段描述中断如何将处理器从睡眠模式唤醒的内容。

  

如果在MCU处于休眠模式时发生使能中断,则MCU会唤醒。 MCU   然后,除了启动时间之外,它还会停止四个周期,执行中断程序,然后执行   从SLEEP后的指令恢复执行。

因此,您无需在中断例程中唤醒处理器。

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

相关问题