实验平台:正点原子战舰开发板
系统:windows 7 64位
编译器:MDK 4.72a
参考例程:ATK串口例程,野火ISO串口例程
中断主要分为两种:
1、系统异常中断也可以说的内核异常,这类异常中断有些是不可以控制的,如RESET,NMI,FAULT.
2、外部中断,这些中断都是可以设置的,每个GPIO都可以被设置为中断。
当要使用中断时候都要对NVIC进行设置
void NVIC_Init(NVIC_InitTypeDef* NVIC_InitStruct);
NVIC_IRQChannel 需要配置的中断线
NVIC_IRQChannelCmd 使能或关闭相应中断向量的中断响应
NVIC_IRQChannelPreemptionPriority 配置相应中断向量抢占优先级
NVIC_IRQChannelSubPriority 配置相应中断向量的响应优先级
抢占 > 响应 ,先判断抢占 然后再判断响应。
要配置这些优先级组,可以采用库函数 NVIC_PriorityGroupConfig(),可输
入的参数为 NVIC_PriorityGroup_0 ~ NVIC_PriorityGroup_4,有5 种分配组。
关系式是:
第0组:16种抢断
第1组:2种抢断,8种响应
第2组:4种抢断,4种响应
第3组:8种抢断,2种响应
第4组:16种响应,无抢断
数越小,优先级越高。当要用到N多中断时候才要设置这个优先级组。否则不用设置。
STM32一共有16个中断线,编号为0~15。GPIOA~GPIOG的第0个引脚都属于0号中断线,所有的1引脚,都属于1号中断线,以此类推。但是每一个中断线同时只能响应一个引脚的中断,但是可以分时复用,设置不同的触发方式。
void EXTI_Init(EXTI_InitTypeDef* EXTI_InitStruct);//初始化的结构体函数
typedef struct
{
uint32_t EXTI_Line; //中断线号 EXTI_LineX;
EXTIMode_TypeDef EXTI_Mode; //模式选择 中断或者事件
EXTITrigger_TypeDef EXTI_Trigger; //触发方式
FunctionalState EXTI_LineCmd; //使能命令
}EXTI_InitTypeDef;
填写完这两个结构体,然后初始化就可以使用外部中断了。但是我们还需要中断函数
记得使能引脚的复用功能AFIO
中断函数有固定的函数名字,不能更改,我们可以从启动文件里看到中断函数
外部按键中断函数的一般格式为:
void EXTI2_IRQHandler(void)
{
if( EXTI_GetITStatus(EXTI_Line2 ) != RESET)//判断某个线上的中断是否发生
{
中断逻辑…
EXTI_ClearITPendingBit( EXTI_Line2 ); //清除 LINE 上的中断标志位
}
}
看门狗作用就是防止程序跑飞或者死机,当IWDG_KR没有定时写入0XAAAA时就会产生一个强制的复位信号使芯片重启。但是IWDG用的是内部RC时钟,频率不稳定,所以在喂狗时候要提前喂狗,防止勿复位。
void IWDG_WriteAccessCmd(uint16_t IWDG_WriteAccess);
打开和关闭IWDG的写入保护
void IWDG_SetPrescaler(uint8_t IWDG_Prescaler);
分频比 2^n( n= 2 ~ 16) 最大256
void IWDG_SetReload(uint16_t Reload);
设置重载值最大4095
void IWDG_ReloadCounter(void);
重载IWDG_RLR寄存器的数
void IWDG_Enable(void);
使能IWDG
FlagStatus IWDG_GetFlagStatus(uint16_t IWDG_FLAG);
查询预分频或者重载是否进行中
计算时间用:Tout=((4×2^prer) ×rlr) /40 。
部分代码:
void IWDG_Init()
{
IWDG_WriteAccessCmd(IWDG_WriteAccess_Enable);
IWDG_SetPrescaler(4);
IWDG_SetReload(625);
IWDG_ReloadCounter();
IWDG_Enable();
}
void EXITX_Init()
{
EXTI_InitTypeDef EXIT_InitStruct;
NVIC_InitTypeDef NVIC_InitStruct;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);
GPIO_EXTILineConfig(GPIO_PortSourceGPIOE,GPIO_PinSource2);
EXIT_InitStruct.EXTI_Line = EXTI_Line2;
EXIT_InitStruct.EXTI_Mode = EXTI_Mode_Interrupt;
EXIT_InitStruct.EXTI_Trigger = EXTI_Trigger_Falling;
EXIT_InitStruct.EXTI_LineCmd = ENABLE;
NVIC_InitStruct.NVIC_IRQChannel = EXTI2_IRQn;
NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 2;
NVIC_InitStruct.NVIC_IRQChannelSubPriority = 2;
NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE;
EXTI_Init(&EXIT_InitStruct);
NVIC_Init(&NVIC_InitStruct);
}
void EXTI2_IRQHandler()
{
delay_ms(10);
if(KEY2 == 0)
{
IWDG_ReloadCounter();
}
EXTI_ClearITPendingBit(EXTI_Line2);
}
『本文转载自网络,版权归原作者所有,如有侵权请联系删除』