STM32外部中断简介
STM32的中断系统由嵌套中断向量控制器(Nested Vectored Interrupt Controller,NVIC)、外部中断/事件控制器(External Interrupt/Event Controller,EXTI)和各个外设中断控制器部分构成。
我们通过外部中断/事件线路映射。
将IO端口映射到16根外部中断线上,外部中断的GPIO的端口映射可由下图体现。
每一组相同的编号的GPIO都被映射到同一个外部中断/事件寄存器中。使用时Cortex-M3可以通过外部中断或者内部中断唤醒内核配置外部IO端口、RTC闹钟和USB唤醒事件来唤醒CPU。
我们在exti.c文件中进行 EXTIX_Init(void)函数编写,以及EXTI0_IRQHandler(void)进行IO口的中断服务程序。在EXTIX_Init(void)函数
中我们需要根据硬件的IO选择相应的中断线以及中断通道。为使用WK_UP、KEY0、KEY1三个按键分别连接到PA0、PE4、PE3三个IO口同时注意到KEY0、
KEY1低电平有效WK_UP按键高电平有效。因此我们在中断中使用中断线0中断线3中断线4(注意此时将WK_UP电阻上拉)
void EXTIX_Init(void)
{
EXTI_InitTypeDef EXTI_InitStructure;
NVIC_InitTypeDef NVIC_InitStructure;
KEY_Init();
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);
//GPIOE.3 KEY1
GPIO_EXTILineConfig(GPIO_PortSourceGPIOE,GPIO_PinSource3);
EXTI_InitStructure.EXTI_Line=EXTI_Line3;
EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;
EXTI_Init(&EXTI_InitStructure);
//GPIOE.4 KEY0
GPIO_EXTILineConfig(GPIO_PortSourceGPIOE,GPIO_PinSource4);
EXTI_InitStructure.EXTI_Line=EXTI_Line4;
EXTI_Init(&EXTI_InitStructure);
//GPIOA.0 PA0 WK_UP
GPIO_EXTILineConfig(GPIO_PortSourceGPIOA,GPIO_PinSource0);
EXTI_InitStructure.EXTI_Line=EXTI_Line0;
EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising;
EXTI_Init(&EXTI_InitStructure);
//设置中断EXTIO中断向量控制
NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x02;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x03;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
//设置中断EXTI3中断向量控制
NVIC_InitStructure.NVIC_IRQChannel = EXTI3_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x02;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x01;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
//设置中断EXTI4中断向量控制
NVIC_InitStructure.NVIC_IRQChannel = EXTI4_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x02;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x00;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
}
TFTLCD显示
使用的TFTLCD型号为2.4&2.8寸TFT(ILI9341芯片驱动)为实现此功能,计划配置好lcd.c并在主函数中使能,并在中断服务程序调用,可以根据自己的需求使用LCD_ShowString()函数模型控制字体的位置大小(注意fond.h字库函数的使用。
240*320分辨率
16位真彩显示(65536色)
自带电阻触摸屏
自带背光电路
以下是中断服务程序
void EXTI0_IRQHandler(void)
{
delay_ms(10);
if(WK_UP==1)
{
LCD_ShowString(30,40,210,40,24,"");
}
EXTI_ClearITPendingBit(EXTI_Line0);//清空中断线上标志位
}
void EXTI3_IRQHandler(void)
{
delay_ms(10);
if(KEY1==0)
{
LCD_ShowString(30,70,200,40,24,"");
}
EXTI_ClearITPendingBit(EXTI_Line3); //清空中断线上标志位
}
void EXTI4_IRQHandler(void)
{
delay_ms(10);
if(KEY0==0)
{
LCD_ShowString(30,90,200,40,24,"");
}
EXTI_ClearITPendingBit(EXTI_Line4); //清空中断线上标志位
}
int main(void)//主函数内容
{
delay_init();
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
uart_init(115200);
KEY_Init();
LCD_Init();
LED_Init();
EXTIX_Init();
LCD_Clear(WHITE);
POINT_COLOR=RED; //设置TFTLCD字体以及屏幕底色
while(1) //执行死循环进入中断
{
printf("OKrn");
delay_ms(1000);
}
}
最后的效果
按下KEY0,KEY1,WK_UP各个按键后屏幕上显示不同的内容,可以根据不同需求更改中断服务程序内容。