新手上路
积分 37
金钱 37
注册时间 2016-12-3
在线时间 6 小时
1 金钱
下面是代码,一直调试不出来。大神帮忙看下。
///****************************************************************
// 头文件
//****************************************************************/
#include "sys.h"
#include "delay.h"
#include "usart.h"
#include "HeaderPath.h"
/****************************************************************
说明
TIM4产生PWM波形
PD12对应TIM4_CH1
PD13对应TIM4_CH2
****************************************************************/
TIM_HandleTypeDef TIM4_Handler; //定时器句柄
TIM_OC_InitTypeDef TIM4_CHHandler; //定时器3通道4句柄
TIM_HandleTypeDef TIM5_Handler; //定时器句柄
/****************************************************************
功能:TIM4 PWM部分初始化 & PWM输出初始化
参数: arr:自动重装值
psc:时钟预分频数
返回值:None
****************************************************************/
void TIM4_PWM_Init(u16 TIM4_arr,u16 TIM4_psc)
{
TIM4_Handler.Instance=TIM4; //定时器3
TIM4_Handler.Init.Prescaler=TIM4_psc; //定时器分频
TIM4_Handler.Init.CounterMode=TIM_COUNTERMODE_UP;//向上计数模式
TIM4_Handler.Init.Period=TIM4_arr; //自动重装载值
TIM4_Handler.Init.ClockDivision=TIM_CLOCKDIVISION_DIV1;
TIM4_CHHandler.OCMode=TIM_OCMODE_PWM2; //模式选择PWM2
TIM4_CHHandler.Pulse=TIM4_arr/2; //设置比较值,此值用来确定占空比,默认比较值为自动重装载值的一半,即占空比为50%
TIM4_CHHandler.OCPolarity=TIM_OCPOLARITY_HIGH; //输出比较极性为高
TIM4_Handler.Init.RepetitionCounter=0;
HAL_TIM_PWM_Init(&TIM4_Handler); //初始化TIM4
HAL_TIME4_MasterConfig();
HAL_TIM_PWM_ConfigChannel(&TIM4_Handler,&TIM4_CHHandler,TIM_CHANNEL_1);//配置TIM4通道1
HAL_TIM_PWM_ConfigChannel(&TIM4_Handler,&TIM4_CHHandler,TIM_CHANNEL_2);//配置TIM4通道2
HAL_TIM_PWM_Start(&TIM4_Handler,TIM_CHANNEL_1);//开启PWM通道1
HAL_TIM_PWM_Start(&TIM4_Handler,TIM_CHANNEL_2);//开启PWM通道2
// TIM4->CCR1=TIM_CR1_CEN;
// __HAL_TIM_ENABLE(&TIM4_Handler);
}
/****************************************************************
功能: //定时器底层驱动,时钟使能,引脚配置
//此函数会被HAL_TIM_PWM_Init()调用
//htim:定时器句柄
参数:None
返回值:NoneNone
****************************************************************/
void HAL_TIM_PWM_MspInit(TIM_HandleTypeDef *htim)
{
GPIO_InitTypeDef GPIO_Initure;
__HAL_RCC_TIM4_CLK_ENABLE(); //使能定时器4
__HAL_RCC_GPIOD_CLK_ENABLE(); //开启GPIOD时钟
GPIO_Initure.Pin=GPIO_PIN_12|GPIO_PIN_13;//PD12\PD13
GPIO_Initure.Mode=GPIO_MODE_AF_PP; //复用推完输出
GPIO_Initure.Pull=GPIO_PULLDOWN; //上拉
GPIO_Initure.Speed=GPIO_SPEED_HIGH; //高速
GPIO_Initure.Alternate=GPIO_AF2_TIM4; //PD12\PD13复用为TIM4
HAL_GPIO_Init(GPIOD,&GPIO_Initure);
}
/****************************************************************
说明
主时钟:TIM4
从时钟:TIM5
****************************************************************/
/****************************************************************
功能:Configures the TIM in master mode
参数:None
返回值:NoneNone
****************************************************************/
void HAL_TIME4_MasterConfig()
{
TIM_MasterConfigTypeDef TIM4_MasterConfig;
TIM4_MasterConfig.MasterOutputTrigger=TIM_TRGO_UPDATE;
TIM4_MasterConfig.MasterSlaveMode=TIM_MASTERSLAVEMODE_ENABLE;
HAL_TIMEx_MasterConfigSynchronization(&TIM4_Handler,&TIM4_MasterConfig);
}
/****************************************************************
说明
定时器溢出时间计算方法:Tout=((arr+1)*(psc+1))/Ft us.
Ft=定时器工作频率,单位:Mhz
这里使用的是定时器5!(定时器5挂在APB1上,时钟为HCLK/2)
*****************************************************************/
/****************************************************************
功能:TIM5 PWM部分初始化 & PWM输出初始化
参数: arr:自动重装值
psc:时钟预分频数
返回值:None
****************************************************************/
void TIM5_Init(u16 TIM5_arr)
{
TIM5_Handler.Instance=TIM5; //通用定时器5
TIM5_Handler.Init.Prescaler=0; //分频
TIM5_Handler.Init.CounterMode=TIM_COUNTERMODE_UP; //向上计数器
TIM5_Handler.Init.Period=TIM5_arr; //自动装载值
TIM5_Handler.Init.ClockDivision=TIM_CLOCKDIVISION_DIV1; //时钟分频因子
TIM5_Handler.Init.RepetitionCounter=0;
HAL_TIM_Base_Init(&TIM5_Handler);
// TIM_ETR_SetConfig(TIM5,0,0,0);
// __HAL_TIM_ENABLE(&TIM5_Handler);
HAL_TIM5_SlaveConfig();
HAL_TIM_Base_Start_IT(&TIM5_Handler); //使能定时器5和定时器5更新中断:TIM_IT_UPDATE
// __HAL_TIM_ENABLE(&TIM5_Handler);
// TIM5->CCR1=TIM_CR1_CEN;
}
//定时器底册驱动,开启时钟,设置中断优先级
//此函数会被HAL_TIM_Base_Init()函数调用
void HAL_TIM_Base_MspInit(TIM_HandleTypeDef *htim)
{
if(htim==(&TIM5_Handler))
{
__HAL_RCC_TIM5_CLK_ENABLE(); //使能TIM5时钟
HAL_NVIC_SetPriority(TIM5_IRQn ,2,2); //设置中断优先级,抢占优先级1,子优先级3
HAL_NVIC_EnableIRQ(TIM5_IRQn); //开启ITM5中断
}
}
/****************************************************************
说明
主时钟:TIM4
从时钟:TIM5
****************************************************************/
/****************************************************************
功能:Configures the TIM in Slave mode
参数:None
返回值:None
****************************************************************/
//HAL_StatusTypeDef HAL_TIM_SlaveConfigSynchronization(TIM_HandleTypeDef *htim, TIM_SlaveConfigTypeDef * sSlaveConfig);
void HAL_TIM5_SlaveConfig()
{
TIM_SlaveConfigTypeDef TIM5_SlaveConfig;
TIM5_SlaveConfig.SlaveMode= TIM_SLAVEMODE_EXTERNAL1 ;
TIM5_SlaveConfig.InputTrigger=TIM_TS_ITR2 ;
TIM5_SlaveConfig.TriggerPolarity=TIM_ETRPOLARITY_NONINVERTED;
TIM5_SlaveConfig.TriggerPrescaler=TIM_TRIGGERPRESCALER_DIV1;
TIM5_SlaveConfig.TriggerFilter=0;
HAL_TIM_SlaveConfigSynchronization(&TIM5_Handler,&TIM5_SlaveConfig);
HAL_TIM_SlaveConfigSynchronization_IT(&TIM5_Handler,&TIM5_SlaveConfig);
}
/****************************************************************
功能:Configures the TIM in Slave mode in interrupt mode
参数:None
返回值:None
****************************************************************/
/****************************************************************
功能://定时器5中断服务函数
参数:None
返回值:None
****************************************************************/
void TIM5_IRQHandler(void)
{
HAL_TIM_IRQHandler(&TIM5_Handler);
}
/****************************************************************
功能://定时器5中断服务函数调用
参数:None
返回值:None
****************************************************************/
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
if(htim->Instance==TIM5)
{
TIM4->CCR1=0;
TIM4->CCR2=0;
TIM5->CNT=0;
HAL_TIM_Base_Stop_IT(&TIM5_Handler);
}
}
/****************************************************************
功能://调用定时器4、定时器5初始化函数
参数:TIM4_arr //定时器4重载值
TIM4_psc //定时器4预分频值
TIM5_arr //定时器5重载值
返回值:None
****************************************************************/
void Master_Slave_Init(u16 TIM4_arr,u16 TIM4_psc,u16 TIM5_arr)
{
TIM4_PWM_Init(TIM4_arr,TIM4_psc);
TIM5_Init(TIM5_arr);
// HAL_TIM_PWM_Start(&TIM4_Handler,TIM_CHANNEL_1);//开启PWM通道1
// HAL_TIM_PWM_Start(&TIM4_Handler,TIM_CHANNEL_2);//开启PWM通道2
// HAL_TIM_Base_Start_IT(&TIM5_Handler); //使能定时器5和定时器5更新中断:TIM_IT_UPDATE
}
我来回答