☰
STM32F103 TIM1四通道单脉冲输出:ETR触发配置与避坑指南
2026/10/15 17:33:39 网站建设 项目流程

简介:这份资源面向STM32F103嵌入式开发者与定时器学习者,聚焦高级定时器TIM1的ETR外部触发输入与四通道单脉冲输出(One Pulse Mode)实现,解决外部事件触发下多路精确时序脉冲生成的问题,适合具备一定寄存器与固件库基础的中级开发者参考。压缩包内仅1个C源文件,体积约868B,代码围绕TIM1时钟使能、ETR引脚输入配置、单脉冲模式初始化及各通道比较值设定展开,可直接嵌入工程验证。目前已有4740人学习下载,热度较高。读者可从中获取ETR驱动四通道独立脉冲输出的完整配置思路,理解各通道比较寄存器如何决定脉冲宽度与输出时序,并借鉴外部触发启动、计数到达后自动停止的机制,为电机控制、信号发生与同步信号生成等场景提供可复用的代码骨架与排错参考。

1. 单脉冲输出踩坑记:为什么四路通道偏偏卡在 ETR 上

去年帮一个做步进电机驱动的朋友调板子,STM32F103 的 TIM1 要输出四路单脉冲,每路脉冲宽度和延时都不同,用来分别驱动四个轴的细分控制器。前两路用 TIM1_CH1、CH2 很顺,第三路想用 ETR 引脚做外部触发源时,示波器上死活出不来波形。翻了两天参考手册才发现,TIM1 的 ETR 在单脉冲模式下有个隐藏前提——它默认是外部时钟输入通道,不是普通 PWM 输出通道,想让它参与单脉冲输出,必须先把从模式控制器配成触发启动,再让 ETR 走触发路径而不是时钟路径。

这个坑在中文资料里几乎没人讲透。TIM1 作为 STM32F103 的高级定时器,单脉冲输出模式(One Pulse Mode)本身是标准功能,但四通道同时用、且其中一路涉及 ETR 引脚时,寄存器配置的耦合关系会变得很绕。这篇笔记把 TIM1 四通道单脉冲输出的完整配置链路拆开,重点讲 ETR 通道为什么特殊、怎么配、参数怎么算、哪里容易翻车。适合已经会用 TIM 输出 PWM、但被单脉冲模式和 ETR 复用卡住的嵌入式从业者,新手跟着步骤也能跑通,熟手可以直接看第 4 章的边界条件。

2. TIM1 单脉冲模式与 ETR 通道:寄存器层面的真实关系

2.1 单脉冲模式的本质:一次触发只出一个脉冲

STM32F103 的 TIM1 单脉冲模式,核心逻辑是:定时器收到一个触发信号后,计数器启动,输出一个指定宽度的脉冲,然后自动停止,等待下一次触发。它和普通 PWM 的区别在于“只出一次”,不是连续输出。实现上依赖三个寄存器协同:

  • TIM1_CR1的 OPM 位(One Pulse Mode)置 1,开启单脉冲模式。
  • TIM1_CCMRx配置通道为 PWM 模式 2 或输出比较模式,决定脉冲极性。
  • TIM1_ARR和TIM1_CCRx决定脉冲周期和占空比,也就是脉冲宽度。

触发源可以来自软件(UG 位)、内部时钟、或者外部触发输入。ETR 引脚在这里的角色,就是外部触发输入的一个可选路径。

2.2 ETR 引脚的双重身份:外部时钟还是触发输入

ETR(External Trigger)在 TIM1 里默认走的是外部时钟输入路径,也就是 TIM1_SMCR 寄存器里 ECE=1、SMS=111 的配置。但单脉冲模式需要的是“触发启动”,对应 SMS=110(触发模式)。这两条路径在寄存器层面是互斥的,配错了 ETR 就不会触发单脉冲,而是变成外部时钟计数。

关键寄存器位:

寄存器位域单脉冲触发所需值说明
TIM1_SMCRSMS[2:0]110触发模式,ETR 作为触发源
TIM1_SMCRTS[2:0]111触发源选 ETR
TIM1_SMCRECE0关闭外部时钟模式
TIM1_CR1OPM1单脉冲模式使能
TIM1_CCERCCxE1对应通道输出使能

这张表是整篇文章最核心的配置依据。很多人卡住就是因为 SMS 和 ECE 同时置了 1,结果 ETR 既想当时钟又想当触发,硬件行为不可预测。

2.3 四通道同时输出的资源冲突点

TIM1 有四个独立通道 CH1~CH4,但 ETR 是独立引脚,不占通道。四通道单脉冲输出时,每个通道的 CCRx 可以独立设脉冲宽度,但 ARR 是共享的。这意味着四路脉冲的周期必须一致,只有宽度可以不同。如果四路需要不同周期,单靠 TIM1 做不到,得用多个定时器或者软件重载 ARR。

