你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

用STM8S003做了一款小报警器,不定时重启,求指导

[复制链接]
help008 提问时间:2015-1-1 22:19 /
用STM8S003做了一款小报警器,电池供电,平时休眠,外部中断唤醒,测试过程中开启休眠就出现无规律重启,不使用休眠就一切正常,折腾了几天,一直没找到问题。最后逐步简化程序,发现只保留休眠和唤醒,也是一样的重启,已经没思路了,求各位朋友帮忙,贴出最后测试的程序,IAR下的。
#include "iostm8s103f3.h"
      
#define uchar unsigned char
#define uint  unsigned 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");
      }  
}


只保留这点都不行,无规律重启,有时是连续重启,有时要几个小时
收藏 评论9 发布时间:2015-1-1 22:19

举报

9个回答
langgao183 回答时间:2015-1-5 14:07:35
本帖最后由 langgao183 于 2015-1-5 14:15 编辑

1,在外部中断函数加一个return
2,你的中断io口有接上拉?
3.参考:http://bbs.eeworld.com.cn/thread-253053-1-1.html



小贾-370388 回答时间:2015-1-5 16:14:04
我怀疑是你的接口受到干扰的问题,
w453509596 回答时间:2015-1-8 16:16:12
个人感觉你对STM8S在各模式之间转换处理器所做了哪些工作你可能还不太了解。你选择了电池供电,注意下关闭掉所有不用的外设的时钟,你最好在程序初始的时候,对电源管理相关的寄存作一些初始化。一般自动重启都是因为电源或者工作模式设置错误。
help008 回答时间:2015-1-12 18:13:08
谢谢楼上几位的建议,后来测试发现,只要休眠时不关掉FLASH供电,就不会出现重启,具体原因到现在也没有找到,楼上提到的几个方面都试过了,不能解决问题。客户要的急,样机已经交客户测试了,休眠不关掉FLASH电源,休眠电流在60ua左右,比完全休眠大了很多
我是酱油哥 回答时间:2015-1-12 19:43:52
好有难度啊
小竹新雨 回答时间:2016-3-28 19:55:47
help008 发表于 2015-1-12 18:13
谢谢楼上几位的建议,后来测试发现,只要休眠时不关掉FLASH供电,就不会出现重启,具体原因到现在也没有找 ...

楼主,我也遇到了和你同样的问题,能教教我怎么才能不关掉flash供电吗
小竹新雨 回答时间:2016-3-28 20:25:05
help008 发表于 2015-1-12 18:13
谢谢楼上几位的建议,后来测试发现,只要休眠时不关掉FLASH供电,就不会出现重启,具体原因到现在也没有找 ...

楼主,我是调用FLASH->CR1寄存器来开启flash供电的,但是偶尔还是会重启,你是怎么解决的,我用的是stml051,谢谢你了
zcl201207 回答时间:2016-3-28 20:27:29
weihl 回答时间:2016-3-29 13:06:01
我之前项目里低功耗处理部分的代码, 你参考下(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");
}

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版