OpenEdv-开源电子网

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

求助Timer3 CH2 PWM输出问题

[复制链接]

1

主题

7

帖子

0

精华

新手上路

积分
20
金钱
20
注册时间
2020-7-4
在线时间
6 小时
发表于 2022-12-7 21:29:29 | 显示全部楼层 |阅读模式
1金钱
我用IAR写的PWM输出程序,正常应该看到PB5的小灯亮灭交替,结果一直是常亮状态,搜了一圈没搞明白怎么回事
基本定时功能和中断倒是正常,PWM输出无作用


  1. //Main.c
  2. /* Includes ------------------------------------------------------------------*/
  3. #include "main.h"

  4. void SystemClock_Config(void);
  5. void LED_Init(void);

  6. #define     LED1_ON         HAL_GPIO_WritePin(GPIOB,GPIO_PIN_5, GPIO_PIN_RESET)
  7. #define     LED1_OFF        HAL_GPIO_WritePin(GPIOB,GPIO_PIN_5, GPIO_PIN_SET)
  8. #define     LED1_Toggle     HAL_GPIO_TogglePin(GPIOB,GPIO_PIN_5)

  9. #define     LED2_ON          HAL_GPIO_WritePin(GPIOE,GPIO_PIN_5, GPIO_PIN_RESET)
  10. #define     LED2_OFF        HAL_GPIO_WritePin(GPIOE,GPIO_PIN_5, GPIO_PIN_SET)
  11. #define     LED2_Toggle     HAL_GPIO_TogglePin(GPIOE,GPIO_PIN_5)

  12. void Tim3_Init(void);
  13. void Tim3B_Init(void);

  14. TIM_HandleTypeDef         TIM3_Handler;              //定时器句柄
  15. TIM_OC_InitTypeDef         TIM3_CH2Handler;        //定时器3通道2句柄

  16. uint ret;
  17. int compare=0;

  18. int main(void)
  19. {

  20.   HAL_Init();

  21.   SystemClock_Config();
  22.    
  23. // LED_Init();
  24. // LED1_OFF;
  25. // LED2_OFF;
  26.   
  27.   //Tim3B_Init();
  28.      
  29.   Tim3_Init();
  30.   


  31.   while (1)
  32.   {
  33.    
  34.   }
  35. }

  36. /**
  37.   * @brief  System Clock Configuration
  38.   *         The system Clock is configured as follow :
  39.   *            System Clock source            = PLL (HSE)
  40.   *            SYSCLK(Hz)                     = 72000000
  41.   *            HCLK(Hz)                       = 72000000
  42.   *            AHB Prescaler                  = 1
  43.   *            APB1 Prescaler                 = 2
  44.   *            APB2 Prescaler                 = 1
  45.   *            HSE Frequency(Hz)              = 8000000
  46.   *            HSE PREDIV1                    = 1
  47.   *            PLLMUL                         = 9
  48.   *            Flash Latency(WS)              = 2
  49.   * [url=home.php?mod=space&uid=271674]@param[/url]  None
  50.   * @retval None
  51.   */
  52. void SystemClock_Config(void)
  53. {
  54.   RCC_ClkInitTypeDef clkinitstruct = {0};
  55.   RCC_OscInitTypeDef oscinitstruct = {0};
  56.   
  57.   /* Enable HSE Oscillator and activate PLL with HSE as source */
  58.   oscinitstruct.OscillatorType  = RCC_OSCILLATORTYPE_HSE;
  59.   oscinitstruct.HSEState        = RCC_HSE_ON;
  60.   oscinitstruct.HSEPredivValue  = RCC_HSE_PREDIV_DIV1;
  61.   oscinitstruct.PLL.PLLState    = RCC_PLL_ON;
  62.   oscinitstruct.PLL.PLLSource   = RCC_PLLSOURCE_HSE;
  63.   oscinitstruct.PLL.PLLMUL      = RCC_PLL_MUL9;
  64.   if (HAL_RCC_OscConfig(&oscinitstruct)!= HAL_OK)
  65.   {
  66.     /* Initialization Error */
  67.     while(1);
  68.   }

  69.   /* Select PLL as system clock source and configure the HCLK, PCLK1 and PCLK2
  70.      clocks dividers */
  71.   clkinitstruct.ClockType = (RCC_CLOCKTYPE_SYSCLK | RCC_CLOCKTYPE_HCLK | RCC_CLOCKTYPE_PCLK1 | RCC_CLOCKTYPE_PCLK2);
  72.   clkinitstruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
  73.   clkinitstruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
  74.   clkinitstruct.APB2CLKDivider = RCC_HCLK_DIV1;
  75.   clkinitstruct.APB1CLKDivider = RCC_HCLK_DIV2;  
  76.   if (HAL_RCC_ClockConfig(&clkinitstruct, FLASH_LATENCY_2)!= HAL_OK)
  77.   {
  78.     /* Initialization Error */
  79.     while(1);
  80.   }
  81. }

  82. void LED_Init(void)
  83. {
  84.   __HAL_RCC_GPIOB_CLK_ENABLE();
  85.   __HAL_RCC_GPIOE_CLK_ENABLE();
  86.   
  87.   GPIO_InitTypeDef GPIO_Init_Struct;
  88.   
  89.   GPIO_Init_Struct.Pin=GPIO_PIN_5;
  90.   GPIO_Init_Struct.Mode=GPIO_MODE_OUTPUT_PP;
  91.   GPIO_Init_Struct.Pull=GPIO_PULLUP;
  92.   GPIO_Init_Struct.Speed=GPIO_SPEED_FREQ_HIGH;
  93.   
  94.   HAL_GPIO_Init(GPIOB, &GPIO_Init_Struct);
  95.        
  96.   HAL_GPIO_Init(GPIOE, &GPIO_Init_Struct);
  97. }


  98. void Tim3_Init(void)
  99. {

  100.     TIM3_Handler.Instance=TIM3;                  //定时器3
  101.     TIM3_Handler.Init.Prescaler=(72-1);       //定时器分频
  102.     TIM3_Handler.Init.CounterMode=TIM_COUNTERMODE_UP;//向上计数模式
  103.     TIM3_Handler.Init.Period=(50000-1);          //自动重装载值
  104.     TIM3_Handler.Init.ClockDivision=TIM_CLOCKDIVISION_DIV1;
  105.       TIM3_Handler.Init.RepetitionCounter = 0;
  106.   TIM3_Handler.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;
  107.     HAL_TIM_PWM_Init(&TIM3_Handler);       //初始化PWM
  108.    
  109.     TIM3_CH2Handler.OCMode=TIM_OCMODE_PWM1; //模式选择PWM1
  110.     TIM3_CH2Handler.Pulse=(50000-1)/2;            //设置比较值,此值用来确定占空比,默认比较值为自动重装载值的一半,即占空比为50%
  111.     TIM3_CH2Handler.OCPolarity=TIM_OCPOLARITY_LOW; //输出比较极性为低
  112.       TIM3_CH2Handler.OCFastMode   = TIM_OCFAST_DISABLE;
  113.   TIM3_CH2Handler.OCNPolarity  = TIM_OCNPOLARITY_HIGH;
  114.   TIM3_CH2Handler.OCNIdleState = TIM_OCNIDLESTATE_RESET;
  115.   
  116.     HAL_TIM_PWM_ConfigChannel(&TIM3_Handler,&TIM3_CH2Handler,TIM_CHANNEL_2);//配置TIM3通道2
  117.        
  118.    HAL_TIM_PWM_Start(&TIM3_Handler,TIM_CHANNEL_2);//开启PWM通道2
  119. }

  120. void HAL_TIM_PWM_MspInit(TIM_HandleTypeDef *htim)
  121. {
  122.         GPIO_InitTypeDef GPIO_Initure;
  123.        
  124.     if(htim->Instance==TIM3)
  125.     {   

  126.             __HAL_RCC_TIM3_CLK_ENABLE();                        //使能定时器3
  127.             __HAL_RCC_GPIOB_CLK_ENABLE();                        //开启GPIOB时钟
  128.             __HAL_AFIO_REMAP_TIM3_PARTIAL();                //TIM3通道引脚部分重映射使能
  129.             
  130.             GPIO_Initure.Pin=GPIO_PIN_5;                   //PB5
  131.             GPIO_Initure.Mode=GPIO_MODE_AF_PP;          //复用推挽输出
  132.             //GPIO_Initure.Pull=GPIO_PULLUP;          //上拉
  133.             GPIO_Initure.Speed=GPIO_SPEED_FREQ_HIGH;//高速
  134.             HAL_GPIO_Init(GPIOB,&GPIO_Initure);        
  135.     }
  136. }

  137. void Tim3B_Init(void)
  138. {

  139.     TIM3_Handler.Instance=TIM3;                  //定时器3
  140.     TIM3_Handler.Init.Prescaler=(72-1)*100;       //定时器分频
  141.     TIM3_Handler.Init.CounterMode=TIM_COUNTERMODE_UP;//向上计数模式
  142.     TIM3_Handler.Init.Period=(50000-1);          //自动重装载值
  143.     TIM3_Handler.Init.ClockDivision=TIM_CLOCKDIVISION_DIV1;
  144.     HAL_TIM_Base_Init(&TIM3_Handler);       //初始化PWM
  145.        
  146.       HAL_TIM_Base_Start_IT(&TIM3_Handler); //使能定时器3和定时器3更新中断:TIM_IT_UPDATE   
  147. }

  148. void HAL_TIM_Base_MspInit(TIM_HandleTypeDef *htim)
  149. {
  150.     if(htim->Instance==TIM3)
  151.         {
  152.                 __HAL_RCC_TIM3_CLK_ENABLE();            //使能TIM3时钟
  153.                 HAL_NVIC_SetPriority(TIM3_IRQn,1,3);    //设置中断优先级,抢占优先级1,子优先级3
  154.                 HAL_NVIC_EnableIRQ(TIM3_IRQn);          //开启ITM3中断   
  155.         }
  156. }

  157. //定时器3中断服务函数
  158. void TIM3_IRQHandler(void)
  159. {
  160.     HAL_TIM_IRQHandler(&TIM3_Handler);
  161. }

  162. //回调函数,定时器中断服务函数调用
  163. void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
  164. {
  165.     if(htim==(&TIM3_Handler))
  166.     {
  167.         LED1_Toggle;        //LED1反转
  168.     }
  169. }
