ImageVerifierCode 换一换
格式:DOCX , 页数:15 ,大小:1,008.89KB ,
资源ID:17830712      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/17830712.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(STM32 例程看门狗文档格式.docx)为本站会员(b****4)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

STM32 例程看门狗文档格式.docx

1、一旦启动独立看门狗,就不能停止(LSI也不能被禁止);看门狗被激活后,则在计数器计数至0x000时产生复位;在电源稳定期间,即使系统进入STOP和STANDBY模式,独立看门狗复位能将系统从STANDBY模式唤醒。最适合应用于要求看门狗运行时,完全独立与主应用之外的项目编辑 硬件电路分析:这里的核心是在STM32内部进行,并不需要外部电路。但是考虑到指示当前状态和喂狗等操作,我们需要2个IO口,一个用来输入喂狗信号,另外一个用来指示程序是否重启。喂狗我们采用板上的WAKEUP键来操作,而程序重启,则是通过LED4来指示的。LED4和WAKEUP的连接在前面跑马灯实验已经介绍了,这里我们不再多说

2、.STM32的独立看门狗由内部专门的40Khz低速时钟驱动,即使主时钟发生故障,它也仍然有效。这里需要注意独立看门狗的时钟并不是准确的40Khz,而是在3060Khz之间变化的一个时钟,只是我们在估算的时候,以40Khz的频率来计算,看门狗对时间的要求不是很精确,所以,时钟有些偏差,都是可以接受的。通过对LSI进行校准可获得相对精确的看门狗超时时间。有关LSI校准的问题,详见数据手册LSI时钟一节。IWDG的功能框图如上所示。可以看出,IWDG主要由4个寄存器控制。Prescaler register :预分频寄存器Status register :状态寄存器Reload register :

3、重装载寄存器Key Register :键值寄存器IWDG的工作流程如下:40KHz的LSI时钟信号发送至8位预分频器进行分频,分频后的时钟信号发送至12位的递减计数器,重装载寄存器把12位的重装载数值发送至递减计数器,如果12位的递减计数器没有得到12位的重装载数值,当计数减至0x000时IWDG则复位具体的寄存器的使用和特点见下。IWDG寄存器介绍:IWDG寄存器结构,IWDG_TypeDeff,在文件“stm32f10x_map.h”中定义如下:typedef struct vu32 KR; /Key Register键值寄存器vu32 PR; /Prescaler register预分

4、频寄存器vu32 RLR; /Reload registe重装载寄存器vu32 SR; /Status register状态寄存器 IWDG_TypeDef;IWDG外设声明于文件“stm32f10x_map.h”:#define PERIPH_BASE (u32)0x40000000) #define APB1PERIPH_BASE PERIPH_BASE #define APB2PERIPH_BASE (PERIPH_BASE + 0x10000) #define AHBPERIPH_BASE (PERIPH_BASE + 0x20000) #define IWDG_BASE (APB1P

5、ERIPH_BASE + 0x3000) #ifndef DEBUG . #ifdef _IWDG #define IWDG (IWDG_TypeDef *) IWDG_BASE) #endif /*_IWDG */ #else /* DEBUG */ EXT IWDG_TypeDef *IWDG;#endif为了访问IWDG寄存器, _IWDG必须在文件“stm32f10x_conf.h”中定义如下:#define _IWDG编辑 键寄存器(IWDG_KR) . 位31:16 保留,始终读为0。位15:0 KEY15:0: 键值(只写寄存器,读出值为0x0000) (Key value) 软

6、件必须以一定的间隔写入0xAAAA,否则,当计数器为0时,看门狗会产生复位。写入0x5555表示允许访问IWDG_PR和IWDG_RLR寄存器。写入0xCCCC,启动看门狗工作(若选择了硬件看门狗则不受此命令字限制)。在WDG_KR中写入0xCCCC,开始启用独立看门狗;此时计数器开始从其复位值0xFFF递减计数。当计数器计数到末尾0x000时,会产生一个复位信号(IWDG_RESET)。无论何时,只要键寄存器IWDG_KR中被写入0xAAAA, IWDG_RLR中的值就会被重新加载到计数器中从而避免产生看门狗复位。IWDG_PR和IWDG_RLR寄存器具有写保护功能。要修改这两个寄存器的值,

