历史上的今天
今天是:2024年09月23日(星期一)
2020年09月23日 | STM8s窗口看门狗
2020-09-23 来源:eefocus
看看窗口看门狗的框图

从图里看出产生复位信号有2个方式:
1 WDGCR寄存器的T6 由1变0,也就是从此寄存器的值从0x40变成0x3F会产生复位信号;
2 当寄存器WDGCR的值大于WDGWR的时候写WDGCR寄存器会产生复位信号;
解释:
WDGCR的最高位WDGA是开启看门狗的(WDGA=1开启),当然如果开启了硬件看门狗这个位就没用了。硬件看门狗在OPTION BYTES里设置。
WDGCR的低六位是计数用的从图里可以得出这个计数器的时钟是fCPU时钟分频得来的。这个分频值固定是12288,根据这个可以计算看门狗的延时时间。
WDGWR是窗口寄存器,最高位保留,低六位保存的是窗口值,从图里的逻辑图发现comparator=1 when T6:0>W6:0,意思是当WDGCR计数值大于WDGCR
且此时Write WDGCR(这个意思是软件刷新计数器的值)就会产生一个复位信号复位stm8s。当然我们不想这个事情发送。所以在写程序的时候不能在计时器的值
大于窗口寄存器设定值的时候刷新计数器的值。所以在设定这个窗口寄存器数值的时候只能设定在0x7f~0xC0之间。
程序:
知道窗口电子狗怎么工作那么编程就好说了,三件事:
1 设定窗口寄存器值,开启看门狗(WDGA=1),这是初始化看门狗
2 判断看门狗计数值是否小于窗口值,是就喂狗
代码如下:
用stm8s的官方库。
WWDG_Init(0x7f, 0x50); //初始化
CounterValue = (u8)WWDG->CR & 0x7F;
if(CounterValue < WINDOW){
WWDG_SetCounter(COUNTERINIT); //喂狗
}
解释一下WWDG_Init这个函数体的内容是:
void WWDG_Init(uint8_t Counter, uint8_t WindowValue)
{
/* Check the parameters */
assert_param(IS_WWDG_WINDOWLIMITVALUE_OK(WindowValue));
WWDG->WR = WWDG_WR_RESET_VALUE;
WWDG->CR = (uint8_t)((uint8_t)(WWDG_CR_WDGA | WWDG_CR_T6) | (uint8_t)Counter);
WWDG->WR = (uint8_t)((uint8_t)(~WWDG_CR_WDGA) & (uint8_t)(WWDG_CR_T6 | WindowValue));
}
WWDG_SetCounter的源码是:
void WWDG_SetCounter(uint8_t Counter)
{
/* Check the parameters */
assert_param(IS_WWDG_COUNTERVALUE_OK(Counter));
/* Write to T[6:0] bits to configure the counter value, no need to do
a read-modify-write; writing a 0 to WDGA bit does nothing */
WWDG->CR = (uint8_t)(Counter & (uint8_t)BIT_MASK);
}
assert_param是参数检查,其他没啥好说的。搞清楚寄存器作用就行了。其他问题暂时想不起来。哦,对了延时时间看下图:

这里说得比较清楚如果stm8用的是内部HSI 16M晶振切fCPU的分频也是0那么窗口看门狗的时钟频率就是fCPU/12288,那么一个计时周期就是12288/fCPU就是0.768ms
如果设定的窗口值是0x50,那么从0x7F数下来一算就知道了。0.768*(0x7f-0x50)。要注意这里fCPU不一定是16m(CPUDIV分频系数可以改变),如果要搞清楚stm8的时钟频率看下面这个图。这里就不做详细讨论了,以后在说。

史海拾趣
|
部分几台机子出现CF卡内容被冲掉的现象, 格式化后重新分区又可以使用, 个别出现CF损坏。 可自己怎么实验就是没法模拟重现这个想象,真没头绪 CF卡使用的PXA255的自带CF控制器,Kinston 1G CF卡,OS是4.2。 大家有没有碰到过这个现象? 谢谢 … 查看全部问答> |
|
个位大侠: 我是刚自学usb驱动程序,求一个usb摄像头驱动程序源码(要Linux或无操作系统)做参考! 有意者请发一份给我!不慎感激!!! 我的e_mail:tulouzhizhu@163.com… 查看全部问答> |
|
我用的是 武汉创维特arm9s3c2410开发板 上面带的gprs模块型号为 BENQ M23 我用此模块与电脑窗口相连 一直连不通 超级终端的设置依次是:115200 8 无 1 硬件 试过其他波特率 也试过硬流控 & ...… 查看全部问答> |
|
关于我们 安防英才网(http://www.afjob88.com)作为一览英才网招聘网站成员,是一家从事成品监控、楼宇对讲、一卡通、防盗报警、门禁、停车场系统、智能化弱电工程、消防等企业提供人力资源服务的专业性人才网站。自创办以来,凭借专业的团队、 ...… 查看全部问答> |
|
刚搞了一块 stm32f4 discovery, 打开它的一个工程文件, 所有的头文件声明都集中在 stm32f4xx_conf.h中声明,可是找遍所有的文件,都没看到在哪里include \"stm32f4xx_conf.h\", 这是怎么回事啊? 如果不用这个配置头文件,我自己在主程序中把要用 ...… 查看全部问答> |
|
#include \"io430.h\" #include \"io430g2553.h\" void Rturn() { P1DIR=BIT0+BIT2; P2DIR=BIT0+BIT1; //使 P1.0 P1.2 P2.0 P2.2为输出端// &n ...… 查看全部问答> |
|
一般来说,对通讯而言,都是基于某种通讯协议的,小弟我现在要做两块板子32间的can通讯,也没啥通讯协议的,想问一下,这些id,数据,或者帧格式等该怎么确定??… 查看全部问答> |
|
请教各位,如果我没有做任何的时序约束,编译通过了,是不是意味着我的寄存器没有出现时序违规,即都满足setup和hold时间,还是他即使出现了时序问题,也不会提示报错。谢谢了~~… 查看全部问答> |