复制代码


最佳答案

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

更新一下,我好像发现问题所在了 我把例程里串口初始化屏蔽了,例程就成我现在程序的样子,PB5常亮PWM不输出 我把例程里串口初始化解除屏蔽了,例程就能够正常输出PWM了,PB5亮灭发生了变化然后发现问题出在语句__HAL_RCC_AFIO_CLK_ENABLE();上,而且这个语句必须在PWM输出引脚重映射语句前执行,否则就不会执行PWM输出引脚重映射,PWM不会才PB5输出。 现在在我的程序中单独执行PWM输出,PB5就可以正常亮灭了
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

1

主题

7

帖子

0

精华

新手上路

积分
20
金钱
20
注册时间
2020-7-4
在线时间
6 小时
 楼主| 发表于 2022-12-7 21:29:30 | 显示全部楼层
本帖最后由 haoyue1995 于 2022-12-8 13:02 编辑

更新一下,我好像发现问题所在了
我把例程里串口初始化屏蔽了,例程就成我现在程序的样子,PB5常亮PWM不输出
我把例程里串口初始化解除屏蔽了,例程就能够正常输出PWM了,PB5亮灭发生了变化然后发现问题出在语句__HAL_RCC_AFIO_CLK_ENABLE();上,而且这个语句必须在PWM输出引脚重映射语句前执行,否则就不会执行PWM输出引脚重映射,PWM不会才PB5输出。

