历史上的今天
返回首页

历史上的今天

今天是:2025年01月14日(星期二)

正在发生

2019年01月14日 | stm32F4XX之独立看门狗 HAL库

2019-01-14 来源:eefocus

1:简介


独立看门狗 (IWDG) 由其专用低速时钟 (LSI) 驱动,因此即便在主时钟发生故障时仍然保持 工作状态。窗口看门狗 (WWDG) 时钟由 APB1 时钟经预分频后提供,通过可配置的时间窗 口来检测应用程序非正常的过迟或过早的操作。


IWDG 最适合应用于那些需要看门狗作为一个在主程序之外,能够完全独立工作,并且对时 间精度要求较低的场合。WWDG 最适合那些要求看门狗在精确计时窗口起作用的应用程序。


独立看门狗的时钟是一个内部 RC时钟,所以并不是准确的 32Khz,而是在 15~47Khz 之间的一个可变化的时钟,只是我们在估算的时候,以 32Khz 的频率来计算,看门狗对时间的要求不是很精确,所以,时钟有些偏差,都是可以接受的


2:特性


● 自由运行递减计数器


● 时钟由独立 RC 振荡器提供(可在待机和停止模式下运行)


● 当递减计数器值达到 0x000 时产生复位(如果看门狗已激活)


3:功能说明


独立看门狗有几个寄存器与我们这节相关,我们分别介绍这几个寄存器。首先是关键字寄存器 IWDG_KR。当通过对关键字寄存器 (IWDG_KR) 写入值 0xCCCC 启动独立看门狗时,计数器开始从复位 值 0xFFF 递减计数。当计数器计数到终值 (0x000) 时会产生一个复位信号(IWDG 复位)。任何时候将关键字 0xAAAA 写到 IWWDG_KR 寄存器中,IWDG_RLR 的值就会被重载到计 数器,从而避免产生看门狗复位


IWDG_PR 和 IWDG_RLR 寄存器具有写保护功能。要修改这两个寄存器的值,必须先向IWDG_KR 寄存器中写入 0x5555。将其他值写入这个寄存器将会打乱操作顺序,寄存器将重新被保护。重装载操作(即写入 0xAAAA)也会启动写保护功能



接下来,我们介绍预分频寄存器(IWDG_PR),该寄存器用来设置看门狗时钟的分频系数,最低为 4,最高位 256,该寄存器是一个 32 位的寄存器,但是我们只用了最低 3 位,其他都是保留位。



在介绍完 IWDG_PR 之后,我们介绍一下重装载寄存器 IWDG_RLR。该寄存器用来保存重装载到计数器中的值。该寄存器也是一个 32 位寄存器,但是只有低 12 位是有效的



4:配置步骤


1)取消寄存器写保护,设置看门狗预分频系数和重装载值首先我们必须取消 IWDG_PR 和 IWDG_RLR 寄存器的写保护,这样才可以设置寄存器IWDG_PR 和 IWDG_RLR 的值。取消写保护和设置预分频系数以及重装载值在 HAL 库中是通

过函数 HAL_IWDG_Init 实现的。该函数声明为:


HAL_StatusTypeDef HAL_IWDG_Init(IWDG_HandleTypeDef *hiwdg);该函数只有一个入口参数 hiwdg,该参数是 IWDG_HandleTypeDef 结构体指针类型。接下来我们看看结构体 IWDG_HandleTypeDef 定义:

typedef struct

{

 IWDG_TypeDef *Instance;

IWDG_InitTypeDef Init; 

 HAL_LockTypeDef Lock;

 __IO HAL_IWDG_StateTypeDef State; 

}IWDG_HandleTypeDef;


成员变量 Instance 用来设置看门狗寄存器基地址,实际上在 HAL 库中已经通过标识符定义了,这里对于独立看门狗直接设置为标识符 IWDG 即可。


成员变量 Init 是一个 IWDG_InitTypeDef 结构体类型,该结构体只有 2 个成员变量,分别用来设置独立看门狗的预分频系数和重装载值,定义如下:


typedef struct

{

uint32_t Prescaler;

 uint32_t Reload; 

}IWDG_InitTypeDef;


