Timer STM32F103定时器通道模式
我在手册中找不到这样的信息,所以我在询问 我在设计PCB,我有定时器的问题。我需要设置8个独立的PWM和6个计数器(输入频率从50Hz到2kHz不等),并且我没有任何空闲管脚,因此无法进行重新映射。 是否可以在一个计时器内但在不同通道上混合模式 我的意思是,是否可以设置这样的配置: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的该通道的引脚
- 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
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