欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

STM32之定时器

程序员文章站 2022-03-13 17:05:17
...
一·定时器功能简介
区别于SYSTick一般只用于系统时钟的计时,STM32的定时器外设功能强大的超出了想象,STM32一共有8个都为16位的定时器,其中TIM6,TIM7是基本定时器;TIM2,TIM3,TIM4,TIM5是通用定时器;TIM1和TIM8为高级定时器。这些定时器使STM32具有定时,信号的频率测量,信号的PWM测量,PWM输出,三相6步电机控制及编码器接口等功能,都是专门为工控领域量身定做的。

1.。基本定时器TIM6/7是16位的只能向上计数的定时器,只能用于定时。就是累加的时钟脉冲数超过预定值时能触发中断或触发DMA请求,由于在芯片内部与DAC外设相连,可以通过触发输出驱动DAC,也可以作为其他通用定时器的其他基准。
STM32之定时器
2.通用定时器
相比之下,通用定时器TIM2 ~ TIM5 就比基本定时器复杂多了,除了基本的定时,它主要用来测量输入脉冲的频率,脉冲宽与输出PWM脉冲的场合,还具有编码器的接口,如下图:
STM32之定时器
3.高级定时器
TIM1和TIM8是两个高级定时器,它们具有基本,通用定时器的所有功能,还具有三相6步电机的接口,刹车功能及用于PWM驱动电路的死区时间控制,使得它非常适合于电机的控制。如图:
STM32之定时器

好的,说了介么多,下面我们用一个PWM 输出实例分析

本定时器PWM输出实验中我们用到了 GPIO,RCC,TIM外设,没有使用中断,下面来看main函数

/* 
* 函数名:main
* 描述  :主函数
* 输入  :无
* 输出  :无
*/


int main()
{
	
	/*TIM3 PWM波输出初始化,并使能TIM3 PWM输出*/
	   TIM3_PWM_Init();
	
	   while(1)
		 {}
			 
}   

主函数非常简单,调用用户函数TIM3_PWM_Init( ) 把TIM 初始化为PWM输出模式后,内核就把所有工作都交给了TIM外设,完全由TIM来控制GPIO引脚输出PWM波。

/* 
* 函数名:TIM3_PWM_Init
* 描述  :TIM3 输出PWM信号初始化,只要调用这个函数TIM3的四个通道就会有PWM信号输出
* 输入  :无
* 输出  :
* 调用  :外部调用
*/

void TIM3_PWM_Init(void)
{
	  TIM3_GPIO_Config();
	  TIM3_Mode_Config();
}

首先调用了TIM3_GPIO_Config() 对作为TIM外设通道复用的GPIO引脚进行初始化,再调用TIM3_Mode_Config( ) 对TIM外设进行初始化。

/*
* 函数名:TIM3_GPIO_Config
* 描述  :配置TIM3 复用输出PWM时用到的I/O
* 输入  :无
* 输出  :
* 调用  :内部调用
*
*/

static void  TIM3_GPIO_Config(void)
{
	GPIO_InitTypeDef GPIO_InitStructure;
	
	/* TIM3 clock enable*/
	// PCLK1经过2倍频作为TIM3的时钟等于72MHZ
	
  RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);
	
	/* GPIOA and GPIOB clock enable*/
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB,ENABLE);
	
	/* GPIOA Configuration: TIM3 channel 1 and 2 as alternate function push-pull */
	
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6 |GPIO_Pin_7;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOA,&GPIO_InitStructure);
	
	/* GPIOB Configuration : TIM3 channel 3and 4 as alternate function push-pull */
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1;
	
	GPIO_Init(GPIOB,&GPIO_InitStructure);
}

TIM3_GPIO_Config( )函数中,我们使能TIM3外设的时钟,并对TIM3通道相应的GPIO引脚做出相应的配置,使能GPIO时钟,分别是PA6,PA7,PB0,PB1 。它们被配置为复用输出,翻转频率为50MHZ

/*
* 函数名:TIM3_Mode_Config
* 描述  :配置TIM3 输出的PWM信号的模式,如周期,极性,占空比
* 输入  :无
* 输出  :无
* 调用  :内部调用
*
*/


static void TIM3_Mode_Config(void)
{
	TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
	TIM_OCInitTypeDef        TIM_OCInitStructure;
	
	/* pwm 信号电平跳变值*/
	
	u16 CCR1_Val = 500;
	u16 CCR2_Val = 375;
	u16 CCR3_Val = 250;
	u16 CCR4_Val = 125;


/*Time base comfiguration */
	TIM_TimeBaseStructure.TIM_Period = 999;
	//当定时器从0数到999,即为1000次,为一个周期
	TIM_TimeBaseStructure.TIM_Prescaler = 0;
	//设置预分频:不预分频,即为72MHZ
	TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;
	//设置时钟分频系数:不分频
	TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
	// 向上计数模式
	
	TIM_TimeBaseInit(TIM3,&TIM_TimeBaseStructure);
	
	/* PWM1 Mode configuration:channel1 */
	
	TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
	//配置为PWM模式1
	TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
	TIM_OCInitStructure.TIM_Pulse = CCR1_Val;
	//设置跳变值,当计数器计数到这个值时,电平发生跳变
	TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
	//当定时器计数值小于CCR1_Val时为高电平
	TIM_OC1Init(TIM3,&TIM_OCInitStructure); //使能通道1
	TIM_OC1PreloadConfig(TIM3,TIM_OCPreload_Enable);
	
	/* PWM1 Mode configuration:channel2 */
	
	TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
	TIM_OCInitStructure.TIM_Pulse = CCR2_Val;
	//设置通道二的电平跳变值,输出另一个占空比的PWM
	
	TIM_OC2Init(TIM3,&TIM_OCInitStructure); //使能通道2
	TIM_OC2PreloadConfig(TIM3,TIM_OCPreload_Enable);
	
	/* PWM1 Mode configuration:channel3 */
	
	TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
	TIM_OCInitStructure.TIM_Pulse = CCR3_Val;
	//设置通道3的电平跳变值,输出另一个占空比的PWM
	
	TIM_OC3Init(TIM3,&TIM_OCInitStructure); //使能通道3
	TIM_OC3PreloadConfig(TIM3,TIM_OCPreload_Enable);
	
	
	/* PWM1 Mode configuration:channel4 */
	
	TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
	TIM_OCInitStructure.TIM_Pulse = CCR4_Val;
	//设置通道4的电平跳变值,输出另一个占空比的PWM
	
	TIM_OC4Init(TIM3,&TIM_OCInitStructure); //使能通道4
	TIM_OC4PreloadConfig(TIM3,TIM_OCPreload_Enable);
	
	TIM_ARRPreloadConfig(TIM3,ENABLE);
	//使能TIM 重载寄存器ARR
	
	/* TIM3 enable counter */
	TIM_Cmd(TIM3,ENABLE);
}
实验现象

以前我们都是通过J_LINK直接将我们的代码烧到开发板的Flash中去调试,现在要换成软件仿真,首先要设置一下我们的开发环境。
1.Target()Options 选项

STM32之定时器
2.选中Debug选项卡
STM32之定时器
3.选中Use Simulator选项卡,然后点击OK按钮
STM32之定时器
STM32之定时器
相关标签: STM32 定时