OpenEdv-开源电子网

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

F767互补pwm设定的问题

[复制链接]

5

主题

7

帖子

0

精华

初级会员

Rank: 2

积分
53
金钱
53
注册时间
2018-1-15
在线时间
22 小时
发表于 2018-8-1 14:03:32 | 显示全部楼层 |阅读模式
5金钱
本帖最后由 bob7452 于 2018-8-1 15:14 编辑

照着下列代码编写结果GPIO抓不到输出
/*************************************************************/
有两个问题想提问:

1.参考代码中设置了PWM输出,但却是用HAL_TIM_Base_Init(&htim1) 为何不是用HAL_TIM_PWM_Init(&htim1)?

2.照着代码编写GPIO无输出,请问大佬们是哪段代码有错误
/*************************************************************/
操作环境: keil V5.14.0
参考代码: http://jiaodi.tech/2018/05/07/stm32f767-pwm/
/*************************************************************/
[mw_shl_code=c,true]
pwm.c

#include "pwm.h"

/*TIM8 Handler*/
TIM_HandleTypeDef TIM8_Handler;
TIM_OC_InitTypeDef sConfigOC;
void TIM8_PWM_Init(u16 prescaler,u16 period)
{
/*TIM_ClockConfigTypeDef sClockSourceConfig;*/
TIM_MasterConfigTypeDef sMasterConfig;
TIM_BreakDeadTimeConfigTypeDef sBreakDeadTimeConfig;

/*Timer Base Setting*/
TIM8_Handler.Instance = TIM8; //TIM8
TIM8_Handler.Init.Prescaler = prescaler; //Timer prescaler
TIM8_Handler.Init.CounterMode = TIM_COUNTERMODE_UP;
TIM8_Handler.Init.Period = period; //arr
TIM8_Handler.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1; //CLOCK DIVISION
TIM8_Handler.Init.RepetitionCounter=0;
HAL_TIM_PWM_Init(&TIM8_Handler); // ---> Start HAL_TIM_MspInit

/*ClockSource Setting*/
sClockSourceConfig.ClockSource=TIM_CLOCKSOURCE_INTERNAL;
HAL_TIM_ConfigClockSource(&TIM8_Handler, &sClockSourceConfig);

/*MasterConfigTypeDef Setting*/
sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET;
sMasterConfig.MasterOutputTrigger2 = TIM_TRGO2_RESET;
sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;
HAL_TIMEx_MasterConfigSynchronization(&TIM8_Handler, &sMasterConfig);

/*PWM Mode Setting*/
sConfigOC.OCMode = TIM_OCMODE_PWM1;
sConfigOC.Pulse = 20;
sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH;
sConfigOC.OCNPolarity = TIM_OCNPOLARITY_HIGH;
sConfigOC.OCFastMode = TIM_OCFAST_DISABLE;
sConfigOC.OCIdleState = TIM_OCIDLESTATE_RESET;
sConfigOC.OCNIdleState = TIM_OCNIDLESTATE_RESET;
/*CHANNEL1*/
HAL_TIM_PWM_ConfigChannel(&TIM8_Handler, &sConfigOC, TIM_CHANNEL_1);         
HAL_TIM_PWM_Start(&TIM8_Handler, TIM_CHANNEL_1);
HAL_TIMEx_PWMN_Start(&TIM8_Handler, TIM_CHANNEL_1); // turn on complementary channel

/*CHANNEL2*/
sConfigOC.Pulse = 30;
HAL_TIM_PWM_ConfigChannel(&TIM8_Handler, &sConfigOC, TIM_CHANNEL_2);         
HAL_TIM_PWM_Start(&TIM8_Handler, TIM_CHANNEL_2);
HAL_TIMEx_PWMN_Start(&TIM8_Handler, TIM_CHANNEL_2); // turn on complementary channel
  
/*CHANNEL3*/        
sConfigOC.Pulse = 40;
HAL_TIM_PWM_ConfigChannel(&TIM8_Handler, &sConfigOC, TIM_CHANNEL_3);         
HAL_TIM_PWM_Start(&TIM8_Handler, TIM_CHANNEL_3);
HAL_TIMEx_PWMN_Start(&TIM8_Handler, TIM_CHANNEL_3); // turn on complementary channel

/*BreakDeadTime Setting*/
sBreakDeadTimeConfig.OffStateRunMode = TIM_OSSR_DISABLE;
sBreakDeadTimeConfig.OffStateIDLEMode = TIM_OSSI_DISABLE;
sBreakDeadTimeConfig.LockLevel = TIM_LOCKLEVEL_OFF;
sBreakDeadTimeConfig.DeadTime = 100;
sBreakDeadTimeConfig.BreakState = TIM_BREAK_DISABLE;
sBreakDeadTimeConfig.BreakPolarity = TIM_BREAKPOLARITY_HIGH;
sBreakDeadTimeConfig.BreakFilter = 0;
sBreakDeadTimeConfig.Break2State = TIM_BREAK2_DISABLE;
sBreakDeadTimeConfig.Break2Polarity = TIM_BREAK2POLARITY_HIGH;
sBreakDeadTimeConfig.Break2Filter = 0;
sBreakDeadTimeConfig.AutomaticOutput = TIM_AUTOMATICOUTPUT_DISABLE;
HAL_TIMEx_ConfigBreakDeadTime(&TIM8_Handler, &sBreakDeadTimeConfig);


}
void HAL_TIM_PWM_MspInit(TIM_HandleTypeDef *htim)
{
        if(htim->Instance==TIM8)
        {
                        GPIO_InitTypeDef GPIO_InitStruct;
                        /*Set up TIM8 CLK*/
                        __HAL_RCC_TIM8_CLK_ENABLE();
                                                
                        /*Set Up GPIO CLK */
                        __HAL_RCC_GPIOI_CLK_ENABLE();
                        __HAL_RCC_GPIOH_CLK_ENABLE();
                        /*Set Up PWM Output Pin */
                        GPIO_InitStruct.Pin = GPIO_PIN_5|GPIO_PIN_6|GPIO_PIN_7;
                        GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
                        GPIO_InitStruct.Pull = GPIO_NOPULL;
                        GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
                        GPIO_InitStruct.Alternate = GPIO_AF3_TIM8;
                        HAL_GPIO_Init(GPIOI, &GPIO_InitStruct);
                        
                        /*Set Up PWM Output Pin N*/
                        GPIO_InitStruct.Pin = GPIO_PIN_13|GPIO_PIN_14|GPIO_PIN_15;
                        GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
                        GPIO_InitStruct.Pull = GPIO_NOPULL;
                        GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
                        GPIO_InitStruct.Alternate = GPIO_AF3_TIM8;
                        HAL_GPIO_Init(GPIOH, &GPIO_InitStruct);
        }
}[/mw_shl_code]


