串口看门狗编程实验详解

描述

  // 独立看门狗没有中断,WWDG有

  // IWDG有时钟(LSI),wwdg需要挂载(PCK1:APB1)

  // IWDG是12位递减的。WWDG是7位递减的

  // IWDG只有下限,WWDG有下限和上限

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

  #include “stm32f4xx.h”

  void delay(void);

  void led_init(void);

  void wwdg_init(u8 tr,u8 wval,u32 pre);

  void WWDG_IRQHandler(void);

  u8 WWDG_CNT=0X7F;

  int main(){

  NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);

  led_init();

  GPIO_ResetBits(GPIOF,GPIO_Pin_10);

  delay();

  delay();

  GPIO_SetBits(GPIOF,GPIO_Pin_10);

  wwdg_init(0x7f,0x5f,WWDG_Prescaler_8);

  while(1){

  GPIO_ResetBits(GPIOF,GPIO_Pin_10);

  }

  }

  void delay(void){

  int i,j;

  for(i=0;i《100000;i++)

  for(j=0;j《1000;j++)

  {}

  }

  void led_init(void){ // 保持DS1灯常亮,当熄灭时,表示MCU复位,说明没有喂狗。 DS0当喂狗时闪烁

  GPIO_InitTypeDef GPIO_InitStruct;

  RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOF,ENABLE);

  GPIO_InitStruct.GPIO_Mode=GPIO_Mode_OUT;

  GPIO_InitStruct.GPIO_OType=GPIO_OType_PP;

  GPIO_InitStruct.GPIO_Pin=GPIO_Pin_9|GPIO_Pin_10;

  GPIO_InitStruct.GPIO_PuPd=GPIO_PuPd_UP;

  GPIO_InitStruct.GPIO_Speed=GPIO_Fast_Speed;

  GPIO_Init( GPIOF, &GPIO_InitStruct);

  GPIO_SetBits(GPIOF,GPIO_Pin_10|GPIO_Pin_9);

  }

  void wwdg_init(u8 tr,u8 wval,u32 pre){ // 分别为计算计数器初值、看门狗窗口值(上限:自己设定,下限0x40)、分频数

  NVIC_InitTypeDef NVIC_InitStruct;

  WWDG_CNT=tr&WWDG_CNT;

  RCC_APB1PeriphClockCmd(RCC_APB1Periph_WWDG,ENABLE); // wwdg挂载的时钟,iwdg有自己的时钟,不需要挂载

  WWDG_SetWindowValue(wval);

  WWDG_SetPrescaler(pre);

  WWDG_Enable(WWDG_CNT);// 开启看门狗:设置了计数器初值,并且使能了看门狗

  NVIC_InitStruct.NVIC_IRQChannel=WWDG_IRQn;

  NVIC_InitStruct.NVIC_IRQChannelCmd=ENABLE;

  NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority=0x02;

  NVIC_InitStruct.NVIC_IRQChannelSubPriority=0x02;

  NVIC_Init(& NVIC_InitStruct);

  WWDG_ClearFlag();

  WWDG_EnableIT();// 开启提前唤醒中断

  }

  void WWDG_IRQHandler(void){

  WWDG_SetCounter(WWDG_CNT);

  WWDG_ClearFlag();

  GPIO_ResetBits(GPIOF,GPIO_Pin_9); //中断处理函数,中间出现喂狗,DS0就会闪一下

  delay();

  delay();

  delay();

  GPIO_SetBits(GPIOF,GPIO_Pin_9);

  }

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分