现在在我的程序中单独执行PWM输出,PB5就可以正常亮灭了



  1. //Main.c
  2. /* Includes ------------------------------------------------------------------*/
  3. #include "main.h"

  4. void SystemClock_Config(void);
  5. void LED_Init(void);

  6. #define     LED1_ON         HAL_GPIO_WritePin(GPIOB,GPIO_PIN_5, GPIO_PIN_RESET)
  7. #define     LED1_OFF        HAL_GPIO_WritePin(GPIOB,GPIO_PIN_5, GPIO_PIN_SET)
  8. #define     LED1_Toggle     HAL_GPIO_TogglePin(GPIOB,GPIO_PIN_5)

  9. #define     LED2_ON          HAL_GPIO_WritePin(GPIOE,GPIO_PIN_5, GPIO_PIN_RESET)
  10. #define     LED2_OFF        HAL_GPIO_WritePin(GPIOE,GPIO_PIN_5, GPIO_PIN_SET)
  11. #define     LED2_Toggle     HAL_GPIO_TogglePin(GPIOE,GPIO_PIN_5)

  12. void Tim3_Init(void);
  13. void Tim3B_Init(void);

  14. TIM_HandleTypeDef         TIM3_Handler;              //定时器句柄
  15. TIM_OC_InitTypeDef         TIM3_CH2Handler;        //定时器3通道2句柄

  16. uint ret;
  17. int compare=0;

  18. int main(void)
  19. {

  20.   HAL_Init();

  21.   SystemClock_Config();
  22.    
  23. // LED_Init();
  24. // LED1_OFF;
  25. // LED2_OFF;
  26.   
  27.   //Tim3B_Init();
  28.   
  29.   Tim3_Init();
  30.   


  31.   while (1)
  32.   {
  33.    
  34.   }
  35. }

  36. /**
  37.   * @brief  System Clock Configuration
  38.   *         The system Clock is configured as follow :
  39.   *            System Clock source            = PLL (HSE)
  40.   *            SYSCLK(Hz)                     = 72000000
  41.   *            HCLK(Hz)                       = 72000000
  42.   *            AHB Prescaler                  = 1
  43.   *            APB1 Prescaler                 = 2
  44.   *            APB2 Prescaler                 = 1
  45.   *            HSE Frequency(Hz)              = 8000000
  46.   *            HSE PREDIV1                    = 1
  47.   *            PLLMUL                         = 9
  48.   *            Flash Latency(WS)              = 2
  49.   * @param  None
  50.   * @retval None
  51.   */
  52. void SystemClock_Config(void)
  53. {
  54.   RCC_ClkInitTypeDef clkinitstruct = {0};
  55.   RCC_OscInitTypeDef oscinitstruct = {0};
  56.   
  57.   /* Enable HSE Oscillator and activate PLL with HSE as source */
  58.   oscinitstruct.OscillatorType  = RCC_OSCILLATORTYPE_HSE;
  59.   oscinitstruct.HSEState        = RCC_HSE_ON;
  60.   oscinitstruct.HSEPredivValue  = RCC_HSE_PREDIV_DIV1;
  61.   oscinitstruct.PLL.PLLState    = RCC_PLL_ON;
  62.   oscinitstruct.PLL.PLLSource   = RCC_PLLSOURCE_HSE;
  63.   oscinitstruct.PLL.PLLMUL      = RCC_PLL_MUL9;
  64.   if (HAL_RCC_OscConfig(&oscinitstruct)!= HAL_OK)
  65.   {
  66.     /* Initialization Error */
  67.     while(1);
  68.   }

  69.   /* Select PLL as system clock source and configure the HCLK, PCLK1 and PCLK2
  70.      clocks dividers */
  71.   clkinitstruct.ClockType = (RCC_CLOCKTYPE_SYSCLK | RCC_CLOCKTYPE_HCLK | RCC_CLOCKTYPE_PCLK1 | RCC_CLOCKTYPE_PCLK2);
  72.   clkinitstruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
  73.   clkinitstruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
  74.   clkinitstruct.APB2CLKDivider = RCC_HCLK_DIV1;
  75.   clkinitstruct.APB1CLKDivider = RCC_HCLK_DIV2;  
  76.   if (HAL_RCC_ClockConfig(&clkinitstruct, FLASH_LATENCY_2)!= HAL_OK)
  77.   {
  78.     /* Initialization Error */
  79.     while(1);
  80.   }
  81. }

  82. void LED_Init(void)
  83. {
  84.   __HAL_RCC_GPIOB_CLK_ENABLE();
  85.   __HAL_RCC_GPIOE_CLK_ENABLE();
  86.   
  87.   GPIO_InitTypeDef GPIO_Init_Struct;
  88.   
  89.   GPIO_Init_Struct.Pin=GPIO_PIN_5;
  90.   GPIO_Init_Struct.Mode=GPIO_MODE_OUTPUT_PP;
  91.   GPIO_Init_Struct.Pull=GPIO_PULLUP;
  92.   GPIO_Init_Struct.Speed=GPIO_SPEED_FREQ_HIGH;
  93.   
  94.   HAL_GPIO_Init(GPIOB, &GPIO_Init_Struct);
  95.         
  96.   HAL_GPIO_Init(GPIOE, &GPIO_Init_Struct);
  97. }


  98. void Tim3_Init(void)
  99. {

  100.     TIM3_Handler.Instance=TIM3;                  //定时器3
  101.     TIM3_Handler.Init.Prescaler=(7200-1);       //定时器分频
  102.     TIM3_Handler.Init.CounterMode=TIM_COUNTERMODE_UP;//向上计数模式
  103.     TIM3_Handler.Init.Period=(50000-1);          //自动重装载值
  104.     TIM3_Handler.Init.ClockDivision=TIM_CLOCKDIVISION_DIV1;
  105.     HAL_TIM_PWM_Init(&TIM3_Handler);       //初始化PWM
  106.    
  107.     TIM3_CH2Handler.OCMode=TIM_OCMODE_PWM1; //模式选择PWM1
  108.     TIM3_CH2Handler.Pulse=(50000-1)/2;            //设置比较值,此值用来确定占空比,默认比较值为自动重装载值的一半,即占空比为50%
  109.     TIM3_CH2Handler.OCPolarity=TIM_OCPOLARITY_LOW; //输出比较极性为低
  110.   
  111.     HAL_TIM_PWM_ConfigChannel(&TIM3_Handler,&TIM3_CH2Handler,TIM_CHANNEL_2);//配置TIM3通道2
  112.         
  113.    HAL_TIM_PWM_Start(&TIM3_Handler,TIM_CHANNEL_2);//开启PWM通道2
  114. }

  115. void HAL_TIM_PWM_MspInit(TIM_HandleTypeDef *htim)
  116. {
  117.         GPIO_InitTypeDef GPIO_Initure;
  118.         
  119.     if(htim->Instance==TIM3)
  120.     {   
  121.       __HAL_RCC_TIM3_CLK_ENABLE();                        //使能定时器3
  122.       __HAL_RCC_AFIO_CLK_ENABLE();
  123.       __HAL_AFIO_REMAP_TIM3_PARTIAL();                //TIM3通道引脚部分重映射使能
  124.       __HAL_RCC_GPIOB_CLK_ENABLE();                        //开启GPIOB时钟
  125.       
  126.             
  127.             GPIO_Initure.Pin=GPIO_PIN_5;                   //PB5
  128.             GPIO_Initure.Mode=GPIO_MODE_AF_PP;          //复用推挽输出
  129.             //GPIO_Initure.Pull=GPIO_PULLUP;          //上拉
  130.             GPIO_Initure.Speed=GPIO_SPEED_FREQ_HIGH;//高速
  131.             HAL_GPIO_Init(GPIOB,&GPIO_Initure);         
  132.     }
  133. }

  134. void Tim3B_Init(void)
  135. {

  136.     TIM3_Handler.Instance=TIM3;                  //定时器3
  137.     TIM3_Handler.Init.Prescaler=(72-1);       //定时器分频
  138.     TIM3_Handler.Init.CounterMode=TIM_COUNTERMODE_UP;//向上计数模式
  139.     TIM3_Handler.Init.Period=(50000-1);          //自动重装载值
  140.     TIM3_Handler.Init.ClockDivision=TIM_CLOCKDIVISION_DIV1;
  141.     HAL_TIM_Base_Init(&TIM3_Handler);       //初始化PWM
  142.         
  143.       HAL_TIM_Base_Start_IT(&TIM3_Handler); //使能定时器3和定时器3更新中断:TIM_IT_UPDATE   
  144. }

  145. void HAL_TIM_Base_MspInit(TIM_HandleTypeDef *htim)
  146. {
  147.     if(htim->Instance==TIM3)
  148.         {
  149.                 __HAL_RCC_TIM3_CLK_ENABLE();            //使能TIM3时钟
  150.                 HAL_NVIC_SetPriority(TIM3_IRQn,1,3);    //设置中断优先级,抢占优先级1,子优先级3
  151.                 HAL_NVIC_EnableIRQ(TIM3_IRQn);          //开启ITM3中断   
  152.         }
  153. }

  154. //定时器3中断服务函数
  155. void TIM3_IRQHandler(void)
  156. {
  157.     HAL_TIM_IRQHandler(&TIM3_Handler);
  158. }

  159. //回调函数,定时器中断服务函数调用
  160. void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
  161. {
  162.     if(htim==(&TIM3_Handler))
  163.     {
  164.         LED1_Toggle;        //LED1反转
  165.     }
  166. }
