我在手册里找不到这样的信息所以我在问。
我在设计PCB,我对计时器有问题。我需要设置8个独立的PWMs和6个计数器(输入频率从50赫兹到2千赫不等),我没有任何自由的引脚,所以重新映射不是一个选择。是否可以在一个定时器内,但在不同的频道上混合模式?
我的意思是,是否有可能设置这样的配置:
发布于 2018-11-04 15:45:19
是否可以在一个定时器内,但在不同的频道上混合模式?
是的,但是他们会共享计数器并重新加载寄存器。这意味着,如果PWMs使用的是特定的频率,即不只是数到65535 (没有预分频器就会给出~1 kHz @ 64或72 MHz),那么捕获寄存器只会在这个范围内获得时间戳。
每个定时器只有一个计数器,由它的4个通道共享。它可以计数某些时钟事件(通常等于系统时钟的APB时钟),也可以计数一个外部触发器输入。为了产生PWM信号,计数器必须提供PWM频率。要在其他输入线路上计数脉冲,需要DMA通道或中断例程来提供额外的计数器。
计时器中断的计数
您可以在脉宽调制模式下设置两个通道,在输入捕获模式下设置另外两个通道,如参考手册的各个章节所述。在输入捕获通道上启用中断。在中断处理程序中,检查计时器状态寄存器以查看哪个通道导致中断,并进行计数。在重新设置状态寄存器中的中断位时,请小心,不要意外地重置尚未处理的事件位。这应该是可行的:
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进行计数
即使在中断的情况下,以最多2 kHz来计数6个通道,即信号至少要间隔500个,对单片机来说也是没有问题的。但是,如果MCI还有很多其他事情要做,并且您有大量免费的DMA通道,您可以设置捕获通道来生成DMA请求,而不是中断。
请注意,TIM4_CH4没有与DMA通道相关联,因此您必须重新排列引脚,或者在中断模式下使用此通道。
如果不需要事件之间的确切时间,那么将DMA通道设置为外设到内存、8位、循环模式,并禁用外设和内存地址增量。源地址和目标地址都应该是有效的,并且字节是可调整的,但是这些值并不重要。在CNDTR中添加一些较大的值,例如0x8000 (使溢出处理更简单)。它将计数计时器捕获事件(向下),同时重复复制同一个字节。您可以在需要时检查控制循环中的计数器。
这样做的优点是根本不使用单片机核心,它可以休眠以节省电源,外围模块将自动计数。缺点当然是它使用6个DMA信道(在7个中,例如在STM32F103C8上)。
如果需要时间戳,可以让DMA将它们从CCR寄存器复制到真正的内存缓冲区,同时打开内存增量。
https://stackoverflow.com/questions/53137147
复制相似问题