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

源码链接

  • 5
    点赞
  • 32
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
STM32CubeMX 是一个集成开发环境(IDE),用于快速配置 STM32 微控制器的软件和硬件参数。它可以帮助开发人员快速生成代码和配置文件,以便更快地开始使用 STM32 微控制器。 关于 STM32CubeMX 中的主从定时器,需要先了解 STM32定时器类型。在 STM32 中,有多种类型的定时器,包括基本定时器、通用定时器、高级定时器等。其中,通用定时器(TIM)是最常用的定时器之一,它可以实现很多功能,包括 PWM 输出、输入捕获、定时中断等。 在 STM32CubeMX 中,可以通过配置来实现定时器主从模式。具体步骤如下: 1. 打开 STM32CubeMX,并选择相应的 STM32 微控制器型号。 2. 在左侧的菜单中选择“Timers”,然后选择要使用的定时器。 3. 在右侧的“Mode”选项卡中,选择“Master/Slave mode”选项,并选择“Enable”。 4. 配置主定时器和从定时器的参数,例如时钟源、分频系数、计数模式等。 5. 在主定时器的“DMA/Interrupt”选项卡中,选择“Update”中断,并使能中断。 6. 在从定时器的“Mode”选项卡中,选择“Slave mode”为“External clock mode 1”。 7. 在从定时器的“Clock configuration”选项卡中,选择“External clock source”为“ETR (TI1) input”。 通过以上步骤,就可以配置 STM32主从定时器模式。在该模式下,主定时器控制时钟源,从定时器通过外部时钟信号进行计数,从而实现同步计数。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值