
用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"); } } 只保留这点都不行,无规律重启,有时是连续重启,有时要几个小时 |
STM8S003无法检测到引脚电平
STM8 @svlreg 问题
STM8AF62XX+L99PM62GXP LIN通讯的电路原理图有吗?官网提供了一套软件,没找到对应的原理图,请大家指教一下
求一个STM8S207例程
初次接触STM8,请问在STVD中,为什么这个Struct会报错
STMS005K6T6 如何采集内部参考电压。
stm8s003 adc中断和通道切换的问题
adc施密特触发器stm8
stm8l051f3 TSSOP20 封装,待机模式下,2天后,电流突然增加到140UA
STM8S用STVP烧录怎么加密?
1,在外部中断函数加一个return
2,你的中断io口有接上拉?
3.参考:http://bbs.eeworld.com.cn/thread-253053-1-1.html
楼主,我也遇到了和你同样的问题,能教教我怎么才能不关掉flash供电吗
楼主,我是调用FLASH->CR1寄存器来开启flash供电的,但是偶尔还是会重启,你是怎么解决的,我用的是stml051,谢谢你了
/*******************************************************************************
****输入:无
****输出:无
****端口:无
****说明:低功耗模式开启
****举例: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");
}