找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 323|回复: 4
打印 上一主题 下一主题
收起左侧

关于HCF32460 timera pwm占空比不可调问题

[复制链接]
跳转到指定楼层
楼主
  1. /*
  2. * Author: ClingYang
  3. * Date: 2025-11-11
  4. * Version: 1.0
  5. */
  6. #ifndef __TIMERA_PWM_H__
  7. #define __TIMERA_PWM_H__

  8. #ifdef __cplusplus
  9. extern "C" {
  10. #endif
  11. #include "main.h"
  12. #define TMRA_UNIT         (CM_TMRA_6)
  13. #define TMRA_PERIPH_CLK   (FCG2_PERIPH_TMRA_6)
  14. #define TMRA_PWM_CH       (TMRA_CH4)

  15. #define TMRA_PWM_PORT     (GPIO_PORT_A)
  16. #define TMRA_PWM_PIN      (GPIO_PIN_15)
  17. #define TMRA_PWM_PIN_FUNC (GPIO_FUNC_5)

  18. #define TMRA_MD           (TMRA_MD_SAWTOOTH)  
  19. #define TMRA_DIR          (TMRA_DIR_UP)
  20. #define TMRA_PERIOD_VAL   (500U - 1U) // 200kHz @ 100MHz PCLK1
  21. #define TMRA_PWM_CMP_VAL  (149U) // 30%占空比

  22. void TimeraPwmInit(void);
  23. void TimeraPwmStart(void);
  24. void TimeraPwmStop(void);
  25. int32_t TimeraPwmSetDuty(uint8_t u8Duty);
  26. #ifdef __cplusplus
  27. }
  28. #endif

  29. #endif /*__TIMERA_PWM_H__*/
复制代码

  1. #include "timera_pwm.h"
  2. extern uint16_t test_var;
  3. /**
  4. * @brief  TimerA configuration.
  5. * @param  None
  6. * @retval None
  7. */
  8. static void TmrAConfig(void)
  9. {
  10.     stc_tmra_init_t stcTmraInit;
  11.     stc_tmra_pwm_init_t stcPwmInit;

  12.     /* 1. Enable TimerA peripheral clock. */
  13.     FCG_Fcg2PeriphClockCmd(TMRA_PERIPH_CLK, ENABLE);

  14.     /* 2. Set a default initialization value for stcTmraInit. */
  15.     (void)TMRA_StructInit(&stcTmraInit);

  16.     /* 3. Modifies the initialization values depends on the application. */
  17.     stcTmraInit.sw_count.u8CountMode = TMRA_MD;
  18.     stcTmraInit.sw_count.u8CountDir  = TMRA_DIR;
  19.     stcTmraInit.u32PeriodValue = TMRA_PERIOD_VAL;
  20.     (void)TMRA_Init(TMRA_UNIT, &stcTmraInit);

  21.     /* 4. Set the comparison reference value. */

  22.     (void)TMRA_PWM_StructInit(&stcPwmInit);
  23.     stcPwmInit.u32CompareValue = TMRA_PWM_CMP_VAL;
  24.     GPIO_SetFunc(TMRA_PWM_PORT, TMRA_PWM_PIN, TMRA_PWM_PIN_FUNC);
  25.     (void)TMRA_PWM_Init(TMRA_UNIT, TMRA_PWM_CH, &stcPwmInit);
  26.     TMRA_PWM_OutputCmd(TMRA_UNIT, TMRA_PWM_CH, ENABLE);


  27. }
  28. void TimeraPwmInit(void)
  29. {
  30.     TmrAConfig();
  31.     test_var = 2;
  32. }
  33. void TimeraPwmStart(void)
  34. {
  35.     TMRA_Start(TMRA_UNIT);
  36. }
  37. /**
  38. * Stop PWM output:
  39. *   TMRA_Stop(TMRA_UNIT);
  40. *   or
  41. *   TMRA_PWM_OutputCmd(TMRA_UNIT, TMRA_PWM_x_CH, DISABLE);
  42. */
  43. void TimeraPwmStop(void)
  44. {
  45.     TMRA_Stop(TMRA_UNIT);
  46. }
  47. int32_t TimeraPwmSetDuty(uint8_t u8Duty)
  48. {
  49.     uint32_t u32CompareValue;

  50.     // 限制占空比范围(0~100)
  51.     if (u8Duty > 100)
  52.     {
  53.         return LL_ERR_INVD_PARAM;
  54.     }
  55.     u32CompareValue = (TMRA_PWM_CMP_VAL * u8Duty) / 100;
  56.     TMRA_SetCompareValue(TMRA_UNIT, TMRA_PWM_CH, u32CompareValue);

  57.     return LL_OK;
  58. }

  59. /****************************************************END OF FILE****************************************************/
