STM32F429的TIM2、3、10、11输出PWM

tim.h

#ifndef __TIM_H
#define __TIM_H
#include "stm32f4xx_hal.h"
#include "led.h"  
#include "sys.h" 

/*
*
*TIM2
*
*/
extern u8 TIM2_flag1;		//定时器标志位
void TIM2_Init(u16 arr,u16 psc);
void TIM2_PWM_Init(u16 arr,u16 psc);	//TIM? PWM部分初始化 
void TIM_SetTIM2Compare2(u32 compare);//设置TIM?通道?的占空比

/*
*
*TIM3
*
*/
void TIM3_Init(u16 arr,u16 psc);
void TIM3_PWM_Init(u16 arr,u16 psc);	//TIM? PWM部分初始化 
void TIM_SetTIM3Compare1(u32 compare);//设置TIM?通道?的占空比
void TIM_SetTIM3Compare2(u32 compare);//设置TIM?通道?的占空比
void TIM_SetTIM3Compare3(u32 compare);//设置TIM?通道?的占空比
void TIM_SetTIM3Compare4(u32 compare);//设置TIM?通道?的占空比

/*
*
*TIM10
*
*/
extern u8 TIM10_flag1;		//定时器标志位
void TIM10_Init(u16 arr,u16 psc);
void TIM10_PWM_Init(u16 arr,u16 psc);	//TIM? PWM部分初始化 
void TIM_SetTIM10Compare1(u32 compare);//设置TIM?通道?的占空比

/*
*
*TIM11
*
*/
extern u8 TIM11_flag1;		//定时器标志位
void TIM11_Init(u16 arr,u16 psc);
void TIM11_PWM_Init(u16 arr,u16 psc);	//TIM? PWM部分初始化 
void TIM_SetTIM11Compare1(u32 compare);//设置TIM?通道?的占空比

#endif 


tim.c

#include "tim.h" 

/*
*
*TIM2
*
*/
u8 TIM2_flag1;		//定时器标志位
TIM_HandleTypeDef 	TIM2_Handler;	//结构体变量
TIM_OC_InitTypeDef  TIM2_CH_Handler;  //定时器?通道?句柄

/*
*
*TIM3
*
*/
uint16_t TIM3_flag1;		//定时器标志位
int TIM3_flag2;					//定时器标志位
int TIM3_flag3;					//定时器标志位
int TIM3_flag4;					//定时器标志位
TIM_HandleTypeDef 	TIM3_Handler;			//结构体变量
TIM_OC_InitTypeDef  TIM3_CH_Handler;  //定时器?通道?句柄


/*
*
*TIM10
*
*/
u8 TIM10_flag1;		
TIM_HandleTypeDef	  TIM10_Handler; 
TIM_OC_InitTypeDef  TIM10_CH_Handler;  //定时器?通道?句柄

/*
*
*TIM11
*
*/
u8 TIM11_flag1;		
TIM_HandleTypeDef 	TIM11_Handler;
TIM_OC_InitTypeDef  TIM11_CH_Handler;  //定时器?通道?句柄	
	

/***************************************************************
*
*定时器底层驱动,开启时钟,设置中断优先级
*回调函数,定时器中断服务函数调用
*
****************************************************************/
void HAL_TIM_Base_MspInit(TIM_HandleTypeDef *htim)
{
    if(htim->Instance==TIM2)
	{
		__HAL_RCC_TIM2_CLK_ENABLE();           
		HAL_NVIC_SetPriority(TIM2_IRQn,2,3);  
		HAL_NVIC_EnableIRQ(TIM2_IRQn);         
	}
	if(htim->Instance==TIM3)
	{
		__HAL_RCC_TIM3_CLK_ENABLE();           
		HAL_NVIC_SetPriority(TIM3_IRQn,3,4);  
		HAL_NVIC_EnableIRQ(TIM3_IRQn);         
	}
    if(htim->Instance==TIM10)
	{
		__HAL_RCC_TIM10_CLK_ENABLE();					
		HAL_NVIC_SetPriority(TIM1_UP_TIM10_IRQn, 10,11);
		HAL_NVIC_EnableIRQ(TIM1_UP_TIM10_IRQn);
	}
	if(htim->Instance==TIM11)
	{
		__HAL_RCC_TIM11_CLK_ENABLE();					
		HAL_NVIC_SetPriority(TIM1_TRG_COM_TIM11_IRQn, 11,12);
		HAL_NVIC_EnableIRQ(TIM1_TRG_COM_TIM11_IRQn);
	}
}    


