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); //修改比较值,修改占空比
}
}