STM8关于IWDG看门狗和HSI高速时钟和复位的坑

2019-11-07来源: eefocus关键字:STM8  IWDG  看门狗  HSI  高速时钟  复位

前言:我的第一篇博客,快被逼疯了。用的STM8S003F3,耗时5天,问题已解决,结局很坑!


但因为这一个问题,我似乎将stm8的时钟,复位,看门狗,iar的使用几乎全吃透了。


忠告:不要随随便便相信百度里头随便找来的资料!


现象:主频只在16MHz时,程序频繁复位不可控,其他现象异常离奇不阐述了,防止伤脑。


正文:前因后果是这样的:


1,我配置了16M的主频


CLK_HSIPrescalerConfig(CLK_PRESCALER_HSIDIV1);//内部高速时钟,不分频


或者:CLK->CKDIVR = 0x00;  //HSIDIV = 0 CPUDIV = 0   cpu时钟 = 16Mhz


发现它频繁自动复位,复位速度极快,找不到原因,问了老总,老总说复位和IWDG有关。


2,没学过也没设置过看门狗,那就配置吧

大体就是让我配置一下,网上各种配置方法,精简后,所有网上内容都统一为:


void IWDG_Init(void) //配置并启动看门狗

    IWDG->KR = 0xCC;    //启动独立看门狗  

    IWDG->KR = 0x55;    //写入解锁  

    IWDG->PR = 0x06;    //256分频

    IWDG->RLR = 0xFF;    //设置重载寄存器

    IWDG->KR = 0xAA;    //锁定并刷新

//    IWDG_Enable();      //使能看门狗 

//    IWDG_WriteAccessCmd(IWDG_WriteAccess_Enable);    //写使能

//    IWDG_SetPrescaler(IWDG_Prescaler_256);        //预分频256,128KHZ/256 

//    IWDG_SetReload(0XFF);        //设置每次喂狗的计数值。

//    IWDG_ReloadCounter();        //喂狗


}


操作寄存器和库函数都有了,而且是不出错的


void WDT(void)//喂狗

{  

   IWDG->KR = 0xaa;


}


定期喂狗即可,LSI的256分频大概1秒左右喂一次狗,不喂就复位,看起来就很简单了


3我真心是为了解决问题把独立喂狗IWDG都快吃透了,保证看门狗配置绝对没问题了,复位问题还是没解决!


正常情况,看门狗是可要可不要的,不是说开机就会自动初始化(老总的隐形误导)。


如果我初始化看门狗了,看门狗也应该1秒复位一次,可我1秒复位n多次,那说明跟看门狗无关


4排查发现,又跟时钟有关


CLK_HSIPrescalerConfig(CLK_PRESCALER_HSIDIV2);//内部高速时钟,分频2;


分频2,4,8,程序不再复位了,就是说16M会自动复位,8M以下就不复位了?可我就是要16M啊


手册说,看门狗用LSI,我主频用HSI,互相不影响吧?(互不影响)


5快疯了,要交差,半路出现问题搞不定


把代码全删了,只留了几句话


 CLK_HSIPrescalerConfig(CLK_PRESCALER_HSIDIV1);//内部高速时钟,不分频


 GPIO_Init(Laser_V1_Port, (GPIO_Pin_TypeDef)Laser_V1_Pin, GPIO_MODE_OUT_PP_LOW_SLOW);    //灯亮


 int i=1000;

 GPIO_WriteHigh(Laser_V1_Port,Laser_V1_Pin);

 while(i--);


 GPIO_WriteLow(Laser_V1_Port,Laser_V1_Pin);


 while(1) { }


按照逻辑,开机亮一下啊,可我现在一直会亮,(因为它复位了)


找了个别人的demo试试,还是一样,但是用别的STM8开发板试了就没事!


6最终发现while(1){}去掉,则不再复位了,while(1){}不去掉,灯还是不停的闪


靠,这根本不是复位,而是灯闪的操作被莫名循环了,不是复位导致的!!!!靠,拍电影啊,这么弯弯绕!


7问题没发现,但是问题已解决,那就是:


main()函数中,如果while(1)是空的,会执行while(1)意外的代码?不要让while(1)空着就行


这TM什么鬼,明明技术贴,搞得跟走近科学一样(中间过程忽略)


8最后一天,都快放弃了,最后猜想是不是硬件问题?!内心思路:跟硬件有毛关系啊!

最终:Vcap将它的电容从103改为105,复位问题奇迹般不再发生了(1uF)。


为什么我就选了103?!啊?因为我特么从网上百度随便找了个百度文库照抄的!坑啊!(NRST也没加电容!)