/***************************************************************
*
*
*TIM2
*
*
****************************************************************/
/***************************************************************
* 通用定时器2中断初始化
* arr:自动重装值。
* psc:时钟预分频数
* 定时器溢出时间计算方法:Tout=((arr+1)*(psc+1))/Ft us.
* Ft=定时器工作频率,单位:Mhz
* 这里使用的是定时器2!(定时器2挂在APB1上,时钟为HCLK/2)
****************************************************************/
void TIM2_Init(u16 arr,u16 psc)
{  
    TIM2_Handler.Instance=TIM2;                          //通用定时器2
    TIM2_Handler.Init.Prescaler=psc;                     //分频系数
    TIM2_Handler.Init.CounterMode=TIM_COUNTERMODE_UP;    //向上计数器
    TIM2_Handler.Init.Period=arr;                        //自动装载值
    TIM2_Handler.Init.ClockDivision=TIM_CLOCKDIVISION_DIV1;//时钟分频因子
    HAL_TIM_Base_Init(&TIM2_Handler);
    
    HAL_TIM_Base_Start_IT(&TIM2_Handler); //使能定时器2和定时器2更新中断:TIM_IT_UPDATE   
}
//PWM部分初始化  
void TIM2_PWM_Init(u16 arr,u16 psc)
{ 
    TIM2_Handler.Instance=TIM2;           
    TIM2_Handler.Init.Prescaler=psc;       //定时器分频
    TIM2_Handler.Init.CounterMode=TIM_COUNTERMODE_UP;//向上计数模式
    TIM2_Handler.Init.Period=arr;          //自动重装载值
    TIM2_Handler.Init.ClockDivision=TIM_CLOCKDIVISION_DIV1;
    HAL_TIM_PWM_Init(&TIM2_Handler);       //初始化PWM
    
    TIM2_CH_Handler.OCMode=TIM_OCMODE_PWM1; //模式选择PWM1
    TIM2_CH_Handler.Pulse=arr/2;            //设置比较值,此值用来确定占空比,
                                            //默认比较值为自动重装载值的一半,即占空比为50%
    TIM2_CH_Handler.OCPolarity=TIM_OCPOLARITY_LOW; //输出比较极性为低 
    HAL_TIM_PWM_ConfigChannel(&TIM2_Handler,&TIM2_CH_Handler,TIM_CHANNEL_2);//配置TIM?通道?
		HAL_TIM_PWM_Start(&TIM2_Handler,TIM_CHANNEL_2);//开启PWM?通道?
}
//设置TIM?通道?的占空比
void TIM_SetTIM2Compare2(u32 compare)
{
	TIM2->CCR2=compare; //compare:比较值
}

//定时器?中断服务函数
void TIM2_IRQHandler(void)
{
    HAL_TIM_IRQHandler(&TIM2_Handler);
}

