完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
扫一扫,分享给好友
学过51单片机的外部中断的话入门会很快;
本篇博文基于STM32F103ZET6芯片,与大多数STM32F10x芯片兼容; 代码基于ST官网提供的3.5.0标准库 如有不足之处,还望前辈多多指教; 一些需要了解的基础知识
图片反映GPIO管脚和外部中断的对应关系 通过上面的图能看出来每个管脚所对应的外部中断线,但是我们在应用的时候不会将所有的GPIO管脚都去配置,所以这时候就需要我们去通过调用库函数去人为的去配置寄存器;下面说程序配置的过程 编程步骤的实现以及对应库函数的讲解 本例程将实现一个按键的按下触发对应的GPIO口的外部中断,中断函数内部实现一个对LED灯的控制; 初始化GPIO口为输入 GPIO_InitTypeDef GPIO_InitStructure; //PE.2的外部电路是外部下拉,配置管脚的时候将它设置为上拉输入 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOx,ENABLE); //使能GPIOE时钟 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_x; //确定要操作的管脚 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_x; //设置此管脚为输入 GPIO_Init(GPIOx, &GPIO_InitStructure); //初始化GPIOE2 2.开启GPIO口复用时钟,设置GPIO口与中断线的映射关系 void GPIO_EXTILineConfig(GPIO_PortSourcex , GPIO_PinSourcex); //开启对应管脚和外部中断线的连接 1 例:GPIO_EXTILineConfig(GPIO_PortSourceGPIOE , GPIO_PinSource2); //中断线2与GPIOE连接,即与EXTI2中断线连接; 初始化线上中断,设置触发条件等; EXTI_InitTypeDef EXTI_InitStructure; EXTI_InitStructure.EXTI_Line=EXTI_Linex; //配置中断线标号;范围从EXTI_Line0 ~ EXTI_Line15; EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt; //设置模式为中断模式; 可选EXTI_Trigger_interrupt和EXTI_Trigger_Event; EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling; //设置触发方式为下降沿;可选下降沿触发:EXTI_Trigger_Falling;上升沿触发: EXTI_Trigger_Rising;上升沿和下降沿都触发:EXTI_Rising_Falling; EXTI_InitStructure.EXTI_LineCmd = ENABLE; //使能此中断线 EXTI_Init(&EXTI_InitStructure); //根据EXTI_InitStruct中指定的参数初始化外设EXTI寄存器 配置中断分组(NVIC),并使能中断; NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //这里只是举个例子分组模式为NVIC_PriorityGroup_2,即抢占优先级为0~3,响应优先级为0~3; NVIC_InitTypeDef NVIC_InitStructure; NVIC_InitStructure.NVIC_IRQChannel = EXTIx_IRQn; //使能按键KEY2所在的外部中断通道 NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x02; //抢占优先级2, NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x02; //子优先级2 NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //使能外部中断通道 NVIC_Init(&NVIC_InitStructure); 编写中断服务函数 STM32的GPIO口外部中断函数只有6个,分别是: EXPORT EXT0_IRQHandler EXPORT EXT1_IRQHandler EXPORT EXT2_IRQHandler EXPORT EXT3_IRQHandler EXPORT EXT4_IRQHandler EXPORT EXT9_5_IRQHandler EXPORT EXT15_10_IRQHandler 这里需要解释: 中断线0~4每个中断线对应一个中断函数 举个例子:PA0,PB0,PC0,PD0,PE0,PF0 共用 void EXT0_IRQHandler(void)中断函数; PA1,PB1,PC1,PD1,PE1,PF1 共用 void EXTI1_IRQHandler(void)中断函数; …… …… PA4,PB4,PC4,PD4,PE4,PF4 共用 void EXTI4_IRQHandler(void)中断函数; 中断线5~9共用一个中断函数:EXTI_9_5_IRQHandler PA5,PA6,PA7,PA8,PA9 PB5,PB6,PB7,PB8,PB9 PC5,PC6,PC7,PC8,PC9 PD5,PD6,PD7,PD8,PD9 PE5,PE6,PE7,PE8,PE9 中断线10~15共用中断函数EXTI15_10_IRQHandler PA10,PA11,PA12,PA13,PA14,PA15 PB10,PB11,PB12,PB13,PB14,PB15 PC10,PC11,PC12,PC13,PC14,PC15 PD10,PD11,PD12,PD13,PD14,PD15 PE10,PE11,PE12,PE13,PE14,PE15 判断中断线上中断是否发生的函数(中断标志位是否置位) ITStatus EXTI_GetITStatis(uint32_t EXTI_Line); //一般放在中断程序的开头检查所检查的中断线是否发生中断 1 清除中断标志位函数(这个有点像C51单片机里边的IT还是TI忘记了,反正就是中断标志位) void EXTI_ClearITPendingBit(uint32_t EXTI_Line); 1 应用中的中断服务函数格式: void EXTIx_IRQHandler(void) { if(!(GPIO_ReadInputDataBit(GPIOx,GPIO_Pin_x))) //判断按键是否被按下 { 中断逻辑…… } EXTI_ClearITPendingBit(EXTI_Linex); //清除Line上的中断标志位 } 有关寄存器 中断屏蔽寄存器EXTI_IMR 事件屏蔽寄存器EXTI_EMR 上升沿触发选择寄存器EXTI_RTSR 下降沿触发选择寄存器EXTI_FTSR 软件中断时间寄存器EXTI_SWIER 挂起寄存器EXTI_PR |
|
|
|
只有小组成员才能发言,加入小组>>
调试STM32H750的FMC总线读写PSRAM遇到的问题求解?
1574 浏览 1 评论
X-NUCLEO-IHM08M1板文档中输出电流为15Arms,15Arms是怎么得出来的呢?
1519 浏览 1 评论
949 浏览 2 评论
STM32F030F4 HSI时钟温度测试过不去是怎么回事?
672 浏览 2 评论
ST25R3916能否对ISO15693的标签芯片进行分区域写密码?
1565 浏览 2 评论
1852浏览 9评论
STM32仿真器是选择ST-LINK还是选择J-LINK?各有什么优势啊?
622浏览 4评论
STM32F0_TIM2输出pwm2后OLED变暗或者系统重启是怎么回事?
508浏览 3评论
514浏览 3评论
stm32cubemx生成mdk-arm v4项目文件无法打开是什么原因导致的?
494浏览 3评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-15 02:22 , Processed in 0.725501 second(s), Total 79, Slave 62 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号