新手入门
- 积分
- 19
- 金钱
- 19
- 注册时间
- 2017-5-4
- 在线时间
- 1 小时
|
1金钱
这个东西我调了几天了,但是一直不行,求大神帮忙看看哪里有问题,下面是代码:
pwm.h
#ifndef __PWM_H
#define __PWM_H
#include "sys.h"
#define ADVANCED_TIMx TIM8
#define ADVANCED_TIM_RCC_CLK_ENABLE() __HAL_RCC_TIM8_CLK_ENABLE()
#define ADVANCED_TIM_RCC_CLK_DISABLE() __HAL_RCC_TIM8_CLK_DISABLE()
#define ADVANCED_TIM_GPIO_RCC_CLK_ENABLE() {__HAL_RCC_GPIOA_CLK_ENABLE();__HAL_RCC_GPIOB_CLK_ENABLE();__HAL_RCC_GPIOC_CLK_ENABLE();}
#define ADVANCED_TIM_CH1_PORT GPIOC
#define ADVANCED_TIM_CH1_PIN GPIO_PIN_6
#define ADVANCED_TIM_CH2_PORT GPIOC
#define ADVANCED_TIM_CH2_PIN GPIO_PIN_7
#define ADVANCED_TIM_CH3_PORT GPIOC
#define ADVANCED_TIM_CH3_PIN GPIO_PIN_8
#define ADVANCED_TIM_CH1N_PORT GPIOA
#define ADVANCED_TIM_CH1N_PIN GPIO_PIN_7
#define ADVANCED_TIM_CH2N_PORT GPIOB
#define ADVANCED_TIM_CH2N_PIN GPIO_PIN_0
#define ADVANCED_TIM_CH3N_PORT GPIOB
#define ADVANCED_TIM_CH3N_PIN GPIO_PIN_1
/* 扩展变量 ------------------------------------------------------------------*/
extern TIM_HandleTypeDef htimx;
/* 函数声明 ------------------------------------------------------------------*/
void ADVANCED_TIMx_Init(u16 arr,u16 psc);
#endif //__PWM_H
pwm.c
#include "pwm.h"
/* 私有类型定义 --------------------------------------------------------------*/
/* 私有宏定义 ----------------------------------------------------------------*/
/* 私有变量 ------------------------------------------------------------------*/
TIM_HandleTypeDef htimx;
/* 扩展变量 ------------------------------------------------------------------*/
/* 私有函数原形 --------------------------------------------------------------*/
/* 函数体 --------------------------------------------------------------------*/
/**
* 函数功能: 定时器硬件初始化配置
* 输入参数: htim:定时器句柄类型指针
* 返 回 值: 无
* 说 明: 该函数被ADVANCED_TIMx_Init函数调用
*/
void HAL_TIM_MspPostInit(TIM_HandleTypeDef* htim)
{
GPIO_InitTypeDef GPIO_InitStruct;
if(htim->Instance==ADVANCED_TIMx)
{
/* 定时器通道功能引脚端口时钟使能 */
ADVANCED_TIM_GPIO_RCC_CLK_ENABLE();
__HAL_RCC_TIM8_CLK_ENABLE(); //使能定时器8
/* 定时器通道1功能引脚IO初始化 */
GPIO_InitStruct.Pin = ADVANCED_TIM_CH1_PIN;
GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
GPIO_InitStruct.Pull=GPIO_PULLUP; //上拉
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
GPIO_InitStruct.Alternate = GPIO_AF3_TIM8;
HAL_GPIO_Init(ADVANCED_TIM_CH1_PORT, &GPIO_InitStruct);
/* 定时器通道1互补通道功能引脚IO初始化 */
GPIO_InitStruct.Pin = ADVANCED_TIM_CH1N_PIN;
HAL_GPIO_Init(ADVANCED_TIM_CH1N_PORT, &GPIO_InitStruct);
/* 定时器通道2功能引脚IO初始化 */
GPIO_InitStruct.Pin = ADVANCED_TIM_CH2_PIN;
GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
GPIO_InitStruct.Pull=GPIO_PULLUP; //上拉
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
GPIO_InitStruct.Alternate = GPIO_AF3_TIM8;
HAL_GPIO_Init(ADVANCED_TIM_CH2_PORT, &GPIO_InitStruct);
/* 定时器通道2互补通道功能引脚IO初始化 */
GPIO_InitStruct.Pin = ADVANCED_TIM_CH2N_PIN;
HAL_GPIO_Init(ADVANCED_TIM_CH2N_PORT, &GPIO_InitStruct);
/* 定时器通道3功能引脚IO初始化 */
GPIO_InitStruct.Pin = ADVANCED_TIM_CH3_PIN;
GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
GPIO_InitStruct.Pull=GPIO_PULLUP; //上拉
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
GPIO_InitStruct.Alternate = GPIO_AF3_TIM8;
HAL_GPIO_Init(ADVANCED_TIM_CH3_PORT, &GPIO_InitStruct);
/* 定时器通道3互补通道功能引脚IO初始化 */
GPIO_InitStruct.Pin = ADVANCED_TIM_CH3N_PIN;
HAL_GPIO_Init(ADVANCED_TIM_CH3N_PORT, &GPIO_InitStruct);
}
}
/**
* 函数功能: 基本定时器初始化
* 输入参数: 无
* 返 回 值: 无
* 说 明: 无
*/
void ADVANCED_TIMx_Init(u16 arr,u16 psc)
{
TIM_ClockConfigTypeDef sClockSourceConfig;
TIM_MasterConfigTypeDef sMasterConfig;
TIM_BreakDeadTimeConfigTypeDef sBreakDeadTimeConfig;
TIM_OC_InitTypeDef sConfigOC;
htimx.Instance = TIM8; //定时器8
htimx.Init.Prescaler = psc; //时钟分频系数
htimx.Init.CounterMode = TIM_COUNTERMODE_UP; //向上计数模式
htimx.Init.Period = arr/2; //设置比较值,此值用来确定占空比,
//默认比较值为自动重装载值的一半,即占空比为50%
htimx.Init.ClockDivision=TIM_CLOCKDIVISION_DIV1; //时钟分频系数
htimx.Init.RepetitionCounter = 0; //重复计数寄存器值
HAL_TIM_Base_Init(&htimx); //初始化定时器8
sClockSourceConfig.ClockSource = TIM_CLOCKSOURCE_INTERNAL; //时钟源
HAL_TIM_ConfigClockSource(&htimx, &sClockSourceConfig);
HAL_TIM_PWM_Init(&htimx);
sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET; //
sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;
HAL_TIMEx_MasterConfigSynchronization(&htimx, &sMasterConfig);
sBreakDeadTimeConfig.OffStateRunMode = TIM_OSSR_ENABLE;
sBreakDeadTimeConfig.OffStateIDLEMode = TIM_OSSI_ENABLE;
sBreakDeadTimeConfig.LockLevel = TIM_LOCKLEVEL_1;
sBreakDeadTimeConfig.DeadTime = 11;
sBreakDeadTimeConfig.BreakState = TIM_BREAK_ENABLE;
sBreakDeadTimeConfig.BreakPolarity = TIM_BREAKPOLARITY_LOW;
sBreakDeadTimeConfig.AutomaticOutput = TIM_AUTOMATICOUTPUT_ENABLE;
HAL_TIMEx_ConfigBreakDeadTime(&htimx, &sBreakDeadTimeConfig);
sConfigOC.OCMode = TIM_OCMODE_PWM1; //PWM模式1
sConfigOC.Pulse = 127; //
sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH;
sConfigOC.OCNPolarity = TIM_OCPOLARITY_HIGH;
sConfigOC.OCFastMode = TIM_OCFAST_DISABLE;
sConfigOC.OCIdleState = TIM_OCIDLESTATE_SET;
sConfigOC.OCNIdleState = TIM_OCNIDLESTATE_RESET;
HAL_TIM_PWM_ConfigChannel(&htimx, &sConfigOC, TIM_CHANNEL_1);
sConfigOC.Pulse = 600;
HAL_TIM_PWM_ConfigChannel(&htimx, &sConfigOC, TIM_CHANNEL_2);
sConfigOC.Pulse = 50;
HAL_TIM_PWM_ConfigChannel(&htimx, &sConfigOC, TIM_CHANNEL_3);
HAL_TIM_MspPostInit(&htimx); //初始化TIM8的相关引脚
}
/**
* 函数功能: 基本定时器硬件初始化配置
* 输入参数: htim_base:基本定时器句柄类型指针
* 返 回 值: 无
* 说 明: 该函数被HAL库内部调用
*/
void HAL_TIM_Base_MspInit(TIM_HandleTypeDef* htim_base)
{
if(htim_base->Instance==TIM8 || htim_base->Instance==TIM3)
{
/* 基本定时器外设时钟使能 */
ADVANCED_TIM_RCC_CLK_ENABLE();
// HAL_NVIC_SetPriority(TIM8_UP_TIM13_IRQn,1,3); //设置中断优先级,抢占优先级1,子优先级3
// HAL_NVIC_EnableIRQ(TIM8_UP_TIM13_IRQn); //开启ITM3中断
}
if(htim_base->Instance==TIM8 || htim_base->Instance==TIM3)
{
__HAL_RCC_TIM3_CLK_ENABLE(); //使能TIM3时钟
HAL_NVIC_SetPriority(TIM3_IRQn,1,3); //设置中断优先级,抢占优先级1,子优先级3
HAL_NVIC_EnableIRQ(TIM3_IRQn); //开启ITM3中断
}
}
|
|