我使用NUCLEO-F042K6板来生成PWM信号。我使用 Timer2 来达到这个目的。 Timer2 有 4 个通道,但根据STM32F042x4 Datasheet CH1 无法重定向到物理引脚。 [ 我仍然想使用定时器 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 并且它有效。我认为错误在于寄存器配置。
在设置 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