/***************************************************************
*
*
*TIM3
*
*
****************************************************************/
//通用定时器3中断初始化,定时器3在APB1上,APB1的定时器时钟为200MHz
//arr:自动重装值。
//psc:时钟预分频数
//定时器溢出时间计算方法:Tout=((arr+1)*(psc+1))/Ft us.
//Ft=定时器工作频率,单位:Mhz
//这里使用的是定时器3!(定时器3挂在APB1上,时钟为HCLK/2)
void TIM3_Init(u16 arr,u16 psc)
{  
    TIM3_Handler.Instance=TIM3;                          
    TIM3_Handler.Init.Prescaler=psc;                     //分频
    TIM3_Handler.Init.CounterMode=TIM_COUNTERMODE_UP;    //向上计数器
    TIM3_Handler.Init.Period=arr;                        //自动装载值
    TIM3_Handler.Init.ClockDivision=TIM_CLOCKDIVISION_DIV1;//时钟分频因子
    HAL_TIM_Base_Init(&TIM3_Handler);
    
    HAL_TIM_Base_Start_IT(&TIM3_Handler); //使能定时器?和定时器?更新中断
}
//PWM部分初始化  
void TIM3_PWM_Init(u16 arr,u16 psc)
{ 
    TIM3_Handler.Instance=TIM3;          
    TIM3_Handler.Init.Prescaler=psc;       //定时器分频
    TIM3_Handler.Init.CounterMode=TIM_COUNTERMODE_UP;//向上计数模式
    TIM3_Handler.Init.Period=arr;          //自动重装载值
    TIM3_Handler.Init.ClockDivision=TIM_CLOCKDIVISION_DIV1;
    HAL_TIM_PWM_Init(&TIM3_Handler);       //初始化PWM
    
    TIM3_CH_Handler.OCMode=TIM_OCMODE_PWM1; //模式选择PWM1
    TIM3_CH_Handler.Pulse=arr/2;            //设置比较值,此值用来确定占空比,
                                            //默认比较值为自动重装载值的一半,即占空比为50%
    TIM3_CH_Handler.OCPolarity=TIM_OCPOLARITY_LOW; //输出比较极性为低 
    HAL_TIM_PWM_ConfigChannel(&TIM3_Handler,&TIM3_CH_Handler,TIM_CHANNEL_1);//配置TIM?通道?
		HAL_TIM_PWM_ConfigChannel(&TIM3_Handler,&TIM3_CH_Handler,TIM_CHANNEL_2);//配置TIM?通道?
    HAL_TIM_PWM_ConfigChannel(&TIM3_Handler,&TIM3_CH_Handler,TIM_CHANNEL_3);//配置TIM?通道?
		HAL_TIM_PWM_ConfigChannel(&TIM3_Handler,&TIM3_CH_Handler,TIM_CHANNEL_4);//配置TIM?通道?
    HAL_TIM_PWM_Start(&TIM3_Handler,TIM_CHANNEL_1);//开启PWM?通道?
		HAL_TIM_PWM_Start(&TIM3_Handler,TIM_CHANNEL_2);//开启PWM?通道?
		HAL_TIM_PWM_Start(&TIM3_Handler,TIM_CHANNEL_3);//开启PWM?通道?
		HAL_TIM_PWM_Start(&TIM3_Handler,TIM_CHANNEL_4);//开启PWM?通道?
}
//设置TIM?通道?的占空比
void TIM_SetTIM3Compare1(u32 compare)
{
	TIM3->CCR1=compare; //compare:比较值
}
void TIM_SetTIM3Compare2(u32 compare)
{
	TIM3->CCR2=compare; 
}
void TIM_SetTIM3Compare3(u32 compare)
{
	TIM3->CCR3=compare; 
}
void TIM_SetTIM3Compare4(u32 compare)
{
	TIM3->CCR4=compare; 
}
//定时器?中断服务函数
void TIM3_IRQHandler(void)
{
    HAL_TIM_IRQHandler(&TIM3_Handler);
}

/***************************************************************
*
*
*TIM10
*
*
****************************************************************/
void TIM10_Init(u16 arr,u16 psc)
{  
	TIM10_Handler.Instance=TIM10;                         
	TIM10_Handler.Init.Prescaler=psc;                     //分频系数
	TIM10_Handler.Init.CounterMode=TIM_COUNTERMODE_UP;    //向上计数器
	TIM10_Handler.Init.Period=arr;                        //自动装载值
	TIM10_Handler.Init.ClockDivision=TIM_CLOCKDIVISION_DIV2;//时钟分频因子
	HAL_TIM_Base_Init(&TIM10_Handler);
	
	HAL_TIM_Base_Start_IT(&TIM10_Handler); //使能定时器和定时器更新中断
}
//PWM部分初始化  
void TIM10_PWM_Init(u16 arr,u16 psc)
{ 
    TIM10_Handler.Instance=TIM10;           
    TIM10_Handler.Init.Prescaler=psc;       //定时器分频
    TIM10_Handler.Init.CounterMode=TIM_COUNTERMODE_UP;//向上计数模式
    TIM10_Handler.Init.Period=arr;          //自动重装载值
    TIM10_Handler.Init.ClockDivision=TIM_CLOCKDIVISION_DIV1;
    HAL_TIM_PWM_Init(&TIM10_Handler);       //初始化PWM
    
    TIM10_CH_Handler.OCMode=TIM_OCMODE_PWM1; //模式选择PWM1
    TIM10_CH_Handler.Pulse=arr/2;            //设置比较值,此值用来确定占空比,
																						 //默认比较值为自动重装载值的一半,即占空比为50%
    TIM10_CH_Handler.OCPolarity=TIM_OCPOLARITY_LOW; //输出比较极性为低 
    HAL_TIM_PWM_ConfigChannel(&TIM10_Handler,&TIM10_CH_Handler,TIM_CHANNEL_1);//配置TIM?通道?
		HAL_TIM_PWM_Start(&TIM10_Handler,TIM_CHANNEL_1);//开启PWM?通道?
}
//设置TIM?通道?的占空比
void TIM_SetTIM10Compare1(u32 compare)
{
	TIM10->CCR1=compare; //compare:比较值
}
//定时器中断服务函数
void TIM1_UP_TIM10_IRQHandler(void)
{
   HAL_TIM_IRQHandler(&TIM10_Handler);
}