7、必须先向IWDG_KR寄存器中写入0x5555。以不同的值写入这个寄存器将会打乱操作顺序,寄存器将重新被保护。重装载操作(即写入0xAAAA)也会启动写保护功能。对于寄存器的典型值,在stm32f10x.h中有如下定义 #define IWDG_WriteAccess_Enable (uint16_t)0x5555)#define IWDG_WriteAccess_Disable (uint16_t)0x0000)编辑 预分频寄存器(IWDG_PR) 预分频寄存器(IWDG_PR),该寄存器用来设置看门狗时钟的分频系数,最低为4,最高位256,该寄存器是一个32位的寄存器,但是我们只用了最低3

8、位,其他都是保留位。预分频寄存器各位定义如下:3 保留,始终读为0。位2:0 PR2: 预分频因子 (Prescaler divider) 这些位具有写保护设置.通过设置这些位来选择计数器时钟的预分频因子。要改变预分频因子,IWDG_SR寄存器的PVU位必须为0。000: 预分频因子=4 001: 预分频因子=8 010: 预分频因子=16 011: 预分频因子=32 100: 预分频因子=64 101: 预分频因子=128 110: 预分频因子=256 111:注意:对此寄存器进行读操作,将从VDD电压域返回预分频值。如果写操作正在进行,则读回的值可能是无效的。因此,只有当IWDG_SR寄存

9、器的PVU位为0时,读出的值才有效。预分频值的设定,在stm32f10x.h中有如下定义 #define IWDG_Prescaler_4 (uint8_t)0x00)#define IWDG_Prescaler_8 (uint8_t)0x01)#define IWDG_Prescaler_16 (uint8_t)0x02)#define IWDG_Prescaler_32 (uint8_t)0x03)#define IWDG_Prescaler_64 (uint8_t)0x04)#define IWDG_Prescaler_128 (uint8_t)0x05)#define IWDG_Pre

10、scaler_256 (uint8_t)0x06)编辑 重装载寄存器(IWDG_RLR) 在介绍完IWDG_PR之后,我们介绍一下重装载寄存器。该寄存器用来保存重装载到计数器中的值。该寄存器也是一个32位寄存器,但是只有低12位是有效的,该寄存器的各位描述如下:12 保留,始终读为0。位11:0 RL11:看门狗计数器重装载值 (Watchdog counter reload value) 这些位具有写保护功能。用于定义看门狗计数器的重装载值,每当向IWDG_KR寄存器写入0xAAAA时,重装载值会被传送到计数器中。随后计数器从这个值开始递减计数。看门狗超时周期可通过此重装载值和时钟预分频值来

11、计算。只有当IWDG_SR寄存器中的RVU位为0时,才能对此寄存器进行修改。注:因此,只有当IWDG_SR寄存器的RVU位为0时,读出的值才有效。编辑 状态寄存器(IWDG_SR) 2 保留。位1 RVU:看门狗计数器重装载值更新 (Watchdog counter reload value update) 此位由硬件置1用来指示重装载值的更新正在进行中。当在VDD域中的重装载更新结束后,此位由硬件清0(最多需5个40kHz的RC周期)。重装载值只有在RVU位被清0后才可更新。位0 PVU:看门狗预分频值更新 (Watchdog prescaler value update) 此位由硬件置1用

