STM32之定时器

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

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

好的,说了介么多,下面我们用一个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 选项

2.选中Debug选项卡
3.选中Use Simulator选项卡,然后点击OK按钮

猜你喜欢

转载自blog.csdn.net/panrenqiu/article/details/79979882