硬汉嵌入式论坛

 找回密码
 立即注册
查看: 2247|回复: 3
收起左侧

bsp_tim_pwm.c这个文件里,下面这个函数形参_ucChannel怎么没有用上

[复制链接]

9

主题

12

回帖

39

积分

新手上路

积分
39
发表于 2021-3-3 17:32:07 | 显示全部楼层 |阅读模式
void BspConfigTIMGpio(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin_x, TIM_TypeDef* TIMx, uint8_t _ucChannel)
{
    GPIO_InitTypeDef GPIO_InitStructure;
   
    RCC_AHB1PeriphClockCmd(BspGetRCCofGPIO(GPIOx), ENABLE);
   
    /*
        APB1 定时器有 TIM2, TIM3 ,TIM4, TIM5, TIM6, TIM7, TIM12, TIM13, TIM14
        APB2 定时器有 TIM1, TIM8 ,TIM9, TIM10, TIM11
    */   
    if((TIMx == TIM1)||(TIMx == TIM8)||(TIMx == TIM9)||(TIMx == TIM10)||(TIMx == TIM11))
    {
        RCC_APB2PeriphClockCmd(bspGetRCCofTIM(TIMx), ENABLE);
    }
    else
    {
        RCC_APB1PeriphClockCmd(bspGetRCCofTIM(TIMx), ENABLE);
    }
   
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_x;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
    GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
    GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
    GPIO_Init(GPIOx, &GPIO_InitStructure);
   
    GPIO_PinAFConfig(GPIOx, BspGetPinSource(GPIO_Pin_x), BspGetAFofTIM(TIMx));
}
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115667
QQ
发表于 2021-3-4 08:20:25 | 显示全部楼层
从那里工程里面找的这个函数,这种BspConfigTIMGpio不是我们的命名方式,我们的这个驱动文件bsp_的函数bsp_打头的。

貌似你是下载网友的工程,网友做了修改。

