STM32 LL库中断配置引脚外部中断的方式

中断原理图
很多情况可以产生中断,开发者可以在cubemx中nvic选单、通讯模块选单处配置。请自行探索;部分中断有关的内容在模块讲解时·将会提到。
※启用中断后,注意在system core->nvic->code generation中勾选生成irq handler和 select for init sequence ordering。
※生成的中断函数定义在stm32fxxx_it.h和stm32fxxx_it.c中,向函数中填要执行的代码即可。
对于外部中断的事件分配,多个引脚将被分配到中断事件(具体可以参考文档),若需要区分则须在中断程序内写判断。判断方式之后给到
配置引脚外部中断的方式:
①在引脚图上选中需要配置的引脚,选择中断功能(如图)
②在nvic选单中使能中断
③在nvic->code generation中勾选生成irq handler和 select for init sequence
勾选select for init sequence是个人习惯,这样可以在main.c中生成独立初始化函数
④在gpio->gpio配置中断模式(如图)
可以配置上/下拉电阻(上拉、下拉、浮空)和中断触发模式。
⑤生成代码。(stm32fxxx_it.c中,配置为interrupt mode)
void exti15_10_irqhandler(void){ /* user code begin exti15_10_irqn 0 */ /* user code end exti15_10_irqn 0 */ /* user code begin exti15_10_irqn 1 */ /* user code end exti15_10_irqn 1 */}外部触发类型与中断处理:
一、触发类型
上升沿触发、下降沿触发、上升/下降沿触发(电平变化触发)
二、中断处理※
分为中断模式(interrupt mode) 和 事件模式(event mode) 两种
中断模式即为普通中断,其概念不多解释。配置成中断模式时,stm32fxxx_it库中会自动生成中断句柄函数。
※ 事件模式 。(很少用)
参考本文最前面提供的中断原理图。在配置为事件模式时,中断信号将传输给图中的pulse generator而非中断控制器。
虽然中断和事件的硬件信号产生源相同,但是配置为事件时将不会发生挂起,也就是说事件过程不需cpu的参与,可以与主程序并行: 事件机制提供了一个完全由硬件自动完成的触发到产生结果的通道,不要软件的参与,降低了cpu的负荷,节省了中断资源,提高了响应速度(硬件总快于软件)。
※事件模式虽然有优势,但在实际工程中几乎不会有人使用。不讲了。之后的代码默认使用中断模式配置。
配置外部中断需要三步: 1.配置gpio与中断线(input line)连接 2.中断线配置 3.中断向量配置
结合代码:
pin:pc13mode:interrupt; rising edge trigger detectionpull: floating在gpio.c :
/*连接引脚与中断线(exticrn)*/ ll_gpio_af_setextisource(ll_gpio_af_exti_portc, ll_gpio_af_exti_line13); /*配置中断线*/ exti_initstruct.line_0_31 = ll_exti_line_13; //配置触发源的连接 exti_initstruct.linecommand = enable; exti_initstruct.mode = ll_exti_mode_it; exti_initstruct.trigger = ll_exti_trigger_rising; ll_exti_init(&exti_initstruct); /*引脚gpio设置*/ ll_gpio_setpinmode(gpioc, ll_gpio_pin_13, ll_gpio_mode_floating); /* exti interrupt init*/ nvic_setpriority(exti15_10_irqn, nvic_encodepriority(nvic_getprioritygrouping(),1, 0)); nvic_enableirq(exti15_10_irqn);※关于ll_exti_line_x:
x代表的是中断线;中断线(linex) 是中断信号的输入硬件。
line连接gpio,例如line13可接pa13、pb13、pc13....。可以将引脚与中断线理解为短接。中断线同时只能连接一个引脚(linex只能连接pax,pbx,pcx,pdx...其一)。 来自input line的信号输入触发中断程序的调用
※中断程序结束时别忘清除中断位挂起位
ll api分析:
input line引脚输入配置
stm32fxxx_ll_gpio.h中:
/**/__static_inline void ll_gpio_af_setextisource(uint32_t port, uint32_t line);/*使能中断引脚 pnx;通过此函数将使引脚连接相应的exti_line_x。@param port =ll_gpio_af_exti_portn@param line =ll_gpio_af_exti_linex※每次只能配置一个引脚 pnx; pnx 将连接exti_line_x*/__static_inline uint32_t ll_gpio_af_getextisource(uint32_t line);/* 返回连接在exti_linex上的引脚信息(端口号)。 @param line =ll_gpio_af_gpio_linex @retval: ll_gpio_af_gpio_portn*/exti_line配置结构体ll_exti_inittypedef
typedef struct{ uint32_t line_0_31;/* exti_line选择; line_0_31= ll_exti_line_x */ functionalstate linecommand; /* 使能位。linecommand= enable */ uint8_t mode;/* 模式选择; mode= ll_exti_mode_it 中断模式 ll_exti_mode_event 事件模式 ll_exti_mode_it_event 中断&事件模式 */ uint8_t trigger;/* 触发模式选择; trigger = ll_exti_trigger_none 无触发 ll_exti_trigger_rising 上升沿触发 ll_exti_trigger_falling 下降沿触发 ll_exti_trigger_rising_falling 上升/下降均触发 */} ll_exti_inittypedef;初始化函数ll_exti_init()
errorstatus ll_exti_init(ll_exti_inittypedef *exti_initstruct)/* 初始化并启用中断exti_linex。操作成功返回success*/重设中断结构体
void ll_exti_structinit(ll_exti_inittypedef *exti_initstruct){ exti_initstruct- >line_0_31 = ll_exti_line_none; exti_initstruct- >linecommand = disable; exti_initstruct- >mode = ll_exti_mode_it; exti_initstruct- >trigger = ll_exti_trigger_falling;}•
软件中断触发函数(模拟外部触发)
__static_inline void ll_exti_generateswi_0_31(uint32_t extiline){//extiline = ll_exti_line_x;触发line_x对应的中断处理函数;效果与外部触发相同 set_bit(exti- >swier, extiline);}//软件触发寄存器swier改变可以通过清零挂起位pr清除中断线判断函数:
__static_inline uint32_t ll_exti_isactiveflag_0_31(uint32_t extiline);/*@param extiline =ll_exti_line_x当extiline是引发中断函数的中断线时,返回值为!reset ;反之返回值reset (=0)*/挂起位清除函数:
清除函数挂起位,使能下一次中断唤起
__static_inline void ll_exti_clearflag_0_31(uint32_t extiline);/*@param extiline =ll_exti_line_x清除中断挂起位;若中断是由软件模拟外部触发实现的,清除时一并将swier位清除*/使用案例
void exti15_10_irqhandler(void){ ll_mdelay(10);//按键消抖,防止多次触发(一置位pr即可能再次触发) if (ll_exti_isactiveflag_0_31(ll_exti_line_13) != reset)//当中断由exti_line_13引起 { /* user code begin ll_exti_line_13 */ ll_exti_clearflag_0_31(ll_exti_line_13); //清除标志位 ll_gpio_togglepin(gpioa, ll_gpio_pin_15); //翻转led /* user code end ll_exti_line_13 */ } if (ll_exti_isactiveflag_0_31(ll_exti_line_15) != reset)//当中断由exti_line_15引起 { ll_exti_clearflag_0_31(ll_exti_line_15); //清除标志位 }}

可控硅整流电路及其工作原理
松下发布全新KAIROS紧凑型控制面板AT-KC10C2
如何避免PCB电路板线路层氧化的解决办法
Kepware助力宾夕法尼亚大学实现校园运营管理
富士通信号继电器的发展图
STM32 LL库中断配置引脚外部中断的方式
为什么需要IPFS重新架构整个网络
CX5010嵌入式控制器:高性能,多接口
瑞福锂业与南澳锂矿签订五年协议,促进共同发展
从Windows命令提示符将文档和图像转换为PDF
ABB机器人编程的详细解析
LG新能源采用新工艺提升其电芯良品率和生产效率
TCL X10养生舱冰箱:一款伊能静都在推荐的智能家电
中国联通:2019全网开通VoLTE,确保5G高质量语音
助听器的设计与制作
微软市值上终于超越了苹果,成为全球市值最高上市公司
荣耀10GT版游戏性能怎么样
不同类别的传感器集成形式分类
聊一聊MES数据采集系统需求分析和总体设计
闲谈Vitis AI|DPU在UltraScale平台下的软硬件流程(1)