复制代码
上面是.c.h  
  1. /**
  2. *******************************************************************************
  3. * @file  main.c
  4. * @brief Main program.
  5. @verbatim
  6. Change Logs:
  7. Date             Author          Notes
  8. 2025-11-11       CDT             First version
  9. @endverbatim
  10. *******************************************************************************
  11. * Copyright (C) 2022-2025, Xiaohua Semiconductor Co., Ltd. All rights reserved.
  12. *
  13. * This software component is licensed by XHSC under BSD 3-Clause license
  14. * (the "License"); You may not use this file except in compliance with the
  15. * License. You may obtain a copy of the License at:
  16. *                    opensource.org/licenses/BSD-3-Clause
  17. *
  18. *******************************************************************************
  19. */

  20. /*******************************************************************************
  21. * Include files
  22. ******************************************************************************/
  23. #include "main.h"
  24. #include "My_button.h"
  25. #include "timer.h"
  26. #include "timera_pwm.h"
  27. /*******************************************************************************
  28. * Local type definitions ('typedef')
  29. ******************************************************************************/
  30. uint16_t test_var = 0;
  31. en_pin_state_t pc13;
  32. /*******************************************************************************
  33. * Local pre-processor symbols/macros ('#define')
  34. ******************************************************************************/
  35. /*******************************************************************************
  36. * Global variable definitions (declared in header file with 'extern')
  37. ******************************************************************************/

  38. /*******************************************************************************
  39. * Local function prototypes ('static')
  40. ******************************************************************************/
  41. /*******************************************************************************
  42. * Local variable definitions ('static')
  43. ******************************************************************************/

  44. /*******************************************************************************
  45. * Function implementation - global ('extern') and local ('static')
  46. ******************************************************************************/
  47. // Clock Config
  48. static void App_ClkCfg(void)
  49. {
  50.     /* Set bus clock div. */
  51.     CLK_SetClockDiv(CLK_BUS_CLK_ALL, (CLK_HCLK_DIV1 | CLK_EXCLK_DIV2 | CLK_PCLK0_DIV1 | CLK_PCLK1_DIV2 |
  52.                                       CLK_PCLK2_DIV4 | CLK_PCLK3_DIV4 | CLK_PCLK4_DIV2));
  53.     /* sram init include read/write wait cycle setting */
  54.     SRAM_SetWaitCycle(SRAM_SRAM_ALL, SRAM_WAIT_CYCLE1, SRAM_WAIT_CYCLE1);
  55.     SRAM_SetWaitCycle(SRAM_SRAMH, SRAM_WAIT_CYCLE0, SRAM_WAIT_CYCLE0);
  56.     /* flash read wait cycle setting */
  57.     EFM_SetWaitCycle(EFM_WAIT_CYCLE5);
  58.     /* XTAL config */
  59.     stc_clock_xtal_init_t stcXtalInit;
  60.     (void)CLK_XtalStructInit(&stcXtalInit);
  61.     stcXtalInit.u8State = CLK_XTAL_ON;
  62.     stcXtalInit.u8Drv = CLK_XTAL_DRV_HIGH;
  63.     stcXtalInit.u8Mode = CLK_XTAL_MD_OSC;
  64.     stcXtalInit.u8StableTime = CLK_XTAL_STB_2MS;
  65.     (void)CLK_XtalInit(&stcXtalInit);
  66.     /* MPLL config */
  67.     stc_clock_pll_init_t stcMPLLInit;
  68.     (void)CLK_PLLStructInit(&stcMPLLInit);
  69.     stcMPLLInit.PLLCFGR = 0UL;
  70.     stcMPLLInit.PLLCFGR_f.PLLM = (1UL - 1UL);
  71.     stcMPLLInit.PLLCFGR_f.PLLN = (50UL - 1UL);
  72.     stcMPLLInit.PLLCFGR_f.PLLP = (2UL - 1UL);
  73.     stcMPLLInit.PLLCFGR_f.PLLQ = (2UL - 1UL);
  74.     stcMPLLInit.PLLCFGR_f.PLLR = (2UL - 1UL);
  75.     stcMPLLInit.u8PLLState = CLK_PLL_ON;
  76.     stcMPLLInit.PLLCFGR_f.PLLSRC = CLK_PLL_SRC_XTAL;
  77.     (void)CLK_PLLInit(&stcMPLLInit);
  78.     /* 3 cycles for 126MHz ~ 200MHz */
  79.     GPIO_SetReadWaitCycle(GPIO_RD_WAIT3);
  80.     /* Switch driver ability */
  81.     PWC_HighSpeedToHighPerformance();
  82.     /* Set the system clock source */
  83.     CLK_SetSysClockSrc(CLK_SYSCLK_SRC_PLL);
  84. }

  85. // Port Config
  86. static void App_PortCfg(void)
  87. {
  88.     GPIO_SetDebugPort(GPIO_PIN_TDI, DISABLE);
  89. }

  90. /**
  91. * @brief  Main function of the project
  92. * @param  None
  93. * @retval int32_t return value, if needed
  94. */
  95. int32_t main(void)
  96. {
  97.     /* Register write unprotected for some required peripherals. */
  98.     LL_PERIPH_WE(LL_PERIPH_ALL);
  99.     // Clock Config
  100.     App_ClkCfg();
  101.     // Port Config
  102.     App_PortCfg();
  103.     /* Register write protected for some required peripherals. */

  104.     // Timer Init
  105.     timer0_init();
  106.     // GPIO Init
  107.     gpio_init();
  108.     // LCD_Init();
  109.     My_button_init_attach_start();
  110.     // Timera PWM Init
  111.     TimeraPwmInit();
  112.     DDL_DelayMS(1U);
  113.     TimeraPwmStart();
  114.     DDL_DelayMS(1U);
  115.     // LL_PERIPH_WP(LL_PERIPH_ALL);
  116.     for (;;)
  117.     {
  118.         //             test_var++;
  119.              TimeraPwmSetDuty(test_var);
  120.         //        pc13 = gpio_read_pc13();
  121.     }
  122. }

  123. /**
  124. * @brief  TMR0 compare interrupt callback function
  125. * @param  None
  126. * @retval None
  127. */
  128. void TMR0_CompareIrqCallback(void)
  129. {
  130.     TMR0_ClearStatus(TMR0_UNIT, TMR0_CH_FLAG);
  131.     static uint32_t _t0 = 0U;
  132.     static uint32_t tik5ms = 0U;
  133.     _t0++;
  134.     tik5ms++;

  135.     if (tik5ms >= 5U) // 50ms扫描一次按键
  136.     {
  137.         button_ticks();
  138.         tik5ms = 0U;
  139.     }
  140.     if (_t0 >= 1000U)
  141.     {
  142.         gpio_toggle();
  143. //        test_var++; TimeraPwmSetDuty((uint8_t)test_var);  // 修正这一行
  144.         _t0 = 0U;
  145.     }
  146. }
  147. /*******************************************************************************
  148. * EOF (not truncated)
  149. ******************************************************************************/
