【发布时间】:2021-06-05 12:41:30
【问题描述】:
我使用定时器 1 来创建免费的 PWM 输出。 I 根据 STM32F3 参考手册设置所有寄存器。当我调试代码时,计时器计数非常好,但 TIM1_CH1 输出不输出任何内容。(其他通道输出也有同样的问题)
这是我的代码:
void Timer1_PWMInit()
{
//----------------Setup Timer 1 for 25khz Center Aligned PWM-----------------
RCC->APB2ENR |= RCC_APB2ENR_TIM1EN; // Enable Timer 1 Clock
GPIOE->AFR[1] |= 0x20; // Set Alternate Function 2 For Timer 1 CH1 Output
TIM1->CR1 = 0; // Clear CR1 Register(Turn off Timer 1)
TIM1->CNT = 0; // Clear Timer Counter
TIM1->PSC = 0; // Set Timer 1 Prescaler to 1:1
TIM1->ARR = 320; // 40 us(25 khz) PWM Period
TIM1->CCR1 = 320; // Timer 1 Channel 1 Duty Cycle(%50)
TIM1->CCR2 = 320; // Timer 1 Channel 2 Duty Cycle(%50)
TIM1->CCR3 = 320; // Timer 1 Channel 3 Duty Cycle(%50)
TIM1->CCR5 = 0; // Timer 1 Channel 5 Duty Cycle
TIM1->CCMR1 = 0x6868; // Set Channel 1 and Channel 2 Output Compare mode to PWM Mode
TIM1->CCMR2 = 0x68; // Set Channel 3 Output Compare mode to PWM Mode
TIM1->CCMR3 = 0x10048; // Set Channel 5 Output Compare Mode to Combined PWM Mode
TIM1->CCER = 0x10555; // Enable Output Compare Channels
TIM1->CR1 = 0xE0; // Set Counting Mode to Center Aligned Mode
TIM1->EGR |= 0x1; // Set UG bit for Updating Registers
TIM1->BDTR = 0xC800; // Set MOE and OOSR bits for enabling Output
TIM1->CR1 |= 0x1; // Enable Timer 1
//-------------------------------------------------------------------------
}
【问题讨论】:
-
首先,不要使用幻数。相反,使用预定义的位名称。大多数人(包括我)不会费心将你的幻数写入计算器,然后通过计数/跟踪每个人来手动检查它们。其次,定义“它不起作用。” 预期的行为是什么?你的观察是什么?运行代码时会发生什么?
-
@Tagli 在嵌入式中它有时没有意义,特别是对于原型代码(至少应该稍后仔细审查,当然最好不要使用)。对于整数值,这取决于。但是,是的,至少可以使用一些常量宏。