Timer STM32F103定时器通道模式

Timer STM32F103定时器通道模式,timer,embedded,stm32,pwm,Timer,Embedded,Stm32,Pwm,我在手册中找不到这样的信息,所以我在询问 我在设计PCB,我有定时器的问题。我需要设置8个独立的PWM和6个计数器(输入频率从50Hz到2kHz不等),并且我没有任何空闲管脚,因此无法进行重新映射。 是否可以在一个计时器内但在不同通道上混合模式 我的意思是,是否可以设置这样的配置: TIM1_CH1-PWM TIM1_CH2-PWM TIM1_CH3-碳纳米管 TIM1_CH4-碳纳米管 TIM2_CH1-碳纳米管 TIM2_CH2-CNT TIM2_CH3-用于USART的该通道的引脚

我在手册中找不到这样的信息,所以我在询问

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

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

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

  • TIM2_CH1-碳纳米管
  • TIM2_CH2-CNT
  • 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-CNT
是否可以在一个计时器内但在不同通道上混合模式

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

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

计时器中断计数

您可以在PWM模式下设置2个通道,在输入捕获模式下设置2个通道,如本手册相应章节所述。在输入捕获通道上启用中断。在中断处理程序中,检查定时器状态寄存器,查看哪个通道导致了中断,并进行计数。在重置状态寄存器中的中断位时要小心,不要意外重置尚未处理的事件位。这应该起作用:

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中断源,但有一个限制,即具有相同编号的两个引脚不能同时映射为EXTI中断源,即
PA0、PA1、PB2、PC3、PA4
可以,但
PA0、PB0
不能。设置EXTI中断可能比定时器捕获通道更容易,缺点是没有时间戳和输入过滤器

使用DMA计数

计数6个通道,最多2 kHz,即信号之间至少相隔500 us,即使有中断,MCU也不会有问题。但是,如果MCI还有很多其他事情要做,并且您有很多空闲DMA通道,那么您可以设置捕获通道来生成DMA请求,而不是中断

请注意,
TIM4_CH4
没有与之相关的DMA通道,因此您必须稍微重新排列管脚,或在中断模式下使用此通道

如果不需要事件之间的精确计时,则将DMA通道设置为外设到内存、8位、循环模式,并禁用外设和内存地址增量。源地址和目标地址都应有效且字节可寻址,但值并不重要。在
CNDTR
中放入一些较大的值,例如
0x8000
(以简化溢出处理)。它将对计时器捕获事件(向下)进行计数,同时反复复制相同的字节。您可以随时检查控制回路中的计数器

这样做的优点是根本不使用MCU内核,可以将其置于休眠状态以节省电源,外围模块将自动进行计数。缺点当然是它使用6个DMA信道(例如在
STM32F103C8
上的7个信道中)

如果您需要时间戳,可以让DMA将它们从
CCR
寄存器复制到实际内存缓冲区,并启用内存增量

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

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

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

计时器中断计数

您可以在PWM模式下设置2个通道,在输入捕获模式下设置2个通道,如本手册相应章节所述。在输入捕获通道上启用中断。在中断处理程序中,检查定时器状态寄存器,查看哪个通道导致了中断,并进行计数。在重置状态寄存器中的中断位时要小心,不要意外重置尚未处理的事件位。这应该起作用:

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中断源,但有一个限制,即具有相同编号的两个引脚不能同时映射为EXTI中断源,即
PA0、PA1、PB2、PC3、PA4
可以,但
PA0、PB0
不能。设置EXTI-inte