另一个冲突点是触发源。四通道如果都要外部触发,TIM1 只有一个 ETR 引脚,只能接一路外部信号。如果四路需要独立触发,ETR 方案就不成立,得改用软件触发或者外部中断分别启动。这一点在选型阶段就要想清楚,不然后面改板子更麻烦。

3. 从零配置四通道单脉冲:寄存器操作与 HAL 库两条路

3.1 时钟与 GPIO 初始化:先把引脚复用配对

TIM1 是高级定时器,挂在 APB2 总线上,时钟使能要开 RCC_APB2ENR 的 TIM1EN 位。GPIO 方面,CH1~CH4 对应 PA8、PA9、PA10、PA11,ETR 对应 PA12。这四个引脚都要配成复用推挽输出,但 ETR 作为触发输入时,实际是输入方向,GPIO 模式要配成浮空输入或上拉输入。

// 使能 TIM1 和 GPIOA 时钟 RCC->APB2ENR |= RCC_APB2ENR_TIM1EN | RCC_APB2ENR_IOPAEN; // PA8~PA11 复用推挽输出,50MHz GPIOA->CRH &= ~(0xFF << 0); // 清 PA8~PA11 GPIOA->CRH |= (0xBB << 0); // 1011: 复用推挽, 50MHz // PA12 浮空输入,作为 ETR 触发输入 GPIOA->CRH &= ~(0xF << 16); GPIOA->CRH |= (0x4 << 16); // 0100: 浮空输入

这里有个容易翻车的点:PA12 如果配成复用推挽输出,ETR 就变成输出方向,触发信号进不来。必须配成输入模式。很多人照着 PWM 例程改,忘了改 PA12 的方向,结果 ETR 完全没反应。

3.2 时基与单脉冲参数计算:ARR 和 CCR 怎么定

假设系统时钟 72MHz,TIM1 预分频器 PSC=71,则计数频率 1MHz,每个计数 1us。要输出脉冲宽度 100us、周期 500us 的单脉冲:

  • ARR = 500 - 1 = 499(周期 500us)
  • CCR1 = 100(脉冲宽度 100us)
  • CCR2 = 150(第二路 150us)
  • CCR3 = 200(第三路 200us)
  • CCR4 = 250(第四路 250us)
TIM1->PSC = 71; // 72MHz / (71+1) = 1MHz TIM1->ARR = 499; // 周期 500us TIM1->CCR1 = 100; // CH1 脉冲 100us TIM1->CCR2 = 150; // CH2 脉冲 150us TIM1->CCR3 = 200; // CH3 脉冲 200us TIM1->CCR4 = 250; // CH4 脉冲 250us

参数说明:PSC 和 ARR 都是 16 位寄存器,最大值 65535。如果需要的周期超过 65.535ms(1MHz 计数下),就得加大 PSC 或者用 32 位定时器。TIM1 是 16 位的,这是硬边界。

3.3 通道模式与输出使能:CCMR 和 CCER 的配法

每个通道要配成 PWM 模式 2,这样计数器小于 CCRx 时输出有效电平,到 CCRx 时翻转,配合单脉冲模式就能出一个脉冲。

// CH1~CH4 都配 PWM 模式 2 TIM1->CCMR1 = (0x70 << 4) | (0x70 << 12); // CH1, CH2 TIM1->CCMR2 = (0x70 << 4) | (0x70 << 12); // CH3, CH4 // 使能所有通道输出,高电平有效 TIM1->CCER = TIM_CCER_CC1E | TIM_CCER_CC2E | TIM_CCER_CC3E | TIM_CCER_CC4E;

CCMR 的 OCxM 位设成 111 就是 PWM 模式 2。注意 CCMR1 控制 CH1 和 CH2,CCMR2 控制 CH3 和 CH4,别写错寄存器。

3.4 ETR 触发路径配置:SMCR 寄存器的精确写法

这是整篇文章最关键的一步。ETR 要作为触发源,SMCR 必须这样配:

// ETR 作为触发源,触发模式,关闭外部时钟 TIM1->SMCR = TIM_SMCR_TS_2 | TIM_SMCR_TS_1 | TIM_SMCR_TS_0 | // TS=111, 选 ETR TIM_SMCR_SMS_2 | TIM_SMCR_SMS_1; // SMS=110, 触发模式 // ECE 位保持 0,不使能外部时钟

TS=111 选 ETR 作为触发输入,SMS=110 进入触发模式。ECE 必须为 0,否则 ETR 会走外部时钟路径,单脉冲模式失效。这个配置顺序也有讲究:先配 SMCR,再使能 OPM,最后开定时器。

3.5 启动与验证:OPM 位和 UG 位的时序

TIM1->CR1 |= TIM_CR1_OPM; // 单脉冲模式 TIM1->CR1 |= TIM_CR1_CEN; // 启动定时器 TIM1->EGR |= TIM_EGR_UG; // 软件产生一次更新,加载寄存器