/*********************************************************************/

[mw_shl_code=c,true]
pwm.h

#ifndef _PWM_H
#define _PWM_H
#include <sys.h>         
extern TIM_ClockConfigTypeDef sClockSourceConfig;
extern TIM_MasterConfigTypeDef sMasterConfig;
extern TIM_OC_InitTypeDef sConfigOC;
extern TIM_BreakDeadTimeConfigTypeDef sBreakDeadTimeConfig;
extern TIM_HandleTypeDef TIM8_Handler;
void TIM_SetTIM3Compare4(u32 compare);
void TIM8_PWM_Init(u16 prescaler,u16 period);
#endif[/mw_shl_code]
/*****************************************************************************************/
[mw_shl_code=c,true]
main.c

#include "sys.h"
#include "delay.h"
#include "usart.h"
#include "pwm.h"


int main(void)
{


    Cache_Enable();               
    HAL_Init();                                       
    Stm32_Clock_Init(432,25,2,9);   
    delay_init(216);         
          uart_init(115200);                       
                TIM8_PWM_Init(216-1 ,100-1);
        
    while(1)
                        {
                        
                        }
}
[/mw_shl_code]


最佳答案

查看完整内容[请看2#楼]

已解决 加入一行TIM8->BDTR|=1
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

5

主题

7

帖子

0

精华

初级会员

Rank: 2

积分
53
金钱
53
注册时间
2018-1-15
在线时间
22 小时
 楼主| 发表于 2018-8-1 14:03:33 | 显示全部楼层
已解决 加入一行TIM8->BDTR|=1<<15 //使能Moe位
回复

使用道具 举报

5

主题

7

帖子

0

精华

初级会员

Rank: 2

积分
53
金钱
53
注册时间
2018-1-15
在线时间
22 小时
 楼主| 发表于 2018-8-1 16:21:52 | 显示全部楼层
但还有个问题是
HAL_TIM_PWM_Start(&TIM8_Handler, TIM_CHANNEL_1)
这代码中好像有使能MOE位,但却没效果,还请各位大佬指点

HAL_StatusTypeDef HAL_TIM_PWM_Start(TIM_HandleTypeDef *htim, uint32_t Channel)
{
  /* Check the parameters */
  assert_param(IS_TIM_CCX_INSTANCE(htim->Instance, Channel));

  /* Enable the Capture compare channel */
  TIM_CCxChannelCmd(htim->Instance, Channel, TIM_CCx_ENABLE);
  
  if(IS_TIM_ADVANCED_INSTANCE(htim->Instance) != RESET)  
  {
    /* Enable the main output */
    __HAL_TIM_MOE_ENABLE(htim);
  }
   
  /* Enable the Peripheral */
  __HAL_TIM_ENABLE(htim);
  
  /* Return function status */
  return HAL_OK;
}

回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-1 02:37

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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