12、来指示预分频值的更新正在进行中。当在VDD域中的预分频值更新结束后,此位由硬件清0(最多需5个40kHz的RC周期)。预分频值只有在PVU位被清0后才可更新。编辑 IWDG寄存器映像IWDG寄存器映像和复位值 有关寄存器的起始地址,参见数据手册. 编辑 程序分析编辑 固件库库函数分析:IWDG的库函数如下所示:编辑 函数IWDG_WriteAccessCmd IWDG_WriteAccess 该参数使能或者失能对寄存器IWDG_PR和IWDG_RLR的写操作函数原型如下:void IWDG_WriteAccessCmd(uint16_t IWDG_WriteAccess) /* Check t

13、he parameters */ assert_param(IS_IWDG_WRITE_ACCESS(IWDG_WriteAccess); IWDG-KR = IWDG_WriteAccess; 可以看出,该函数的作用就是把输入参数传递到IWDG_KR中去.在stm32f10x.h中我们找到输入参数的定义,如下所示 #define IS_IWDG_WRITE_ACCESS(ACCESS) (ACCESS) = IWDG_WriteAccess_Enable) | (ACCESS) = IWDG_WriteAccess_Disable)由硬件分析可知,写入0x5555表示允许访问IWDG_PR和

14、IWDG_RLR寄存器。重装载操作(即使写入0xAAAA)也会启动写保护功能。所以IWDG_WriteAccess_Enable和IWDG_WriteAccess_Disable 的含义与字面含义不同,作用分别为使能和失能IWDG_PR和RWDG_RLR的写操作.IWDG_WriteAccessCmd(IWDG_WriteAccess_Enable);/关闭IWDG_PR和IWDG_RLR的写保护IWDG_WriteAccessCmd(IWDG_WriteAccess_Disable);/打开IWDG_PR和IWDG_RLR的写保护编辑 函数IWDG_SetPrescaler IWDG_Pre

15、scaler 该参数设置了IWDG的预分频值这些参数被定义在stm32f10x.h中. 1. define IWDG_Prescaler_4 (uint8_t)0x00) 2. define IWDG_Prescaler_8 (uint8_t)0x01) 3. define IWDG_Prescaler_16 (uint8_t)0x02) 4. define IWDG_Prescaler_32 (uint8_t)0x03) 5. define IWDG_Prescaler_64 (uint8_t)0x04) 6. define IWDG_Prescaler_128 (uint8_t)0x05)

