| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 嵌入式 -> STM32F103五分钟入门系列(十三)独立看门狗IWDG -> 正文阅读 |
|
[嵌入式]STM32F103五分钟入门系列(十三)独立看门狗IWDG |
学习板:STM32F103ZET6 一、独立看门狗(IWDG)简介1、什么是看门狗看门狗是为了避免程序跑飞而设置的,在程序正常运行情况下,会一直“喂狗”,使程序不会复位。可以这样理解:在一个定时器中断中,中断服务函数里是整个程序的复位,在定时器之外,会一直给定时器重装载初值(相当于喂狗),程序一直执行正常的话,定时器不会发生中断,即不会进入中断服务函数,不会执行复位程序;当程序跑飞时,由于没有“喂狗”,定时器计数到0(如向下计数时),发生中断,执行中断服务函数里的复位程序,程序重新开始执行。 2、独立看门狗应用场合由于独立看门狗时钟源由LSI时钟提供,并不精确,所以IWDG最适合应用于那些需要看门狗作为一个在主程序之外,能够完全独立工作,并且对时间精度要求较低的场合。 二、独立看门狗时钟从时钟框图可以看到,看门狗的时钟为内部低速时钟40KHZ,我们知道LSI和HSI都是有内部RC振荡电路生成的,输出不稳定,所以这个时钟大约为40KHZ,并不精准。 三、独立看门狗的相关寄存器(1)键寄存器(IWDG_KR)该寄存器是低16位有效的32位寄存器。从上图得到以下信息:
所以一般程序可以如下:
(2)预分频寄存器(IWDG_PR)该寄存器是只有低3位有效的32位寄存器,之前的IWDG_KR寄存器中也强调过,要对IWDG_PR寄存器操作,必须先对IWDG_KR写入0x5555。 我们知道,独立看门狗的时钟是40KHZ的LSI,经过本寄存器设置预分频系数后,独立看门狗的时钟会变为40KHZ/预分频因子。 (3)重装载寄存器(IWDG_RLR)该寄存器并不像SysTick定时器的重装载寄存器一样,该寄存器不需要手动装载初值,只需设置好装载值后,每次给IWDG_KR寄存器写入0xAAAA,即可装载初值。 (4)状态寄存器(IWDG_SR)该寄存器只有位0和位1有效,位0指示预分频值更新、位1指示重装载值更新;置1时表示正在更新,置0时表示更新完成。 通过该寄存器还可以获取目前看门狗装载值、预分频器更新状态:
四、独立看门狗编程顺序①取消寄存器写保护(向 IWDG_KR 写入 0X5555) ②设置独立看门狗的预分频系数和重装载值(IWDG_PR和IWDG_PLR) ③重载计数值喂狗(向 IWDG_KR 写入 0XAAAA) ④启动看门狗(向 IWDG_KR 写入 0XCCCC) ⑤程序的其他地方喂狗(向 IWDG_KR 写入 0XAAAA) 五、例子(寄存器版)例:按下KEY_UP后,喂狗,正常状态下,LED0处于亮灯状态。(当没有喂狗时,程序被复位,此时LED0会灭了再被点亮) LED和KEY的代码之前总结过了,可以详见:STM32F103五分钟入门系列(五)按键实验(库函数+寄存器) 这里直接附代码:
接下来写独立看门狗实验,寄存器版比较简单 首先看一下预分频系数和重装载值怎么搞。 LSI约为40KHZ,就当它是准确的40KHZ,预分频系数为4、8、16… 则独立看门狗时钟为40kHZ/16,,每计数一次的时间:16/40ms,则1s需要计数:40000/16=2500;所以可以设置:
需要注意的是,重装载值寄存器IWDG_RLR只有低12位有效,所以最大重装载值为:2^12-1=4095 mian.c中代码:
上述程序需要注意的是一定要延时一个时间,否则没有喂狗导致程序重新执行,但是LED灭一下,根本看不出变化。 通过上述代码,下载调试后发现:在KEY_UP未按下时,LED0每亮1s,灭0.5s,当长按KEY_UP时,LED0保持常亮状态。 六、独立看门狗常用库函数独立看门狗的常用库函数定义在stm32f10x_iwdg.h中: (1)取消PR、RLR寄存器写保护函数IWDG_WriteAccessCmd()参数: 操作: 可以看到该函数就是将KR写入0x5555,来取消PR、RLR寄存器写保护 (2)设置分频因子函数IWDG_SetPrescaler()参数: 操作: 可以看到,该函数是将16进制数写入PR寄存器,其分频因子对应的16进制数: (3)设置重装载值函数IWDG_SetReload()参数: 该参数由我们计算得来,由于RLR寄存器是低12位有效,所以该值<=0xFFF 操作: 直接将重装载初值写入到RLR寄存器 (4)重装载初值函数(喂狗)IWDG_ReloadCounter参数: 操作: 直接对KR寄存器写入0xAAAA,喂狗。 (5)启动独立看门狗函数IWDG_Enable()参数: 操作: 给KR寄存器写入0xCCCC,启动独立看门狗。 (6)独立看门狗状态获取函数IWDG_GetFlagStatus()参数: 参数FLAG=0x0001|0x0002=0x0003 当独立看门狗处于更新状态时: 操作: 返回值: 返回SET(!0)表示处于更新中 七、例子(库函数版)库函数版也比较简单,直接把刚刚例子中寄存器部分替换为库函数 代码如下:
|
|
嵌入式 最新文章 |
基于高精度单片机开发红外测温仪方案 |
89C51单片机与DAC0832 |
基于51单片机宠物自动投料喂食器控制系统仿 |
《痞子衡嵌入式半月刊》 第 68 期 |
多思计组实验实验七 简单模型机实验 |
CSC7720 |
启明智显分享| ESP32学习笔记参考--PWM(脉冲 |
STM32初探 |
STM32 总结 |
【STM32】CubeMX例程四---定时器中断(附工 |
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年12日历 | -2024/12/27 9:46:05- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |
数据统计 |