OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 4111|回复: 1

stm32f7使用高级定时器8输出对称的PWM一直不行,求高手指点

[复制链接]

1

主题

3

帖子

0

精华

新手入门

积分
19
金钱
19
注册时间
2017-5-4
在线时间
1 小时
发表于 2017-11-17 20:44:48 | 显示全部楼层 |阅读模式
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中断   
        }  
}

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165516
金钱
165516
注册时间
2010-12-1
在线时间
2116 小时
发表于 2017-11-18 01:00:40 | 显示全部楼层
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-5-19 06:50

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表