STM8S AWU(活跃停机)功能一打开,过一会儿程序喜欢跑飞
问题描述:AWU功能一打开,过一会儿程序喜欢跑飞不打开AWU功能就可以,不知道是哪个地方出了问题!编译器为IAR
#include "stdio.h"
#include
#include
#define _NOP() __no_operation()
#pragma vector = 0X03
__interrupt void AWU_IRQHandler(void)
{
unsigned char i;
_NOP();
i=AWU_CSR1;
_NOP();
}
void Awu_Init(void)
{
CLK_ICKR|= 0x08; //打开LSI时钟
CLK_PCKENR2 |= 0X04; //使能AWU时钟
AWU_APR=0x1e; //
AWU_TBR=0x0b; //
AWU_CSR1|=0x10; //AWU使能自动唤醒功能
CLK_ICKR|= 0x20; //活跃停机模式(AWU使能情况)下,关闭电压调节器节省功耗
CLK_ICKR|= 0x04; //从停机(Halt)或活跃停机(Active Halt)模式快速唤醒使能
FLASH_CR1 &= ~0x40; //活跃停机模式下Flash掉电,
}
void main(void)
{
_NOP();
Awu_Init();
_NOP();
__enable_interrupt(); // 开全局中断
while (1)
{
_NOP();
__halt(); //低功耗模式(停机)
_NOP();
}
}
回复:STM8S AWU(活跃停机)功能一打开,过一会儿程序喜欢跑飞
所有未用的I/O口全部设为上拉输出低电平,把未用的的IO设置成输入试试。回复:STM8S AWU(活跃停机)功能一打开,过一会儿程序喜欢跑飞
程序跑飞,自己单步,找到跑飞的地方。RE:STM8S AWU(活跃停机)功能一打开,过一会儿程序喜欢跑飞
程序跑飞与芯片功能无关,很多时候是指针非法或访问越界。建议你根据SP指向的内存区,查看栈内数据,找出跑飞位置,然后仔细检查程序。个人调试的一点心得,希望对你有用回复:STM8S AWU(活跃停机)功能一打开,过一会儿程序喜欢跑飞
程序单步运行时正常,是走了一会儿后,程序才跑飞的。堆栈也是正常的,现在只有一个中断,然后是while (1)
{
_NOP();
__halt(); //低功耗模式(停机)
_NOP();
}
库函数的例程,我也试了,走一段时间后(1到2分钟后),也会跑飞。
RE:STM8S AWU(活跃停机)功能一打开,过一会儿程序喜欢跑飞
库函数的例程如果都能跑飞,可能是你硬件设计上的问题了回复:STM8S AWU(活跃停机)功能一打开,过一会儿程序喜欢跑飞
回复第 5 楼 于2013-09-14 15:57:51发表:库函数的例程如果都能跑飞,可能是你硬件设计上的问题了
硬件问题我也怀疑过,后来我用官方的实验板 STM8-DISCOVERY ,也测试了,还是出现同样的问题,不知道是什么原因。
回复:STM8S AWU(活跃停机)功能一打开,过一会儿程序喜欢跑飞
我现在也遇到了这样的情况,你的问题怎么解决的?回复:STM8S AWU(活跃停机)功能一打开,过一会儿程序喜欢跑飞
mark:lol 同样的问题呀, 与其他中断冲突,我把其他定时器中断关闭就好了。 温柔的武士刀 发表于 2013-9-16 21:04所有未用的I/O口全部设为上拉输出低电平,把未用的的IO设置成输入试试。
这个适当设置后编译通过,在本人的stm8s207上运行符合预期。支持一下 zhanglong71 发表于 2016-5-9 15:32
这个适当设置后编译通过,在本人的stm8s207上运行符合预期。支持一下
我就把主函数改了,其他都跟楼主一样,为什么根本不会唤醒:
void main(void)
{
/*PB5为推挽输出*/
PB_DDR |= 0x20;/*xx1x xxxx*/
PB_CR1 |= 0x20;/*xx1x xxxx*/
PB_CR2 &= 0xdf;/*xx0x xxxx*/
PB_ODR = 0x20;
_NOP();
Awu_Init();
_NOP();
__enable_interrupt();// 开全局中断
while (1)
{
PB_ODR = 0x20;
asm("HALT");
_NOP();
PB_ODR = 0x00;
asm("HALT");
_NOP();
}
} 标记一下,看看谁能解答
页:
[1]
2