历史上的今天
返回首页

历史上的今天

今天是:2024年11月07日(星期四)

正在发生

2019年11月07日 | STM8S——watchdog(IWDG)

2019-11-07 来源:eefocus

IWDG工作原理:


  1、当键值寄存器(IWDG_KR)中写入数值0xCC后,独立看门狗就会被启动,计数器开始从它的复位值0xFF开始递减计数,当计数减到0x00时就会产生一个复位信号。


  2、使用IWDG_PR和IWDG_RLR寄存器配独立看门狗。


  (1)IWDG_PR寄存器是用于选择驱动计数器时钟的预分频系数。


  (2)当KEY_REFRESH的数值(0xAA)写入到IWDG_KR寄存器时,独立看门狗将用IWDG_RLR的数值刷新计数器的内容,从而避免了产生看门狗的复位。


  3、IWDG_PR和IWDG_RLR寄存器具有写保护功能,要修改它们前,需首先在IWDG_KR寄存器写入KEY_ACCESS代码(0x55);在IWDG_KR写入0xAA将恢复写保护状态。


 IWDG工作细节:


1、为了避免程序忙跑跑死了没反应,加上一个看门狗watchdog实时监控着程序,一旦程序没有在规定的时间喂狗,则狗叫使得单片机复位。


2、Independent watchdog(IWDG)内部有时钟源(128kHz),所以即使主时钟挂了watchdog还是能继续工作的。


   另外还有个Window watchdog (WWDG),比IWDG复杂得多,我们没有采用。


3、由于内部是128kHz,所以watchdog能允许的最大延迟时间为510ms(当RL[7:0]= 0xFF时),最小延迟时间为2ms(当RL[7:0]= 0x00时);我们选取510ms。

  也就是说一旦打开看门狗,最迟每隔510ms就要进行喂狗操作,否则看门狗将会打开复位。


4、看门狗的实现不难,难点在于怎样验证自己设置的看门狗是否正确,难点在与想办法测试watchdog。


   方法是在while(1)的循环里延时510ms以上(如延时600ms),通过对相关寄存器特征值的显示查看,来判断单片机是否被复位,若被复位则验证成功。


5、值得注意的是,开门狗一旦打开就无法关闭,只有通过不断的喂狗来防止复位。


