STM32 定时器 中断(内有PWM Mode、CH Ploarity解释)

本文通过实践探讨了PWMMode和CHPolarity设置如何影响输出,使用控制变量法展示了不同模式和极性下高电平位置的变化。同时,详细解释了定时器中断回调函数的种类,如定时器溢出、输出比较、输入捕获、触发和错误中断的回调函数,并阐述了中断服务函数的调用流程。

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

关于PWM Mode、CH Ploarity对输出的影响,多说无益,毕竟实践是检验真理的唯一标准用控制变量法,ARR为1000,占空比为200,通过示波器看高电平的位置,占空比在这里用数字表示,请看实验结果:在这里插入图片描述

PWM Mode CH Ploarity High Low
1 High 200 800
1 Low 800 200
2 High 800 200
2 Low 200 800

可以得出结论。

关于回调函数

当触发中断时会调用对应的中断函数  例如定时器2中断: TIM2_IRQHandler (void) HAL 库中对中断的类
### STM32定时器PWM输入捕获 为了实现STM32定时器PWM输入捕获,需配置特定的硬件资源并编写相应的软件代码。具体来说,需要选择合适的GPIO引脚作为PWM信号的输入通道,并配置定时器的工作模式来捕捉PWM的关键参数。 #### 硬件连接 - **外部信号源**:使用一个信号发生器或其他能够产生PWM信号的设备。 - **STM32捕获输入**:将PWM信号接入至指定的GPIO引脚,例如PA6(TIM2_CH1),该引脚被配置为定时器的输入捕获通道[^1]。 #### 软件配置要点 - **开启时钟**:使能相关外设与时钟树中的对应分支。 - **配置时基单元**:设定预分频系数、自动重装载值等参数以匹配期望的时间基准。 - **配置CCR寄存器**:对于PWM输入捕获而言,至少需要用到两个CCR寄存器分别存储周期长度和脉宽信息[^4]。 - **配置GPIO**:设置用于捕获PWM信号的引脚属性及其复用功能。 - **启动定时器**:激活定时器以便开始监测来自外部的PWM波形变化。 下面是一份基于上述说明编写的C语言程序片段,展示了如何利用CubeMX生成的基础框架进一步定制化开发: ```c #include "main.h" TIM_HandleTypeDef htim2; void SystemClock_Config(void); static void MX_GPIO_Init(void); static void MX_TIM2_Init(void); int main(void){ HAL_Init(); SystemClock_Config(); MX_GPIO_Init(); MX_TIM2_Init(); /* Start Input Capture */ if(HAL_TIM_IC_Start_IT(&htim2, TIM_CHANNEL_1) != HAL_OK){ Error_Handler(); // 错误处理函数 } while(1){} } // 初始化TIM2 static void MX_TIM2_Init(void){ __HAL_RCC_TIM2_CLK_ENABLE(); htim2.Instance = TIM2; // 设置时基结构体 TIM_SlaveConfigTypeDef sSlaveConfig = {0}; TIM_MasterConfigTypeDef sMasterConfig = {0}; htim2.Init.Prescaler = 79; // 假定系统时钟80MHz,则此预分频得到1Mhz计数频率 htim2.Init.CounterMode = TIM_COUNTERMODE_UP; htim2.Init.Period = 65535; // 自动重载值最大范围 htim2.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1; htim2.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE; if (HAL_TIM_Base_Init(&htim2) != HAL_OK){ Error_Handler(); } // 配置IC通道 TIM_IC_InitTypeDef sConfigIC = {0}; sConfigIC.ICPolarity = TIM_INPUTCHANNELPOLARITY_RISING_FALLING; sConfigIC.ICSelection = TIM_ICSELECTION_DIRECTTI; sConfigIC.ICPrescaler = TIM_ICPSC_DIV1; sConfigIC.ICFilter = 0; if (HAL_TIM_IC_ConfigChannel(&htim2, &sConfigIC, TIM_CHANNEL_1) != HAL_OK){ Error_Handler(); } // 主从模式配置 sSlaveConfig.SlaveMode = TIM_SLAVEMODE_RESET; sSlaveConfig.InputTrigger = TIM_TS_TI1FP1; sSlaveConfig.TriggerPolarity = TIM_TRIGGERPOLARITY_NONINVERTED; sSlaveConfig.TriggerFilter = 0; if (HAL_TIM_SlaveConfigSynchronization(&htim2, &sSlaveConfig) != HAL_OK){ Error_Handler(); } sMasterConfig.MasterOutputEnabled= TIM_MASTEROUTPUT_ENABLED; if (HAL_TIMEx_MasterConfigSynchronization(&htim2, &sMasterConfig) != HAL_OK){ Error_Handler(); } } ``` 这段代码实现了对TIM2定时器的基本初始化以及针对通道1的输入捕获功能启用中断服务例程(ISR),从而可以在每次检测到边沿跳变事件时触发回调机制来进行后续的数据读取与分析操作。
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

动态比特

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值