资讯动态

深入学习stm32hal定时器1

发布时间:2026/10/25 1:19:00 来源:尧图企业网站定制
1.清除MOE什么是MOEMOE是main output是高级定时器如 STM32 中的 TIM1、TIM8特有的一个安全控制机制它由BDTR断路和死区寄存器中的 MOE 位Main Output Enable控制。主输出Main Output是定时器输出真正生效的“总开关”。哪怕你已经配置了 PWM 模式启用了通道CCx、CCxN设置好了比较值如果MOE 位没打开输出引脚还是不会输出任何波形。总结关闭MOE有两种方式第一种是通过宏__HAL_TIM_MOE_DISABLE来进行手动关闭前提是四个通道输出已经关闭才行。第二种是硬件关闭。// 配置 TIMx 的 Break 输入引入外部保护信号如过流检测电路输出TIMx-BDTR | TIM_BDTR_BKE; // 使能 Break这样一旦故障信号到来MOE 自动清零所有PWM关闭比你代码中判断再清除更快、更安全。2.HAL_TIM_OC_Stop和HAL_TIM_PWM_Stop得区别PWM不也属于OC得范畴嘛通过源代码来进行判断两者函数内部实现完全是一致的3.函数HAL_TIM_PWM_Stop内部有一行代码__HAL_TIM_DISABLE按道理应该只关闭一个通道这行代码的作用是关闭整个TIM外设真的起这个作用吗测试结果不会关闭整个外设只会关闭对应的通道输出HAL_StatusTypeDef HAL_TIM_PWM_Stop(TIM_HandleTypeDef *htim, uint32_t Channel){/* Check the parameters */assert_param(IS_TIM_CCX_INSTANCE(htim-Instance, Channel));/* Disable the Capture compare channel */TIM_CCxChannelCmd(htim-Instance, Channel, TIM_CCx_DISABLE);if (IS_TIM_BREAK_INSTANCE(htim-Instance) ! RESET){/* Disable the Main Output */__HAL_TIM_MOE_DISABLE(htim);}/* Disable the Peripheral */__HAL_TIM_DISABLE(htim);/* Set the TIM channel state */TIM_CHANNEL_STATE_SET(htim, Channel, HAL_TIM_CHANNEL_STATE_READY);/* Return function status */return HAL_OK;}这是关闭某个通道PWM输出的函数代码我有一个问题他的用处应该是关闭其中一个通道但是内部有一个代码__HAL_TIM_DISABLE这是关闭整个定时器这合理嘛按道理应该是关闭整个tim1外设但是实际测试结果是仅仅关闭PA7和PA9PA8和PB0正常输出PWM。猜测如果有其他通道在运行那么就只关闭当前通道而不关闭整个外设还真是下图中的英文注释意思是只有当所有 CCx 和 CCxN 通道均已被禁用时定时器实例的计数器才会被禁用。下面尝试强制输出和GPT描述的是一样的对于一对互补输出的PWM通道无法使其一个通道输出PWM另一个互补通道强制输出低电平或者高电平。如注释所示TIM_OCMODE_FORCED_ACTIVE强制输出高电平结果是CH1主通道输出高电平互补通道输出低电平。强制输出高低电平体现在主通道上。因此如果想要实现互补的通道一个输出PWM一个强制输出高低电平的话想要初始化该互补通道引脚为GPIO才行有点麻烦挺有意思的TIM_OCMODE_FORCED_ACTIVE首先是控制主通道输出高电平互补通道输出低电平。如果你关闭主通道只开着互补通道那么TIM_OCMODE_FORCED_ACTIVE就会控制互补通道输出高电平主打一个得控制输出高电平4.如何设置单脉冲和逆变信号周期的个数通过更新中断来实现在更新中断里面进行计数每进入一次中断代表生成一个PWM次数达到目标次数后关闭5.验证tim1关闭PWM输出时和强制输出低电平时的adc采集值分别是多少估计一个是浮空一个是0。测试结果如下adc采集强制高电平时为3.281adc采集强制低电平时为0.002adc采集pwm关闭输出时采集值任意接与不接pwm输出引脚采集值不变化6.HAL_TIM_PeriodElapsedCallback更新中断产生后会调用这个回调函数这么多的中断回调函数什么时候会被调用呢先放着7.记录HAL_SET_Compare设置倍数占空比变化急剧的原因Single_Pulse(1000,100,10);//PWM周期是1000us脉冲宽度是100us那么占空比是10%打印信息如下说明是没有问题得可是脉冲宽度极小Period: 1000 us, Pulse: 100 us, Prescaler: 79, CCR: 100, Count: 10没有错误占空比10%有点太小了一开始没有反应过来。后续直接*10占空比变为100%又变成没有低电平8.开启定时器中断__HAL_TIM_ENABLE_IT和__HAL_TIM_ENABLE的摆放顺序解决__HAL_TIM_ENABLE_IT应该放在__HAL_TIM_ENABLE前面。原因逻辑上合理确保中断逻辑已经配置完毕即中断服务函数、优先级、标记清楚都准备好再启动定时器9.在中断里面printf(single pulse)没有输出但是我在里面置位debug变量然后在while中进行debug判断并进行打印。疑问为什么在中断中打印不出信息呢很奇怪9.控制TIM1两对互补通道输出互补两对互补PWM信号时只有输出一对互补的PWM信号还有一对只能输出高低电平。原因没有设置通道2的CCR即没有加上红框代码导致一直输出高电平因为这段代码是直接复制的单脉冲生成函数单脉冲函数里面只用到通道1没用到通道2没注意。我一开始以为是单脉冲函数里面的强制CH2-PWM2B输出低电平导致的后来排除掉这个可能10._HAL_TIM_DISABLE(htim6)和HAL_TIM_Base_Stop_IT(htim6);有啥区别HAL_TIM_Base_Stop_IT是停止定时器计数并且关闭中断属于完全关闭_HAL_TIM_DISABLE是仅仅停止定时器计数不关闭中断这适合暂停一下定时器后续接着使用11.记录一下玄学问题Nucleo-L432KC开发板第一次插到电脑上时是不能正常工作的体现在昨天可以正常运行的程序今天再次烧录就出不了现象并且连基本的GPIO点亮LED都没有正常点亮重新插拔之后就可以正常运行了LED也被正常点亮12.使用中断加状态机输出指定的PMW波形这个波形的下降沿十分缓慢呈现45度夹角我不是理解因为我直接在while循环里面测试是很好的占空比为50%的方波13.用于启动定时器传进来的参数必须大于1否则无法开启中断GPT解释但是没有看文档具体验证应该是这样吧。确实没注意这个细节卡了一些时间14.遇到一个不算是bug的情况但我以为是一个bug生成逆变单脉冲时需要1A和2B2A和1B交替导通一小段可自定义的时长于是我便让定时器1A引脚输出测试波形一看波形周期是对的但是会有一段很长的下降沿我以为他是电压下降的太慢导致的后续测试应该是处于关闭状态电压处于floating状态不用担心不是一个bug第二个玄学问题TIM1-CH2的强制通道输出引脚没有效果一直都是高电平或者低电平切换强制高低电平没有效果我不是很理解我将输出通道改为ch1就可以进行强制电平翻转改为ch2就不行真玄学我打算先将pwm输出引脚转换为普通的gpio引脚来进行控制等后续有时间再尝试tim1-ch2的强制电平翻转真的是有趣哇核心先把结果搞出来不要顾及太多15.定时器计数问题TIM6_Init2可以运行会每1us执行一次中断。TIM6_Init1就不会触发中断16.下午查原因为什么其他指令不回复原因校验码计算错误不是只有四个字节相加而是19个字节相加只是之前是因为大部分字节是00。但是没有解决问题很奇怪还是遇到玄学问题勒。原因是对应的指令没有开启led翻转emmm解决下位机接收到数据都是1和0的问题emmm服了||和|没分清楚前者是逻辑运算后者是bit运算两码事

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