【问题标题】:STM32F303VC Timer1 Complementary PWM Doesnt workSTM32F303VC Timer1互补PWM不工作
【发布时间】: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 在嵌入式中它有时没有意义,特别是对于原型代码(至少应该稍后仔细审查,当然最好不要使用)。对于整数值,这取决于。但是,是的,至少可以使用一些常量宏。

标签: c embedded stm32


【解决方案1】:

尝试使用“RCC_AHBENR_GPIOEEN”启用 GPIOE 时钟,并为其他定时器通道输出引脚设置备用功能。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-27
    • 2015-08-19
    • 2018-06-16
    • 2012-02-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多