STM32F103计时器通道模式

时间:2018-11-04 02:03:21

标签: timer embedded stm32 pwm

我无法在手册中找到此类信息,所以我问。

我正在设计PCB,但计时器存在问题。我需要设置8个独立的PWM和6个计数器(输入频率从50Hz到2kHz),并且我没有任何可用的引脚,因此无法重新映射。 是否可以在一个计时器内但在不同通道上混合模式?

我的意思是可以设置这样的配置:

  • TIM1_CH1-PWM
  • TIM1_CH2-PWM
  • TIM1_CH3-碳纳米管
  • TIM1_CH4-碳纳米管

  • TIM2_CH1-碳纳米管
  • TIM2_CH2-碳纳米管
  • TIM2_CH3-此通道用于USART的引脚
  • TIM2_CH4-用于USART的此通道的引脚

  • TIM3_CH1-PWM
  • TIM3_CH2-PWM
  • TIM3_CH3-PWM
  • TIM3_CH4-PWM

  • TIM4_CH1-PWM
  • TIM4_CH2-PWM
  • TIM4_CH3-碳纳米管
  • TIM4_CH4-碳纳米管

1 个答案:

答案 0 :(得分:1)

  

是否可以在一个计时器内但在不同通道上混合模式?

是,但是它们将共享计数器并重新加载寄存器。这意味着,如果PWM使用特定的频率,即不仅仅计数到65535(没有预分频器,它将在64或72 MHz时给出〜1 kHz),那么捕获寄存器将仅在该范围内获得时间戳。 >

每个计时器只有一个计数器,该计数器由其4个通道共享。它可以对某些时钟事件(APB时钟,通常等于系统时钟)进行计数,也可以对一个外部触发输入进行计数。要生成PWM信号,计数器必须提供PWM频率。要对其他输入线上的脉冲进行计数,必须使用DMA通道或中断例程来提供附加的计数器。

使用计时器中断计数

您可以在{em> PWM模式中设置2个通道,并在输入捕获模式中设置另外2个通道,如Reference Manual的相应章节所述。在输入捕捉通道上启用中断。在中断处理程序中,检查计时器状态寄存器以查看引起中断的通道,然后进行计数。重置状态寄存器中的中断位时要小心,不要意外重置未处理的事件位。这应该起作用:

uint32_t t1c3, t1c4;
void TIM1_Handler(void) {
    if(TIM1->SR & TIM_SR_CC3IF) {
        t1c3++;
        TIM1->SR = ~TIM_SR_CC3IF;
    }
    if(TIM1->SR & TIM_SR_CC4IF) {
        t1c4++;
        TIM1->SR = ~TIM_SR_CC4IF;
    }
}

如果需要两个事件之间的确切经过时间,还可以从捕获/比较寄存器中读取时间戳记值。

使用EXTI中断计数

任何I / O引脚都可以是EXTI中断源,其约束是不能将具有相同 number 的两个引脚同时映射为EXTI中断源,即{{1 }}可以,但是PA0,PA1,PB2,PC3,PA4不能。设置EXTI中断可能比定时器捕获通道更容易,其缺点是没有时间戳,也没有输入过滤器。

使用DMA计数

对最多2 kHz的6个通道进行计数,即信号至少相隔500 us,即使有中断,对于MCU也不成问题。但是,如果MCI还有很多其他事情要做,并且您有大量的可用DMA通道,则可以设置捕获通道以生成DMA请求而不是中断。

请注意,PA0,PB0没有与之关联的DMA通道,因此您必须重新排列一下引脚,或者在中断模式下使用此通道。

如果您不需要在事件之间的确切时间,则将DMA通道设置为内存外设,8位循环模式,并禁用外设和内存地址增量。源地址和目标地址均应有效且可字节访问,但是这些值并不重要。在TIM4_CH4中添加一些较大的值,例如CNDTR(使溢出处理更简单)。一遍又一遍地复制同一字节时,它将计数计时器捕获事件(向下)。您可以随时在控制循环中检查计数器。

这具有根本不使用MCU内核的优点,可以使其休眠以节省功率,外围模块将自动进行计数。缺点当然是它使用6个DMA通道(例如在0x8000上有7个)。

如果需要时间戳,可以在打开内存增量的情况下让DMA从STM32F103C8寄存器复制到真实的内存缓冲区。