完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
一.开发板原理图
硬件设备与printf重定向一致。 PS:该程序在上一个printf重定向的实验中修改完成。 二.操作步骤。 分析: 首先独立看门狗的作用是用于检测并解决由软件错误导致的故障,当软件出错的时候,可以通过独立看门狗将系统复位。 它的实质是一个12位的递减计数器,当数值递减到0的时候会让系统产生一次复位,如果在0之前刷新了数值的话系统就不会复位了,这个过程称之为喂狗。 该功能的供电由VDD电压域供电,所以在停止模式和待机模式下也能工作。 PS:由于独立看门狗开启过后就无法关闭,除非是系统复位且不开启独立看门狗。 所以如果可以不用独立看门狗的话,就尽量的不要启用。 1:是IWDG的时钟。它由其专用的低速时钟LSI驱动,计时主时钟发生故障仍然可以保持工作。频率为40KHz(由于该时钟并不是很精确,所以该看门狗只使用于对于时间精度要求比较低的场合)。 2:是IWDG的预分频器寄存器,LSI时钟通过一个8位预分频寄存器IWDG_PR分频后输入给计数器时钟。通过对该寄存器写入值来设置分频因子。(4、8、16、32、64、128、256) 计数器时钟(CK-CNT) = 40/4*2……PRE(PRE即预分频系数)。经过一个时钟,计数器的值就会减一。(PRE从0——6) 3:是计数器,有12位,计数范围从 0x000——0xFFF. 4:是重装载值的寄存器。,一样有十二位,设定的是计数器的初始值。从该值开始计数,到0会产生一次复位。溢出时间(TimeOut) = (4*2^PRE)/40*ReloadValue(ms) 5:是密钥寄存器(IWDG_KR)。这个寄存器是IWDG的一个控制寄存器。 当写入的值不同时,寄存器会有不同的控制效果: 0X5555:因为预分频寄存器和重装载值寄存器都有写访问保护,要修改寄存器的值的时候就要先接触写保护。 0XAAAA:写入这个将IWDG_RLR寄存器内的值重装载到计数器中。 0XCCCC:写入这个将启动IWDG的功能,此属软件启动,一旦开启的IWDG的话它就关不掉,只有复位才可以关掉。 6:是它的状态寄存器(IWDG——SR),只有位0:PVU和位1:RVU操有效,只能由硬件置0和1.当RVU状态是1的时候表明看门狗计数器重装载值的更新,置为1的时候表明重装载值的更新正在进行中,更新完毕之后由硬件清0。PVU:看门狗预分频值更新,硬件1表示预分频值的更新正在进行中,完成后由硬件置为0. 三.程序部分。 要用独立看门狗的话要加入有关独立看门狗的文件。 然后新建一个文件夹IWDG用于存放有关独立看门狗的源文件和头文件。 双击STM32中的IWDG的头文件,查看相关的配置。 进入独立看门狗的头文件中查看相关的操作。右边的五个函数分别的意义是如下图所示。 进行相关的配置即可。上面也是IWDG初始化的程序。 接下来还要编写一个 喂狗的程序。 这就是IDWG的所有的源文件的程序书写。 之后在头文件中声明以下,添加该文件夹的编译路径即可开始编写主函数。 添加自己的独立看门狗的书写的文件夹路径即可。 主函数的书写。 IWDG.h文件 #ifndef _IWDG_H #define _IWDG_H #include “system.h” void IWDG_FeedDOG(void); void IWDG_Init(u8 IWDG_Prescaler, u16 Reload); #endif IWDG.c文件 #include “iwdg.h” void IWDG_Init(u8 Prescaler, u16 Reload) { //开启寄存器的写操作 IWDG_WriteAccessCmd(IWDG_WriteAccess_Enable); IWDG_SetPrescaler(Prescaler); //设置预分频系数 IWDG_SetReload(Reload); //设定重载值 IWDG_ReloadCounter(); //重新装载 IWDG_Enable(); //独立看门狗使能 } //喂狗 void IWDG_FeedDOG(void) { IWDG_ReloadCounter();//重新装载初值 } main.c文件 #include “system.h” #include “SysTick.h” #include “led.h” #include “pwm.h” #include “Usart.h” #include “key.h” #include “iwdg.h” /********************************************* 程序写好后,下载到开发板上,打开我们的串口调试助手, 设置波特率为9600,数据位8位,停止位1位 按下向上的按键,第二个led会亮起同时串口会打印喂狗信息 如果1280ms内没有按下的话,led2就会重新熄灭,并且串口会打印出复位系统的信息 led1的闪烁表明我们的程序是否正常在进行。(检测作用) *********************************************/ int main() { u8 i; SysTick_Init(72); NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); LED_Init(); KEY_Init(); USART1_Init(9600); IWDG_Init(4, 800); //IWDG的初始化,分频系数为4, 初始装载值是800 //根据计算可以知道如果在1280ms内没有执行喂狗的话就会重启程序 printf(“复位系统rn”); while(1) { if(KEY_Scan(0) == KEY_UP) //按下向上按键为喂狗操作 { IWDG_FeedDOG(); led2=0; //led2做提示灯 printf(“喂狗rn”); //串口上打印信息 } i++; if(i%20 == 0) { led1=!led1; //led1用于检测程序是否在正常的及逆行 } delay_ms(10); } } 四。实验现象 按下上键过后会打印喂狗。 |
|
|
|
只有小组成员才能发言,加入小组>>
调试STM32H750的FMC总线读写PSRAM遇到的问题求解?
1874 浏览 1 评论
X-NUCLEO-IHM08M1板文档中输出电流为15Arms,15Arms是怎么得出来的呢?
1658 浏览 1 评论
1143 浏览 2 评论
STM32F030F4 HSI时钟温度测试过不去是怎么回事?
759 浏览 2 评论
ST25R3916能否对ISO15693的标签芯片进行分区域写密码?
1720 浏览 2 评论
1963浏览 9评论
STM32仿真器是选择ST-LINK还是选择J-LINK?各有什么优势啊?
789浏览 4评论
STM32F0_TIM2输出pwm2后OLED变暗或者系统重启是怎么回事?
611浏览 3评论
628浏览 3评论
stm32cubemx生成mdk-arm v4项目文件无法打开是什么原因导致的?
590浏览 3评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2025-1-11 13:42 , Processed in 0.708857 second(s), Total 75, Slave 59 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号