下面这个是我们的原版:

  1. /*
  2. *********************************************************************************************************
  3. *
  4. *        模块名称 : TIM基本定时中断和PWM驱动模块
  5. *        文件名称 : bsp_tim_pwm.c
  6. *        版    本 : V1.6
  7. *        说    明 : 利用STM32F4内部TIM输出PWM信号, 并实现基本的定时中断
  8. *        修改记录 :
  9. *                版本号  日期        作者     说明
  10. *                V1.0    2013-08-16 armfly  正式发布
  11. *                V1.1        2014-06-15 armfly  完善 bsp_SetTIMOutPWM,当占空比=0和100%时,关闭定时器,GPIO配置为输出
  12. *                V1.2        2015-05-08 armfly  解决TIM8不能输出PWM的问题。
  13. *                V1.3        2015-07-23 armfly  初始化定时器,必须设置 TIM_TimeBaseInitStruct.TIM_RepetitionCounter = 0x0000;               
  14. *                                                                   TIM1 和 TIM8 必须设置。否则蜂鸣器的控制不正常。
  15. *                V1.4        2015-07-30 armfly  增加反相引脚输出PWM函数 bsp_SetTIMOutPWM_N();
  16. *                V1.5        2016-02-01 armfly  去掉 TIM_OC1PreloadConfig(TIMx, TIM_OCPreload_Enable);
  17. *                V1.6        2016-02-27 armfly  解决TIM14无法中断的BUG, TIM8_TRG_COM_TIM14_IRQn
  18. *
  19. *        Copyright (C), 2015-2016, 安富莱电子 www.armfly.com
  20. *
  21. *********************************************************************************************************
  22. */

  23. #include "bsp.h"


  24. /*
  25.         可以输出到GPIO的TIM通道:

  26.         TIM1_CH1, PA8,        PE9,
  27.         TIM1_CH2, PA9,        PE11
  28.         TIM1_CH3, PA10,        PE13
  29.         TIM1_CH4, PA11,        PE14

  30.         TIM2_CH1, PA15 (仅限429,439) 407没有此脚
  31.         TIM2_CH2, PA1,        PB3
  32.         TIM2_CH3, PA2,        PB10
  33.         TIM2_CH4, PA3,        PB11

  34.         TIM3_CH1, PA6,  PB4, PC6
  35.         TIM3_CH2, PA7,        PB5, PC7
  36.         TIM3_CH3, PB0,        PC8
  37.         TIM3_CH4, PB1,        PC9

  38.         TIM4_CH1, PB6,  PD12
  39.         TIM4_CH2, PB7,        PD13
  40.         TIM4_CH3, PB8,        PD14
  41.         TIM4_CH4, PB9,        PD15

  42.         TIM5_CH1, PA0,  PH10
  43.         TIM5_CH2, PA1,        PH11
  44.         TIM5_CH3, PA2,        PH12
  45.         TIM5_CH4, PA3,        PI10

  46.         TIM8_CH1, PC6,  PI5
  47.         TIM8_CH2, PC7,        PI6
  48.         TIM8_CH3, PC8,        PI7
  49.         TIM8_CH4, PC9,        PI2

  50.         TIM9_CH1, PA2,  PE5
  51.         TIM9_CH2, PA3,        PE6

  52.         TIM10_CH1, PB8,  PF6

  53.         TIM11_CH1, PB9,  PF7

  54.         TIM12_CH1, PB14,  PH6
  55.         TIM12_CH2, PB15,  PH9

  56.         TIM13_CH1, PA6,  PF8
  57.         TIM14_CH1, PA7,  PF9

  58.         APB1 定时器有 TIM2, TIM3 ,TIM4, TIM5, TIM6, TIM7, TIM12, TIM13, TIM14
  59.         APB2 定时器有 TIM1, TIM8 ,TIM9, TIM10, TIM11
  60.        

  61.         APB1 定时器的输入时钟 TIMxCLK = SystemCoreClock / 2; 84M
  62.         APB2 定时器的输入时钟 TIMxCLK = SystemCoreClock; 168M
  63. */

  64. /*
  65. *********************************************************************************************************
  66. *        函 数 名: bsp_GetRCCofGPIO
  67. *        功能说明: 根据GPIO 得到RCC寄存器
  68. *        形    参:无
  69. *        返 回 值: GPIO外设时钟名
  70. *********************************************************************************************************
  71. */
  72. uint32_t bsp_GetRCCofGPIO(GPIO_TypeDef* GPIOx)
  73. {
  74.         uint32_t rcc = 0;

  75.         if (GPIOx == GPIOA)
  76.         {
  77.                 rcc = RCC_AHB1Periph_GPIOA;
  78.         }
  79.         else if (GPIOx == GPIOB)
  80.         {
  81.                 rcc = RCC_AHB1Periph_GPIOB;
  82.         }
  83.         else if (GPIOx == GPIOC)
  84.         {
  85.                 rcc = RCC_AHB1Periph_GPIOC;
  86.         }
  87.         else if (GPIOx == GPIOD)
  88.         {
  89.                 rcc = RCC_AHB1Periph_GPIOD;
  90.         }
  91.         else if (GPIOx == GPIOE)
  92.         {
  93.                 rcc = RCC_AHB1Periph_GPIOE;
  94.         }
  95.         else if (GPIOx == GPIOF)
  96.         {
  97.                 rcc = RCC_AHB1Periph_GPIOF;
  98.         }
  99.         else if (GPIOx == GPIOG)
  100.         {
  101.                 rcc = RCC_AHB1Periph_GPIOG;
  102.         }
  103.         else if (GPIOx == GPIOH)
  104.         {
  105.                 rcc = RCC_AHB1Periph_GPIOH;
  106.         }
  107.         else if (GPIOx == GPIOI)
  108.         {
  109.                 rcc = RCC_AHB1Periph_GPIOI;
  110.         }

  111.         return rcc;
  112. }

  113. /*
  114. *********************************************************************************************************
  115. *        函 数 名: bsp_GetPinSource
  116. *        功能说明: 根据 GPIO_Pin_X 得到 GPIO_PinSource
  117. *        形    参:gpio_pin
  118. *        返 回 值: GPIO_PinSource
  119. *********************************************************************************************************
  120. */
  121. uint16_t bsp_GetPinSource(uint16_t gpio_pin)
  122. {
  123.         uint16_t ret = 0;

  124.         if (gpio_pin == GPIO_Pin_0)
  125.         {
  126.                 ret = GPIO_PinSource0;
  127.         }
  128.         else if (gpio_pin == GPIO_Pin_1)
  129.         {
  130.                 ret = GPIO_PinSource1;
  131.         }
  132.         else if (gpio_pin == GPIO_Pin_2)
  133.         {
  134.                 ret = GPIO_PinSource2;
  135.         }
  136.         else if (gpio_pin == GPIO_Pin_3)
  137.         {
  138.                 ret = GPIO_PinSource3;
  139.         }
  140.         else if (gpio_pin == GPIO_Pin_4)
  141.         {
  142.                 ret = GPIO_PinSource4;
  143.         }
  144.         else if (gpio_pin == GPIO_Pin_5)
  145.         {
  146.                 ret = GPIO_PinSource5;
  147.         }
  148.         else if (gpio_pin == GPIO_Pin_6)
  149.         {
  150.                 ret = GPIO_PinSource6;
  151.         }
  152.         else if (gpio_pin == GPIO_Pin_7)
  153.         {
  154.                 ret = GPIO_PinSource7;
  155.         }
  156.         else if (gpio_pin == GPIO_Pin_8)
  157.         {
  158.                 ret = GPIO_PinSource8;
  159.         }
  160.         else if (gpio_pin == GPIO_Pin_9)
  161.         {
  162.                 ret = GPIO_PinSource9;
  163.         }
  164.         else if (gpio_pin == GPIO_Pin_10)
  165.         {
  166.                 ret = GPIO_PinSource10;
  167.         }
  168.         else if (gpio_pin == GPIO_Pin_11)
  169.         {
  170.                 ret = GPIO_PinSource11;
  171.         }
  172.         else if (gpio_pin == GPIO_Pin_12)
  173.         {
  174.                 ret = GPIO_PinSource12;
  175.         }
  176.         else if (gpio_pin == GPIO_Pin_13)
  177.         {
  178.                 ret = GPIO_PinSource13;
  179.         }
  180.         else if (gpio_pin == GPIO_Pin_14)
  181.         {
  182.                 ret = GPIO_PinSource14;
  183.         }
  184.         else if (gpio_pin == GPIO_Pin_15)
  185.         {
  186.                 ret = GPIO_PinSource15;
  187.         }

  188.         return ret;
  189. }

  190. /*
  191. *********************************************************************************************************
  192. *        函 数 名: bsp_GetRCCofTIM
  193. *        功能说明: 根据TIM 得到RCC寄存器
  194. *        形    参:无
  195. *        返 回 值: TIM外设时钟名
  196. *********************************************************************************************************
  197. */
  198. uint32_t bsp_GetRCCofTIM(TIM_TypeDef* TIMx)
  199. {
  200.         uint32_t rcc = 0;

  201.         /*
  202.                 APB1 定时器有 TIM2, TIM3 ,TIM4, TIM5, TIM6, TIM7, TIM12, TIM13, TIM14
  203.                 APB2 定时器有 TIM1, TIM8 ,TIM9, TIM10, TIM11
  204.         */
  205.         if (TIMx == TIM1)
  206.         {
  207.                 rcc = RCC_APB2Periph_TIM1;
  208.         }
  209.         else if (TIMx == TIM8)
  210.         {
  211.                 rcc = RCC_APB2Periph_TIM8;
  212.         }
  213.         else if (TIMx == TIM9)
  214.         {
  215.                 rcc = RCC_APB2Periph_TIM9;
  216.         }
  217.         else if (TIMx == TIM10)
  218.         {
  219.                 rcc = RCC_APB2Periph_TIM10;
  220.         }
  221.         else if (TIMx == TIM11)
  222.         {
  223.                 rcc = RCC_APB2Periph_TIM11;
  224.         }
  225.         /* 下面是 APB1时钟 */
  226.         else if (TIMx == TIM2)
  227.         {
  228.                 rcc = RCC_APB1Periph_TIM2;
  229.         }
  230.         else if (TIMx == TIM3)
  231.         {
  232.                 rcc = RCC_APB1Periph_TIM3;
  233.         }
  234.         else if (TIMx == TIM4)
  235.         {
  236.                 rcc = RCC_APB1Periph_TIM4;
  237.         }
  238.         else if (TIMx == TIM5)
  239.         {
  240.                 rcc = RCC_APB1Periph_TIM5;
  241.         }
  242.         else if (TIMx == TIM6)
  243.         {
  244.                 rcc = RCC_APB1Periph_TIM6;
  245.         }
  246.         else if (TIMx == TIM7)
  247.         {
  248.                 rcc = RCC_APB1Periph_TIM7;
  249.         }
  250.         else if (TIMx == TIM12)
  251.         {
  252.                 rcc = RCC_APB1Periph_TIM12;
  253.         }
  254.         else if (TIMx == TIM13)
  255.         {
  256.                 rcc = RCC_APB1Periph_TIM13;
  257.         }
  258.         else if (TIMx == TIM14)
  259.         {
  260.                 rcc = RCC_APB1Periph_TIM14;
  261.         }

  262.         return rcc;
  263. }

  264. /*
  265. *********************************************************************************************************
  266. *        函 数 名: bsp_GetAFofTIM
  267. *        功能说明: 根据TIM 得到AF寄存器配置
  268. *        形    参: 无
  269. *        返 回 值: AF寄存器配置
  270. *********************************************************************************************************
  271. */
  272. uint8_t bsp_GetAFofTIM(TIM_TypeDef* TIMx)
  273. {
  274.         uint8_t ret = 0;

  275.         /*
  276.                 APB1 定时器有 TIM2, TIM3 ,TIM4, TIM5, TIM6, TIM7, TIM12, TIM13, TIM14
  277.                 APB2 定时器有 TIM1, TIM8 ,TIM9, TIM10, TIM11
  278.         */
  279.         if (TIMx == TIM1)
  280.         {
  281.                 ret = GPIO_AF_TIM1;
  282.         }
  283.         else if (TIMx == TIM8)
  284.         {
  285.                 ret = GPIO_AF_TIM8;
  286.         }
  287.         else if (TIMx == TIM9)
  288.         {
  289.                 ret = GPIO_AF_TIM9;
  290.         }
  291.         else if (TIMx == TIM10)
  292.         {
  293.                 ret = GPIO_AF_TIM10;
  294.         }
  295.         else if (TIMx == TIM11)
  296.         {
  297.                 ret = GPIO_AF_TIM11;
  298.         }
  299.         /* 下面是 APB1时钟 */
  300.         else if (TIMx == TIM2)
  301.         {
  302.                 ret = GPIO_AF_TIM2;
  303.         }
  304.         else if (TIMx == TIM3)
  305.         {
  306.                 ret = GPIO_AF_TIM3;
  307.         }
  308.         else if (TIMx == TIM4)
  309.         {
  310.                 ret = GPIO_AF_TIM4;
  311.         }
  312.         else if (TIMx == TIM5)
  313.         {
  314.                 ret = GPIO_AF_TIM5;
  315.         }
  316.         /* 没有 TIM6 TIM7 */
  317.         else if (TIMx == TIM8)
  318.         {
  319.                 ret = GPIO_AF_TIM8;
  320.         }
  321.         else if (TIMx == TIM9)
  322.         {
  323.                 ret = GPIO_AF_TIM9;
  324.         }
  325.         else if (TIMx == TIM12)
  326.         {
  327.                 ret = GPIO_AF_TIM12;
  328.         }
  329.         else if (TIMx == TIM13)
  330.         {
  331.                 ret = GPIO_AF_TIM13;
  332.         }
  333.         else if (TIMx == TIM14)
  334.         {
  335.                 ret = GPIO_AF_TIM14;
  336.         }

  337.         return ret;
  338. }

  339. /*
  340. *********************************************************************************************************
  341. *        函 数 名: bsp_ConfigTimGpio
  342. *        功能说明: 配置GPIO和TIM时钟, GPIO连接到TIM输出通道
  343. *        形    参: GPIOx
  344. *                         GPIO_PinX
  345. *                         TIMx
  346. *                         _ucChannel
  347. *        返 回 值: 无
  348. *********************************************************************************************************
  349. */
  350. void bsp_ConfigTimGpio(GPIO_TypeDef* GPIOx, uint16_t GPIO_PinX, TIM_TypeDef* TIMx, uint8_t _ucChannel)
  351. {
  352.         GPIO_InitTypeDef  GPIO_InitStructure;

  353.         /* 使能GPIO时钟 */
  354.         RCC_AHB1PeriphClockCmd(bsp_GetRCCofGPIO(GPIOx), ENABLE);

  355.           /* 使能TIM时钟 */
  356.         if ((TIMx == TIM1) || (TIMx == TIM8) || (TIMx == TIM9) || (TIMx == TIM10) || (TIMx == TIM11))
  357.         {
  358.                 RCC_APB2PeriphClockCmd(bsp_GetRCCofTIM(TIMx), ENABLE);
  359.         }
  360.         else
  361.         {
  362.                 RCC_APB1PeriphClockCmd(bsp_GetRCCofTIM(TIMx), ENABLE);
  363.         }

  364.         /* 配置GPIO */
  365.         GPIO_InitStructure.GPIO_Pin = GPIO_PinX;        /* 带入的形参 */
  366.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
  367.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
  368.         GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
  369.         GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP ;
  370.         GPIO_Init(GPIOx, &GPIO_InitStructure);

  371.         /* 连接到AF功能 */
  372.         GPIO_PinAFConfig(GPIOx, bsp_GetPinSource(GPIO_PinX), bsp_GetAFofTIM(TIMx));
  373. }

  374. /*
  375. *********************************************************************************************************
  376. *        函 数 名: bsp_ConfigGpioOut
  377. *        功能说明: 配置GPIO为推挽输出。主要用于PWM输出,占空比为0和100的情况。
  378. *        形    参: GPIOx
  379. *                          GPIO_PinX
  380. *        返 回 值: 无
  381. *********************************************************************************************************
  382. */
  383. void bsp_ConfigGpioOut(GPIO_TypeDef* GPIOx, uint16_t GPIO_PinX)
  384. {
  385.         GPIO_InitTypeDef  GPIO_InitStructure;

  386.         /* 使能GPIO时钟 */
  387.         RCC_AHB1PeriphClockCmd(bsp_GetRCCofGPIO(GPIOx), ENABLE);

  388.         /* 配置GPIO */
  389.         GPIO_InitStructure.GPIO_Pin = GPIO_PinX;                /* 带入的形参 */
  390.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;        /* 输出 */
  391.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  392.         GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;        /* 推挽 */
  393.         GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL ;        /* 无上拉 */
  394.         GPIO_Init(GPIOx, &GPIO_InitStructure);
  395. }

  396. /*
  397. *********************************************************************************************************
  398. *        函 数 名: bsp_SetTIMOutPWM
  399. *        功能说明: 设置引脚输出的PWM信号的频率和占空比.  当频率为0,并且占空为0时,关闭定时器,GPIO输出0;
  400. *                          当频率为0,占空比为100%时,GPIO输出1.
  401. *        形    参: _ulFreq : PWM信号频率,单位Hz  (实际测试,最大输出频率为 168M / 4 = 42M). 0 表示禁止输出
  402. *                          _ulDutyCycle : PWM信号占空比,单位:万分之一。如5000,表示50.00%的占空比
  403. *        返 回 值: 无
  404. *********************************************************************************************************
  405. */
  406. void bsp_SetTIMOutPWM(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin, TIM_TypeDef* TIMx, uint8_t _ucChannel,
  407.          uint32_t _ulFreq, uint32_t _ulDutyCycle)
  408. {
  409.         TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
  410.         TIM_OCInitTypeDef  TIM_OCInitStructure;
  411.         uint16_t usPeriod;
  412.         uint16_t usPrescaler;
  413.         uint32_t uiTIMxCLK;

  414.         if (_ulDutyCycle == 0)
  415.         {               
  416.                 TIM_Cmd(TIMx, DISABLE);                /* 关闭PWM输出 */
  417.                 bsp_ConfigGpioOut(GPIOx, GPIO_Pin);        /* 配置GPIO为推挽输出 */               
  418.                 GPIO_WriteBit(GPIOx, GPIO_Pin, Bit_RESET);        /* PWM = 0 */               
  419.                 return;
  420.         }
  421.         else if (_ulDutyCycle == 10000)
  422.         {
  423.                 TIM_Cmd(TIMx, DISABLE);                /* 关闭PWM输出 */

  424.                 bsp_ConfigGpioOut(GPIOx, GPIO_Pin);        /* 配置GPIO为推挽输出 */               
  425.                 GPIO_WriteBit(GPIOx, GPIO_Pin, Bit_SET);        /* PWM = 1 */       
  426.                 return;
  427.         }
  428.        

  429.         bsp_ConfigTimGpio(GPIOx, GPIO_Pin, TIMx, _ucChannel);        /* 使能GPIO和TIM时钟,并连接TIM通道到GPIO */
  430.        
  431.     /*-----------------------------------------------------------------------
  432.                 system_stm32f4xx.c 文件中 void SetSysClock(void) 函数对时钟的配置如下:

  433.                 HCLK = SYSCLK / 1     (AHB1Periph)
  434.                 PCLK2 = HCLK / 2      (APB2Periph)
  435.                 PCLK1 = HCLK / 4      (APB1Periph)

  436.                 因为APB1 prescaler != 1, 所以 APB1上的TIMxCLK = PCLK1 x 2 = SystemCoreClock / 2;
  437.                 因为APB2 prescaler != 1, 所以 APB2上的TIMxCLK = PCLK2 x 2 = SystemCoreClock;

  438.                 APB1 定时器有 TIM2, TIM3 ,TIM4, TIM5, TIM6, TIM6, TIM12, TIM13,TIM14
  439.                 APB2 定时器有 TIM1, TIM8 ,TIM9, TIM10, TIM11

  440.         ----------------------------------------------------------------------- */
  441.         if ((TIMx == TIM1) || (TIMx == TIM8) || (TIMx == TIM9) || (TIMx == TIM10) || (TIMx == TIM11))
  442.         {
  443.                 /* APB2 定时器 */
  444.                 uiTIMxCLK = SystemCoreClock;
  445.         }
  446.         else        /* APB1 定时器 */
  447.         {
  448.                 uiTIMxCLK = SystemCoreClock / 2;
  449.         }

  450.         if (_ulFreq < 100)
  451.         {
  452.                 usPrescaler = 10000 - 1;                                        /* 分频比 = 10000 */
  453.                 usPeriod =  (uiTIMxCLK / 10000) / _ulFreq  - 1;                /* 自动重装的值 */
  454.         }
  455.         else if (_ulFreq < 3000)
  456.         {
  457.                 usPrescaler = 100 - 1;                                        /* 分频比 = 100 */
  458.                 usPeriod =  (uiTIMxCLK / 100) / _ulFreq  - 1;                /* 自动重装的值 */
  459.         }
  460.         else        /* 大于4K的频率,无需分频 */
  461.         {
  462.                 usPrescaler = 0;                                        /* 分频比 = 1 */
  463.                 usPeriod = uiTIMxCLK / _ulFreq - 1;        /* 自动重装的值 */
  464.         }

  465.         /* Time base configuration */
  466.         TIM_TimeBaseStructure.TIM_Period = usPeriod;
  467.         TIM_TimeBaseStructure.TIM_Prescaler = usPrescaler;
  468.         TIM_TimeBaseStructure.TIM_ClockDivision = 0;
  469.         TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
  470.         TIM_TimeBaseStructure.TIM_RepetitionCounter = 0x0000;                /* TIM1 和 TIM8 必须设置 */       

  471.         TIM_TimeBaseInit(TIMx, &TIM_TimeBaseStructure);

  472.         /* PWM1 Mode configuration: Channel1 */
  473.         TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
  474.         TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
  475.         TIM_OCInitStructure.TIM_Pulse = (_ulDutyCycle * usPeriod) / 10000;
  476.         TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
  477.        
  478.         TIM_OCInitStructure.TIM_OutputNState = TIM_OutputNState_Disable;        /* only for TIM1 and TIM8. */       
  479.         TIM_OCInitStructure.TIM_OCNPolarity = TIM_OCNPolarity_High;                        /* only for TIM1 and TIM8. */               
  480.         TIM_OCInitStructure.TIM_OCIdleState = TIM_OCIdleState_Reset;                /* only for TIM1 and TIM8. */
  481.         TIM_OCInitStructure.TIM_OCNIdleState = TIM_OCNIdleState_Reset;                /* only for TIM1 and TIM8. */
  482.        
  483.         if (_ucChannel == 1)
  484.         {
  485.                 TIM_OC1Init(TIMx, &TIM_OCInitStructure);
  486.                 //TIM_OC1PreloadConfig(TIMx, TIM_OCPreload_Enable);
  487.         }
  488.         else if (_ucChannel == 2)
  489.         {
  490.                 TIM_OC2Init(TIMx, &TIM_OCInitStructure);
  491.                 //TIM_OC2PreloadConfig(TIMx, TIM_OCPreload_Enable);
  492.         }
  493.         else if (_ucChannel == 3)
  494.         {
  495.                 TIM_OC3Init(TIMx, &TIM_OCInitStructure);
  496.                 //TIM_OC3PreloadConfig(TIMx, TIM_OCPreload_Enable);
  497.         }
  498.         else if (_ucChannel == 4)
  499.         {
  500.                 TIM_OC4Init(TIMx, &TIM_OCInitStructure);
  501.                 //TIM_OC4PreloadConfig(TIMx, TIM_OCPreload_Enable);
  502.         }

  503.         TIM_ARRPreloadConfig(TIMx, ENABLE);

  504.         /* TIMx enable counter */
  505.         TIM_Cmd(TIMx, ENABLE);

  506.         /* 下面这句话对于TIM1和TIM8是必须的,对于TIM2-TIM6则不必要 */
  507.         if ((TIMx == TIM1) || (TIMx == TIM8))
  508.         {
  509.                 TIM_CtrlPWMOutputs(TIMx, ENABLE);
  510.         }
  511. }

  512. /*
  513. *********************************************************************************************************
  514. *        函 数 名: bsp_SetTIMOutPWM_N
  515. *        功能说明: 设置TIM的反相引脚(比如TIM8_CH3N) 输出的PWM信号的频率和占空比.  当频率为0,并且占空为0时,关闭定时器,GPIO输出0;
  516. *                          当频率为0,占空比为100%时,GPIO输出1.
  517. *        形    参: _ulFreq : PWM信号频率,单位Hz  (实际测试,最大输出频率为 168M / 4 = 42M). 0 表示禁止输出
  518. *                          _ulDutyCycle : PWM信号占空比,单位:万分之一。如5000,表示50.00%的占空比
  519. *        返 回 值: 无
  520. *********************************************************************************************************
  521. */
  522. void bsp_SetTIMOutPWM_N(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin, TIM_TypeDef* TIMx, uint8_t _ucChannel,
  523.          uint32_t _ulFreq, uint32_t _ulDutyCycle)
  524. {
  525.         TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
  526.         TIM_OCInitTypeDef  TIM_OCInitStructure;
  527.         uint16_t usPeriod;
  528.         uint16_t usPrescaler;
  529.         uint32_t uiTIMxCLK;

  530.         if (_ulDutyCycle == 0)
  531.         {               
  532.                 TIM_Cmd(TIMx, DISABLE);                /* 关闭PWM输出 */
  533.                 bsp_ConfigGpioOut(GPIOx, GPIO_Pin);        /* 配置GPIO为推挽输出 */               
  534.                 GPIO_WriteBit(GPIOx, GPIO_Pin, Bit_RESET);        /* PWM = 0 */               
  535.                 return;
  536.         }
  537.         else if (_ulDutyCycle == 10000)
  538.         {
  539.                 TIM_Cmd(TIMx, DISABLE);                /* 关闭PWM输出 */

  540.                 bsp_ConfigGpioOut(GPIOx, GPIO_Pin);        /* 配置GPIO为推挽输出 */               
  541.                 GPIO_WriteBit(GPIOx, GPIO_Pin, Bit_SET);        /* PWM = 1 */       
  542.                 return;
  543.         }
  544.        

  545.         bsp_ConfigTimGpio(GPIOx, GPIO_Pin, TIMx, _ucChannel);        /* 使能GPIO和TIM时钟,并连接TIM通道到GPIO */
  546.        
  547.     /*-----------------------------------------------------------------------
  548.                 system_stm32f4xx.c 文件中 void SetSysClock(void) 函数对时钟的配置如下:

  549.                 HCLK = SYSCLK / 1     (AHB1Periph)
  550.                 PCLK2 = HCLK / 2      (APB2Periph)
  551.                 PCLK1 = HCLK / 4      (APB1Periph)

  552.                 因为APB1 prescaler != 1, 所以 APB1上的TIMxCLK = PCLK1 x 2 = SystemCoreClock / 2;
  553.                 因为APB2 prescaler != 1, 所以 APB2上的TIMxCLK = PCLK2 x 2 = SystemCoreClock;

  554.                 APB1 定时器有 TIM2, TIM3 ,TIM4, TIM5, TIM6, TIM6, TIM12, TIM13,TIM14
  555.                 APB2 定时器有 TIM1, TIM8 ,TIM9, TIM10, TIM11

  556.         ----------------------------------------------------------------------- */
  557.         if ((TIMx == TIM1) || (TIMx == TIM8) || (TIMx == TIM9) || (TIMx == TIM10) || (TIMx == TIM11))
  558.         {
  559.                 /* APB2 定时器 */
  560.                 uiTIMxCLK = SystemCoreClock;
  561.         }
  562.         else        /* APB1 定时器 */
  563.         {
  564.                 uiTIMxCLK = SystemCoreClock / 2;
  565.         }

  566.         if (_ulFreq < 100)
  567.         {
  568.                 usPrescaler = 10000 - 1;                                        /* 分频比 = 10000 */
  569.                 usPeriod =  (uiTIMxCLK / 10000) / _ulFreq  - 1;                /* 自动重装的值 */
  570.         }
  571.         else if (_ulFreq < 3000)
  572.         {
  573.                 usPrescaler = 100 - 1;                                        /* 分频比 = 100 */
  574.                 usPeriod =  (uiTIMxCLK / 100) / _ulFreq  - 1;                /* 自动重装的值 */
  575.         }
  576.         else        /* 大于4K的频率,无需分频 */
  577.         {
  578.                 usPrescaler = 0;                                        /* 分频比 = 1 */
  579.                 usPeriod = uiTIMxCLK / _ulFreq - 1;        /* 自动重装的值 */
  580.         }

  581.         /* Time base configuration */
  582.         TIM_TimeBaseStructure.TIM_Period = usPeriod;
  583.         TIM_TimeBaseStructure.TIM_Prescaler = usPrescaler;
  584.         TIM_TimeBaseStructure.TIM_ClockDivision = 0;
  585.         TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
  586.         TIM_TimeBaseStructure.TIM_RepetitionCounter = 0x0000;                /* TIM1 和 TIM8 必须设置 */       

  587.         TIM_TimeBaseInit(TIMx, &TIM_TimeBaseStructure);

  588.         /* PWM1 Mode configuration: Channel1 */
  589.         TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
  590.         TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Disable;                /* 此处和正相引脚不同 */
  591.         TIM_OCInitStructure.TIM_Pulse = (_ulDutyCycle * usPeriod) / 10000;
  592.         TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
  593.        
  594.         TIM_OCInitStructure.TIM_OutputNState = TIM_OutputNState_Enable;                /* only for TIM1 and TIM8. 此处和正相引脚不同 */       
  595.         TIM_OCInitStructure.TIM_OCNPolarity = TIM_OCNPolarity_High;                        /* only for TIM1 and TIM8. */                 
  596.         TIM_OCInitStructure.TIM_OCIdleState = TIM_OCIdleState_Reset;                /* only for TIM1 and TIM8. */
  597.         TIM_OCInitStructure.TIM_OCNIdleState = TIM_OCNIdleState_Reset;                /* only for TIM1 and TIM8. */
  598.        
  599.         if (_ucChannel == 1)
  600.         {
  601.                 TIM_OC1Init(TIMx, &TIM_OCInitStructure);
  602.                 TIM_OC1PreloadConfig(TIMx, TIM_OCPreload_Enable);
  603.         }
  604.         else if (_ucChannel == 2)
  605.         {
  606.                 TIM_OC2Init(TIMx, &TIM_OCInitStructure);
  607.                 TIM_OC2PreloadConfig(TIMx, TIM_OCPreload_Enable);
  608.         }
  609.         else if (_ucChannel == 3)
  610.         {
  611.                 TIM_OC3Init(TIMx, &TIM_OCInitStructure);
  612.                 TIM_OC3PreloadConfig(TIMx, TIM_OCPreload_Enable);
  613.         }
  614.         else if (_ucChannel == 4)
  615.         {
  616.                 TIM_OC4Init(TIMx, &TIM_OCInitStructure);
  617.                 TIM_OC4PreloadConfig(TIMx, TIM_OCPreload_Enable);
  618.         }

  619.         TIM_ARRPreloadConfig(TIMx, ENABLE);

  620.         /* TIMx enable counter */
  621.         TIM_Cmd(TIMx, ENABLE);

  622.         /* 下面这句话对于TIM1和TIM8是必须的,对于TIM2-TIM6则不必要 */
  623.         if ((TIMx == TIM1) || (TIMx == TIM8))
  624.         {
  625.                 TIM_CtrlPWMOutputs(TIMx, ENABLE);
  626.         }
  627. }

  628. /*
  629. *********************************************************************************************************
  630. *        函 数 名: bsp_SetTIMforInt
  631. *        功能说明: 配置TIM和NVIC,用于简单的定时中断. 开启定时中断。 中断服务程序由应用程序实现。
  632. *        形    参: TIMx : 定时器
  633. *                          _ulFreq : 定时频率 (Hz)。 0 表示关闭。
  634. *                          _PreemptionPriority : 中断优先级分组
  635. *                          _SubPriority : 子优先级
  636. *        返 回 值: 无
  637. *********************************************************************************************************
  638. */
  639. void bsp_SetTIMforInt(TIM_TypeDef* TIMx, uint32_t _ulFreq, uint8_t _PreemptionPriority, uint8_t _SubPriority)
  640. {
  641.         TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
  642.         uint16_t usPeriod;
  643.         uint16_t usPrescaler;
  644.         uint32_t uiTIMxCLK;

  645.           /* 使能TIM时钟 */
  646.         if ((TIMx == TIM1) || (TIMx == TIM8) || (TIMx == TIM9) || (TIMx == TIM10) || (TIMx == TIM11))
  647.         {
  648.                 RCC_APB2PeriphClockCmd(bsp_GetRCCofTIM(TIMx), ENABLE);
  649.         }
  650.         else
  651.         {
  652.                 RCC_APB1PeriphClockCmd(bsp_GetRCCofTIM(TIMx), ENABLE);
  653.         }

  654.         if (_ulFreq == 0)
  655.         {
  656.                 TIM_Cmd(TIMx, DISABLE);                /* 关闭定时输出 */
  657.                 return;
  658.         }

  659.     /*-----------------------------------------------------------------------
  660.                 system_stm32f4xx.c 文件中 void SetSysClock(void) 函数对时钟的配置如下:

  661.                 HCLK = SYSCLK / 1     (AHB1Periph)
  662.                 PCLK2 = HCLK / 2      (APB2Periph)
  663.                 PCLK1 = HCLK / 4      (APB1Periph)

  664.                 因为APB1 prescaler != 1, 所以 APB1上的TIMxCLK = PCLK1 x 2 = SystemCoreClock / 2;
  665.                 因为APB2 prescaler != 1, 所以 APB2上的TIMxCLK = PCLK2 x 2 = SystemCoreClock;

  666.                 APB1 定时器有 TIM2, TIM3 ,TIM4, TIM5, TIM6, TIM7, TIM12, TIM13,TIM14
  667.                 APB2 定时器有 TIM1, TIM8 ,TIM9, TIM10, TIM11

  668.         ----------------------------------------------------------------------- */
  669.         if ((TIMx == TIM1) || (TIMx == TIM8) || (TIMx == TIM9) || (TIMx == TIM10) || (TIMx == TIM11))
  670.         {
  671.                 /* APB2 定时器 */
  672.                 uiTIMxCLK = SystemCoreClock;
  673.         }
  674.         else        /* APB1 定时器 */
  675.         {
  676.                 uiTIMxCLK = SystemCoreClock / 2;
  677.         }

  678.         if (_ulFreq < 100)
  679.         {
  680.                 usPrescaler = 10000 - 1;                                        /* 分频比 = 1000 */
  681.                 usPeriod =  (uiTIMxCLK / 10000) / _ulFreq  - 1;                /* 自动重装的值 */
  682.         }
  683.         else if (_ulFreq < 3000)
  684.         {
  685.                 usPrescaler = 100 - 1;                                        /* 分频比 = 100 */
  686.                 usPeriod =  (uiTIMxCLK / 100) / _ulFreq  - 1;                /* 自动重装的值 */
  687.         }
  688.         else        /* 大于4K的频率,无需分频 */
  689.         {
  690.                 usPrescaler = 0;                                        /* 分频比 = 1 */
  691.                 usPeriod = uiTIMxCLK / _ulFreq - 1;        /* 自动重装的值 */
  692.         }

  693.         /* Time base configuration */
  694.         TIM_TimeBaseStructure.TIM_Period = usPeriod;
  695.         TIM_TimeBaseStructure.TIM_Prescaler = usPrescaler;
  696.         TIM_TimeBaseStructure.TIM_ClockDivision = 0;
  697.         TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
  698.         TIM_TimeBaseStructure.TIM_RepetitionCounter = 0x0000;                /* TIM1 和 TIM8 必须设置 */

  699.         TIM_TimeBaseInit(TIMx, &TIM_TimeBaseStructure);

  700.         TIM_ARRPreloadConfig(TIMx, ENABLE);

  701.         /* TIM Interrupts enable */
  702.         TIM_ITConfig(TIMx, TIM_IT_Update, ENABLE);

  703.         /* TIMx enable counter */
  704.         TIM_Cmd(TIMx, ENABLE);

  705.         /* 配置TIM定时更新中断 (Update) */
  706.         {
  707.                 NVIC_InitTypeDef NVIC_InitStructure;        /* 中断结构体在 misc.h 中定义 */
  708.                 uint8_t irq = 0;        /* 中断号, 定义在 stm32f4xx.h */

  709.                 if ((TIMx == TIM1) || (TIMx == TIM10))
  710.                         irq = TIM1_UP_TIM10_IRQn;
  711.                 else if (TIMx == TIM2)
  712.                         irq = TIM2_IRQn;
  713.                 else if (TIMx == TIM3)
  714.                         irq = TIM3_IRQn;
  715.                 else if (TIMx == TIM4)
  716.                         irq = TIM4_IRQn;
  717.                 else if (TIMx == TIM5)
  718.                         irq = TIM5_IRQn;
  719.                 else if (TIMx == TIM6)
  720.                         irq = TIM6_DAC_IRQn;
  721.                 else if (TIMx == TIM7)
  722.                         irq = TIM7_IRQn;
  723.                 else if (TIMx == TIM7)
  724.                         irq = TIM7_IRQn;
  725.                 else if (TIMx == TIM7)
  726.                         irq = TIM7_IRQn;
  727.                 else if ((TIMx == TIM8) || (TIMx == TIM13))
  728.                         irq = TIM8_UP_TIM13_IRQn;
  729.                 else if (TIMx == TIM9)
  730.                         irq = TIM1_BRK_TIM9_IRQn;
  731.                 else if (TIMx == TIM11)
  732.                         irq = TIM1_TRG_COM_TIM11_IRQn;
  733.                 else if (TIMx == TIM12)
  734.                         irq = TIM8_BRK_TIM12_IRQn;
  735.                 else if (TIMx == TIM14)
  736.                         irq = TIM8_TRG_COM_TIM14_IRQn;

  737.                 NVIC_InitStructure.NVIC_IRQChannel = irq;
  738.                 NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = _PreemptionPriority;
  739.                 NVIC_InitStructure.NVIC_IRQChannelSubPriority = _SubPriority;
  740.                 NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  741.                 NVIC_Init(&NVIC_InitStructure);
  742.         }
  743. }

  744. /***************************** 安富莱电子 www.armfly.com (END OF FILE) *********************************/