复制代码



回复

使用道具 举报

1

主题

7

帖子

0

精华

新手上路

积分
20
金钱
20
注册时间
2020-7-4
在线时间
6 小时
 楼主| 发表于 2022-12-8 10:18:35 来自手机 | 显示全部楼层
能帮忙解答一下吗?
回复

使用道具 举报

16

主题

426

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2676
金钱
2676
注册时间
2018-11-8
在线时间
431 小时
发表于 2022-12-8 11:12:01 | 显示全部楼层
本帖最后由 babyrabbit 于 2022-12-8 11:15 编辑

PWM不是控制小灯的亮暗吗 怎么变小灯的闪烁了?
回复

使用道具 举报

1

主题

7

帖子

0

精华

新手上路

积分
20
金钱
20
注册时间
2020-7-4
在线时间
6 小时
 楼主| 发表于 2022-12-8 11:24:33 | 显示全部楼层
babyrabbit 发表于 2022-12-8 11:12
PWM不是控制小灯的亮暗吗 怎么变小灯的闪烁了?

用例程代码试过,发现没效果,就改成直接看小灯亮(PWM输出低)灭(PWM输出高)了
回复

使用道具 举报

11

主题

2103

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4588
金钱
4588
注册时间
2015-1-10
在线时间
574 小时
发表于 2022-12-8 11:38:27 | 显示全部楼层
PWM频率太高的话LED是看不出亮灭的,10Hz以上就看不大出来了
回复

使用道具 举报

1

主题

7

帖子

0

精华

新手上路

积分
20
金钱
20
注册时间
2020-7-4
在线时间
6 小时
 楼主| 发表于 2022-12-8 11:47:37 | 显示全部楼层
阿侑kevin 发表于 2022-12-8 11:38
PWM频率太高的话LED是看不出亮灭的,10Hz以上就看不大出来了

我把分频系数改成了7200-1,时钟频率为72*10^6/7200==10000Hz。周期重装值值50000的情况下,一个完整周期约为5s,占空比一半也有2.5s才对.....但是没效果啊
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2024-11-24 20:05

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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