Stm32-窗口看门狗实验

来源:互联网 发布:手机上编程软件 编辑:程序博客网 时间:2024/05/17 10:40

通过学习窗口看门狗实验了解并复习了:

<span style="white-space:pre"></span>外部中断配置步骤:
<span style="white-space:pre"></span>(1)初始化I/O为输入
<span></span>(2)开启复用时钟,设置I/O口与中断线映射关系(用到GPIOA,相应开时钟)
<span></span>(3)开启相应线上中断时间,选泽触发关系<span style="font-family: Arial, Helvetica, sans-serif;"></span>
<span style="font-family: Arial, Helvetica, sans-serif;">             <strong></strong></span><span style="font-family: Arial, Helvetica, sans-serif;">(4)配置中断分组NVIC,使能中断</span>
<span style="font-family: Arial, Helvetica, sans-serif;"><span></span>     (5)编写中断服务函数</span>

1.外部中断初始化EXTI_Initd的初始化即:

#include "exti.h"#include "led.h"#include "key.h"#include "delay.h"#include "usart.h"  ////////////////////////////////////////////////////////////////////////////////// <span style="white-space:pre"></span>   //外部中断0服务程序void EXTI0_IRQHandler(void){<span style="white-space:pre"></span>delay_ms(10);//消抖<span style="white-space:pre"></span>if(KEY2==1)<span style="white-space:pre"></span> //按键2<span style="white-space:pre"></span>{<span style="white-space:pre"></span>LED0=!LED0;<span style="white-space:pre"></span>LED1=!LED1;<span style="white-space:pre"></span><span style="white-space:pre"></span>}<span style="white-space:pre"></span> <span style="white-space:pre"></span>EXTI->PR=1<<0;  //清除LINE0上的中断标志位  }//外部中断15~10服务程序void EXTI15_10_IRQHandler(void){<span style="white-space:pre"></span><span style="white-space:pre"></span>delay_ms(10);    //消抖<span style="white-space:pre"></span> <span style="white-space:pre"></span>if(KEY0==0)      //按键0<span style="white-space:pre"></span>{<span style="white-space:pre"></span>LED0=!LED0;<span style="white-space:pre"></span>}else if(KEY1==0)//按键1<span style="white-space:pre"></span>{<span style="white-space:pre"></span>LED1=!LED1;<span style="white-space:pre"></span>}<span style="white-space:pre"></span>EXTI->PR=1<<13;     //清除LINE13上的中断标志位  <span style="white-space:pre"></span>EXTI->PR=1<<15;     //清除LINE15上的中断标志位  }
void EXTIX_Init(void){RCC->APB2ENR|=1<<2;     //使能PORTA时钟JTAG_Set(JTAG_SWD_DISABLE);//关闭JTAG和SWD   GPIOA->CRL&=0XFFFFFFF0;//PA0设置成输入  GPIOA->CRL|=0X00000008;   GPIOA->CRH&=0X0F0FFFFF;//PA13,15设置成输入  GPIOA->CRH|=0X80800000;    GPIOA->ODR|=1<<13;   //PA13上拉,PA0默认下拉GPIOA->ODR|=1<<15;   //PA15上拉Ex_NVIC_Config(GPIO_A,0,RTIR); //上升沿触发Ex_NVIC_Config(GPIO_A,13,FTIR);//下降沿触发Ex_NVIC_Config(GPIO_A,15,FTIR);//下降沿触发MY_NVIC_Init(2,2,EXTI0_IRQChannel,2);    //抢占2,子优先级2,组2MY_NVIC_Init(2,1,EXTI15_10_IRQChannel,2);//抢占2,子优先级1,组2   }
<span style="white-space:pre"></span>
   
2.窗口看门狗IWDG_Init函数初始化“:

#include "wdg.h"#include "led.h"//初始化独立看门狗//prer:分频数:0~7(只有低3位有效!)//分频因子=4*2^prer.但最大值只能是256!//rlr:重装载寄存器值:低11位有效.//时间计算(大概):Tout=((4*2^prer)*rlr)/40 (ms).void IWDG_Init(u8 prer,u16 rlr) {IWDG->KR=0X5555;//使能对IWDG->PR和IWDG->RLR的写     IWDG->PR=prer;  //设置分频系数     IWDG->RLR=rlr;  //从加载寄存器 IWDG->RLR  IWDG->KR=0XAAAA;//reload     IWDG->KR=0XCCCC;//使能看门狗}//喂独立看门狗void IWDG_Feed(void){IWDG->KR=0XAAAA;//reload   }//保存WWDG计数器的设置值,默认为最大.u8 WWDG_CNT=0x7f;//初始化窗口看门狗//tr   :T[6:0],用于存储计数器的值//wr   :W[6:0],用于存储窗口值//fprer:窗口看门狗的实际设置//低2位有效.Fwwdg=PCLK1/4096/2^fprer.void WWDG_Init(u8 tr,u8 wr,u8 fprer){  RCC->APB1ENR|=1<<11;//使能wwdg时钟WWDG_CNT=tr&WWDG_CNT;   //初始化WWDG_CNT.   WWDG->CFR|=fprer<<7;    //PCLK1/4096再除2^fprerWWDG->CFR|=1<<9;        //使能提前唤醒中断WWDG->CFR&=0XFF80;     WWDG->CFR|=wr;    //设定窗口值     WWDG->CR|=WWDG_CNT|(1<<7); //开启看门狗,设置7位计数器      MY_NVIC_Init(2,3,WWDG_IRQChannel,2);//抢占2,子优先级3,组2   }//重设置WWDG计数器的值void WWDG_Set_Counter(u8 cnt){WWDG->CR|=(cnt&0x7F);//重设置7位计数器}//窗口看门狗中断服务程序void WWDG_IRQHandler(void){    u8 wr,tr;   wr=WWDG->CFR&0X7F;tr=WWDG->CR&0X7F;if(tr<wr)WWDG_Set_Counter(WWDG_CNT);//只有当计数器的值,小于窗口寄存器的值才能写CR!!      WWDG->SR=0X00;//清除提前唤醒中断标志位LED1=!LED1;}
</pre><pre name="code" class="objc"><span style="white-space:pre"></span>stm32中文手册P321.


0 0
原创粉丝点击