复制代码
回复

使用道具 举报

9

主题

12

回帖

39

积分

新手上路

积分
39
 楼主| 发表于 2021-3-9 09:09:34 | 显示全部楼层
eric2013 发表于 2021-3-4 08:20
从那里工程里面找的这个函数,这种BspConfigTIMGpio不是我们的命名方式,我们的这个驱动文件bsp_的函数bsp_ ...

复制的原版的这个函数里面,形参_ucChannel还是没用上啊
void bsp_ConfigTimGpio(GPIO_TypeDef* GPIOx, uint16_t GPIO_PinX, TIM_TypeDef* TIMx, uint8_t _ucChannel)
{
        GPIO_InitTypeDef  GPIO_InitStructure;

        /* 使能GPIO时钟 */
        RCC_AHB1PeriphClockCmd(bsp_GetRCCofGPIO(GPIOx), ENABLE);

          /* 使能TIM时钟 */
        if ((TIMx == TIM1) || (TIMx == TIM8) || (TIMx == TIM9) || (TIMx == TIM10) || (TIMx == TIM11))
        {
                RCC_APB2PeriphClockCmd(bsp_GetRCCofTIM(TIMx), ENABLE);
        }
        else
        {
                RCC_APB1PeriphClockCmd(bsp_GetRCCofTIM(TIMx), ENABLE);
        }

        /* 配置GPIO */
        GPIO_InitStructure.GPIO_Pin = GPIO_PinX;        /* 带入的形参 */
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
        GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
        GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP ;
        GPIO_Init(GPIOx, &GPIO_InitStructure);

        /* 连接到AF功能 */
        GPIO_PinAFConfig(GPIOx, bsp_GetPinSource(GPIO_PinX), bsp_GetAFofTIM(TIMx));
}
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115667
QQ
发表于 2021-3-9 10:16:35 | 显示全部楼层
woaiwm 发表于 2021-3-9 09:09
复制的原版的这个函数里面,形参_ucChannel还是没用上啊
void bsp_ConfigTimGpio(GPIO_TypeDef* GPIOx,  ...

没用上,就不用管了呗,属于预留参数。
回复

使用道具 举报

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

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2025-5-10 19:10 , Processed in 0.210264 second(s), 24 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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