16、 7. define IWDG_Prescaler_256 (uint8_t)0x06) 详见硬件分析中的预分频寄存器.void IWDG_SetPrescaler(uint8_t IWDG_Prescaler) assert_param(IS_IWDG_PRESCALER(IWDG_Prescaler);PR = IWDG_Prescaler;可以看出该函数的作用也仅仅为把IWDG_Prescaler的值传递至预分频寄存器中.使用方法,例如:/* 设置预分频为8分频 */ IWDG_SetPrescaler(IWDG_Prescaler_8);编辑 函数IWDG_SetReload void

17、 IWDG_SetReload(uint16_t Reload) assert_param(IS_IWDG_RELOAD(Reload);RLR = Reload;如上面的函数一样,该函数的作用一样简单清晰,仅仅为把需要设定的重装载值传递到IWDG_RLR寄存器中.喂狗时间 (单位ms)= (预分频系数/4)*0.1*RLR(重装载值)比如,我想达到喂狗时间越为1S的效果,为此我们选择32分频,带入计算可得1000 = (32/4)*0.1*RLRRLR = 1000/(32/4*0.1) = 1250 = 0x4E2即当设置了预分频为32后,我们使用IWDG_SetReload(0x4E2)

18、;后,喂狗时间约为1S实际上,喂狗时间不可能无穷大,或者无穷小。下图为看门狗超时时间:编辑 函数IWDG_ReloadCounter /* 喂狗 */ IWDG_ReloadCounter();该函数原型为 void IWDG_ReloadCounter(void)KR = KR_KEY_Reload;在stm32f10x.c中我们可以找到以下的定义 #define KR_KEY_Reload (uint16_t)0xAAAA) /初始的喂狗值,格段时间喂一次KR_KEY_Reload的值为0xAAA,对照着函数代码可知,该函数的作用仅仅是向IWDG_KR中传输0xAAA,由上面的寄存器分析可

19、知,向KR寄存器写入0XAAA后,IWDG_RLR中的值就会被重新加载到计数器中从而避免产生看门狗复位。 这个也就是我们说的喂狗操作.编辑 函数IWDG_Enable 该函数的原型如下:void IWDG_Enable(void)KR = KR_KEY_Enable;和上个函数相同,该函数的作用为向IWDG_KR中写入KR_KEY_Enable的值.我们可以在stm32f10x.c中找出KR_KEY_Enable的定义 #define KR_KEY_Enable (uint16_t)0xCCCC)通过硬件分析中的KR寄存器分析可知,向IWDG_KR中写入0xCCCC的效果为启用看门狗.直接调用

20、这个函数就可以启用看门狗.编辑 函数IWDG_GetFlagStatus 该函数原型如下:FlagStatus IWDG_GetFlagStatus(uint16_t IWDG_FLAG) FlagStatus bitstatus = RESET; assert_param(IS_IWDG_FLAG(IWDG_FLAG); if (IWDG-SR & IWDG_FLAG) != (uint32_t)RESET) bitstatus = SET; else bitstatus = RESET; /* Return the flag status */ return bitstatus;在stm3

21、2f10x.h中有如下定义:typedef enum RESET = 0, SET = !RESET FlagStatus, ITStatus;可以看出RESET和SET的值分别为0,1.由此可以看出,该函数的作用为,通过读取IWDG_SR寄存器的相应位,来检测IWDG当前的的状态,并返回。详见上面状态寄存器(IWDG_SR)介绍.编辑 程序设计简要分析:看门狗是定时器的一种,一般定时器的使用过程如下:初始化定时器的设置。包括工作方式等,并开启中断和计数功能。2.启用寄存器后,经过一定的耗时,如果在定时器溢出之前没有刷新定时器的数值,则定时器将溢出,并申请中断。3.定时器中断后执行相应的中断服

22、务程序.与一般定时器不同的是,看门狗溢出所对应的中断服务程序只须一条指令,即在中断向量地址写入无条件转移命令,把计算机拖回整个程序的第一行,对单片机重新进行初始化并获得正确的执行顺序 通过硬件分析可知,事实上我们只要三个寄存器进行相应的设置,就可以启动STM32的独立看门狗,启动过程可以按如下步骤实现:1)向IWDG_KR写入0X5555。通过这步,我们取消IWDG_PR和IWDG_RLR的写保护,使后面可以操作这两个寄存器。设置IWDG_PR和IWDG_RLR的值。这两步设置看门狗的分频系数,和重装载的值。由此,就可以知道看门狗的喂狗时间,该时间的计算方式为:Tout=40Khz/(4*2p

23、rer)*rlr);当然这个值是个粗略的计算值,因为时钟不准确,所以无法得到准确的喂狗时间。2)向IWDG_KR写入0XAAAA。通过这步操作,将使STM32重新加载IWDG_RLR的值到看门狗计数器里面。也可以用该命令来喂狗。向IWDG_KR写入0XCCCC通过这步操作,我们就可以启动STM32的看门狗。如果一段时间内,不向IWDG_KR写入0XAAAA,则程序复位,调回整个程序的第一行.编辑 TB开发板LED程序流程图=编辑 TB开发板程序源代码:Main.c/* * Jason * jiangjjemsym * */*iwdg*/#include stm32f10x.hstm32f10x

24、_iwdg.hTB_LED.hTB_KEY.hvoid iwdg_init();void delay();/*-/ 函数名称: int main()/ 入口参数: 无/ 输 出:/ 函数功能: 主函数-*/int main(void)/初始化LED1和LED3 TB_LEDInit(LED1); TB_LEDInit(LED3);/立即熄灭LED3 TB_LEDOff(LED3);/延时一段时间后,熄灭LED1 delay(); TB_LEDOff(LED1);/初始化按键WAKEUP按键的中断 TB_PBInit(BUTTON_WAKEUP, BUTTON_MODE_EXTI);/PA0/初始化看门狗 iwdg_init(); while(1); return 0; void iwdg_init() 初始化看门狗void iwdg_init() IWDG_WriteAccessCmd(IWDG_WriteAccess_Enable); IWDG_SetReload(0xfff); /设置重装载值为0xfff IWDG_SetPrescaler(IWDG_Prescaler_32); /设置预分频系数为32/ IWDG_ReloadCounter(); IWDG_Enable(); /使能看门狗/*-

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1