用STM8S003做了一款小报警器,不定时重启,求指导
用STM8S003做了一款小报警器,电池供电,平时休眠,外部中断唤醒,测试过程中开启休眠就出现无规律重启,不使用休眠就一切正常,折腾了几天,一直没找到问题。最后逐步简化程序,发现只保留休眠和唤醒,也是一样的重启,已经没思路了,求各位朋友帮忙,贴出最后测试的程序,IAR下的。#include "iostm8s103f3.h"
#define uchar unsigned char
#define uintunsigned int
#define beep PD_ODR_ODR6
#define led PD_ODR_ODR5
#define RF PA_IDR_IDR3
void delay_1ms(uint x) //1毫秒延时
{
uchar b,c;
for(;x>0;x--)
{
for(b=5;b>0;b--);
{
for(c=150;c>0;c--);
}
}
}
#pragma vector=0x05//PA
__interrupt void ext_A3(void) //RF外部中断
{
;
}
void Init_GPIO(void)//IO初始化
{
PA_DDR=0xF7;
PA_CR1=0x00;
PA_CR2=0x00;//PA3中断,休眠前开启
PD_DDR=0xff;//ef
PD_CR1=0x60;
PD_CR2=0x00;
PD_ODR=0X20;
CLK_CKDIVR=0X02; //CPU 4分频
}
void system_start() //上电初始化
{
Init_GPIO();
EXTI_CR1=0XC1; //PD上升沿和下降沿触发,PA仅上升沿触发
PA_CR2=0x08;//开启PA3上升沿中断
asm("rim");//开全局中断
}
void main()
{
system_start();
beep=1;
delay_1ms(500);
beep=0;
while(1)
{
led=!led;
asm("HALT");
}
}
只保留这点都不行,无规律重启,有时是连续重启,有时要几个小时
本帖最后由 langgao183 于 2015-1-5 14:15 编辑
1,在外部中断函数加一个return
2,你的中断io口有接上拉?
3.参考:http://bbs.eeworld.com.cn/thread-253053-1-1.html
我怀疑是你的接口受到干扰的问题, 个人感觉你对STM8S在各模式之间转换处理器所做了哪些工作你可能还不太了解。你选择了电池供电,注意下关闭掉所有不用的外设的时钟,你最好在程序初始的时候,对电源管理相关的寄存作一些初始化。一般自动重启都是因为电源或者工作模式设置错误。 谢谢楼上几位的建议,后来测试发现,只要休眠时不关掉FLASH供电,就不会出现重启,具体原因到现在也没有找到,楼上提到的几个方面都试过了,不能解决问题。客户要的急,样机已经交客户测试了,休眠不关掉FLASH电源,休眠电流在60ua左右,比完全休眠大了很多 好有难度啊
help008 发表于 2015-1-12 18:13
谢谢楼上几位的建议,后来测试发现,只要休眠时不关掉FLASH供电,就不会出现重启,具体原因到现在也没有找 ...
楼主,我也遇到了和你同样的问题,能教教我怎么才能不关掉flash供电吗 help008 发表于 2015-1-12 18:13
谢谢楼上几位的建议,后来测试发现,只要休眠时不关掉FLASH供电,就不会出现重启,具体原因到现在也没有找 ...
楼主,我是调用FLASH->CR1寄存器来开启flash供电的,但是偶尔还是会重启,你是怎么解决的,我用的是stml051,谢谢你了 :):):):):):):) 我之前项目里低功耗处理部分的代码, 你参考下(STM8L052R8)
/*******************************************************************************
****输入:无
****输出:无
****端口:无
****说明:低功耗模式开启
****举例:lowpower_mode_on();//进入低功耗模式
****作者:
*******************************************************************************/
void lowpower_mode_on(void)
{
//低功耗模式下的GPIO配置
//设置PA7,PA6,PA5,PA4,PA2为推挽输出低电平,速率2MHz
PA_DDR |= 0xf4; //0b1111-0100
PA_CR1 |= 0xf4; //0b1111-0100
PA_CR2 &= 0x0b; //0b0000-1011
PA_ODR &= 0x0b; //0b0000-1011
//设置PB7,PB6,PB5,PB4,PB3,PB2,PB1,PB0为推挽输出低电平,速率2MHz
PB_DDR |= 0xff; //0b1111-1111
PB_CR1 |= 0xff; //0b1111-1111
PB_CR2 &= 0x00; //0b0000-0000
PB_ODR &= 0x00; //0b0000-0000
//设置PC7,PC4,PC3,PC2,PC1,PC0为推挽输出低电平,速率2MHz
PC_DDR |= 0x9f; //0b1011-1111
PC_CR1 |= 0x9f; //0b1011-1111
PC_CR2 &= 0x60; //0b0100-0000
PC_ODR &= 0x60; //0b0100-0000
//PC5设置为浮空输入不带中断模式,不能设置为推挽输出低电平模式
PC_DDR_DDR5 = 0; //输入
PC_CR1_C15= 0; //浮空
PC_CR2_C25= 0; //不带中断
//设置PD7,PD6,PD5,PD4,PD3,PD2,PD1,PD0为推挽输出低电平,速率2MHz
PD_DDR |= 0xff; //0b1111-1111
PD_CR1 |= 0xff; //0b1111-1111
PD_CR2 &= 0x00; //0b0000-0000
PD_ODR &= 0x00; //0b0000-0000
//设置PE7,PE6,PE5,PE4,PE3,PE2,PE1,PE0为推挽输出低电平,速率2MHz
PE_DDR |= 0xff; //0b1111-1111
PE_CR1 |= 0xff; //0b1111-1111
PE_CR2 &= 0x00; //0b0000-0100
PE_ODR &= 0x00; //0b0000-0100
//设置PF7,PF6,PF5,PF4,PF1,PF0为推挽输出低电平,速率2MHz
PF_DDR |= 0xf3; //0b1111-0011
PF_CR1 |= 0xf3; //0b1111-0011
PF_CR2 &= 0x0c; //0b0000-1100
PF_ODR &= 0x0c; //0b0000-1100
//设置PG7,PG6,PG5,PG4,PG3,PG2,PG1,PG0为推挽输出低电平,速率2MHz
PG_DDR |= 0xff; //0b1111-1111
PG_CR1 |= 0xff; //0b1111-1111
PG_CR2 &= 0x00; //0b0000-0000
PG_ODR &= 0x00; //0b0000-0000
//复位按键(外部中断,用于低功耗唤醒)端口初始化-PA3,低电平有效
PA_DDR_DDR3 = 0; //输入
PA_CR1_C13= 1; //上拉
PA_CR2_C23= 1; //带中断
CPU_CCR = 0X28; //等级3,0最低,3最高
ITC_SPR3_VECT11SPR = 0x01; //中断等级1(0低-->3高)
EXTI_CR1_P3IS = 0x02; //设置lin3中断线上的触发方式为 下降沿触发
//充电检测(外部中断)端口初始化-PC6,高电平有效
PC_DDR_DDR6 = 0; //输入
PC_CR1_C16= 0; //浮空
PC_CR2_C26= 1; //带中断
CPU_CCR = 0X28; //等级3, 0最低,3最高
ITC_SPR4_VECT14SPR = 0x01; //中断等级1(0低-->3高)
EXTI_CR2_P6IS = 0x01; //设置lin6中断线上的触发方式为 上升沿触发
//低功耗模式下关掉ADC
ADC1_CR1_ADON = 0; //关闭ADC转换
//低功耗模式下,USART1恢复默认状态
USART1_CR1_USARTD = 1; //关闭USART1,低功耗模式要设置为1
USART1_CR2_TIEN = 0; //关闭USART1发送中断
USART1_CR2_RIEN = 0; //关闭USART1接收中断
USART1_CR2_TEN = 0; //关闭USART1发送
USART1_CR2_REN = 0; //关闭USART1接收
//低功耗模式下,USART3恢复默认状态
USART3_CR1_USARTD = 1; //关闭USART3,低功耗模式要设置为1
USART3_CR2_TIEN = 0; //关闭USART3发送中断
USART3_CR2_RIEN = 0; //关闭USART3接收中断
USART3_CR2_TEN = 0; //关闭USART3发送
USART3_CR2_REN = 0; //关闭USART3接收
//关闭主板电源,减小主电源消耗
MAIN_PWR_CTRL = 0; //关闭主板电源
//打开总中断,为从HALT模式下用外部中断唤醒做准备
asm("rim"); //rim为开中断,sim为关中断
//关闭内部参考电压,降低MCU电源消耗
PWR_CSR2 = 0x02;
//关闭片内系统外设时钟
CLK_PCKENR1 = 0x00; //关闭片内外设时钟
CLK_PCKENR2 = 0x80; //关闭片内外设时钟,保留BootROM
CLK_PCKENR3 = 0x00; //关闭片内外设时钟
//先清除中断标志,防止干扰进入HALT模式
EXTI_SR1_P3F = 1; //清除lin3线上中断标志
EXTI_SR1_P5F = 1; //清除lin5线上中断标志
EXTI_SR1_P6F = 1; //清除lin6线上中断标志
EXTI_SR1_P7F = 1; //清除lin7线上中断标志
TIM2_SR1_UIF = 0; //清除中断标志
//进入HALT模式,只有外部中断可以唤醒
asm("halt");
}
页:
[1]