/***************************************************************
*
*
*TIM11
*
*
****************************************************************/
void TIM11_Init(u16 arr,u16 psc)
{ 
	TIM11_Handler.Instance=TIM11;                         
	TIM11_Handler.Init.Prescaler=psc;                     //分频系数
	TIM11_Handler.Init.CounterMode=TIM_COUNTERMODE_UP;    //向上计数器
	TIM11_Handler.Init.Period=arr;                        //自动装载值
	TIM11_Handler.Init.ClockDivision=TIM_CLOCKDIVISION_DIV2;//时钟分频因子
	HAL_TIM_Base_Init(&TIM11_Handler);
	
	HAL_TIM_Base_Start_IT(&TIM11_Handler); //使能定时器和定时器更新中断
}
//PWM部分初始化  
void TIM11_PWM_Init(u16 arr,u16 psc)
{ 
    TIM11_Handler.Instance=TIM11;           
    TIM11_Handler.Init.Prescaler=psc;       //定时器分频
    TIM11_Handler.Init.CounterMode=TIM_COUNTERMODE_UP;//向上计数模式
    TIM11_Handler.Init.Period=arr;          //自动重装载值
    TIM11_Handler.Init.ClockDivision=TIM_CLOCKDIVISION_DIV1;
    HAL_TIM_PWM_Init(&TIM11_Handler);       //初始化PWM
    
    TIM11_CH_Handler.OCMode=TIM_OCMODE_PWM1; //模式选择PWM1
    TIM11_CH_Handler.Pulse=arr/2;            //设置比较值,此值用来确定占空比,
																						 //默认比较值为自动重装载值的一半,即占空比为50%
    TIM11_CH_Handler.OCPolarity=TIM_OCPOLARITY_LOW; //输出比较极性为低 
    HAL_TIM_PWM_ConfigChannel(&TIM11_Handler,&TIM11_CH_Handler,TIM_CHANNEL_1);//配置TIM?通道?
		HAL_TIM_PWM_Start(&TIM11_Handler,TIM_CHANNEL_1);//开启PWM?通道?
}
//设置TIM?通道?的占空比
void TIM_SetTIM11Compare1(u32 compare)
{
	TIM11->CCR1=compare; //compare:比较值
}
//定时器中断服务函数
void TIM1_TRG_COM_TIM11_IRQHandler(void)
{
  HAL_TIM_IRQHandler(&TIM11_Handler);
}








tim_STEPMOTOR.h

#ifndef __TIM_STEPMOTOR_H
#define __TIM_STEPMOTOR_H
#include "tim.h"
	
#endif 

tim_STEPMOTOR.c

#include "tim_STEPMOTOR.h"