UG 位的作用是手动产生一次更新事件,把 PSC、ARR、CCRx 的值加载到影子寄存器。如果不加这一步,第一次触发时寄存器值可能还没生效,脉冲宽度会不对。这是血泪经验:调试时示波器上第一个脉冲总是怪怪的,加了 UG 就正常了。

验证方法:用信号发生器给 PA12 一个上升沿,示波器接 PA8~PA11,应该看到四路不同宽度的脉冲各出一个,然后停止,等下一个上升沿再出。如果某一路不出,先查对应 CCER 位和 GPIO 配置。

4. 避坑与排查:ETR 单脉冲最常见的五个翻车点

4.1 现象:ETR 引脚有触发信号,但四路都没输出

原因:SMCR 的 SMS 位配成了 000(内部时钟模式),或者 ECE 位误置 1 导致 ETR 走了外部时钟路径,单脉冲模式根本没启动。

解决:读 TIM1->SMCR 的值,确认 SMS=110、TS=111、ECE=0。如果用的是 HAL 库,检查 HAL_TIM_OnePulse_Start 之前有没有调 HAL_TIM_SlaveConfigSynchro 配触发源。

4.2 现象:只有 CH1 出脉冲,CH2~CH4 没反应

原因:CCER 寄存器只使能了 CC1E,其他通道的使能位没置 1。或者 CCMR2 写错,CH3、CH4 的模式位没配对。

解决:直接读 TIM1->CCER,确认低 8 位是 0x11(CC1E~CC4E 都置 1)。CCMR2 的 OC3M 和 OC4M 都要设成 111。

4.3 现象:脉冲宽度和 CCR 值对不上,偏差很大

原因:UG 位没置,影子寄存器没加载,第一次触发用的是复位值。或者 PSC 配错,实际计数频率和预期不符。

解决:在 CEN 置 1 之后、触发之前,手动置一次 UG。用示波器测实际脉冲宽度,反推计数频率,验证 PSC 和 ARR 的计算。

4.4 现象:第二个触发来了没反应,只出一次脉冲

原因:单脉冲模式触发后,TIM1_CR1 的 CEN 位被硬件自动清零,定时器停了。下一次触发需要重新置 CEN。

解决:在触发中断或者外部中断里重新置 CEN 和 UG。如果用的是 ETR 触发,硬件不会自动重新使能,必须在软件里处理。

4.5 现象:四路脉冲同时出,但相位完全一样,没有先后

原因:四通道共享同一个计数器和 ARR,CCRx 只决定脉冲宽度,不决定起始时刻。如果四路需要错开起始时间,单靠 TIM1 的 CCRx 做不到。

解决:需要错相的话,用四个独立定时器,或者用 DMA 动态改 CCRx 的值。TIM1 的四通道单脉冲只适合“同时启动、宽度不同”的场景。

5. 进阶技巧:用 DMA 动态改 CCR 实现变宽度脉冲序列

四通道单脉冲输出固定宽度只能应付简单场景。实际项目里经常需要一串宽度递增或递减的脉冲,比如驱动步进电机做加减速。这时候可以用 DMA 在每次触发后自动更新 CCRx 的值,实现脉冲宽度序列。

思路是:把一组 CCR 值放在数组里,DMA 通道配成内存到外设模式,外设地址指向 TIM1->CCR1,每次更新事件触发一次 DMA 传输。这样每来一个触发,CCR1 就换成下一个值,输出宽度就变了。

uint16_t ccr_seq[] = {100, 150, 200, 250, 300, 350, 400}; // DMA1 通道 2 配到 TIM1_CH1 DMA1_Channel2->CPAR = (uint32_t)&TIM1->CCR1; DMA1_Channel2->CMAR = (uint32_t)ccr_seq; DMA1_Channel2->CNDTR = 7; DMA1_Channel2->CCR = DMA_CCR_MINC | DMA_CCR_DIR | DMA_CCR_CIRC; DMA1_Channel2->CCR |= DMA_CCR_EN; // TIM1 使能 DMA 更新请求 TIM1->DIER |= TIM_DIER_UDE;

参数说明:CIRC 位让 DMA 循环传输,数组用完自动回到开头。CNDTR 是传输次数,对应数组长度。DIER 的 UDE 位让每次更新事件都发 DMA 请求。这样每触发一次,CCR1 就换一个值,脉冲宽度按数组顺序变化。

验证方法:示波器接 PA8,给 PA12 一串触发信号,应该看到脉冲宽度按 100、150、200 的顺序变化。如果宽度不变,查 DMA 的 CPAR 地址对不对,DIER 的 UDE 位有没有置。

这个技巧的边界是:DMA 传输有延迟,触发频率太高时 CCR 更新可能跟不上,脉冲宽度会乱。实测触发间隔低于 10us 时就不太稳了,需要降频或者改用更高主频的型号。

从那以后我每次配 TIM1 单脉冲,都先把 SMCR 的 SMS 和 ECE 两位单独读出来确认一遍,再往下走。这个习惯帮我省了至少三次重新翻手册的时间。希望帮到你。

本文还有配套的精品资源,点击获取

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询