关键字:STM8  IWDG  看门狗  HSI  高速时钟  复位 编辑:什么鱼 引用地址:http://news.eeworld.com.cn/mcu/ic479273.html 本网站转载的所有的文章、图片、音频视频文件等资料的版权归版权所有人所有,本站采用的非本站原创文章及图片等内容无法一一联系确认版权者。如果本网所选内容的文章作者及编辑认为其作品不宜公开自由传播,或不应无偿使用,请及时通过电子邮件或电话通知我们,以迅速采取适当措施,避免给双方造成不必要的经济损失。

上一篇:【stm32f407】窗口看门狗 wwdog
下一篇:STM8S——watchdog(IWDG)

关注eeworld公众号 快捷获取更多信息
关注eeworld公众号
快捷获取更多信息
关注eeworld服务号 享受更多官方福利
关注eeworld服务号
享受更多官方福利

推荐阅读

STM8L低功耗调试总结
STM8L低功耗调试资料准备功耗数据目标实现低功耗资料准备在调试STM单片机相关功能时,习惯性的进入到STM官方论坛进行资料下载。调试STM8功耗也不例外,找到STM8L的应用笔记,选择最热,先看看官方提供的STM8入门文档,入门资料可以选择中文或者英文(STM8L和STM8AL入门)。资料里面有一段话,对功耗调试相当重要:6.6 不使用的 I/O 和特性微控制器都是为多种应用设计的,通常一个应用不会使用 100 % 的微控制器资源。为了避免不必要的功率消耗 (对电池供电应用特别重要),同时提高 EMC 性能,闲置时钟、计数器或 I/O 都不应浮空。 I/O 应该外部强制 (上拉或者下拉到闲置 I/O 引脚),并且不使用的功能应
发表于 2019-11-14
STM8L低功耗调试总结
STM8的停机模式
首先,STM8有三种低功耗模式,即等待、活跃停机和停机。具体它们三者有什么区别自己看官方手册去吧,这里只讲停机模式的应用,其他的一笔带过!一、进入的方式:等待模式进入用的指令是WFI,而活跃停机和停机用的都是halt(),所不同的是,在执行halt指令之前,如果开启了AWU,则是活跃停机,反之则是停机。还有一点要说明的是,在停机模式下独立看门狗是不能养的,而只能养窗口看门狗。二、具体进入的步骤:1、首先,你声明一个标志位,名字自己取。这个标志位是用来判断系统是该处于运行模式还是处于停机模式的。我这里用fPowerOn_flag,如下:bool fPowerOn_flag = FALSE;有了这个标志位以后就写下面的部分了:int
发表于 2019-11-14
halt低功耗模式
1. stm8l152有5种低功耗模式,wait mode, low power run mode, low power wait mode, active-halt mode, halt mode.2. 在halt模式下,cpu和外设时钟停止,可以通过外部中断或者复位来唤醒。3. 本实验设计为:led灯亮,紧接着进入halt模式,有按键时,中断,快速唤醒,led灯灭。     PWR_FastWakeUpCmd(ENABLE);  //快速唤醒使能     //所有IO输出低电平    GPIO_Init(GPIOA
发表于 2019-11-14
STM8L051低功耗模式测试文档
STM8L051的五种低功耗模式wait ,low power run mode,low power wait mode,Ative-Halt mode,Halt mode。WAIT  mode  在等待模式,CPU的时钟是停止的,被选择的外设继续运行。WAIT mode 分为两种方式:WFE,WFI。WFE是等待事件发生,才从等待模式中唤醒。WFI是等待中断发生,才从等待模式中唤醒。low power run mode  在低功耗运行模式下,CPU和被选择的外设在工作,程序执行在LSI或者LSE下,从RAM中执行程序,Flash和EEPROM都要停止运行。电压被配置成Ultra Low Power
发表于 2019-11-14
stm8l 低功耗 halt_active模式
第一次尝试做低功耗,芯片stm8l,用的半halt模式1、关于唤醒,可以用外部中断和RTC(stm8l不同的模式用的唤醒方式均不同)2、关于省电,如果没达到理想的电流,一般都是gpio口问题,没用到的都悬浮输入或输出低都是可以的,用到的统一量一下电平,看看哪个状态不对
发表于 2019-11-14
STM8L EXITB一个端口两个中断的实现
void EXTI_Config(void){     EXTI_DeInit();       EXTI_SetPinSensitivity(EXTI_Pin_5,EXTI_Trigger_Falling);     ITC_SetSoftwarePriority(EXTI5_IRQn, ITC_PriorityLevel_1);    GPIO_Init(KEY_PORT, KEY_RT_PIN, GPIO_Mode_In_PU_IT);    EXTI_SetPinSensitivity(
发表于 2019-11-14
小广播
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号 电信业务审批[2006]字第258号函 京公海网安备110108001534 Copyright © 2005-2019 EEWORLD.com.cn, Inc. All rights reserved