久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 1689|回復(fù): 5
打印 上一主題 下一主題
收起左側(cè)

求助STM32F103 Timer3 CH2 PWM輸出問題

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:916650 發(fā)表于 2022-12-8 10:28 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式

我用IAR寫的PWM輸出程序,正常應(yīng)該看到PB5的小燈亮滅交替,結(jié)果一直是常亮狀態(tài),搜了一圈沒搞明白怎么回事
基本定時功能和中斷倒是正常,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.   * @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=(72-1);       //定時器分頻
  102.     TIM3_Handler.Init.CounterMode=TIM_COUNTERMODE_UP;//向上計數(shù)模式
  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.   
  108.     HAL_TIM_PWM_Init(&TIM3_Handler);       //初始化PWM
  109.    
  110.     TIM3_CH2Handler.OCMode=TIM_OCMODE_PWM1; //模式選擇PWM1
  111.     TIM3_CH2Handler.Pulse=(50000-1)/2;            //設(shè)置比較值,此值用來確定占空比,默認(rèn)比較值為自動重裝載值的一半,即占空比為50%
  112.     TIM3_CH2Handler.OCPolarity=TIM_OCPOLARITY_LOW; //輸出比較極性為低
  113.       TIM3_CH2Handler.OCFastMode   = TIM_OCFAST_DISABLE;
  114.   TIM3_CH2Handler.OCNPolarity  = TIM_OCNPOLARITY_HIGH;
  115.   TIM3_CH2Handler.OCNIdleState = TIM_OCNIDLESTATE_RESET;
  116.   
  117.     HAL_TIM_PWM_ConfigChannel(&TIM3_Handler,&TIM3_CH2Handler,TIM_CHANNEL_2);//配置TIM3通道2
  118.        
  119.    HAL_TIM_PWM_Start(&TIM3_Handler,TIM_CHANNEL_2);//開啟PWM通道2
  120. }

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

  127.             __HAL_RCC_TIM3_CLK_ENABLE();                        //使能定時器3
  128.             __HAL_RCC_GPIOB_CLK_ENABLE();                        //開啟GPIOB時鐘
  129.             __HAL_AFIO_REMAP_TIM3_PARTIAL();                //TIM3通道引腳部分重映射使能
  130.             
  131.             GPIO_Initure.Pin=GPIO_PIN_5;                   //PB5
  132.             GPIO_Initure.Mode=GPIO_MODE_AF_PP;          //復(fù)用推挽輸出
  133.             //GPIO_Initure.Pull=GPIO_PULLUP;          //上拉
  134.             GPIO_Initure.Speed=GPIO_SPEED_FREQ_HIGH;//高速
  135.             HAL_GPIO_Init(GPIOB,&GPIO_Initure);        
  136.     }
  137. }

  138. void Tim3B_Init(void)
  139. {

  140.     TIM3_Handler.Instance=TIM3;                  //定時器3
  141.     TIM3_Handler.Init.Prescaler=(72-1)*100;       //定時器分頻
  142.     TIM3_Handler.Init.CounterMode=TIM_COUNTERMODE_UP;//向上計數(shù)模式
  143.     TIM3_Handler.Init.Period=(50000-1);          //自動重裝載值
  144.     TIM3_Handler.Init.ClockDivision=TIM_CLOCKDIVISION_DIV1;
  145.     HAL_TIM_Base_Init(&TIM3_Handler);       //初始化PWM
  146.        
  147.       HAL_TIM_Base_Start_IT(&TIM3_Handler); //使能定時器3和定時器3更新中斷:TIM_IT_UPDATE   
  148. }

  149. void HAL_TIM_Base_MspInit(TIM_HandleTypeDef *htim)
  150. {
  151.     if(htim->Instance==TIM3)
  152.         {
  153.                 __HAL_RCC_TIM3_CLK_ENABLE();            //使能TIM3時鐘
  154.                 HAL_NVIC_SetPriority(TIM3_IRQn,1,3);    //設(shè)置中斷優(yōu)先級,搶占優(yōu)先級1,子優(yōu)先級3
  155.                 HAL_NVIC_EnableIRQ(TIM3_IRQn);          //開啟ITM3中斷   
  156.         }
  157. }

  158. //定時器3中斷服務(wù)函數(shù)
  159. void TIM3_IRQHandler(void)
  160. {
  161.     HAL_TIM_IRQHandler(&TIM3_Handler);
  162. }

  163. //回調(diào)函數(shù),定時器中斷服務(wù)函數(shù)調(diào)用
  164. void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
  165. {
  166.     if(htim==(&TIM3_Handler))
  167.     {
  168.         LED1_Toggle;        //LED1反轉(zhuǎn)
  169.     }
  170. }
