STM32F4使用定时器ETR专用通道进行外部脉冲计数、同步时钟的实现

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毫秒
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值