1. stm32 外部中断简介stm32 的每个 io 都可以作为外部中断的中断输入口。stm32f103 的中断控制器支持 19 个外部中断/事件请求。每个中断设有状态位,每个中断/事件都有独立的触发和屏蔽设置。代码主要分布在固件库的 stm32f10x_exti.h 和 stm32f10x_exti.c 文件。
stm32f103的 19 个外部中断为:
触发方式:stm32 的外部中断是通过边沿来触发的,不支持电平触发。
2. 外部中断分组stm32 的每一个 gpio 都能配置成一个外部中断触发源,stm32 通过根据引脚的序号不同将众多中断触发源分成不同的组。
比如:pa0,pb0,pc0,pd0,pe0,pf0,pg0 为第一组。
依此类推,我们能得出一共有16 组,stm32 规定,每一组中同时只能有一个中断触发源工作,那么,最多工作的也就是16个外部中断。
3. 使用 io 口外部中断的配置步骤3.1 初始化 io 口为输入设置作为外部中断输入的 io 口的状态,可以设置为上拉 / 下拉输入 / 浮空输入,但浮空的时候外部一定要带上拉,或者下拉电阻。否则可能导致中断不停的触发。在干扰较大的地方,就算使用了内部上拉/下拉,也建议使用外部上拉/下拉电阻,这样可以一定程度防止外部干扰带来的影响。
3.2 开启 io 口复用时钟,设置 io 口与中断线的映射关系stm32 的 io 口与中断线的对应关系需要配置外部中断配置寄存器 exticr,这样我们要先开启复用时钟,然后配置 io 口与中断线的对应关系。才能把外部中断与中断线连接起来。
3.3 开启与该io口相对的线上中断/事件,设置触发条件配置中断产生的条件,stm32 可以配置成上升沿触发,下降沿触发,或者任意电平变化触发,但是不能配置成高电平触发和低电平触发。同时要开启中断线上的中断。
注意:
如果使用外部中断,并设置该中断的 emr 位的话,会引起软件仿真不能跳到中断,而硬件上是可以的。而不设置 emr,软件仿真就可以进入中断服务函数,并且硬件上也是可以的。建议不要配置 emr 位。
3.4 配置中断分组nvic配置中断的分组,以及使能,对 stm32 的中断来说,只有配置了 nvic 的设置,并开启才能被执行,否则是不会执行到中断服务函数里面去的。
3.5 编写中断服务函数这是中断设置的最后一步,中断服务函数,是必不可少的,如果在代码里面开启了中断,但是没编写中断服务函数,就可能引起硬件错误,从而导致程序崩溃!所以在开启了某个中断后,一定要记得为该中断编写服务函数。在中断服务函数里面编写你要执行的中断后的操作。
4. 例程分析4.1 配置外部中断对应io//---------------------------------------------------------------------------------------------------------------------------------------------// 函 数 名: exti_gpio_config// 功能说明: 外部中断gpio参数配置// 形 参: 无// 返 回 值: 无// 日 期: 2020-04-25// 备 注: // 作 者: by 霁风ai//---------------------------------------------------------------------------------------------------------------------------------------------static void exti_gpio_config(void){ gpio_inittypedef gpio_init_config; rcc_apb2periphclockcmd(rcc_apb2periph_gpioa, enable);//使能porta时钟 gpio_init_config.gpio_pin = gpio_pin_0;//pa0 gpio_init_config.gpio_mode = gpio_mode_ipd; //pa0设置成输入,默认下拉 gpio_init(gpioa, &gpio_init_config);//初始化gpioa.0}4.2 配置外部中断参数//---------------------------------------------------------------------------------------------------------------------------------------------// 函 数 名: exti_config// 功能说明: 外部中断参数配置// 形 参: 无// 返 回 值: 无// 日 期: 2020-04-25// 备 注: // 作 者: by 霁风ai//---------------------------------------------------------------------------------------------------------------------------------------------static void exti_config(void){ exti_inittypedef exti_init_config; rcc_apb2periphclockcmd(rcc_apb2periph_afio, enable); //外部中断,需要使能afio时钟 gpio_extilineconfig(gpio_portsourcegpioa, gpio_pinsource0); //pa0设置为外部中断 exti_init_config.exti_line = exti_line0; exti_init_config.exti_mode = exti_mode_interrupt; exti_init_config.exti_trigger = exti_trigger_rising;//上升沿触发 exti_init_config.exti_linecmd = enable; exti_init(&exti_init_config); //根据exti_inittypedef中指定的参数初始化外设exti寄存器}4.3 配置中断向量//---------------------------------------------------------------------------------------------------------------------------------------------// 函 数 名: exit_nvic_config// 功能说明: 中断向量参数配置// 形 参: 无// 返 回 值: 无// 日 期: 2020-04-25// 备 注: // 作 者: by 霁风ai//---------------------------------------------------------------------------------------------------------------------------------------------static void exti_nvic_config(void){ nvic_inittypedef nvic_init_config; nvic_init_config.nvic_irqchannel = exti0_irqn;//使能按键所在的外部中断通道 nvic_init_config.nvic_irqchannelpreemptionpriority = 0x02;//抢占优先级2 nvic_init_config.nvic_irqchannelsubpriority = 0x02;//子优先级1 nvic_init_config.nvic_irqchannelcmd = enable; nvic_init(&nvic_init_config);}4.4 统一外部中断调用接口//---------------------------------------------------------------------------------------------------------------------------------------------// 函 数 名: exti_init// 功能说明: 外部中断初始化// 形 参: exti_no:中断号// 返 回 值: 无// 日 期: 2020-04-25// 备 注: 外部调用此函数,实现exti的初始化配置// 作 者: by 霁风ai//---------------------------------------------------------------------------------------------------------------------------------------------void exti_init(uint8_t exti_no){ if (exti_no == 0) { exti_gpio_config(); exti_config(); exti_nvic_config(); }}4.5 编写中断服务函数//---------------------------------------------------------------------------------------------------------------------------------------------// 函 数 名: exti0_irqhandler// 功能说明: 外部中断0服务函数// 形 参: 无// 返 回 值: 无// 日 期: 2020-04-25// 备 注: // 作 者: by 霁风ai//---------------------------------------------------------------------------------------------------------------------------------------------void exti0_irqhandler(void){ if (exti_getitstatus(exti_line0) != reset) { g_exti_cnt++; if (g_exti_cnt % 2) { bsp_ledon(0); //点亮oled0 } else { bsp_ledoff(0); //熄灭oled0 } if (g_exti_cnt > 200) { g_exti_cnt = 0; } exti_clearitpendingbit(exti_line0); //清除exti0线路挂起 }}补充:
在编写中断服务函数的时候会经常使用到两个函数。
(1)第一个函数是判断某个中断线上的中断是否发生(标志位是否置位):
itstatus exti_getitstatus(uint32_t exti_line);这个函数一般使用在中断服务函数的开头判断中断是否发生。
(2)第二个是清除某个中断线上的中断标志位:
void exti_clearitpendingbit(uint32_t exti_line);这个函数一般应用在中断服务函数结束之前,清除中断标志位。
仙知机器人将带领中国工厂走向创新智能化
7nm成台积电最大收入来源,未来还能继续统治市场?
国产AI芯片如何撑起来?GPGPU和ASIC技术路线齐头并进
浅析开关稳压器电路内部元件的作用
MWC2016:联网汽车有哪些新体验
STM32学习笔记一外部中断
防止MAX2104电路中的寄生模式振荡
美国洛克希德·马丁公司帮日本建造被称为F-3的隐身性战机
拆解轻得离谱的镍氢电池充电器
基于碳化硅的功率二极管技术的特点及应用分析
想要游戏聊天两不误?可以试试这个 任天堂Switch专用键盘
性价比高的OPPO A93上线,大内存、高刷均兼备
华为继续从美国厂商购买组件
五大要素驱动云创新助推全球社会经济发展
奥林巴斯亮相第七届国际核电运维大会,为核电安全保驾护航
荣耀20青春版与荣耀20i 得按您的需求来选择
FPGA如何成为新时代的“宠”儿,FPGA技术未来将会独领风骚
如何使用Python Turtle进行编码
什么人不适合当程序员
AI技术怎样帮助实现因材施教