野火电子论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 21981|回复: 2

STM32F407输出PWM波形

[复制链接]
发表于 2020-10-27 16:09:43 | 显示全部楼层 |阅读模式
教程里面有一个输出1/3占空比的PWM波形,用的是TIM2,引脚是PA5,我想把它改成用TIM4输出PWM波,引脚是PD14,我打开bsp_general_tim.c然后按照对应的每一行都在bsp_general_tim.h里面修改了,其他的部分都没有修改,请问还有那些设置需要修改啊,是不是在其他文件中也有要修改的地方啊。下面是bsp_general_tim.c和bsp_general_tim.h的程序
bsp_general_tim.c
  1. /**
  2.   ******************************************************************************
  3.   * @file    bsp_general_tim.c
  4.   * @author  STMicroelectronics
  5.   * @version V1.0
  6.   * @date    2015-xx-xx
  7.   * [url=home.php?mod=space&uid=41770]@brief[/url]   通用定时器PWM输出范例
  8.   ******************************************************************************
  9.   * @attention
  10.   *
  11.   * 实验平台:野火  STM32 F407 开发板  
  12.   * 论坛    :http://www.firebbs.cn
  13.   * 淘宝    :https://fire-stm32.taobao.com
  14.   *
  15.   ******************************************************************************
  16.   */
  17.   
  18. #include "./tim/bsp_general_tim.h"

  19. /**
  20.   * @brief  配置TIM复用输出PWM时用到的I/O
  21.   * @param  无
  22.   * @retval 无
  23.   */
  24. static void TIMx_GPIO_Config(void)
  25. {
  26.         /*定义一个GPIO_InitTypeDef类型的结构体*/
  27.         GPIO_InitTypeDef GPIO_InitStructure;

  28.         /*开启相关的GPIO外设时钟*/
  29.         RCC_AHB1PeriphClockCmd (GENERAL_OCPWM_GPIO_CLK, ENABLE);
  30.   /* 定时器通道引脚复用 */
  31.         GPIO_PinAFConfig(GENERAL_OCPWM_GPIO_PORT,GENERAL_OCPWM_PINSOURCE,GENERAL_OCPWM_AF);
  32.   
  33.         /* 定时器通道引脚配置 */                                                                                                                          
  34.         GPIO_InitStructure.GPIO_Pin = GENERAL_OCPWM_PIN;       
  35.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;   
  36.         GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
  37.         GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
  38.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
  39.         GPIO_Init(GENERAL_OCPWM_GPIO_PORT, &GPIO_InitStructure);
  40. }


  41. /*
  42. * 注意:TIM_TimeBaseInitTypeDef结构体里面有5个成员,TIM6和TIM7的寄存器里面只有
  43. * TIM_Prescaler和TIM_Period,所以使用TIM6和TIM7的时候只需初始化这两个成员即可,
  44. * 另外三个成员是通用定时器和高级定时器才有.
  45. *-----------------------------------------------------------------------------
  46. * TIM_Prescaler         都有
  47. * TIM_CounterMode                         TIMx,x[6,7]没有,其他都有(基本定时器)
  48. * TIM_Period            都有
  49. * TIM_ClockDivision     TIMx,x[6,7]没有,其他都有(基本定时器)
  50. * TIM_RepetitionCounter TIMx,x[1,8]才有(高级定时器)
  51. *-----------------------------------------------------------------------------
  52. */
  53. static void TIM_PWMOUTPUT_Config(void)
  54. {
  55.         TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
  56.   TIM_OCInitTypeDef  TIM_OCInitStructure;
  57.        
  58.         // 开启TIMx_CLK,x[2,3,4,5,12,13,14]
  59.   RCC_APB1PeriphClockCmd(GENERAL_TIM_CLK, ENABLE);

  60.   /* 累计 TIM_Period个后产生一个更新或者中断*/               
  61.   //当定时器从0计数到8399,即为8400次,为一个定时周期
  62.   TIM_TimeBaseStructure.TIM_Period = 8400-1;      
  63.        
  64.         // 通用控制定时器时钟源TIMxCLK = HCLK/2=84MHz
  65.         // 设定定时器频率为=TIMxCLK/(TIM_Prescaler+1)=100KHz
  66.   TIM_TimeBaseStructure.TIM_Prescaler = 840-1;       
  67.   // 采样时钟分频
  68.   TIM_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_DIV1;
  69.   // 计数方式
  70.   TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up;
  71.        
  72.         // 初始化定时器TIMx, x[2,3,4,5,12,13,14]
  73.         TIM_TimeBaseInit(GENERAL_TIM, &TIM_TimeBaseStructure);
  74.        
  75.         /*PWM模式配置*/
  76.         /* PWM1 Mode configuration: Channel1 */
  77.   TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;            //配置为PWM模式1
  78.   TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;       
  79.   TIM_OCInitStructure.TIM_Pulse = 2800-1;
  80.   TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;            //当定时器计数值小于CCR1_Val时为高电平
  81.   TIM_OC1Init(GENERAL_TIM, &TIM_OCInitStructure);         //使能通道1
  82.   
  83.         /*使能通道1重载*/
  84.         TIM_OC1PreloadConfig(GENERAL_TIM, TIM_OCPreload_Enable);
  85.        
  86.         // 使能定时器
  87.         TIM_Cmd(GENERAL_TIM, ENABLE);       
  88. }

  89. /**
  90.   * @brief  初始化控制通用定时器
  91.   * @param  无
  92.   * @retval 无
  93.   */
  94. void TIMx_Configuration(void)
  95. {
  96.         TIMx_GPIO_Config();
  97.   
  98.   TIM_PWMOUTPUT_Config();
  99. }

  100. /*********************************************END OF FILE**********************/
复制代码
bsp_general_tim.h
  1. #ifndef __GENERAL_TIM_H
  2. #define        __GENERAL_TIM_H

  3. #include "stm32f4xx.h"

  4. #define GENERAL_OCPWM_PIN             GPIO_Pin_14              
  5. #define GENERAL_OCPWM_GPIO_PORT       GPIOD                     
  6. #define GENERAL_OCPWM_GPIO_CLK        RCC_AHB1Periph_GPIOD
  7. #define GENERAL_OCPWM_PINSOURCE                                GPIO_PinSource14
  8. #define GENERAL_OCPWM_AF                                                        GPIO_AF_TIM4

  9. #define GENERAL_TIM                               TIM4
  10. #define GENERAL_TIM_CLK                           RCC_APB1Periph_TIM4


  11. void TIMx_Configuration(void);

  12. #endif /* __GENERAL_TIM_H */
复制代码



回复

使用道具 举报

发表于 2020-10-28 14:03:22 | 显示全部楼层
看下PD14和定时器的输出通道是不是对应的,还有就是有没有打开输出通道,代码其他地方看不出什么问题,标准库很久没用都忘了。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-10-28 16:32:39 | 显示全部楼层
瞎眼灯 发表于 2020-10-28 14:03
看下PD14和定时器的输出通道是不是对应的,还有就是有没有打开输出通道,代码其他地方看不出什么问题,标准 ...

HAL库我已经实现了,就是想弄一下标准库的,欸,主要是有其他模块例程用的标准库,我干脆把那一部分移植到HAL库算了。我按照您提到的看一下把,谢谢啦
回复 支持 反对

使用道具 举报

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

本版积分规则

联系站长|手机版|野火电子官网|野火淘宝店铺|野火电子论坛 ( 粤ICP备14069197号 ) 大学生ARM嵌入式2群

GMT+8, 2024-11-24 06:28 , Processed in 0.081000 second(s), 24 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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