HAL_STM32中断,PWM

本文深入解析STM32的中断系统,涵盖中断、中断源、中断向量、优先级等概念,详细介绍了ARM Cortex M3内核的中断管理机制,STM32中断设计步骤,以及基于STM32CubeMX的外部中断设计流程。通过实例,读者可以了解如何配置GPIO引脚、中断触发条件及编写中断服务函数。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

STM32中断系统

理解中断、中断源、中断向量、中断优先级、中断服务函数…等基础概念。
ARM Cortex M3内核支持256个中断,包括16个内核中断和240个外设中断,拥有256个中断优先级别。
STM32的中断通道可能会由多个中断源共用。这就意味着,某一个中断服务函数也可能被多个中断源所共用。所以,在中断服务函数的入口处,需要有一个判断机制,用以辨别是那个中断触发了中断。
STM32微处理器的内核中有一个NVIC(嵌套向量中断控制器)的设备,它对中断进行统一的协调和控制,其中最主要的工作就是控制中断通道的使能和确定中断的优先级。
STM32中有2个优先级的概念:抢占优先级和响应优先级,每个中断都需要指定这两种优先级。
如果两个抢占优先级相同的中断同时到达,NVIC会根据他们的响应优先级高低来决定先处理哪一个。如果两个同时到达的中断的抢占优先级和响应优先级都相等,则根据中断的自然排位顺序来决定响应哪一个。

中断设计步骤

传统STM32外部中断设计步骤:
【1】将GPIO初始化为输入端口。
【2】配置相关I/O引脚与中断线的映射关系。
【3】设置该I/O引脚对应的中断触发条件。
【4】配置NVIC,并使能中断。
【5】编写中断服务函数。
基于STM32CubeMX的外部中断设计步骤:
【1】在STM32CubeMX中指定引脚,配置中断初始化参数。
选择GPIO引脚的功能,设置中断信号触发条件,使能NVIC对应的中断通道。
【2】重写该I/O引脚对应的中断回调函数。

抢占优先级和响应优先级

(1)如果两个中断同时到达,则中断控制器会先处理响应优先级高的中断。(2)当一个中断到来后,如果正在处理另一个中断,则这个后到的中断就要等到前一个中断处理完之后才能被处理(高响应优先级的中断不可以打断低响应优先级的中断)。(3)如果它们的抢占式优先级和响应优先级都相等,则根据它们在中断表中的排位顺序决定先处理哪一个。[link]
(https://zhuanlan.zhihu.com/p/92688895)

NVIC相关函数

设置优先级组:
10HAL_NVIC_SetPriorityGrouping(NVIC_PRIORITYGROUP_4);
(stm32f10xx_hal.c)
在涉及大量中断时设置优先级组可以优化工程,一般工程选NVIC_PRIORITYGROUP_2 就够用了,即2位用来配置抢占优先级,2位用来配置响应优先,即2的2次方共4种抢占优先级,2的2次方共4种响应优先级。

中断线

STM32的每个IO都可以作为外部中断输入。
STM32的中断控制器支持19个外部中断/事件请求:
线0~15:对应外部IO口的输入中断。
线16:连接到PVD输出。
线17:连接到RTC闹钟事件。
线18:连接到USB唤醒事件。

stm32外部中断线有16个,io口有几十上百个,一个中断线可以控制几个io口,但是同一时刻只能响应一个io口的中断。

小蜜蜂老师link

用cubemx初始化后只用重写void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)函数,在里面判断
eg:GPIO_Pin == GPIO_PIN_13

exit

在这里插入图片描述
优先级在中断中有写

PWM

STM32产生PWM原理:
pwm模式1:在向上计数时,一旦TIMx_CNT<TIMx_CCR1时通道一为有效电平,否则为无效。在向下计数时,一旦TIMx_CNT>TIMx_CCR1时通道一为无效电平,否则为有效电平。
pwm模式2:在向上计数时,一旦TIMx_CNT<TIMx_CCR1时通道一为无效电平,否则为有效。在向下计数时,一旦TIMx_CNT>TIMx_CCR1时通道一为有效电平,否则为无效电平。

通俗来说,CNT相当于分针,有一个秒针转一圈CNT加一,再转一圈,再加一。当CNT加到ARR后再加一次,CNT就变成零了。
秒针转一圈多长时间?这就要看预分频系数PSC,时间为时钟频率除以PSC。一个周期为(ARR+1)*(PSC+1)/timer clocks
“本站所有文章均为原创,欢迎转载,请注明文章出处:一只菜鸡儿。(https://blog.youkuaiyun.com/Linuxzbc/article/details/108279737)百度和各类采集站皆不可信,搜索请谨慎鉴别。技术类文章一般都有时效性,本人习惯不定期对自己的博文进行修正和更新,因此请访问出处以查看本文的最新版本。”

### STM32 HAL 库中 PWM 中断使用教程 #### 初始化配置 为了实现PWM功能并利用中断机制,在初始化阶段需通过STM32CubeMX工具完成基本设置。这包括选择合适的定时器资源以及设定其工作模式为PWM输出模式[^1]。 ```c // 配置TIMx通道用于PWM输出 htim->Instance = TIMx; htim->Init.Prescaler = PrescalerValue; // 设置预分频值 htim->Init.CounterMode = TIM_COUNTERMODE_UP; // 计数方向向上计数 htim->Init.Period = PeriodValue; // 自动重装载周期值 HAL_TIM_PWM_Init(&htim); ``` #### 启用PWM中断服务函数 当需要响应特定事件如脉冲结束时触发的动作,则要注册相应的回调函数来处理这些事件。对于PWM而言,通常会关注`Pulse Finished Callback`和`Delay Elapsed Callback`两种情况下的行为[^4]。 ```c void HAL_TIM_PWM_MspInit(TIM_HandleTypeDef* htim_pwm){ /* Enable the timer global interrupt */ HAL_NVIC_SetPriority(TIM_IRQn, 0, 1); HAL_NVIC_EnableIRQ(TIM_IRQn); } __weak void HAL_TIM_PWM_PulseFinishedCallback(TIM_HandleTypeDef *htim){} __weak void HAL_TIM_OC_DelayElapsedCallback(TIM_HandleTypeDef *htim){} ``` #### 实现具体逻辑 在实际应用开发过程中,可以根据项目需求自定义上述两个弱声明的回调方法体内的执行流程。比如可以在每次PWM波形完成后更新占空比参数从而达到调光效果;也可以用来控制其他硬件动作的发生时刻等操作。 ```c void HAL_TIM_PWM_PulseFinishedCallback(TIM_HandleTypeDef *htim){ if (htim->Channel == HAL_TIM_ACTIVE_CHANNEL_1) { // 当CH1上的PWM信号完成一次循环后改变下一个周期内高电平持续时间的比例 __HAL_TIM_SET_COMPARE(htim,TIM_CHANNEL_1,newDutyCycle); } } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值