夜深人静学32系列12——IWDG独立看门狗
上一期我们学习了串口通信,实在是太难了,这一期我们接着学习IWDG独立看门狗。
IWDG简介
IWDG(Independent watchdog,即独立看门狗),其本质是一个递减的计数器,当计数器计数到0时,会产生系统复位信号,使得系统复位。
IWDG的时钟由独立的RC振荡器提供(可以在待机或停止模式下运行),而我们在使用的时候需要做的就是,在计数器计数到0之前,重装载计数器的值,防止系统复位,这个操作也被称之为——喂狗。
哪有人就会说了,你这不是吃饱了没事干吗?一不小心系统就复位了,还跑个屁的程序啊?
实则不然,当我们单片机在运行的时候,难免有时候会受到外界干扰或者自身系统异常,导致单片机卡死的情况,这时候就需要我们的独立看门狗了,它可以检测系统出现的问题,在没有喂狗的时候,及时复位,防止程序乱跑。
但由于IWDG是使用RC振荡器来提供时钟的,因此喂狗的时间往往不会很精确,只能使用在一些对事件精度要求比较低的场合。
IWDG工作原理
IWDG框图
IWDG寄存器
键寄存器(IWDG_KR)
这个寄存器是一个控制寄存器,其写入内容与功能对应关系如下:
写入内容 | 功能 |
---|---|
0xAAAA | 喂狗 |
0x5555 | 允许访问IWDG_PR和IWDG_RLR寄存器 |
0xCCCC | 开启看门狗 |
预分配寄存器(IWDG_PR)
这个寄存器只有低三位有效,其他的保留。
重装载寄存器(IWDG_RLR)
这个寄存器低十二位有效,写入的最大有效值为4096
状态寄存器(IWDG_SR)
看一下就好…………
下面我们来看一下IWDG的配置流程:
IWDG溢出时间计算
举个栗子:我们要设置每1s就需要喂狗,否则系统复位,则可以设置 psc = 64;
rlr = 500; 则prer = 4 ;寄存器IWDG_PR [2:0] = 000;
IWDG配置步骤
我们需要做的就是在规定时间内喂狗!!!!!!!
喂狗的操作就是调用HAL_IWDG_Refresh() 函数
实战
任务要求
- 系统复位,通过串口打印:按下按键0,执行喂狗!!!
- 按键0按下执行喂狗操作。
- 如果一秒内没有执行喂狗操作,则系统复位。
CubeMX配置
我们使用到了串口USART1、按键0、以及IWDG,具体配置如下:
串口和按键配置部分,请参考往期内容。
代码实现
uint8_t Key_Flag ;
int main(void)
{
/* USER CODE BEGIN 1 */
/* USER CODE END 1 */
/* MCU Configuration--------------------------------------------------------*/
/* Reset of all peripherals, Initializes the Flash interface and the Systick. */
HAL_Init();
/* USER CODE BEGIN Init */
/* USER CODE END Init */
/* Configure the system clock */
SystemClock_Config();
/* USER CODE BEGIN SysInit */
/* USER CODE END SysInit */
/* Initialize all configured peripherals */
MX_GPIO_Init();
MX_IWDG_Init();
MX_USART1_UART_Init();
/* USER CODE BEGIN 2 */
printf("按下按键0,执行喂狗!!!\r\n");
/* USER CODE END 2 */
/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
Key_Scan();
if(Key_Flag)
{
HAL_IWDG_Refresh(&hiwdg);
printf("喂狗成功!!!\r\n");
Key_Flag = 0;
}
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
}
/* USER CODE END 3 */
//按键扫描函数,判断按键1是否按下。
void Key_Scan(void)
{
if(HAL_GPIO_ReadPin(KEY0_GPIO_Port,KEY0_Pin) == GPIO_PIN_RESET)
{
HAL_Delay(20);
if(HAL_GPIO_ReadPin(KEY0_GPIO_Port,KEY0_Pin) == GPIO_PIN_RESET)
{
while(!HAL_GPIO_ReadPin(KEY0_GPIO_Port,KEY0_Pin))
{
}
Key_Flag = 1;
}
}
}
}
总结
以上就是本期IWDG独立看门狗的全部内容,比较简单,所以我这里讲的比较简单。就这样…………