6、下面给出代码思路并且附带详细注释:


   由于延时函数如果延时太久会无法实现喂狗操作,所以应该在原来的Delay1ms()函数的基础上,再另外定义一个newDelay()函数,目的是每次延时250ms时(即调用Delay1ms(250))喂狗;



  1 /*-- private variable --*/

  2 __IO uint32_t space_reloadTM = 250;//define every after 250 ms reload IWDG

  3 

  4 /*-- private function --*/

  5 void NewDelay(__IO uint32_t nTime);//include reload IWDG

  6 

  7 static void IWDG_Config_Enable(void);//config and enable IWDG

  8 

  9 

 10 /*-- main function --*/

 11 int main()

 12 {

 13     IWDG_Config_Enable(); //config and enable IWDG 

 14 

 15     //for test

 16     while (1)

 17     {

 18         Delay1ms(600); //timeout and reset happend

 19         

 20         /*-- never runs here --*/

 21       

 22         //Reload IWDG counter

 23         IWDG_ReloadCounter();

 24     }

 25 }

 26 

 27 

 28 

 29 void NewDelay(__IO uint32_t nTime)

 30 {

 31     uint32_t time_divisor = nTime/space_reloadTM;

 32     uint32_t time_remainder = nTime%space_reloadTM;

 33     uint8_t i;

 34     

 35     /* every after 250ms reload IWDG */

 36     for(i=0;i 37     {

 38         Delay1ms(space_reloadTM);

 39         //Reload IWDG counter

 40         IWDG_ReloadCounter();

 41     }

 42     

 43     /* delay the remain time */

 44     Delay1ms(time_remainder);

 45     //Reload IWDG counter

 46     IWDG_ReloadCounter();

 47 }

 48 /*

 49 void Delay1ms(__IO uint32_t nTime)

 50 {

 51   TimingDelay = nTime;

 52 

 53   while (TimingDelay != 0);

 54 }

 55 */

 56 

 57 

 58 

 59 /**

 60  * @brief  Configures the IWDG to generate a Reset if it is not refreshed at the

 61  *         correct time.

 62  * @param  None

 63  * @retval None

 64  */

 65 static void IWDG_Config_Enable(void)

 66 {

 67     /* Check if the system has resumed from IWDG reset */

 68     if (RST_GetFlagStatus(RST_FLAG_IWDGF) != RESET)

 69     {

 70         printf("nr");

 71         uart2str(uartbuff,RST->SR,8,2,'0');   //output RST register

 72         printf("Timeout, RST_SR=%snr",uartbuff);

 73         

 74         printf("timeout!!!");

 75         

 76         /* IWDGF flag set */

 77         /* Clear IWDGF Flag */

 78         RST_ClearFlag(RST_FLAG_IWDGF);

 79     }

 80     else

 81     {

 82         //IWDGF flag is not set

 83     }

 84     

 85     

 86     /* --- IWDG Configuration --- */

 87     

 88     /* Enable IWDG (the LSI oscillator will be enabled by hardware) */

 89     IWDG_Enable(); //0xCC

 90     

 91     /* IWDG timeout equal to 250 ms (the timeout may varies due to LSI frequency

 92      dispersion) */

 93     /* Enable write access to IWDG_PR and IWDG_RLR registers */

 94     IWDG_WriteAccessCmd(IWDG_WriteAccess_Enable); //0x55

 95     

 96     /* IWDG counter clock: LSI/128 */

 97     IWDG_SetPrescaler(IWDG_Prescaler_128);

 98     

 99     /* Set counter reload value to obtain 250ms IWDG Timeout.

100      Counter Reload Value = 250ms/IWDG counter clock period

101      = 250ms / (LSI/128)

102      = 0.25s / (LsiFreq/128)

103      = LsiFreq/(128 * 4)

104      = LsiFreq/512

105      */

106     IWDG_SetReload((uint8_t)(0xFF));//510ms

107     

108     /* Reload IWDG counter */

109     IWDG_ReloadCounter(); //0xAA

110 }

watchdog

 


   为了验证代码的可实现性,故意在主函数中调用Delay1ms(600),所以正确的执行结果应该是:执行Delay1ms(600),watchdog启动复位,输出timeout之类的提示;


   其中证明是否是watchdog启动的复位:查看RST->SR(Reset status register)中Bit1的值,为1表示An IWDG reset occurred,为0表示No IWDG reset occurred。

推荐阅读

史海拾趣

Electro Adapter Inc公司的发展小趣事

随着公司产品的日益成熟,EA公司开始寻求更广阔的市场空间。公司不仅在国内市场加大推广力度,还积极开拓国际市场。在海外市场,EA公司面临着文化差异、法规差异等挑战,但公司通过深入的市场调研和精准的市场定位,成功地将产品推向了欧洲、北美等发达国家和地区。同时,EA公司还加强了品牌宣传,通过参加国际展会、赞助行业活动等方式,提高了品牌知名度和影响力。

Anytek Technology Corporation Ltd公司的发展小趣事

为了进一步满足市场需求,Anytek在2005年投建了安尼泰科(中国)生产基地,并成功投产运营。这一举措不仅大幅提升了公司的生产能力,也为后续的产品研发和市场拓展奠定了坚实基础。同年,Anytek的产品还通过了SGS ISO 9001(2000)国际质量体系认证,这标志着公司的产品质量和管理水平达到了国际标准,为公司的国际化发展打开了新局面。

DPA Components International公司的发展小趣事

DPA Components International公司非常重视企业文化的建设。公司倡导“以人为本、追求卓越”的企业文化,注重员工的培训和发展。公司为员工提供丰富的培训资源和职业发展机会,鼓励员工不断创新和进取。同时,DPA还建立了完善的激励机制和福利制度,让员工感受到公司的关怀和温暖。在这种积极向上的企业文化氛围中,员工的工作积极性和创造力得到了充分激发,为公司的持续发展提供了强大动力。

台湾君耀(Brightking)公司的发展小趣事

2018年,君耀正式加入国巨集团,成为其旗下的一员。这一举措使得君耀能够获得国巨集团在资金、技术、市场等多方面的支持,进一步加速了其发展步伐。通过资源整合和优势互补,君耀在半导体器件领域的地位更加稳固,市场竞争力也得到提升。

CIF公司的发展小趣事

D公司始终坚持品质至上的经营理念,以提供高品质的电子产品为己任。在CIF交易模式下,D公司严格控制产品质量,从原材料采购到生产流程中的每一个环节都进行严格把关。凭借出色的产品质量和良好的售后服务,D公司赢得了客户的信任和好评。

Elpac公司的发展小趣事

在电子产品同质化日益严重的今天,Elpac公司始终坚持品质至上的原则。公司严格把控产品质量,从原材料采购到生产流程再到售后服务,每一个环节都力求做到最好。正是这种对品质的执着追求,让Elpac公司的产品在市场上脱颖而出。许多客户在体验过Elpac公司的产品后,都对其赞不绝口,成为了公司的忠实用户。

问答坊 | AI 解惑

我做的PIC下载调试器ICD2.5,拿出来秀下,相当便宜

PIC烧写调试器ICD2,18F4550+16F877A+USB取电,配进口USB线, 淘宝地址http://auction1.taobao.com/auction/item_detail-0db2-f856961a8480fb64ad9297cf42c260f3.jhtml…

查看全部问答>

ATMEGA8

很奇怪的问题                      我到我朋友那去,写了个简单的循环点灯的程序,编译后烧到芯片里是OK的 然后我把他的设备都拿回去,用我自己电脑上的avr   ...…

查看全部问答>

您正在尝试访问一个早期版本的 SQL Server Compact Edition 数据库。如果是 SQL Server CE 1.0 或 2.0 数据库……

我用vs2005,c#编写了一个简单的数据库操作程序,代码如下:             string strconn = @\"Data Source=\\Northwindoledb.sdf\";             SqlCeConnec ...…

查看全部问答>

关于操作系统中自检问题

本人做了个上电自检的程序,是基于vxworks6.5的, 我把自检函数直接添加在usrconfig.c文件中,usrRoot()函数里,bootrom启动过程中完成了上电自检, 且检测所有硬件(主要是内存和flash)都正常,可是生成操作系统以后(用workbench生成的操作系 ...…

查看全部问答>

HVQFN33是什么封装,ms只有LPC111x有这种封装……

如题,看到了不解。是和某种别的封装兼容吗?…

查看全部问答>

自制硬币收音机

摘要: 我们称这个收音机为三个硬币收音机是因为我们使用了三个硬币作为锚点,连接收音机各个部件,这将使我们的制作过程变得极为简单。在这个收音机中我们使用了一个特殊的10晶体管集成电路,使最后做出的收音机效果非常出 ...  我们称这个 ...…

查看全部问答>

请教STR912KEIL下UCOS移植

楼主:     你好!     买了一个STR912的开发板,发现912的性能还不错,听说又有一个加强版的要出来了,很想把UCOS移上去,请发一个移植模板.谢谢!…

查看全部问答>

串口DMA发送的问题

u8 buf1[100]; //都初始化0 u8 buf2[100]; //都初始化0 u16 rev;   //中断接收计数 串口发送方式: DMA 串口接收方式: 中断 DMA_InitStructure.DMA_PeripheralBaseAddr = USART1_DR_Base; DMA_InitStructure.DMA_MemoryBaseAdd ...…

查看全部问答>

【求助】我用c编程,想给某个引脚定义个名称,比如

我想给P3.1定义为data,然后编程时写data=1;P3.1就输出1,我该如何定义? 我写了 #define P3.1 data 不好使啊???…

查看全部问答>

FPGA设计正弦波

用FPGA设计的正弦波发生器为什么在示波器上的输出频率不受频率控制字的影响?…

查看全部问答>