复制代码
我在debug的时候 无论怎么修改test_var pwm的占空比都无法修改 使用的芯片是 HC32F460JEUA



分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:1066795 发表于 2025-11-11 18:02 | 只看该作者
示波器就是这个样子我不知道是不是哪里出问题了 有使用过的大佬指点两句么

51hei图片_20251111174853_13616_2.jpg (191.79 KB, 下载次数: 0)

51hei图片_20251111174853_13616_2.jpg
回复

使用道具 举报

板凳
ID:1066795 发表于 2025-11-12 10:34 | 只看该作者
  1. #include "timera_pwm.h"
  2. extern uint32_t test_var;
  3. /**
  4. * @brief  TimerA configuration.
  5. * @param  None
  6. * @retval None
  7. */
  8. static void TmrAConfig(void)
  9. {
  10.     stc_tmra_init_t stcTmraInit;
  11.     stc_tmra_pwm_init_t stcPwmInit;

  12.     /* 1. Enable TimerA peripheral clock. */
  13.     FCG_Fcg2PeriphClockCmd(TMRA_PERIPH_CLK, ENABLE);

  14.     /* 2. Set a default initialization value for stcTmraInit. */
  15.     (void)TMRA_StructInit(&stcTmraInit);

  16.     /* 3. Modifies the initialization values depends on the application. */
  17.     stcTmraInit.sw_count.u8CountMode = TMRA_MD_SAWTOOTH; // 锯齿波
  18.     stcTmraInit.sw_count.u8CountDir = TMRA_DIR_UP; // 向上计数模式
  19.     stcTmraInit.u32PeriodValue = (500UL-1UL);
  20.     (void)TMRA_Init(TMRA_UNIT, &stcTmraInit);

  21.     (void)TMRA_PWM_StructInit(&stcPwmInit);
  22.     stcPwmInit.u32CompareValue = 1UL; // 占空比50%
  23.     GPIO_SetFunc(TMRA_PWM_PORT, TMRA_PWM_PIN, TMRA_PWM_PIN_FUNC);
  24.     (void)TMRA_PWM_Init(TMRA_UNIT, TMRA_PWM_CH, &stcPwmInit);
  25.     TMRA_PWM_OutputCmd(TMRA_UNIT, TMRA_PWM_CH, ENABLE);
  26. }
  27. void TimeraPwmInit(void)
  28. {
  29.     TmrAConfig();
  30.     TMRA_Start(TMRA_UNIT);
  31. }
  32. void TimeraPwmStart(void)
  33. {
  34.     TMRA_Start(TMRA_UNIT);
  35. }
  36. /**
  37. * Stop PWM output:
  38. *   TMRA_Stop(TMRA_UNIT);
  39. *   or
  40. *   TMRA_PWM_OutputCmd(TMRA_UNIT, TMRA_PWM_x_CH, DISABLE);
  41. */
  42. void TimeraPwmStop(void)
  43. {
  44.     TMRA_Stop(TMRA_UNIT);
  45. }
  46. int32_t TimeraPwmSetDuty(uint8_t u8Duty)
  47. {
  48.     uint32_t u32CompareValue;
  49.     // 限制占空比范围(0~100)
  50.     if (u8Duty > 100)
  51.     {
  52.         return LL_ERR_INVD_PARAM;
  53.     }
  54.     // 将0-100的占空比映射到0-(TMRA_PERIOD_VAL-1)的比较值范围
  55.     u32CompareValue = ((499 - 1) * u8Duty) / 100;
  56.     TMRA_SetCompareValue(TMRA_UNIT, TMRA_PWM_CH, u32CompareValue);

  57.     return LL_OK;
  58. }

  59. /****************************************************END OF FILE****************************************************/