復(fù)制代碼




分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復(fù)

使用道具 舉報

沙發(fā)
ID:916650 發(fā)表于 2022-12-8 12:56 | 只看該作者
更新一下,我好像發(fā)現(xiàn)問題所在了
問題出在缺少語句__HAL_RCC_AFIO_CLK_ENABLE();
而且這個語句必須在PWM輸出引腳重映射語句前執(zhí)行,否則就不會執(zhí)行PWM輸出引腳重映射,PWM不會從PB5輸出。

現(xiàn)在在我的程序中單獨執(zhí)行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;//向上計數(shù)模式
  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;            //設(shè)置比較值,此值用來確定占空比,默認(rèn)比較值為自動重裝載值的一半,即占空比為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;          //復(fù)用推挽輸出
  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;//向上計數(shù)模式
  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);    //設(shè)置中斷優(yōu)先級,搶占優(yōu)先級1,子優(yōu)先級3
  151.                 HAL_NVIC_EnableIRQ(TIM3_IRQn);          //開啟ITM3中斷   
  152.         }
  153. }

  154. //定時器3中斷服務(wù)函數(shù)
  155. void TIM3_IRQHandler(void)
  156. {
  157.     HAL_TIM_IRQHandler(&TIM3_Handler);
  158. }

  159. //回調(diào)函數(shù),定時器中斷服務(wù)函數(shù)調(diào)用
  160. void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
  161. {
  162.     if(htim==(&TIM3_Handler))
  163.     {
  164.         LED1_Toggle;        //LED1反轉(zhuǎn)
  165.     }
  166. }
復(fù)制代碼

回復(fù)

使用道具 舉報

板凳
ID:814525 發(fā)表于 2022-12-8 13:01 | 只看該作者
要能看到LED閃爍,PWM頻率必須要十幾赫茲一下。頻率高了,是看不到的,必須用示波器觀察。
回復(fù)

使用道具 舉報

地板
ID:77589 發(fā)表于 2022-12-8 14:34 | 只看該作者
初步看了一下,你設(shè)置PWM的頻率是20Hz, 人眼應(yīng)該是感覺不到閃爍。
你先試試幾Hz的情況。
回復(fù)

使用道具 舉報

5#
ID:916650 發(fā)表于 2022-12-8 15:21 | 只看該作者
張?zhí)鞄?發(fā)表于 2022-12-8 13:01
要能看到LED閃爍,PWM頻率必須要十幾赫茲一下。頻率高了,是看不到的,必須用示波器觀察。

感謝回復(fù),確實頻率設(shè)的有些低了
問題后來解決了,發(fā)現(xiàn)是少了復(fù)用引腳時鐘開啟語句。
回復(fù)

使用道具 舉報

6#
ID:916650 發(fā)表于 2022-12-8 15:21 | 只看該作者
Longan.Wang 發(fā)表于 2022-12-8 14:34
初步看了一下,你設(shè)置PWM的頻率是20Hz, 人眼應(yīng)該是感覺不到閃爍。
你先試試幾Hz的情況。

感謝回復(fù),確實頻率設(shè)的有些低了
問題后來解決了,發(fā)現(xiàn)是少了復(fù)用引腳時鐘開啟語句。
回復(fù)

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機教程網(wǎng)

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 久久久久久久一区 | 蜜月va乱码一区二区三区 | 日韩天堂av | 亚洲最大av| 国产精品一区二区免费 | av大片在线 | 日一区二区 | 国产日韩精品一区二区 | 天天综合天天 | 国产亚洲一区二区在线观看 | 三级黄色片在线观看 | 99综合在线 | 成人精品在线观看 | 伊人久久精品 | 久久av网站 | 成人久久 | 女人av| 国产清纯白嫩初高生在线播放视频 | 亚洲福利 | 一区二区三区在线观看视频 | 伊人影院99 | 成人深夜福利在线观看 | 怡红院免费的全部视频 | 在线观看免费毛片 | 91久久北条麻妃一区二区三区 | 国产精品久久视频 | 三级免费av| 久久精品国产a三级三级三级 | 粉嫩av在线 | 337p日本欧洲亚洲大胆鲁鲁 | 欧美成人免费在线视频 | 国产精品久久久久久久岛一牛影视 | 欧美一区二区视频 | 精品一区二区三区免费毛片 | 国产精品1区2区3区 欧美 中文字幕 | 国产精品久久久久久久久久 | 美女黄频| 97起碰 | 久久国产精品一区 | 国产一区二区在线免费观看 | 午夜影院 |