STM8S使用AWU无法唤醒的问题的解决过程

时间:2021-12-11 04:34:53

最近使用STM8S005做一个项目, 想达到进入Halt状态然后定时唤醒, 查看了一下文档, 发现可以用自动唤醒功能AWU来做. 于是有了如下代码: 

AWU_APR = 0x3E; 	//64分频
AWU_TBR = 0x0F; //32秒唤醒
CLK_PCKENR2 |= (0x04); /* AWU与主时钟连接 */
AWU_CSR |= 0x10; //使能自动唤醒

CLK_ICKR |= 0x08; // 打开内部低速时钟源
while(0x10 != CLK_ICKR & 0x10); // 等待时钟源信号稳定

halt();

发现进入Halt状态了, 可等了30多秒后, 没有发现起来呀(我是用LED灯来指示的, LED只在初始化的时候设置, 没有看到LED灯亮, 那就表示没有起来), 百思不得其解, 疯狂google, 才发现自己犯了一个错误: 我以为AWU唤醒后, 会自动复位, 其实它不会复位, 而是进入了中断, 如果没有清除中断, 那么就一直在中断了... 见google来的类似问题:stm8的awu自动唤醒问题

真是经验主义害死人呀.


找到问题那就好办了, 在中断方法中添加看门狗来复位一下(当然, 你也可以根据你的需求来处理这种情况)

@far @interrupt void AWU_IRQHandler(void)
{
WWDG_CR=0xbf;
}
记得修改中断向量表里面的AWU方法名称为
AWU_IRQHandler
就好


PS: 在做AWU的时候还遇到了无法切换到LSI的问题(我一开始以为需要将时钟切换至LSI, AWU才能起作用, 后来发现不是, 无论怎么说, 无法切换到LSI也算是学习到一点东西)

原来LSI需要在选项字节中配置的, 默认LSI不激活的, 又是Google:

STM8S内部时钟切换失败问题的解决方案


同时, 在Google过程中, 又学习到AWU和WWDG配合使用来做低功耗的一种方案:

STM8S AWU与WWD配合


收获良多.