/***************************************************************
*
*TIM3
*定时器底层驱动,时钟使能,引脚配置
*此函数会被HAL_TIM_PWM_Init()调用
*htim:定时器句柄
****************************************************************/
void HAL_TIM_PWM_MspInit(TIM_HandleTypeDef *htim)
{
	GPIO_InitTypeDef GPIO_Initure;
	__HAL_RCC_TIM2_CLK_ENABLE();			//使能定时器
	__HAL_RCC_TIM3_CLK_ENABLE();			//使能定时器
	
	__HAL_RCC_TIM10_CLK_ENABLE();			//使能定时器
	__HAL_RCC_TIM11_CLK_ENABLE();			//使能定时器
	
	__HAL_RCC_GPIOA_CLK_ENABLE();			//开启GPIO时钟
	__HAL_RCC_GPIOB_CLK_ENABLE();			//开启GPIO时钟
	//TIM2
	GPIO_Initure.Pin=GPIO_PIN_1;   
	GPIO_Initure.Mode=GPIO_MODE_AF_PP;  		//复用推完输出
	GPIO_Initure.Pull=GPIO_PULLUP;          //上拉
	GPIO_Initure.Speed=GPIO_SPEED_FREQ_VERY_HIGH; //高速
	GPIO_Initure.Alternate=GPIO_AF1_TIM2;		
	HAL_GPIO_Init(GPIOA,&GPIO_Initure);
	//TIM3
	GPIO_Initure.Pin=GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_4|GPIO_PIN_5;   
	GPIO_Initure.Mode=GPIO_MODE_AF_PP;  		//复用推完输出
	GPIO_Initure.Pull=GPIO_PULLUP;          //上拉
	GPIO_Initure.Speed=GPIO_SPEED_FREQ_VERY_HIGH; //高速
	GPIO_Initure.Alternate=GPIO_AF2_TIM3;		
	HAL_GPIO_Init(GPIOB,&GPIO_Initure);
	//TIM10
	GPIO_Initure.Pin=GPIO_PIN_8;   
	GPIO_Initure.Mode=GPIO_MODE_AF_PP;  		//复用推完输出
	GPIO_Initure.Pull=GPIO_PULLUP;          //上拉
	GPIO_Initure.Speed=GPIO_SPEED_FREQ_VERY_HIGH; //高速
	GPIO_Initure.Alternate=GPIO_AF3_TIM10;		
	HAL_GPIO_Init(GPIOB,&GPIO_Initure);
	//TIM11
	GPIO_Initure.Pin=GPIO_PIN_9;   
	GPIO_Initure.Mode=GPIO_MODE_AF_PP;  		//复用推完输出
	GPIO_Initure.Pull=GPIO_PULLUP;          //上拉
	GPIO_Initure.Speed=GPIO_SPEED_FREQ_VERY_HIGH; //高速
	GPIO_Initure.Alternate=GPIO_AF3_TIM11;		
	HAL_GPIO_Init(GPIOB,&GPIO_Initure);
}

main.c

int main(void)
{
	u8 dir=1;
	u16 led0pwmval=0;

    //200M/200=1M的计数频率,自动重装载为500,那么PWM频率为1M/500=2kHZ
	TIM2_PWM_Init(500-1,200-1); 
	TIM3_PWM_Init(500-1,200-1); 
	TIM10_PWM_Init(500-1,200-1); 
	TIM11_PWM_Init(500-1,200-1); 

	while (1)
	{
		delay_ms(10);	
		if(dir)led0pwmval++;					//dir==1 led0pwmval递增
		else led0pwmval--;				    //dir==0 led0pwmval递减 
		if(led0pwmval>300)dir=0;			//led0pwmval到达300后,方向为递减
		if(led0pwmval==0)dir=1;			  //led0pwmval递减到0后,方向改为递增
		
		TIM_SetTIM2Compare2(led0pwmval);	//修改比较值,修改占空比
		
		TIM_SetTIM3Compare1(led0pwmval);	//修改比较值,修改占空比
		TIM_SetTIM3Compare2(led0pwmval);	//修改比较值,修改占空比
		TIM_SetTIM3Compare3(led0pwmval);	//修改比较值,修改占空比
		TIM_SetTIM3Compare4(led0pwmval);	//修改比较值,修改占空比
		
		TIM_SetTIM10Compare1(led0pwmval);	//修改比较值,修改占空比
		
		TIM_SetTIM11Compare1(led0pwmval);	//修改比较值,修改占空比
	}
}

猜你喜欢

转载自blog.csdn.net/qq_35831134/article/details/110919701