Stm32-窗口看门狗实验

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

	外部中断配置步骤:
	(1)初始化I/O为输入
	(2)开启复用时钟,设置I/O口与中断线映射关系(用到GPIOA,相应开时钟)
	(3)开启相应线上中断时间,选泽触发关系		
             (4)配置中断分组NVIC,使能中断
	     (5)编写中断服务函数

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

#include "exti.h"
#include "led.h"
#include "key.h"
#include "delay.h"
#include "usart.h"
  
// 	  
 


//外部中断0服务程序
void EXTI0_IRQHandler(void)
{
	delay_ms(10);//消抖
	if(KEY2==1)	 //按键2
	{
		LED0=!LED0;
		LED1=!LED1;	
	}		 
	EXTI->PR=1<<0;  //清除LINE0上的中断标志位  
}


//外部中断15~10服务程序
void EXTI15_10_IRQHandler(void)
{			
	delay_ms(10);    //消抖			 
	if(KEY0==0)      //按键0
	{
		LED0=!LED0;
	}else if(KEY1==0)//按键1
	{
		LED1=!LED1;
	}
	EXTI->PR=1<<13;     //清除LINE13上的中断标志位  
	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,组2
	MY_NVIC_Init(2,1,EXTI15_10_IRQChannel,2);//抢占2,子优先级1,组2	   
}
	
   
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^fprer
	WWDG->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(trSR=0X00;//清除提前唤醒中断标志位
	LED1=!LED1;
}

	stm32中文手册P321.



















你可能感兴趣的:(学习笔记)