完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
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分辨率 以下是中断服务程序 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各个按键后屏幕上显示不同的内容,可以根据不同需求更改中断服务程序内容。 |
|
|
|
只有小组成员才能发言,加入小组>>
调试STM32H750的FMC总线读写PSRAM遇到的问题求解?
1617 浏览 1 评论
X-NUCLEO-IHM08M1板文档中输出电流为15Arms,15Arms是怎么得出来的呢?
1543 浏览 1 评论
977 浏览 2 评论
STM32F030F4 HSI时钟温度测试过不去是怎么回事?
683 浏览 2 评论
ST25R3916能否对ISO15693的标签芯片进行分区域写密码?
1595 浏览 2 评论
1863浏览 9评论
STM32仿真器是选择ST-LINK还是选择J-LINK?各有什么优势啊?
645浏览 4评论
STM32F0_TIM2输出pwm2后OLED变暗或者系统重启是怎么回事?
516浏览 3评论
532浏览 3评论
stm32cubemx生成mdk-arm v4项目文件无法打开是什么原因导致的?
505浏览 3评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-22 12:28 , Processed in 0.741332 second(s), Total 77, Slave 60 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号