EXTI:External interrupt/event controller
EXTI
中断流程:
输入线(软件中断事件寄存器:EXTI_SWIER:20位)→边沿检测电路→软件中断事件控制寄存器(软件中断事件寄存器:EXTI_SWIER:20位)→请求挂起寄存器(挂起寄存器:EXTI_PR:20位)→中断屏蔽寄存器(中断屏蔽寄存器:EXTI_IMR:20位)→到NVIC中断控制器
事件流程:
输入线→边沿检测电路→软件中断事件控制寄存器→事件屏蔽寄存器(EXTI_EMR)→脉冲发生器(触发ADC、定时器等)
输入线:
20根,EXTI0-15(GPIO)、EXTI16(PVD输出)、EXTI17(RTC闹钟事件)、
EXTI18(USB唤醒事件)、EXTI19(以太网唤醒事件)
寄存器:AFIO_EXTICR,低16位,高16位保留,4位位1组
使用按键控制LED灯
按键:GPIOC_13
//初始化GPIO
void GPIO_Key_Config(void)
{
GPIO_InitTypeDef GPIO_InitStruct;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_13;
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_Init(GPIOC, &GPIO_InitStruct);
}
//初始化EXTI
void EXIT_Key_Config(void)
{
EXTI_InitTypeDef EXTI_InitStruct;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);
//选择输入线
GPIO_EXTILineConfig(GPIO_PortSourceGPIOC, GPIO_PinSource13);
//用于产生中断/事件线(20)
EXTI_InitStruct.EXTI_Line = EXTI_Line13;
//中断/事件模式
EXTI_InitStruct.EXTI_Mode = EXTI_Mode_Interrupt;
//上升沿触发
EXTI_InitStruct.EXTI_Trigger = EXTI_Trigger_Rising;
//使能
EXTI_InitStruct.EXTI_LineCmd = ENABLE;
EXTI_Init(&EXTI_InitStruct);
}
//
void EXTI_NVIC_Config(void)
{
NVIC_InitTypeDef NVIC_InitStruct;
//配置优先级分组
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
//选择中断源,stm32f10x.h文件中
NVIC_InitStruct.NVIC_IRQChannel = EXTI15_10_IRQn;
NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 1;
NVIC_InitStruct.NVIC_IRQChannelSubPriority = 1;
NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStruct);
}
//编写中断服务函数
//启动文件中找到中断服务函数的名称,在stm32f10x_it.c文件中编写
void EXTI15_10_IRQHandler (void)
{
//判断指定的EXTI线路出发是否发生
if(EXTI_GetITStatus(EXTI_Line13) != RESET)
{
LED_B_TOGGLE;
}
//清除EXTI线路挂起位
EXTI_ClearITPendingBit(EXTI_Line13);
}
网友评论