
前言 基于学习的目的,详细讲解关于标准外设库中的定时器的 17 个示例项目函数文件。本次介绍 OnePulse。 一、示例详解 基于硬件平台:STM32F100B-EVAL,MCU 的型号是 STM32F100VBT6。 软件则是其标准外设库。 单脉冲模式(OPM)允许计数器在受到一个激励时启动,在一个可编程的延时后产生一个宽度可编程的脉冲。 1、One Pulse 的寄存器配置 软件配置,运行程序可以发现,系统时钟设置为 24MHz,定时器使用到的是 TIM4; ![]() 根据时钟树的图谱及其程序, 该示例选择的是内部时钟源作为定时器的时钟源;TIM4 的时钟源来自 APB1 的分频。 ![]() ![]() AHB 时钟 (HCLK)在 RCC_CFGR 寄存器中的分频系数 HPRE 的值为 0,即 SYSCLK not divided,即/1,所以 HCLK 就是24MHz; APB1 的 prescaler 的系数是 PPRE1:0x0,HCLK not divided,即/1,APB1CLK 为 24MHz;由于 APB1 的 prescaler 系数部分频,即/1,所以倍频器不起作用,即为上图中的 TIMxCLK = 24Mhz。 二、示例演练 ![]() 综合上述,本案例中,Timer 的时钟源选择的是 Internal clock,CK_PSC 的时钟频率其实就是时钟树图中的输出 TIMxCLK,然后 TIMxCLK 或 CK_PSC 经过预分频器,才是最终用于计数的时钟基本单位(clock input,输入时钟)。 另外, ![]() 设置 PrescalerValue = 0 和 ClockDivision = 0,不分频,即 TIMxCLK = 24Mhz,即 TIM1 counter clock at 24 MHz。 ![]() OPM = 1,设置为单脉冲模式,在下一次更新事件发生时计数器将停止计数(清零 CEN 位)。 对于 OPM 这一位,默认值是 0,即更新事件发生时计数器不被停止。所以如果成 OPM=0,则相应的波形如下图所示: ![]() 即受到外部触发信号的上升沿后,产生的不是一个脉冲,而是多个脉冲,即 PWM 的波形。从另一方面来说,如果 OPM=0,外部的触发信号也就在第一次上升沿的时候用于触发其他通道输出。之后,由于 OPM=0,即计数器不停止,则会一直输出PWM 波形。 我们接下来看其他的寄存器配置: ![]() SMS = 0x06,从模式选择位,设置为触发模式,在触发 TRGI 出现上升沿时(但未被复位)计数器启动,只有计数器的启动是受控的。 TS = 0x06,触发选择,设置的是被过滤的定时器输入 2(TI2FP2)。 ![]() IC2S(CC2S) = 0x01,设置的是 CC2 通道被配置为输入,IC2 映射到 TI2 上; ![]() CC2P = 0x00,设置的是 0,表示无反转,IC2 上出现上升沿时发生捕获。 所以结合下图,最终的结果是,选择的 TIM4_CH2 作为触发输入,其上升沿发生捕获,用于启动 TIM4。TIM4_CH2 的引脚对应的是 PB7。 在程序中,配置的单脉冲模式,TIM4_CH1 用于输出,对于其的初始化如下图的代码,这儿并没有类似的 TIM_OCInitStructure.TIM_Channel = TIM_Channel_1;的语句,相应的 TIM_OC1Init,这个函数名就是相应的初始化channel_1,如果 TIM_OC2Init 则是初始化 channel_2。 ![]() 下图的波形时运行源程序,OPM=1 的情况下的波形,因为 OPM = 1, 在下一次更新事件发生时计数器将停止计数(清零 CEN位)。所以只会看到一个脉冲。 ![]() 上面黄色的线表示 PB6,TIM4_CH1; 红色的是 PB7,TIM4_CH2; 测量后发现,黄色的脉宽宽度是 2.1ms,符合描述。 ![]() ![]() 对于单脉冲,也可以同时触发几路的输出: 原因如下图: ![]() 在一般的单脉冲模式中,设置的是,TIMx_SMCR 寄存器中的 SMS 从模式选择位,其中的触发模式,是在触发 TRGI 出现上升沿时(但未被复位)计数器启动,只有计数器的启动是受控制的。注意这里控制的是计数器的启动,所以从一点上说明了可以同时输出几路波形的可能性。 另一面,从上图的框架中可以看出, 作为定时器通道本身的触发输入,可能的只有两个:TI1FP1 和 TI2FP2,即 TIMx_CH1和 TIMx_CH2 作为触发输入源的选择。就是输入。 对于输出,按照上面的框图,由于选择了 TI1FP1 或 TI2FP2,接下来走的路径是:Reset,Enable,up\down,Count----> CK_PSC,开始捕捉 CNT,从 CNT 框框中往下的箭头,对于 TIMx_CH1, TIMx_CH2, TIMx_CH3, TIMx_CH4,是并行的,也 就是可以同时输出几路的波形。 理论上是可以的,那么实际呢,只要在初始化一路通道,波形测试如下,也是可以的。 ![]() |
【2025·STM32峰会】GUI解决方案实训分享5-调通板载的NRF24L01 SPI接口并使用模块进行无线通信(发送和接收)
【2025·STM32峰会】GUI解决方案实训分享2-编译运行TouchGFX咖啡机例程(含桌面仿真)
实战经验 | Keil工程使用NEAI库的异常问题
STM32 ISP IQTune:真正零门槛的免费ISP调整软件
【经验分享】STM32 新建基于STM32F40x 固件库的MDK5 工程
意法半导体MCU双供应链策略,打消中国客户后顾之忧
2024意法半导体工业峰会:赋能智能电源和智能工业,构筑可持续未来
ST推出灵活、面向未来的智能电表通信解决方案,助力能源转型
意法半导体 x Qu-Bit Electronix:推动新一轮的数字声音合成革命
从STM32 MPU产品看嵌入式系统中微处理器的新变化