将定时器通道配置为输出

问题描述 投票:0回答:1

我使用NUCLEO-F042K6板来生成PWM信号。我使用 Timer2 来达到这个目的。 Timer2 有 4 个通道,但根据STM32F042x4 Datasheet CH1 无法重定向到物理引脚。 [Picture 2: Alternate functions - Datasheet2 我仍然想使用定时器 2,为此我想使用 CH2。不幸的是,我无法在输出上获得 PWM 信号。这是我的代码:

void TIM2_setup(void){
// Enable Timer 2 clock
RCC->APB1ENR |= RCC_APB1ENR_TIM2EN;
// I/O port A clock enable
RCC->AHBENR |= RCC_AHBENR_GPIOAEN;

//These bits are written by software to configure the I/O mode. 10: Alternate function mode
GPIOA->MODER |= (0x2UL << GPIO_MODER_MODER1_Pos);
//Alternate function AF1 selection for port A pin 1
GPIOA->AFR[0] |= (0x2UL << GPIO_AFRL_AFSEL1_Pos);

TIM2->CR1 |= TIM_CR1_CMS;
TIM2->CR1 |= TIM_CR1_ARPE;
// : PWM mode 1
TIM2->CCMR1 |= (0x6UL << TIM_CCMR1_OC2M_Pos);
TIM2->CCMR1 |= TIM_CCMR1_OC2PE;
TIM2->CCER |= TIM_CCER_CC2E;

TIM2->ARR = 8;
TIM2->CCR2 = 6;
TIM2->PSC = 0;
TIM2->CNT = 0;

TIM2->CR1 |= TIM_CR1_CEN;

}

我应该提到,我使用(几乎)相同的值配置了计时器 3,但使用了通道 1 并且它有效。我认为错误在于寄存器配置。

stm32 cpu-registers pwm
1个回答
0
投票

在设置 TIMx_ARR 之前不要设置 TIM_CR1_ARPE。

如果这样做,新的 ARR 值仅在下一次更新时才会激活,即当 TIMx_CNT 达到默认的 TIMx_ARR 时。默认 TIMx_ARR 是 TIM2(32 位定时器)的最大范围,为 2^32-1,即默认 8MHz HSI 时钟下的 cca 500 秒。你愿意等 cca 8 分钟吗,你会因为输出开始切换而得到奖励。

TIM3 是一个 16 位定时器,因此“初始”延迟只有几毫秒,您没有注意到。

因此,请在设置 TIM2_ARR 后

设置 TIM_CR1_ARPE。或者,您可以通过设置 TIMx_EGR.UG 来强制 ARR 更新。 其他备注:

大多数 STM32
© www.soinside.com 2019 - 2024. All rights reserved.