目前我正在使用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终端上仍然没有打印出来
答案 0 :(得分:1)
在this document第41页的底部,是一段描述中断如何将处理器从睡眠模式唤醒的内容。
如果在MCU处于休眠模式时发生使能中断,则MCU会唤醒。 MCU 然后,除了启动时间之外,它还会停止四个周期,执行中断程序,然后执行 从SLEEP后的指令恢复执行。
因此,您无需在中断例程中唤醒处理器。
但是,如果您希望处理器重新进入休眠状态,则必须在ISR返回后执行额外的步骤,例如将sleep()函数放入循环中。