嵌套向量中断控制器
特性
●68个可屏蔽中断通道(不包含16个Cortex™-M3的中断线);
● 16个可编程的优先等级(使用了4位中断优先级);
外部中断/事件控制器框图
外部中断程序设计思路:
中断初始化,主要是完善三个结构体:
①GPIO_InitTypeDef (功能:IO配置)
②EXTI_InitTypeDef (功能:中断配置)
③NVIC_InitTypeDef (功能:中断优先级配置)
抢占优先级高的可以抢占优先级低的,即发生中断嵌套;响应优先级高的中断先进行,但不会抢占响应优先级低的中断,即不能发生中断嵌套;
void exti_init()
{
GPIO_InitTypeDef GPIO_InitStructure;
EXTI_InitTypeDef EXTI_InitStructure;
NVIC_InitTypeDef NVIC_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE,ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE); //若是,开启复用功能,需要开启复用时钟。
GPIO_InitStructure.GPIO_Pin=k_left;GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPU; //按键所接IO口设置为上拉模式
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;GPIO_Init(GPIOE,&GPIO_InitStructure);
//此处注意,若是没有将中断引脚映射到外部中断线路上,中断将无效
GPIO_EXTILineConfig(GPIO_PortSourceGPIOE,GPIO_PinSource2);//选择GPIO管脚作外部中断线路/*设置外部中断模式 */
EXTI_InitStructure.EXTI_Line=EXTI_Line2;//挂载中断线2
EXTI_InitStructure.EXTI_Mode=EXTI_Mode_Interrupt;//设置为中断模式
EXTI_InitStructure.EXTI_Trigger=EXTI_Trigger_Falling;
EXTI_InitStructure.EXTI_LineCmd = ENABLE;
EXTI_Init(&EXTI_InitStructure); /*设置中断优先级*/
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
NVIC_InitStructure.NVIC_IRQChannel = EXTI2_IRQn; //打开EXIT2的全局中断
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; //抢占优先级为0
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; //响应优先级为0
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //使能
NVIC_Init(&NVIC_InitStructure);
}
中断处理程序实现:
①通过EXTI_GetITStatus检测中断线是否发生了变化
(EXTI_GetITStatus通过检测中断的挂起寄存器EXTI_PR是否和当前发生变化的中断线相同,是的话,返回SET;否的话,返回RESET。)
②发生中断后,使用EXTI_ClearITPendingBit清除EXTI线路挂起位。
中断处理函数,应该放置与stm32f10x_it.c中,也可将该函数copy到Keil编译路径下
如果放在新建的文件夹中,需要将对应的目录添加到Keil编译目录中
void EXTI2_IRQHandler()
{
if(EXTI_GetITStatus(EXTI_Line2)==SET)
{
EXTI_ClearITPendingBit(EXTI_Line0);//清除EXTI线路挂起位
delay_ms(10);//消抖
if(GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_2)==Bit_RESET) //k_left被按下
{
delay_ms(10);//消抖处理
if(GPIO_ReadOutputDataBit(GPIOC,GPIO_Pin_0)==Bit_RESET)
{
//LED 熄灭
GPIO_SetBits(GPIOC,GPIO_Pin_0);
}
else
{
//LED 点亮
GPIO_ResetBits(GPIOC,GPIO_Pin_0);
}
}
while(GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_2)==0);
}
}
上一篇:stm32成长记之LED呼吸灯
下一篇:stm32成长记之滴答时钟
推荐阅读最新更新时间:2024-11-08 11:17
设计资源 培训 开发板 精华推荐
- 基于虚拟仪表板
- ADA4505-2ACBZ-R7 血糖仪中使用的四极黄油值滤波器的典型应用电路
- AD8601WARTZ-R7 低侧运算放大器电流监视器的典型应用
- 使用 RTC2-2405SRW 隔离式 DC/DC 转换器、ON/OFF CTRL 电路的典型应用
- LT3970EMS-5 5V 降压转换器的典型应用
- DC1924A,使用 LT8705、80V VIN 和 VOUT 同步 4 开关降压-升压型 DC-DC 控制器的演示板
- SP6641B、3.3V、低电量检测、DC/DC 升压稳压器的典型应用
- IAS1MOD-ARX3A0CSSC090110-GEVB:ARX3A0 彩色 121° DFOV IAS 模块,1/10/3 英寸,0.3 Mp 卷帘快门原型
- 使用 Analog Devices 的 LTC1660IN 的参考设计
- 使用 Analog Devices 的 LTC3555EUFD 的参考设计