复制代码
  1. /*
  2. * Author: ClingYang
  3. * Date: 2025-11-11
  4. * Version: 1.0
  5. */
  6. #ifndef __TIMERA_PWM_H__
  7. #define __TIMERA_PWM_H__

  8. #ifdef __cplusplus
  9. extern "C" {
  10. #endif
  11. #include "main.h"
  12. #define TMRA_UNIT         (CM_TMRA_6)
  13. #define TMRA_PERIPH_CLK   (FCG2_PERIPH_TMRA_6)
  14. #define TMRA_PWM_CH       (TMRA_CH4)

  15. #define TMRA_PWM_PORT     (GPIO_PORT_A)
  16. #define TMRA_PWM_PIN      (GPIO_PIN_15)
  17. #define TMRA_PWM_PIN_FUNC (GPIO_FUNC_5)

  18. #define TMRA_MD           (TMRA_MD_SAWTOOTH)  
  19. #define TMRA_DIR          (TMRA_DIR_UP)
  20. #define TMRA_PERIOD_VAL   (500U - 1U) // 200kHz @ 100MHz PCLK1
  21. #define TMRA_PWM_CMP_VAL  (149U) // 30%占空比

  22. void TimeraPwmInit(void);
  23. void TimeraPwmStart(void);
  24. void TimeraPwmStop(void);
  25. int32_t TimeraPwmSetDuty(uint8_t u8Duty);
  26. #ifdef __cplusplus
  27. }
  28. #endif

  29. #endif /*__TIMERA_PWM_H__*/
复制代码

可以了     
stcTmraInit.sw_count.u8CountDir = TMRA_DIR_UP; // 向上计数模式
回复

使用道具 举报

地板
ID:1066795 发表于 2025-11-21 09:12 | 只看该作者
https://blog.csdn.net/xiaodududao/article/details/155071638  华大HC32F460踩坑定时器A 输出pwm
这个还有一个坑 希望对遇到同样问题有点小帮助
回复

使用道具 举报

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

本版积分规则

小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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