打印
[STM8]

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

[复制链接]
569|8
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
前言:我的第一篇博客,快被逼疯了。用的STM8S003F3,耗时5天,问题已解决,结局很坑!

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

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

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

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

1,我配置了16M的主频

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

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

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

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



使用特权

评论回复
评论
kmnqhaha 2023-5-25 16:26 回复TA
———————————————— 版权声明:本文为CSDN博主「Genius3115」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。 原文链接:https://blog.csdn.net/Genius3115/article/details/80221280 
沙发
kmnqhaha|  楼主 | 2023-5-25 19:06 | 只看该作者
大体就是让我配置一下,网上各种配置方法,精简后,所有网上内容都统一为:

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();        //喂狗

}

使用特权

评论回复
板凳
kmnqhaha|  楼主 | 2023-5-25 19:07 | 只看该作者
操作寄存器和库函数都有了,而且是不出错的

void WDT(void)//喂狗
{  
   IWDG->KR = 0xaa;

}

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

使用特权

评论回复
地板
kmnqhaha|  楼主 | 2023-5-25 19:09 | 只看该作者
我真心是为了解决问题把独立喂狗IWDG都快吃透了,保证看门狗配置绝对没问题了,复位问题还是没解决!

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

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

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

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

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

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

使用特权

评论回复
5
kmnqhaha|  楼主 | 2023-5-25 19:12 | 只看该作者
快疯了,要交差,半路出现问题搞不定

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

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
kmnqhaha|  楼主 | 2023-5-25 19:13 | 只看该作者
本帖最后由 kmnqhaha 于 2023-5-25 19:14 编辑

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

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

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

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

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

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



最终:Vcap将它的电容从103改为105,复位问题奇迹般不再发生了(1uF)。
为什么我就选了103?!啊?因为我特么从网上百度随便找了个百度文库照抄的!坑啊!(NRST也没加电容!)

使用特权

评论回复
7
lidi911| | 2023-5-25 19:22 | 只看该作者
踩过的坑都是后来的经验啊

使用特权

评论回复
8
Jacquetry| | 2023-5-25 20:06 | 只看该作者
看门狗还是留着比较好

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

40

主题

198

帖子

1

粉丝