目录:
配置步骤:
-
打开IO口时钟(IOPENR)
-
打开PWM时钟(APBENR2)
-
配置IO为输出模式并复用IO口(MODER、OSPEEDR、AFR)
-
配置刹车引脚 (TIM1_BK(PC13)引脚配置为输入模式)(MODER)
-
PWM模块功能配置中心对齐模式、重装载模式(CR1)
-
配置OC4REF为ADC触发源(CR2)
-
计数器清零(CNT)
-
分频设置(PSC)
-
重载值设置(ARR)
-
配置PWM通道1/2/3/4为模式1(CCMR1、CCMR2)
-
启用输出比较功能(CCER)
-
比较值设置(CCRx)
-
启动刹车功能(BDTR、AF1、AF2)
-
使能定时器(CR1)
使用的寄存器介绍(个人理解汉化):
RCC ->IOPENR寄存器:
使用到哪组IO口将对应的IO口置1即可
RCC->IOPENR |= 0x00000007; //GPIOAEN = 1 GPIOBEN = 1 GPIOCEN = 1;
RCC->APBENR2寄存器:
使用到哪个外设将对应的外设置1即可
RCC->APBENR2 |=0x00000800; //TIM1EN = 1;
GPIOx->MODER寄存器:
Bits 31:0 MODE[15:0][1:0]: Port x configuration I/O pin y (y = 15 to 0)
These bits are written by software to configure the I/O mode.
00: Input mode 输入模式
01: General purpose output mode 输出模式
10: Alternate function mode 复用功能模式
11: Analog mode (reset state) 模拟输入
GPIOx->OSPEEDR
Bits 31:0 OSPEED[15:0][1:0]: Port x configuration I/O pin y (y = 15 to 0)
These bits are written by software to configure the I/O output speed.
00: Very low speed 非常低速
01: Low speed 低速
10: High speed 高速
11: Very high speed 非常高速
Note: Refer to the device datasheet for the frequency specifications and the power supply
and load conditions for each speed..
The FT_c GPIOs cannot be set to high speed
GPIO->AFR(复用功能)寄存器(AFRH->AFR[1],AFRL->AFR[0])
AFR[1](AFRH)寄存器:
AFR[1]寄存器对应GPIO8-15号引脚
AFR[0](AFRL)寄存器:
AFR[0]寄存器对应GPIO0-7号引脚
复用功能对应引脚图:
PORTA:
PORTB :
PORTC、PORTD、PORTF:
TIM1->CR1寄存器:
UIFREMAP 配置选项 中断标志位
UIFREMAP = 0: 不映射 (No remapping)
UIF 状态位不会被复制到 TIMx_CNT 寄存器的第 31 位。UIF 标志仍然会在定时器的 SR (Status Register) 中独立存在,用来触发中断或者进行状态检查。
UIFREMAP = 1: 启用映射 (Remapping enabled)
UIF 状态位被复制到定时器计数器寄存器 (TIMx_CNT) 的第 31 位。这意味着当发生更新事件时,TIMx_CNT[31] 会反映 UIF 标志的状态,而不再仅仅依赖于 SR 寄存器中的 UIF 位。这种映射可以用于某些特殊的应用场景,比如当你需要将更新事件和计数器值结合使用时。
CKD[1:0] 位的解释
CKD[1:0] 位有 2 位,表示定时器时钟与死区时间和采样时钟之间的关系。具体的含义如下:
CKD[1:0] = 00: tDTS = tCK_INT 即,死区时间和采样时钟 (tDTS) 的频率等于定时器时钟 (tCK_INT) 的频率。没有进行任何分频,死区时间和采样时钟的时钟周期与定时器时钟相同。
CKD[1:0] = 01: tDTS = 2 * tCK_INT 即,死区时间和采样时钟的频率是定时器时钟频率的二分之一,也就是说会对定时器时钟进行 2 倍分频。死区时间和采样时钟的时钟周期将是定时器时钟周期的两倍。
CKD[1:0] = 10:tDTS = 4 * tCK_INT 即,死区时间和采样时钟的频率是定时器时钟频率的四分之一,也就是说会对定时器时钟进行 4 倍分频。死区时间和采样时钟的时钟周期将是定时器时钟周期的四倍。
CKD[1:0] = 11:保留值,禁止编程。 这个值是保留的,意味着在程序中不能使用该配置。如果设置为 11,定时器将不按预期工作,通常会导致配置错误。
ARPE 位的作用
ARPE = 0: 当 ARPE 位为 0 时,定时器的 自动重载寄存器(ARR) 不是缓冲的。这意味着,每次定时器计数器溢出并且达到 ARR 值时,ARR 的值会立即被用作新的自动重载值。每次定时器计数器的更新都直接读取 ARR 寄存器中的值。
ARPE = 1: 当 ARPE 位为 1 时,定时器的 自动重载寄存器(ARR) 是缓冲的。此时,ARR 寄存器的值不会立即应用,而是 被预先加载到一个缓冲寄存器中,并且只有在计数器溢出时才会更新到 ARR 寄存器。具体来说,当计数器计数到溢出条件时,预加载的 ARR 值将作为新的自动重载值。这种方式可以使得定时器的更新过程更加平滑,并且避免了计数器溢出期间 ARR 值的直接更新带来的可能误差。
CMS[1:0] 位的解释
1. 00: Edge-aligned mode(边沿对齐模式)
2. 01: Center-aligned mode 1(中心对齐模式 1)
3. 10: Center-aligned mode 2(中心对齐模式 2)
4. 11: Center-aligned mode 3(中心对齐模式 3)
DIR = 0: 计数器作为向上计数器(Upcounter)
计数器从 0 开始递增,直到达到设定的最大计数值(通常是 ARR,自动重载寄存器的值),然后回到 0 继续计数。这种模式适用于一般的计数需求,例如简单的时间延迟或事件计数。
DIR = 1: 计数器作为向下计数器(Downcounter)
计数器从设定的最大值(通常是 ARR)开始递减,直到到达 0,再继续递减直到达到负值,然后可能回到最大值。向下计数常用于需要倒计时或者在某些特定事件触发时开始计数的场景。
OPM = 0: 计数器不在更新事件时停止(Counter is not stopped at update event)
计数器在每次更新事件(例如当计数器溢出或达到自动重载值 ARR 时)后继续计数。
在这种模式下,定时器会持续运行,不会因为一个更新事件而停止。
OPM = 1: 计数器在下一个更新事件时停止计数(Counter stops counting at the next update event)
当定时器达到一个更新事件时(如计数器值达到自动重载寄存器 ARR 的值),计数器会停止工作(通过清除 CEN 位,即禁用计数器)。
这意味着定时器会只计数一次,通常用于 单脉冲计数 或 单次定时 的应用场景。定时器在生成一个更新事件后就会停止,适用于需要单次触发事件的情况。
URS = 0:
任何以下事件都会生成更新中断或者 DMA 请求(如果启用):
计数器溢出/下溢(Counter Overflow/Underflow):当计数器达到其最大值并回绕,或者计数器的值从 0 变成负值时,都会触发更新事件。
设置 UG 位(更新生成):通过软件设置 UG(Update Generation)位来强制生成一个更新事件。
通过从属模式控制器(Slave Mode Controller)生成更新:如果定时器设置为从属模式,外部信号可以触发更新事件。也就是说,当 URS = 0 时,更新事件会响应多种触发源,包括计数器溢出、软件触发以及从属模式下的触发等。
URS = 1:
只有 计数器溢出或下溢 会生成更新中断或 DMA 请求(如果启用)。也就是说,URS = 1 时,只有计数器发生溢出或下溢时,才会触发更新事件。
软件设置 UG 或从属模式触发等其他事件将不会再触发更新事件。
UDIS = 0:允许定时器通过溢出、手动触发(UG 位)或从属模式控制器生成更新事件,影像寄存器会被更新为预设值。
UDIS = 1:禁用更新事件,影像寄存器不会更新,但计数器和预分频器会被初始化。
CEN = 0:计数器禁用,不会计数。
CEN = 1:计数器启用,开始计数。
TIM1->CR2寄存器:
各种 MMS2 设置和含义:
0000: Reset
描述: 使用 TIMx_EGR 寄存器中的 UG 位作为触发输出(TRGO2)。当触发输入生成重置事件时(在从模式控制器配置为重置模式时),TRGO2 上的信号会比实际的重置信号有所延迟。
0001: Enable
描述: CNT_EN(计数器启用信号)用作触发输出(TRGO2)。这种模式用于同时启动多个定时器,或者控制一个从定时器的启用窗口。CNT_EN 信号是 CEN 控制位和触发输入的逻辑与(AND)结果,尤其在定时器配置为门控模式时使用。若触发输入控制 CNT_EN 信号,TRGO2 会有延迟,除非选择了主从模式(MSM 位描述)。
0010: Update
描述: 选择更新事件作为触发输出(TRGO2)。在这种模式下,主定时器的更新事件可以作为从定时器的预分频器使用。
0011: Compare pulse
描述: 当 CC1IF 标志位被设置时(即发生捕获或比较匹配时),TRGO2 输出一个正脉冲,即使该标志已被置为高电平。
0100: Compare
描述: 使用 OC1REFC 信号作为触发输出(TRGO2)。
0101: Compare
描述: 使用 OC2REFC 信号作为触发输出(TRGO2)。
0110: Compare
描述: 使用 OC3REFC 信号作为触发输出(TRGO2)。
0111: Compare
描述: 使用 OC4REFC 信号作为触发输出(TRGO2)。
1000: Compare
描述: 使用 OC5REFC 信号作为触发输出(TRGO2)。
1001: Compare
描述: 使用 OC6REFC 信号作为触发输出(TRGO2)。
1010: Compare Pulse
描述: OC4REFC 上的上升沿或下降沿会在 TRGO2 上产生脉冲。
1011: Compare Pulse
描述: OC6REFC 上的上升沿或下降沿会在 TRGO2 上产生脉冲。
1100: Compare Pulse
描述: OC4REFC 或 OC6REFC 的上升沿会在 TRGO2 上产生脉冲。
1101: Compare Pulse
描述: OC4REFC 的上升沿或 OC6REFC 的下降沿会在 TRGO2 上产生脉冲。
1110: Compare Pulse
描述: OC5REFC 或 OC6REFC 的上升沿会在 TRGO2 上产生脉冲。
1111: Compare Pulse
描述: OC5REFC 的上升沿或 OC6REFC 的下降沿会在 TRGO2 上产生脉冲。
bit8---bit18的功能参考(ois1)
1. OIS1 = 0
OC1 = 0(OC1 输出为低电平)。
适用情况: 这仅在 MOE(主输出使能位)为 0 时生效。
当 MOE = 0 时,OC1 输出会被设置为低电平(0),如果存在 OC1N(OC1 的反向输出通道)。
换句话说,如果你使用的是 OC1 和 OC1N(例如用于推挽输出模式),在死区时间(dead-time)结束后,OC1 会被拉低。
2. OIS1 = 1
OC1 = 1(OC1 输出为高电平)。
适用情况: 同样,这仅在 MOE = 0 时生效。
当 MOE = 0 时,OC1 输出会被设置为高电平(1),如果存在 OC1N(OC1 的反向输出通道)。
即使 OC1 处于空闲状态,OC1 输出仍然会被拉高。
TI1S 位的含义:
TI1S = 0: TIMx_CH1 引脚连接到 TI1 输入。
在这种配置下,定时器通道 CH1 的输入直接连接到 TI1 输入端口。
也就是说,TI1 输入信号来自于 TIMx_CH1 引脚的输入。
TI1S = 1:TIMx_CH1、CH2 和 CH3 引脚连接到 TI1 输入,并进行 XOR(异或)组合。
在此配置下,TI1 输入信号不再仅来自于 TIMx_CH1,而是通过对 TIMx_CH1、TIMx_CH2 和 TIMx_CH3 输入信号的异或(XOR)组合来获得。
这种方式可以将三个通道的输入信号进行逻辑组合,从而影响 TI1 输入的逻辑电平。
MMS[2:0] 位的含义及其每种组合的作用
000: Reset
触发源: TIMx_EGR 寄存器中的 UG (Update Generation) 位。
描述: 在这种模式下,TRGO 输出的是一个重置信号。当 UG 位被置位时,产生一个触发信号。如果重置是由触发输入(例如,配置为重置模式的从定时器)产生的,那么 TRGO 上的信号会相对于实际的重置信号延迟。
001: Enable
触发源: CNT_EN (Counter Enable) 信号。
描述: 该模式下,TRGO 输出的是计数器使能信号 CNT_EN。这对于同时启动多个定时器或控制从定时器的启用窗口非常有用。当配置为门控模式时,计数器使能信号是由 CEN 控制位与触发输入信号进行逻辑与运算生成的。如果使能信号由触发输入控制,则 TRGO 信号会有延迟,除非选择了主从模式(MSM 位的配置)。
010: Update
触发源: 更新事件。
描述: 当更新事件(比如计数器溢出)发生时,TRGO 输出一个触发信号。在这种模式下,主定时器可以作为从定时器的预分频器,帮助同步从定时器。
011: Compare Pulse
触发源: 产生一个脉冲,标志 CC1IF 被置位。
描述: 当捕获或比较匹配发生时(例如在比较通道 1 上),TRGO 输出一个正脉冲。即使 CC1IF 已经被置位,TRGO 仍然会产生脉冲。该模式适用于触发事件驱动的场景。
100: Compare - OC1REFC
触发源: 输出比较信号 OC1REFC。
描述: 在此模式下,OC1REFC 信号用于作为 TRGO 输出。当发生与通道 1 相关的比较事件时,TRGO 将输出一个触发信号。
101: Compare - OC2REFC
触发源: 输出比较信号 OC2REFC。
描述: 与上面的模式类似,TRGO 输出由 OC2REFC 信号产生,这个信号与通道 2 的比较事件相关。
110: Compare - OC3REFC
触发源: 输出比较信号 OC3REFC。
描述: 当与通道 3 的比较事件相关时,TRGO 输出由 OC3REFC 信号产生。
111: Compare - OC4REFC
触发源: 输出比较信号 OC4REFC。
描述: 在这个模式下,TRGO 输出由 OC4REFC 信号产生,通常用于与通道 4 的比较事件同步。
CCDS = 0:DMA 请求与捕获/比较事件相关联,即在捕获/比较事件时触发 DMA 传输。
CCDS = 1:DMA 请求与定时器的更新事件相关联,即在定时器的周期更新时触发 DMA 传输。
CCUS 的两种配置:
CCUS = 0: 描述: 在这种配置下,当捕获/比较控制寄存器的预加载功能(CCPC)启用时,只有当 COMG 位被设置时,捕获/比较控制寄存器的值才会被更新。这意味着更新是通过显式地设置 COMG 位来触发的,而不依赖于外部事件。
适用场景: 适用于只通过程序控制更新捕获/比较寄存器的应用。这种模式提供了更精确的控制,允许你在合适的时机显式地更新寄存器。
CCUS = 1: 描述: 在这种模式下,当捕获/比较控制寄存器的预加载功能(CCPC)启用时,捕获/比较控制寄存器的更新不仅可以通过设置 COMG 位来触发,还可以通过 TRGI 输入触发。TRGI 是定时器的触发输入,它可以由外部事件(如外部信号的上升沿)引发,从而导致寄存器的更新。这意味着更新可以是外部事件驱动的,而不仅仅是通过软件显式控制。
适用场景: 适用于需要外部事件驱动定时器寄存器更新的应用。比如,当外部信号的上升沿发生时,可以同步更新捕获/比较寄存器的值。
CCPC = 0: CCxE、CCxNE 和 OCxM 位 不进行预加载,这意味着这些控制寄存器的值一旦写入后立即生效,不需要等待任何额外的事件或条件来更新。
CCPC = 1: CCxE、CCxNE 和 OCxM 位 进行预加载,并且当它们的值被写入之后,它们不会立即更新,而是会等待一个特定的触发事件(称为“换挡事件”或 COM)发生。这些寄存器的更新只有在满足以下条件之一时才会发生:
TIM1->CNT(计数)寄存器:
TIM1->PSC(预分频)寄存器:
TIM1->ARR(重装载)寄存器
定时器计算公式:TimeOut = ((ARR+ 1) * (PSC+ 1) ) / TimeClockFren;
TIM1->CCMR1寄存器:
CC2S[1:0]: Capture/Compare 2 selection
00: CC2 通道配置为 输出模式(output)这种情况下,CC2 被配置为输出信号,通常用于 PWM 输出或其他类似的输出信号。
01: CC2 通道配置为 输入模式,并且 IC2 映射到 TI2(输入捕获通道 2)在这种模式下,CC2 被配置为输入信号捕获模式,输入信号来自于 TI2(通常是某个外部信号),并且 IC2 作为输入捕获通道 2 使用。
10: CC2 通道配置为 输入模式,并且 IC2 映射到 TI1(输入捕获通道 1)在这种模式下,CC2 被配置为输入信号捕获模式,输入信号来自于 TI1,并且 IC2 作为输入捕获通道 1 使用。
11: CC2 通道配置为 输入模式,并且 IC2 映射到 TRC(触发信号)在这种模式下,CC2 被配置为输入信号捕获模式,输入信号来自于 TRC,该信号通常是一个内部触发信号,具体触发源通过 TIMx_SMCR 寄存器中的 TS 位来选择。此模式只在选择了内部触发输入时有效。
OC1CE: Output Compare 1 clear enable
0: OC1Ref is not affected by the ocref_clr_int signal
当 OC1CE = 0 时,输出比较 1(OC1)的参考信号(OC1Ref)不会受清除信号 ocref_clr_int 的影响。无论外部信号 ocref_clr_int 是否有效,OC1Ref 都保持不变。
1: OC1Ref is cleared as soon as a High level is detected on ocref_clr_int signal
当 OC1CE = 1 时,输出比较 1(OC1Ref)会在 高电平触发(High level)检测到时被清除。这意味着当 ocref_clr_int 信号检测到高电平时,OC1Ref 会立即被清零。
OC1M[3:0] 模式
0000: Frozen (冻结模式)
在这种模式下,比较寄存器(TIMx_CCR1)和计数器(TIMx_CNT)的比较不会对输出产生任何影响。这个模式通常用来生成一个基础的时间基准。
0001: Set channel 1 to active level on match (匹配时将通道1设置为激活状态)
当计数器(TIMx_CNT)与比较寄存器(TIMx_CCR1)匹配时,OC1REF 信号会被强制设置为高电平。
0010: Set channel 1 to inactive level on match (匹配时将通道1设置为非激活状态)
当计数器与比较寄存器匹配时,OC1REF 信号会被强制设置为低电平。
0011: Toggle (切换模式)
当计数器与比较寄存器匹配时,OC1REF 信号会在高电平和低电平之间切换。
0100: Force inactive level (强制非激活状态)
OC1REF 信号会被强制设置为低电平。
0101: Force active level (强制激活状态)
OC1REF 信号会被强制设置为高电平。
0110: PWM mode 1 (PWM模式1)
在计数器向上计数时,OC1REF 在计数器值小于比较寄存器(TIMx_CCR1)时为高电平,计数器值大于或等于比较寄存器时为低电平。
在计数器向下计数时,OC1REF 在计数器值大于比较寄存器时为低电平,计数器值小于或等于比较寄存器时为高电平。
0111: PWM mode 2 (PWM模式2)
在计数器向上计数时,OC1REF 在计数器值小于比较寄存器时为低电平,计数器值大于或等于比较寄存器时为高电平。
在计数器向下计数时,OC1REF 在计数器值大于比较寄存器时为高电平,计数器值小于或等于比较寄存器时为低电平。
1000: Retriggerable OPM mode 1 (可重触发单次模式1)
在向上计数时,信号在触发事件(TRGI)之前保持高电平;触发后,信号根据PWM模式1进行切换。
在向下计数时,信号在触发事件(TRGI)之前保持低电平;触发后,信号根据PWM模式1进行切换。
1001: Retriggerable OPM mode 2 (可重触发单次模式2)
在向上计数时,信号在触发事件之前保持低电平;触发后,信号根据PWM模式2进行切换。
在向下计数时,信号在触发事件之前保持高电平;触发后,信号根据PWM模式1进行切换。
1010: Reserved (保留)
该模式保留,未定义用途。
1011: Reserved (保留)
该模式保留,未定义用途。
1100: Combined PWM mode 1 (组合PWM模式1)
在这种模式下,OC1REF 的行为和 PWM 模式 1 相同,OC1REFC 输出是 OC1REF 和 OC2REF 的逻辑或(OR)运算结果。
1101: Combined PWM mode 2 (组合PWM模式2)
在这种模式下,OC1REF 的行为和 PWM 模式 2 相同,OC1REFC 输出是 OC1REF 和 OC2REF 的逻辑与(AND)运算结果。
1110: Asymmetric PWM mode 1 (不对称PWM模式1)
在计数器向上计数时,OC1REF 的行为与 PWM 模式 1 相同;OC1REFC 在计数器向上计数时输出 OC1REF,计数器向下计数时输出 OC2REF。
1111: Asymmetric PWM mode 2 (不对称PWM模式2)
在计数器向上计数时,OC1REF 的行为与 PWM 模式 2 相同;OC1REFC 在计数器向上计数时输出 OC1REF,计数器向下计数时输出 OC2REF。
OC1PE:
0: Preload register on TIMx_CCR1 disabled
当 OC1PE 设置为 0 时,TIMx_CCR1 寄存器没有预装载功能。这意味着你可以随时写入新的值到 TIMx_CCR1 寄存器,这个新值会立即生效。也就是说,写入 TIMx_CCR1 的新值会直接影响输出比较通道(OC1)的行为,不会等待特定的事件或时刻。
1: Preload register on TIMx_CCR1 enabled
当 OC1PE 设置为 1 时,TIMx_CCR1 寄存器启用了预装载功能。在这种情况下,写入 TIMx_CCR1 的值并不会立即生效。新值会被写入到 预装载寄存器(Preload Register),而只有在 更新事件(Update Event,通常是计数器溢出或某个特定的事件)发生时,这个预装载值才会被加载到 TIMx_CCR1 寄存器,并生效。
OC1FE
0: 常规行为
当 OC1FE 被设置为 0 时,CC1 的行为与计数器和 CCR1 寄存器的值正常相互作用,依赖于计数器的状态和 CCR1 中的比较值。如果触发输入信号被激活(例如外部触发信号),CC1 输出的变化(即输出比较)会有一定的延迟。通常,这个延迟是 5 个时钟周期。
1: 快速响应
当 OC1FE 被设置为 1 时,输入触发信号的 上升沿 或 下降沿 会立即作为比较匹配信号触发,CC1 输出会立刻跳变。这种配置将输出的延迟减少到 3 个时钟周期,比常规模式下的 5 个时钟周期减少了 2 个时钟周期。
该模式只在定时器通道被配置为 PWM1 或 PWM2 模式时才生效。
CC1S[1:0] :
00: CC1 通道配置为输出
在这种模式下,CC1 通道用作定时器的输出通道。可以输出定时器的比较值或 PWM 波形。
01: CC1 通道配置为输入,IC1 映射到 TI1
在这种模式下,CC1 通道作为输入通道,接收来自外部信号的输入。IC1 映射到 TI1,即输入信号来自定时器的 TI1 引脚(通常是外部触发信号)。
10: CC1 通道配置为输入,IC1 映射到 TI2
在这种模式下,CC1 通道作为输入通道,接收来自 TI2 引脚的输入信号。IC1 映射到 TI2,通常用于接收定时器 2 的外部触发信号。
11: CC1 通道配置为输入,IC1 映射到 TRC
在这种模式下,CC1 通道作为输入,接收来自 TRC 的信号。IC1 映射到 TRC,这意味着使用了一个 内部触发 输入,且需要通过 TS 位在 TIMx_SMCR 寄存器中选择触发源。这种模式通常用于更复杂的定时器触发系统,其中多个定时器或外部事件协调工作。
TIM1->CCMR2(功能)寄存器:
寄存器功能与TIM1CCMR1的功能一样的只是配置OC3与OC4而已
TIM1->CCER比较使能寄存器:
CC1NP: 也就是互补引脚输出的极性
CC1NP = 0 时,OC1N 为 高电平激活,即当输出被激活时输出的是 高电平。
CC1NP = 1 时,OC1N 为 低电平激活,即当输出被激活时输出的是 低电平。
CC1NE:
CC1NE = 0 时,OC1N 不输出信号,而是由其他控制位(如 MOE、OSSI、OSSR 等)决定输出的电平。
CC1NE = 1 时,OC1N 会按照定时器配置的相关控制位来输出互补信号。
CC1P:
0: OC1 active high (output mode)
在输出模式下,当 OC1 被激活时,输出信号是 高电平。也就是说,定时器输出的信号将是一个高电平(通常是逻辑 1)状态。
1: OC1 active low (output mode)
在输出模式下,当 OC1 被激活时,输出信号是 低电平。也就是说,定时器输出的信号将是一个低电平(通常是逻辑 0)状态。
CC1E = 0:
捕获模式禁用 / OC1 不激活。
当 CC1E 设置为 0 时,OC1 输出信号将被禁用。这意味着 OC1 不会在对应的输出引脚上产生任何信号。在捕获模式下,OC1 信号不会输出。
CC1E = 1:
捕获模式启用 / OC1 信号输出到对应的输出引脚
其他的功能配置参考上面4点
TIM1->CCR1、CCR2、CCR3、CCR4(比较值)寄存器:
TIM1->BDTR(断路和死区时间)寄存器:
BKBID:
BKBID = 0:BRK 输入信号处于 单向输入模式,仅接受外部输入信号,用于触发定时器的 Break 事件。
BKBID = 1:BRK 输入信号处于 双向模式,既可以作为输入信号,也可以作为输出信号,实现双向控制。
BKDSRM:
BKDSRM = 0:BRK 信号处于 武装状态,外部 BRK 信号将触发 Break 事件,定时器等模块会响应这些信号进行相应的控制。
BKDSRM = 1:BRK 信号处于 解除武装状态,外部 BRK 信号不会触发 Break 事件,系统将忽略 BRK 信号的变化。
BK2P:
BK2P = 0:BRK2 信号在 低电平(逻辑 0) 时触发 Break 事件(即低电平有效)。
BK2P = 1:BRK2 信号在 高电平(逻辑 1) 时触发 Break 事件(即高电平有效)。
BK2E:
BK2E = 0:禁用 BRK2 输入信号,系统不会响应 BRK2 信号的变化。
BK2E = 1:启用 BRK2 输入信号,系统会响应 BRK2 信号的变化,并触发相应的 Break 事件。
BKF[3:0] 与BK2F[3:0] 配置选项:
0000: No filter, BRK acts asynchronously
无滤波器,BRK 信号按异步模式工作。
每次信号变化都会立即被识别,不进行任何过滤。
0001: fSAMPLING = fCK_INT, N = 2
采样频率:fCK_INT(内部时钟频率)。
需要连续 2 次事件才能确认信号变化。
0010: fSAMPLING = fCK_INT, N = 4
采样频率:fCK_INT。
需要连续 4 次事件才能确认信号变化。
0011: fSAMPLING = fCK_INT, N = 8
采样频率:fCK_INT。
需要连续 8 次事件才能确认信号变化。
0100: fSAMPLING = fDTS/2, N = 6
采样频率:fDTS/2(定时器时钟的一半)。
需要连续 6 次事件才能确认信号变化。
0101: fSAMPLING = fDTS/2, N = 8
采样频率:fDTS/2。
需要连续 8 次事件才能确认信号变化。
0110: fSAMPLING = fDTS/4, N = 6
采样频率:fDTS/4(定时器时钟的四分之一)。
需要连续 6 次事件才能确认信号变化。
0111: fSAMPLING = fDTS/4, N = 8
采样频率:fDTS/4。
需要连续 8 次事件才能确认信号变化。
1000: fSAMPLING = fDTS/8, N = 6
采样频率:fDTS/8(定时器时钟的八分之一)。
需要连续 6 次事件才能确认信号变化。
1001: fSAMPLING = fDTS/8, N = 8
采样频率:fDTS/8。
需要连续 8 次事件才能确认信号变化。
1010: fSAMPLING = fDTS/16, N = 5
采样频率:fDTS/16(定时器时钟的十六分之一)。
需要连续 5 次事件才能确认信号变化。
1011: fSAMPLING = fDTS/16, N = 6
采样频率:fDTS/16。
需要连续 6 次事件才能确认信号变化。
1100: fSAMPLING = fDTS/16, N = 8
采样频率:fDTS/16。
需要连续 8 次事件才能确认信号变化。
1101: fSAMPLING = fDTS/32, N = 5
采样频率:fDTS/32(定时器时钟的三十二分之一)。
需要连续 5 次事件才能确认信号变化。
1110: fSAMPLING = fDTS/32, N = 6
采样频率:fDTS/32。
需要连续 6 次事件才能确认信号变化。
1111: fSAMPLING = fDTS/32, N = 8
采样频率:fDTS/32。
需要连续 8 次事件才能确认信号变化。
MOE 的具体操作:
MOE = 0(禁用输出):
如果发生 BRK2 事件,或者 MOE 被软件写入 0,所有的输出通道(OC 和 OCN)都会被禁用。如果 MOE 被清除,OC 和 OCN 输出会被禁用,或者根据 OSSI 位的设置,输出会被强制置为空闲状态(Idle state)。
MOE = 1(启用输出):
如果 MOE 被设置为 1,且相关的输出使能位(CCxE 和 CCxNE)被设置,那么输出通道(OC 和 OCN)会被启用。这意味着定时器的输出通道(OC 和 OCN)可以在正常模式下工作,前提是这些输出通道的使能位在 TIMx_CCER 寄存器中被设置。
MOE位与其他位的关系:
AOE(Automatic Output Enable):
AOE 位控制是否允许硬件自动设置 MOE。当 AOE 位设置时,硬件会在特定条件下自动启用 MOE。
OSSI(Output Selection on Idle):
OSSI 位决定了当输出被禁用时,输出信号的状态是被强制为低电平(空闲状态),还是按预设的状态(例如高电平)进行处理。
AOE:
AOE = 0:MOE 只能由软件显式设置,硬件不会自动修改 MOE。
AOE = 1:MOE 可以由软件或硬件自动设置,前提是没有断开事件(BRK 或 BRK2)发生
BKP(Break Polarity)是一个用于控制 BRK 输入信号极性的配置位。它决定了 BRK 输入信号的激活方式。
BKP = 0:表示 BRK 输入信号是 低电平有效(active low),即当 BRK 输入信号为 低电平(0V)时,表示该信号被激活或触发。
BKP = 1:表示 BRK 输入信号是 高电平有效(active high),即当 BRK 输入信号为 高电平(通常是系统电压,比如 3.3V 或 5V)时,表示该信号被激活或触发
BKE(Break Enable)是一个控制 Break 功能启用或禁用的配置位。
BKE = 0:表示 Break 功能被禁用(Break function disabled),即系统不会响应 BRK 输入信号的变化,也不会触发与 Break 相关的操作。
BKE = 1:表示 Break 功能被启用(Break function enabled),即系统会响应 BRK 输入信号的变化,并在 BRK 信号被激活时执行相关的操作(如触发中断、暂停程序等)。
OSSR(Off-state Selection for Run mode)是一个配置位,用于控制 OC/OCN(输出比较输出)信号在 Run mode(运行模式)下的离线状态行为。
OSSR = 0:当 OC/OCN 输出处于非活动状态时,输出被禁用(输出控制被释放),并由 GPIO 逻辑接管。这时,OC/OCN 输出会被设置为 高阻态(Hi-Z)。简而言之,这会让输出进入三态模式,不再驱动任何信号,完全断开外部电路的连接,等待下一次激活。
OSSR = 1:当 OC/OCN 输出处于非活动状态时,输出被启用,并且会保持其不活动电平。这种情况下,输出仍然由定时器控制,并在 CCxE = 1 或 CCxNE = 1 时保持处于不活动电平(即定时器依然控制输出,即使在不活动状态下)。
OSSI:
OSSI = 0:假设定时器在空闲模式下,定时器输出(OC/OCN)会被禁用并进入 高阻态(Hi-Z),外部电路不会看到任何信号输出,这常用于需要完全断开输出的情况。
OSSI = 1:假设定时器在空闲模式下,定时器输出(OC/OCN)首先会被强制为 非活动电平(如低电平),然后在经过死区时间后强制为 空闲电平(如高电平),即使定时器处于非活动状态,它仍然控制输出电平。
LOCK[1:0]: Lock configuration
LOCK OFF(LOCK[1:0] = 00)
在这种设置下,没有任何寄存器位是写保护的。这意味着定时器的所有相关寄存器都可以自由地进行读写操作。
特点:没有写保护,配置可以随时修改。
LOCK Level 1(LOCK[1:0] = 01)
在该级别下,以下寄存器位会被锁定,不能被修改:
DTG 位(定时器的死区时间配置,在 TIMx_BDTR 寄存器中)
OISx 和 OISxN 位(输出比较通道的输出模式设置,在 TIMx_CR2 寄存器中)
BK2BID, BKBID, BK2DSRM, BKDSRM, BK2P, BK2E, BK2F[3:0], BKF[3:0], AOE, BKP, BKE, OSSI, OSSR, DTG[7:0](在 TIMx_BDTR 寄存器中的多个配置位)
特点:这些关键的控制和配置位会被锁定,避免在定时器运行过程中发生意外的写操作。
LOCK Level 2(LOCK[1:0] = 10)
在该级别下,除了 Level 1 中的所有锁定项外,还会增加以下位的锁定:
CC Polarity bits(CCxP 和 CCxNP 位):这些位控制定时器通道的输出极性,在 TIMx_CCER 寄存器中。它们会被锁定,防止修改。
OSSR 和 OSSI 位:这些位控制输出比较的复位和使能信号,会被锁定。
特点:增加了对输出比较通道极性控制和其他输出控制位的写保护。
LOCK Level 3(LOCK[1:0] = 11)
在该级别下,除了 Level 2 中的所有锁定项外,还会锁定以下控制位:
CC Control bits(OCxM 和 OCxPE 位):这些位控制输出比较通道的模式和预载使能,在 TIMx_CCMRx 寄存器中。它们会被锁定,防止被修改。
特点:最强的保护级别,除了输出极性和复位等配置外,连输出比较的模式和使能位都不能修改。
DTG[7:0]: Dead-time generator setup
例如,假设系统时钟周期(tDTS)为 125 ns(即 8 MHz 时钟频率)。
根据不同的 DTG[7:5] 配置,可以得到以下死区时间的计算范围:
DTG[7:5] = 000:
死区时间范围为 0 到 15875 ns,并且以 125 ns 为步长。
即:0, 125, 250, ..., 15875 ns。
DTG[7:5] = 10x:
死区时间范围为 16 μs 到 31750 ns,并且以 250 ns 为步长。
即:16000 ns, 16250 ns, ..., 31750 ns。
DTG[7:5] = 110:
死区时间范围为 32 μs 到 63 μs,并且以 1 μs 为步长。
即:32000 ns, 33000 ns, ..., 63000 ns。
DTG[7:5] = 111:
死区时间范围为 64 μs 到 126 μs,并且以 2 μs 为步长。
即:64000 ns, 66000 ns, ..., 126000 ns。
TIM1->AF1(替代功能)寄存器
ETRSEL[3:0] 字段的具体含义:
0000: ETR legacy mode
选择外部触发源为传统模式(Legacy mode)。这通常指的是使用一个预设的触发源,可能是某种固定的硬件信号。
0011: ADC1 AWD1
选择 ADC1 的 AWD1(模拟看门狗 1)作为外部触发源。当 ADC1 的模拟看门狗 1 触发时,会产生外部触发信号。
0100: ADC1 AWD2
选择 ADC1 的 AWD2(模拟看门狗 2)作为外部触发源。当 ADC1 的模拟看门狗 2 触发时,会产生外部触发信号。
0101: ADC1 AWD3
选择 ADC1 的 AWD3(模拟看门狗 3)作为外部触发源。当 ADC1 的模拟看门狗 3 触发时,会产生外部触发信号。
Others: Reserved
其他值是保留的,意味着不推荐使用,可能是为了未来的扩展或尚未定义的功能。如果使用这些值,可能会导致不稳定或不可预测的行为,因此建议不要选择这些值。
BKINP 位的功能解释:
BKINP = 0:
BKIN 输入极性不反转
如果 BKP = 0(即 BKP 极性为低),则 BKIN 输入信号的有效电平是低电平(Active Low)。
如果 BKP = 1(即 BKP 极性为高),则 BKIN 输入信号的有效电平是高电平(Active High)。
BKINP = 1:
BKIN 输入极性反转
如果 BKP = 0(即 BKP 极性为低),则 BKIN 输入信号的有效电平是高电平(Active High)。
如果 BKP = 1(即 BKP 极性为高),则 BKIN 输入信号的有效电平是低电平(Active Low)。
BKINE = 0:
BKIN 输入禁用
当 BKINE 位设置为 0 时,BKIN 输入信号不会被用作计时器的中断或断路器功能。换句话说,BKIN 输入信号将被忽略,计时器的 BRK 输入信号仅来自其他来源。
BKINE = 1:
BKIN 输入启用
当 BKINE 位设置为 1 时,BKIN 输入信号被启用,并且它将作为计时器的 BRK 输入信号 的一个有效来源。具体来说,BKIN 输入信号会与其他 BRK 输入信号 进行 逻辑“或” 运算,即与其他 BRK 信号源组合在一起。如果 BKIN 输入信号触发了 BRK 事件,那么计时器会根据预设的配置执行断路器功能(如停止、暂停计时器等)。
没有互补输出编程代码:
/***********************************************************************
* 函数名称 :PWMInitialize
* 功能描述 :PWM初始化
* 形参 :无
* 返回值 :无
* 要点备注 :PA8-->TIM1_CH1 PA9-->TIM1_CH2 PA10-->TIME_CH3
PB13-->TIM1_CH1N PB14-->TIM1_CH2N PB15-->TIME_CH3N
PC13-->TIM1_BRKIN (刹车引脚)
PWM设置为中心对齐模式 PWM模式1:高电平有效 PWM模式2:低电平有效
***********************************************************************/
static void PWMInitialize(void)
{
//打开IO口时钟
RCC->IOPENR |= 0x00000007; //GPIOAEN = 1 GPIOBEN = 1 GPIOCEN = 1;
//打开PWM时钟也就是TIME1的时钟
RCC->APBENR2 |=0x00000800; //TIM1EN = 1;
//IO端口功能复用设置
GPIOA->MODER &= 0xffc0ffff; //MODE10[21:20] = 0b00 MODE9[19:18] = 0b00 MODE8[17:16] = 0b00;
GPIOB->MODER &= 0x03ffffff; //MODE15[31:30] = 0b00 MODE14[29:28] = 0b00 MODE13[27:26] = 0b00;
GPIOA->MODER |= 0x002a0000; //MODE10[21:20] = 0b10 MODE9[19:18] = 0b10 MODE8[17:16] = 0b10;
GPIOB->MODER |= 0xa8000000; //MODE15[31:30] = 0b10 MODE14[29:28] = 0b10 MODE13[27:26] = 0b10;
GPIOA->OSPEEDR |= 0x003f000; //OSPEEDR10[21:20] = 0b11 OSPEEDR9[19:18] = 0b11 OSPEEDR8[17:16] = 0b11;
GPIOB->OSPEEDR |= 0xfc00000; //OSPEEDR15[31:30] = 0b11 OSPEEDR14[29:28] = 0b11 OSPEEDR13[27:26] = 0b11;
//GPIOA设置为AF2 TIM1_CH1/2/3 GPIOB设置为AF2 TIM1_CH1N/2N/3N
GPIOA->AFR[1] |= 0x00000222; //AFSEL10[11:8] = 0b0010 AFSEL9[7:4] = 0b0010 AFSEL8[3:0] = 0b0010
GPIOB->AFR[1] |= 0x22200000; //AFSEL15[31:28] = 0b0010 AFSEL9[27:24] = 0b0010 AFSEL8[23:20] = 0b0010
//PWM_BRKIN -> PC13 IO口配置为输入
GPIOC->MODER &= 0xf3ffffff; //MODE13[27:26] = 0b00
GPIOC->MODER |= 0x08000000; //MODE13[27:26] = 0b10
//GPIOc设置为AF2 TIM1_BKIN(刹车引脚)
GPIOC->AFR[1] |= 0x00200000; //AFSEL13[23:20] = 0b0010
//PWM模块功能配置 TIM1 设置为中心对齐模式
TIM1->CR1 = 0x00a0;//ARPE = 1(1为重载模式 0为不自动重载) CMS[6:5] = 0b01 (设置为中心对齐模式)
//CR2主要用来配置一个触发事件 一般配置OC4REFC来触发ADC转换 也就是设置4通道来用于触发ADC
TIM1->CR2 = 0x00700000; //MMS2[23:20] = 0b0111 配置为OC4REFC触发事件
TIM1->CNT = 0; //清零计数器
//分频设置
TIM1->PSC = 0; //没有分频
//重载值设置
TIM1->ARR = 1999;//假设频率为16K那么计算就是64000000/16000 =4000,中心对齐需要除以2 就是2000-1=1999
//配置PWM通道1/2为模式1 OC1XX是设置通道1 OC2XX是设置通道2
TIM1->CCMR1 = 0x00006868;//OC1/2CE = 0(清除功能不开启) OC1/2M[6:4] =0b0110(设置为PWM模式1)
//OC1/2PE = 1(预加载功能开启) OC1/2FE = 0 (快速使能功能关闭)
//CC1/2S[1:0] = 0b00 (设置为功能引脚为输出)
//配置PWM通道3/4为模式1 OC3XX是设置通道3 OC4XX是设置通道4
TIM1->CCMR2 = 0x00006868;//OC3/4CE = 0(清除功能不开启) OC3/4M[6:4] =0b0110(设置为PWM模式1)
//OC3/4PE = 1(预加载功能开启) OC3/4FE = 0 (快速使能功能关闭)
//CC3/4S[1:0] = 0b00 (设置为功能引脚为输出)
//cc1e(输出比较功能启用)
//CC1P = 0:表示通道 1 的输出信号具有正常的极性(高电平时输出正常信号,低电平时输出反转信号)。
//CC1P = 1:表示通道 1 的输出信号具有反向极性(即输出信号反转)。
TIM1->CCER = 0x00001111;//CC1/2/3/4=1;0x00001555 //cc1/cc1n/cc2/cc2n/cc3/cc3n
//比较值设置
TIM1->CCR1 = 1000;
TIM1->CCR2 = 1000;
TIM1->CCR3 = 1000;
TIM1->CCR4 = 10; //这个通道是用来设置触发ADC转换的
//要输出波形就得打开MOE与AOE
//BKE是刹车使能前面已经有刹车引脚了所以需要使能
//BKP设置什么电平是刹车有效电平 0:低电平有效 1:高电平有效
TIM1->BDTR = 0x0000d000; //MOE =1 AOE =1 BKE = 1 BKP = 0;
TIM1->AF1 |= 0x00000001;
TIM1->AF2 =0; //没用上 BK2INE = 0;
//CEN 一定要使能才能行
TIM1->CR1 |=0x0001;//CEN = 1 使能定时器1
}