我是靠谱客的博主 高高心锁,最近开发中收集的这篇文章主要介绍STM32F1主从定时器设置,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

将定时器3做为定时器2 的时钟输入,可用定时器2的值作为定时器3的中断次数、PWM方波个数等

定时器3作为主定时器,需要配置更新事件作为从定时器的预分频器,另外需将定时器3作为主模式运行,置位从模式控制寄存器(TIMx_SMCR)中的第7位。

在这里插入图片描述定时器2作为从定时器,需要设置从模式控制寄存器(TIMx_SMCR)中的TS位为010,

#include "timer.h"
#include "led.h"
/*
	使用正点原子模板例程改编
	使用定时器3作为主定时器,定时器2作为从定时器
	PB5指定为LED输出,观察定时器运行情况
*/
void TIM2_Slave_Init(u16 period,u16 prescaler)
{
    TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
	NVIC_InitTypeDef NVIC_InitStructure;

	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE); //时钟使能
	
	//定时器TIM2初始化
	TIM_TimeBaseStructure.TIM_Period = period-1; 				//设置在下一个更新事件装入活动的自动重装载寄存器周期的值	
	TIM_TimeBaseStructure.TIM_Prescaler =prescaler-1; 			//设置用来作为TIMx时钟频率除数的预分频值
	TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; 	//设置时钟分割:TDTS = Tck_tim
	TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //TIM向上计数模式
	TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure); 			//根据指定的参数初始化TIMx的时间基数单位

	TIM_SelectInputTrigger(TIM2,TIM_TS_ITR2);					//选择TIMx输入触发源	
	TIM_SelectSlaveMode(TIM2,TIM_SlaveMode_External1);			//选中触发( TRGI)的上升沿作为计数器时钟

	NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn;  			//TIM2中断
	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;  	//先占优先级0级
	NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;  		//从优先级3级
	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; 			//IRQ通道被使能
	NVIC_Init(&NVIC_InitStructure);  							//初始化NVIC寄存
	TIM_ITConfig(TIM2,TIM_IT_Update,ENABLE ); 					//使能指定的TIM2中断,允许更新中断
	TIM_Cmd(TIM2, ENABLE);  									//使能TIMx					 
}

void TIM2_IRQHandler(void)   //TIM3中断
{
	if(TIM_GetITStatus(TIM2,TIM_IT_Update)!=RESET)
	{
		TIM_ClearITPendingBit(TIM2, TIM_IT_Update  );  			//清除TIMx更新中断标志 
		LED1 = !LED1;
	}
}


void TIM3_Init(u16 period,u16 prescaler)
{
	TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); 		//时钟使能
	
	//定时器TIM3初始化
	TIM_TimeBaseStructure.TIM_Period = period-1; 				//设置在下一个更新事件装入活动的自动重装载寄存器周期的值	
	TIM_TimeBaseStructure.TIM_Prescaler =prescaler-1; 			//设置用来作为TIMx时钟频率除数的预分频值
	TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; 	//设置时钟分割:TDTS = Tck_tim
	TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //TIM向上计数模式
	TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure); 			//根据指定的参数初始化TIMx的时间基数单位
	
	TIM_SelectMasterSlaveMode(TIM3, TIM_MasterSlaveMode_Enable);//主定时器模式
	TIM_SelectOutputTrigger(TIM3, TIM_TRGOSource_Update);		//主定时器更新事件作为从定时器时钟源
	TIM_ITConfig(TIM3,TIM_IT_Update,DISABLE ); 					//使能指定的TIM3中断,允许更新中断
	
	TIM_Cmd(TIM3, ENABLE);  									//使能TIMx	
}

定时器源码见本链接,使用MDK5.18,单片机是STM32F103RET6

源码链接

最后

以上就是高高心锁为你收集整理的STM32F1主从定时器设置的全部内容,希望文章能够帮你解决STM32F1主从定时器设置所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(58)

评论列表共有 0 条评论

立即
投稿
返回
顶部