一级a做爰片免费网站瑜伽,校园服装网站建设预算,qq个人中心官网,本溪 网站建设 做网站什么是独立看门狗#xff1f;它有什么用#xff1f;什么时候用#xff1f;不用行不行#xff1f; 独立看门狗#xff08;Independent Watchdog#xff0c;简称IWDG#xff09;是一种微控制器中常见的硬件保护机制。它的主要作用是监视系统的运行状态#xff0c;当系统出… 什么是独立看门狗它有什么用什么时候用不用行不行 独立看门狗Independent Watchdog简称IWDG是一种微控制器中常见的硬件保护机制。它的主要作用是监视系统的运行状态当系统出现异常或者死锁时可以自动重置系统确保系统的稳定性和可靠性。 使用独立看门狗的目的是为了防止程序运行过程中出现死循环、死锁或者其他异常情况导致系统无法正常工作的情况。当系统正常运行时程序会周期性地喂狗即重新加载独立看门狗的计数器以防止计时器溢出。如果系统出现异常程序无法喂狗导致独立看门狗的计数器溢出系统就会认为出现了故障并执行相应的操作例如重置系统。 通常情况下独立看门狗适用于那些对系统稳定性和可靠性要求比较高的场景比如嵌入式系统、工业控制系统、汽车电子系统等。在这些场景下即使程序出现异常也需要保证系统能够自动恢复到正常工作状态以避免因为故障导致系统长时间无法运行带来不可预测的后果。 不使用独立看门狗可能会导致系统出现故障后无法及时恢复长时间无响应甚至造成数据丢失或者其他不可预测的后果。因此对于一些对系统稳定性要求较高的应用使用独立看门狗是很有必要的。然而在一些对实时性要求不高、对系统稳定性要求较低的应用中可以不使用独立看门狗以减少系统的复杂性和成本。 所以它重要但不是必需。
iwdg.c
#include iwdg.hvoid Iwdg_Init(void)
{//1、 取消寄存器写保护IWDG_WriteAccessCmd(IWDG_WriteAccess_Enable);//2、设置独立看门狗的预分频系数确定时钟:32KHZ/128 250HZIWDG_SetPrescaler(IWDG_Prescaler_128);//3、设置看门狗重装载值确定溢出时间:IWDG_SetReload(500); //必须在两秒内喂狗//4、使能看门狗 从0xFFF开始计数IWDG_Enable();//5、应用程序喂狗:IWDG_ReloadCounter();}
iwdg.h
#ifndef __IWDG_H
#define __IWDG_H
#include stm32f4xx.hvoid Iwdg_Init(void);#endif
main.c
#include stm32f4xx.h
#include led.h
#include key.h
#include exti.h
#include delay.h
#include pwm.h
#include usart.h
#include string.h
//#include hcsr04.h
//#include infrared.h
#include iwdg.h#define LED0_ON GPIO_ResetBits(GPIOF,GPIO_Pin_9) //开灯
#define LED0_OFF GPIO_SetBits(GPIOF,GPIO_Pin_9) //关灯u8 Usart_Data;
u8 rx_flag 0; //表示串口接收标志 rx_flag 1表示接收完成 rx_flag 0未完成
u8 buffer[64] {0}; //接收存储数据数组
u8 rx_buffer[64] {0}; //接收存储数据数组
u8 rx_i,rx_count0;void USART1_IRQHandler(void)
{//若是非空则返回值为1与RESET0判断不相等则判断为真if(USART_GetITStatus(USART1, USART_IT_RXNE) ! RESET){ /* DR读取接受到的数据*/buffer[rx_count] USART_ReceiveData(USART1); //先赋值再加if(buffer[rx_count-1] :) //判断是否接收到结束标志{for(rx_i0; rx_irx_count-1; rx_i){rx_buffer[rx_i] buffer[rx_i]; //将数据存储在rx_buffer数组中}rx_flag 1; //rx_flag 1表示接收字符串完成rx_count 0;memset(buffer, 0, sizeof(buffer));}//判断为真后为下次中断做准备则需要对中断的标志清零USART_ClearITPendingBit(USART1,USART_IT_RXNE); } }//这是一个主函数
int main(void)
{u16 value 0;//NVIC分组 抢占优先级两位:0~3 响应优先级两位:0~3 NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);Delay_Init();Led_Init();Usart1_Init();Iwdg_Init();printf(This is iwdg test\n);while(1){GPIO_ToggleBits(GPIOA, GPIO_Pin_6);delay_s(1);delay_ms(500); //延时是用时应该程序程序
// delay_ms(200);//往非法地址写值//*(volatile unsigned int *)(0xC0000000) 0x20;printf(program ok??\n);IWDG_ReloadCounter();}return 0;
}烧录结果 问题
为什么这里实验效果是串口打印了program ok\n,而没有了printf(This is iwdg test\n 在给定的代码中首先进行了一系列的初始化操作包括延时初始化、LED初始化、USART1初始化以及IWDG初始化。在主循环中首先对GPIOA的引脚6进行了翻转然后延时了1秒接着延时了500毫秒。在延时之后执行了一条printf语句输出program ok??然后重新加载了独立看门狗IWDG的计数器。 在这段代码中虽然初始化了USART1但在主循环中并没有进行串口的读写操作。因此程序的执行并没有从串口接收到数据也没有通过串口发送数据。由于没有通过串口发送数据因此printf语句printf(This is iwdg test\n);并没有导致任何数据被发送到串口所以在终端上看不到相关输出。 而printf(program ok??\n);语句是在每次循环中执行的因此每次循环都会将program ok??发送到串口所以在终端上看到了这个输出。 但是把*(volatile unsigned int *)(0xC0000000) 0x20;取消注释后又有打印printf(This is iwdg test\n) 在取消注释 *(volatile unsigned int *)(0xC0000000) 0x20; 之后会导致对一个非法地址写入数据这通常会引发硬件异常例如存储器访问错误或者总线错误。在某些微控制器中当发生硬件异常时可能会触发中断或者重置系统。在这种情况下可能会重新执行初始化代码包括对串口的初始化因此你会看到 This is iwdg test\n 这条 printf 语句的输出。 但需要注意的是这种行为是不可预测的因为它取决于微控制器的硬件和系统的工作方式不同的硬件平台和编译器可能会有不同的行为。同时对非法地址的访问可能会导致系统异常或者数据损坏应当尽量避免这种操作。 特殊定时器 独立看门狗IWDG通常可以被看作是一种特殊的计时器。它在硬件层面上实现了一个简单的计时器功能用于监视系统的运行状态。 独立看门狗会在初始化时设定一个计数器的初始值并开始倒计时。当程序在规定的时间内喂狗重新加载计数器计时器会重置并继续倒计时。如果在一段时间内未喂狗计时器会溢出系统会被认为处于异常状态触发相应的操作例如重置系统。 尽管独立看门狗可以被视为一种计时器但它与通用定时器比如STM32中的TIM定时器有所不同。独立看门狗的设计目的主要是用于系统的监控和保护而不是用于实现复杂的定时功能。它通常具有固定的计时周期且不具备定时器常见的各种工作模式和功能。 README
这个实验用到了串口的代码见上几篇。一个芯片的独立看门狗的代码写好了之后基本不用怎么修改做项目时就添加一下防止程序跑飞就ok~要求不高的小项目有没有它都不要紧吧