STM32F4使用定时器ETR专用通道进行外部脉冲计数、同步时钟的实现
外部脉冲计数基本原理
STM32F4中高级定时器TIM1、TIM8,通用定时器TIM2、TIM3、TIM4,共5个定时器具备外部信号驱动通道ETR,因为外部时钟是由外部信号驱动的,所以除了使用时钟驱动系统工作外,还可以对外部信号的频率等进行测量。当外部时钟通过特定的配置后,还可以设置为同步时钟,同步时钟的使用它能保证系统之间数据传输的准确性和稳定性,同步时钟的生成和运作涉及到频率同步和相位同步两个重要概念,其中频率同步指的是两个信号变化频率保持相同或者有固定的比例,而相位相同则要求两个时钟的有效沿保持一致,比如,有A、B两个系统,由系统A产生驱动时钟,且上升沿为触发沿,要使B系统与A系统保持时钟同步,除了时钟频率要设置为一致,也要将B系统的触发沿设置为上升沿触发。
以TIM4的ETR通道为例。
接下来介绍外部脉冲计数具体编程步骤
步骤一:定时器TIM5程序配置
// 初始化脉冲计数器函数
//程序包领取需加qq
// 3182068342
void Pulse_count_Init(u32 arr, u16 psc)
{
}
步骤二:定时器TIM5中断程序
//定时器5中断服务程序
//程序包领取需加qq
// 3182068342
void TIM5_IRQHandler(void)
{
}
步骤三:主程序
// 主函数
//程序包领取需加qq
// 3182068342
int main(void)
{
u8 key_return; // 定义按键返回值变量
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); // 配置中断优先级分组为2
myusart1_Init(); // 初始化串口1
LED_Init(); // 初始化LED
KEY_Init(); // 初始化按键
Pulse_count_Init(10000000-1,42-1); // 设置脉冲计数器
printf("发送接收函数\r\n\r\n"); // 打印提示信息
while(1) // 无限循环
{
if(Caprure_State) // 如果成功捕获到了一次高电平
{
}
delay_ms(10); // 延时10毫秒
}
}
,,,
,,,
,,,
同步时钟基本原理
使用STM32F4实现外部脉冲计数功能,原理和前面讲到的测量电平信号输入时长相似(https://blog.csdn.net/qq_35970934/article/details/142441318),也是通过检测电平跳变来判断脉冲变化频率。具体来说,就是通过使用定时器通道来识别输入的脉冲,比如,可以使用定时器TIM5的通道CH1作为脉冲计数入口。这种使用普通通道进行脉冲计数的方式,在实际使用中既有优势,但也存在缺点,优势是F4除了基本定时器TIM6和TIM7外,每个定时器都至少具备一组通道,能使用的资源非常多;缺点是使用普通通道进行脉冲计数,如果输入脉冲频率较高,容易造成脉冲计数误差,为解决这个问题,可以使用定时器ETR专用通道进行脉冲计数(即定时器计数器由外部输入信号进行驱动)。
接下来介绍同步时钟具体编程步骤
步骤一:定时器TIM4程序配置
//程序包领取需加qq
// 3182068342
void Sync_Clock_Init(u16 arr, u16 psc)
{
}
步骤二:定时器TIM4中断程序
// 定义TIM4中断处理函数
// 用LED灯检验
//程序包领取需加qq
// 3182068342
void TIM4_IRQHandler(void)
{
if(TIM_GetITStatus(TIM4,TIM_IT_Update)) // 检查TIM4是否发生更新事件中断
{
LED0=!LED0;// 切换LED0的状态(开/关)
}
TIM_ClearITPendingBit(TIM4, TIM_IT_Update); // 清除TIM4的更新事件中断标志位,以便下次中断可以触发
}
步骤三:主程序
//主程序
//程序包领取需加qq
// 3182068342
int main(void)
{
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); // 配置中断优先级分组
myusart1_Init(); // 初始化串口1
LED_Init(); // 初始化LED
KEY_Init(); // 初始化按键
Sync_Clock_Init(5000-1,1-1); // 同步时钟初始化
while(1) // 无限循环
{
printf("Count:%d \r\n",TIM4->CNT);// 输出定时器计数值
delay_ms(2);// 延时2毫秒
}
}