数字越小,优先级越高。抢占大于响应
中断优先级设置中断设置相关寄存器
IO uint8_t IP[240]; //中断优先级控制的寄存器组
IO uint32_t ISER[8]; //中断使能寄存器组
IO uint32_t ICER[8]; //中断失能寄存器组
IO uint32_t ISPR[8];//中断挂起寄存器组
IO uint32_t ICPR[8]; //中断解挂寄存器组
IO uint32_t IABR[8]; //中断激活标志位寄存器组
中断编程的顺序
1.使能中断请求
2.配置中断优先级分组
3.配置NVIC寄存器,初始化NIVC_InitTypeDef,再调用初始化函数
4.编写中断服务函数
中断服务函数怎么写
函数地址(名称)在启动文件中
写错了不会报错
中断服务函数写在stm32f10x_it.c
外部中断固件库编程
初始化结构体
EXTI_InitTypeDef
1-EXTI_Line :用于产生 中断/事件线
2-EXTI_Mode: EXTI模式(中断/事件)
3-EXTI_Trigger :触发(上/下/上下)
4-EXTI_LineCmd :使能或者失能(IMR/EMR)
编程要点:(野火板子)
bsp_exti.c
#include "bsp_exti.h"
void NVIC_config()
{
//第一步,配置优先级组
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
//第二步,配置初始化
NVIC_InitTypeDef NVIC_InitStruct;
NVIC_InitStruct.NVIC_IRQChannel=EXTI0_IRQn;
NVIC_InitStruct.NVIC_IRQChannelCmd=ENABLE;
NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority=1;
NVIC_InitStruct.NVIC_IRQChannelSubPriority=1;
NVIC_Init(&NVIC_InitStruct);
//第三步,配置key2的
NVIC_InitStruct.NVIC_IRQChannel=EXTI15_10_IRQn;
NVIC_Init(&NVIC_InitStruct);
}
void key_config()
{
//第一步,开启时钟按键
RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOA, ENABLE);
//开启中断时钟
RCC_APB2PeriphClockCmd( RCC_APB2Periph_AFIO, ENABLE);
//第二步,配置按键初始化
GPIO_InitTypeDef GPIO_InitStruct;
GPIO_InitStruct.GPIO_Pin=GPIO_Pin_0;
GPIO_InitStruct.GPIO_Mode=GPIO_Mode_IN_FLOATING;//因为是外部电平
GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init(GPIOA,&GPIO_InitStruct);
//配置NVIC中断
NVIC_config();
//第三步,为按键选择中断信号,配置中断线(20根那个)
GPIO_EXTILineConfig( GPIO_PortSourceGPIOA, GPIO_PinSource0);
//第四步,配置外部中断初始化
EXTI_InitTypeDef EXTI_InitStruct;
EXTI_InitStruct.EXTI_Line=EXTI_Line0;
EXTI_InitStruct.EXTI_LineCmd=ENABLE;
EXTI_InitStruct.EXTI_Mode=EXTI_Mode_Interrupt;
EXTI_InitStruct.EXTI_Trigger=EXTI_Trigger_Rising;
EXTI_Init(&EXTI_InitStruct);
//第五步配置key2
RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOC, ENABLE);
GPIO_InitStruct.GPIO_Pin=GPIO_Pin_13;
GPIO_Init(GPIOA,&GPIO_InitStruct);
GPIO_EXTILineConfig( GPIO_PortSourceGPIOC, GPIO_PinSource13);
EXTI_InitStruct.EXTI_Line=EXTI_Line13;
EXTI_Init(&EXTI_InitStruct);
}
void EXTI0_IRQHandler()
{
if(EXTI_GetITStatus( EXTI_Line0)!=RESET)
{
LED1_TOGGLE;
}
EXTI_ClearITPendingBit(EXTI_Line0);
}
void EXTI15_10_IRQHandler()
{
if(EXTI_GetITStatus( EXTI_Line13)!=RESET)
{
LED2_TOGGLE;
}
EXTI_ClearITPendingBit(EXTI_Line13);
}