成员变量 Lock 是一个锁存变量,该变量在 HAL 库中当操作配置 IWDG 之前设置为锁住LOCK,当配置操作完成之后设置为 UNLOCK,实际上是一个操作状态标识符。成员变量 State 也是 HAL 定义的一个过程标识符,用来记录 IWDG 处理状态


2)重载计数值喂狗(向 IWDG_KR 写入 0XAAAA)在 HAL 中重载计数值的函数是 HAL_IWDG_Refresh,该函数声明为:

HAL_StatusTypeDef HAL_IWDG_Refresh(IWDG_HandleTypeDef *hiwdg);该函数有一个入口参数为前面讲解的 IWDG_HandleTypeDef 结构体类型指针,它的作用是把值0xAAAA写入到IWDG_KR寄存器,从而触发计数器重载,即实现独立看门狗的喂狗操作。


3) 启动看门狗(向 IWDG_KR 写入 0XCCCC)

HAL 库函数里面启动独立看门狗的函数是 HAL_IWDG_Start:

HAL_StatusTypeDef HAL_IWDG_Start(IWDG_HandleTypeDef *hiwdg);


通过上面 3 个步骤,我们就可以启动 STM32F4 的独立看门狗了,使能了看门狗,在程序里面就必须间隔一定时间喂狗,否则将导致程序复位。


下面附相关代码


1:初始化部分


IWDG_HandleTypeDef IWDG_Handler; //独立看门狗句柄

 

//初始化独立看门狗

//prer:分频数:IWDG_PRESCALER_4~IWDG_PRESCALER_256

//rlr:自动重装载值,0~0XFFF.

//时间计算(大概):Tout=((4*2^prer)*rlr)/32 (ms).

void IWDG_Init(u8 prer,u16 rlr)

{

    IWDG_Handler.Instance=IWDG;

    IWDG_Handler.Init.Prescaler=prer; //设置IWDG分频系数

    IWDG_Handler.Init.Reload=rlr; //重装载值

    HAL_IWDG_Init(&IWDG_Handler); //初始化IWDG  


    HAL_IWDG_Start(&IWDG_Handler); //开启独立看门狗

}


2:喂狗


//喂独立看门狗

void IWDG_Feed(void)

{   

    HAL_IWDG_Refresh(&IWDG_Handler); //喂狗

}

推荐阅读

史海拾趣

Highland Electronics Co Ltd公司的发展小趣事

面对全球半导体市场的周期性波动和贸易环境的不确定性,High Tech Chips Inc展现出了强大的应变能力和灵活性。在市场需求下滑时,公司迅速调整产品结构,加大在物联网、5G通信等新兴领域的研发投入。同时,通过优化供应链管理、提高生产效率等方式降低成本,保持了良好的盈利能力。这种灵活应对市场挑战的策略使得公司在行业低谷期依然能够稳健发展。

FLEX LTD公司的发展小趣事

面对全球半导体市场的周期性波动和贸易环境的不确定性,High Tech Chips Inc展现出了强大的应变能力和灵活性。在市场需求下滑时,公司迅速调整产品结构,加大在物联网、5G通信等新兴领域的研发投入。同时,通过优化供应链管理、提高生产效率等方式降低成本,保持了良好的盈利能力。这种灵活应对市场挑战的策略使得公司在行业低谷期依然能够稳健发展。

屹晶微(EG)公司的发展小趣事

随着业务的不断拓展和市场的不断扩大,屹晶微逐渐意识到与合作伙伴建立长期战略合作关系的重要性。于是,在2023年,他们与电子产业一站式服务平台华秋电子达成了授权代理合作。这一合作不仅为屹晶微提供了更广阔的市场渠道和客户资源,也为其未来的发展奠定了坚实的基础。

在合作过程中,华秋电子为屹晶微提供了全方位的支持和服务。他们共同推广屹晶微的芯片产品,为客户提供更优质的解决方案和服务。同时,华秋电子还利用自身的技术优势和渠道优势,帮助屹晶微拓展海外市场,提升品牌知名度和影响力。

以上两个故事只是屹晶微在电子行业中发展起来的一部分。他们的发展历程充满了挑战和机遇,但黄米龙和他的团队始终保持着坚定的信念和不懈的努力,为中国的芯片产业做出了积极的贡献。

DB Unlimited公司的发展小趣事

随着公司业务的不断发展壮大,DB Unlimited开始将目光投向全球市场。公司积极开拓海外市场,通过参加国际展会、与海外客户建立合作关系等方式,成功将产品推向了全球各地。同时,公司还根据不同国家和地区的市场需求和文化差异,对产品进行本地化改造和优化,进一步提高了产品的市场适应性和竞争力。

Gigabit Logic Inc公司的发展小趣事
部分设计还可以实现模拟自然风等功能,提升用户体验。
Coil-Q Corporation公司的发展小趣事

在电子行业的初期,Coil-Q Corporation以其独特的线圈技术崭露头角。公司创始人发现了传统线圈在效率和稳定性上的不足,于是投入大量资源进行研发,成功开发出一种新型高效线圈。这一创新不仅提高了电子设备的性能,还降低了能耗,迅速赢得了市场的青睐。随着技术的不断完善和市场的扩大,Coil-Q逐渐成为了电子线圈领域的领军企业。

问答坊 | AI 解惑

(求助,在线等)UCLINUX下开机自动运行HELLOWORLD

刚开始接触ARM,现在用的是S3C44B0的开发板,不知道在uclinux下的rc里该修改哪些东西。 在网上看到应该修改如下第一个地址的rc,而且我照做了,make之后没有报错. uClinux-dist/vendors/Samsung/44B0/rc uClinux-dist/romfs/etc/rc 下面是我uCl ...…

查看全部问答>

各种温度传感器测量范围与优缺点

一、热电偶测温的应用原理     热电偶是工业上最常用的温度检测元件之一。其优点是:         ①测量精度高。因热电偶直接与被测对象接触,不受中间介质的影响。        &nbs ...…

查看全部问答>

哪能找到evc的文件管理器原码?

找到了个vc的: http://www.codeproject.com/kb/shell/seashell.aspx?df=100&forumid=929 应该evc的也有一大堆吧,怎么找不到?…

查看全部问答>

天啊,我这么简单的程序都出现两个警告,难道是我的 keil 没有设置好吗?谢谢!

//#include \"STC12LE5404AD.h\" #include #include #include #include void main() {         while(1)        {          ;        ...…

查看全部问答>

请教单片机的触摸屏人机接口问题

现在老师让我把以前按键和数码管的人机接口改成触摸屏的,我自己看了几篇论文,触摸屏用来输入,然后用液晶输出,触摸屏贴在液晶上,这个输入输出是分开的两个模块,占用IO口太多了,而且其实质上也就是键盘输入液晶输出。请问大家也没有做过类似项 ...…

查看全部问答>

请问驱动程序版本号中各个字段的的意义是什么?

请问驱动程序版本号中各个字段的的意义是什么?比如一个驱动程序的版本号为:5.01.2600.0000,这四段字节的意义分别是什么呢?谢谢!…

查看全部问答>

求购二手三星s2410,本人在武汉

本人求购一台s2410开发板,要求资料和配套设备齐全,本人邮箱是antongliang@yahoo.com.cn 请速与我联系!…

查看全部问答>

询问一下关于STM32操作外部Ram的字节寻址的问题

在项目中使用到STM32,由于内存不够用,通过FSMC连接了一块IS61LV25616的512K的SRAM,但是发现FSMC设置宽度为16BIT宽度后,我没有办法以字节为单位寻址,对内存的一次读写都必须是2byte。 想问一下stm32没有自动在内部用硬件做这样的处理么, ...…

查看全部问答>

STM32不能启动的问题

各位,初学STM32。 我使用的STM32F103RBT6的片子、J-link V8仿真器、Keil MDK3.7开发环境。 之前,可以使用Jlink进行仿真、烧写,也可以通过串口ISP方式下载代码。 但现在,不知为何。Jlink一给目标板上电,Jlink的红灯就开始闪烁,STM32的 ...…

查看全部问答>