|
|
- /*
- * Author: ClingYang
- * Date: 2025-11-11
- * Version: 1.0
- */
- #ifndef __TIMERA_PWM_H__
- #define __TIMERA_PWM_H__
- #ifdef __cplusplus
- extern "C" {
- #endif
- #include "main.h"
- #define TMRA_UNIT (CM_TMRA_6)
- #define TMRA_PERIPH_CLK (FCG2_PERIPH_TMRA_6)
- #define TMRA_PWM_CH (TMRA_CH4)
- #define TMRA_PWM_PORT (GPIO_PORT_A)
- #define TMRA_PWM_PIN (GPIO_PIN_15)
- #define TMRA_PWM_PIN_FUNC (GPIO_FUNC_5)
- #define TMRA_MD (TMRA_MD_SAWTOOTH)
- #define TMRA_DIR (TMRA_DIR_UP)
- #define TMRA_PERIOD_VAL (500U - 1U) // 200kHz @ 100MHz PCLK1
- #define TMRA_PWM_CMP_VAL (149U) // 30%占空比
- void TimeraPwmInit(void);
- void TimeraPwmStart(void);
- void TimeraPwmStop(void);
- int32_t TimeraPwmSetDuty(uint8_t u8Duty);
- #ifdef __cplusplus
- }
- #endif
- #endif /*__TIMERA_PWM_H__*/
復(fù)制代碼
- #include "timera_pwm.h"
- extern uint16_t test_var;
- /**
- * @brief TimerA configuration.
- * @param None
- * @retval None
- */
- static void TmrAConfig(void)
- {
- stc_tmra_init_t stcTmraInit;
- stc_tmra_pwm_init_t stcPwmInit;
- /* 1. Enable TimerA peripheral clock. */
- FCG_Fcg2PeriphClockCmd(TMRA_PERIPH_CLK, ENABLE);
- /* 2. Set a default initialization value for stcTmraInit. */
- (void)TMRA_StructInit(&stcTmraInit);
- /* 3. Modifies the initialization values depends on the application. */
- stcTmraInit.sw_count.u8CountMode = TMRA_MD;
- stcTmraInit.sw_count.u8CountDir = TMRA_DIR;
- stcTmraInit.u32PeriodValue = TMRA_PERIOD_VAL;
- (void)TMRA_Init(TMRA_UNIT, &stcTmraInit);
- /* 4. Set the comparison reference value. */
- (void)TMRA_PWM_StructInit(&stcPwmInit);
- stcPwmInit.u32CompareValue = TMRA_PWM_CMP_VAL;
- GPIO_SetFunc(TMRA_PWM_PORT, TMRA_PWM_PIN, TMRA_PWM_PIN_FUNC);
- (void)TMRA_PWM_Init(TMRA_UNIT, TMRA_PWM_CH, &stcPwmInit);
- TMRA_PWM_OutputCmd(TMRA_UNIT, TMRA_PWM_CH, ENABLE);
- }
- void TimeraPwmInit(void)
- {
- TmrAConfig();
- test_var = 2;
- }
- void TimeraPwmStart(void)
- {
- TMRA_Start(TMRA_UNIT);
- }
- /**
- * Stop PWM output:
- * TMRA_Stop(TMRA_UNIT);
- * or
- * TMRA_PWM_OutputCmd(TMRA_UNIT, TMRA_PWM_x_CH, DISABLE);
- */
- void TimeraPwmStop(void)
- {
- TMRA_Stop(TMRA_UNIT);
- }
- int32_t TimeraPwmSetDuty(uint8_t u8Duty)
- {
- uint32_t u32CompareValue;
- // 限制占空比范圍(0~100)
- if (u8Duty > 100)
- {
- return LL_ERR_INVD_PARAM;
- }
- u32CompareValue = (TMRA_PWM_CMP_VAL * u8Duty) / 100;
- TMRA_SetCompareValue(TMRA_UNIT, TMRA_PWM_CH, u32CompareValue);
- return LL_OK;
- }
- /****************************************************END OF FILE****************************************************/
復(fù)制代碼 上面是.c.h
- /**
- *******************************************************************************
- * @file main.c
- * @brief Main program.
- @verbatim
- Change Logs:
- Date Author Notes
- 2025-11-11 CDT First version
- @endverbatim
- *******************************************************************************
- * Copyright (C) 2022-2025, Xiaohua Semiconductor Co., Ltd. All rights reserved.
- *
- * This software component is licensed by XHSC under BSD 3-Clause license
- * (the "License"); You may not use this file except in compliance with the
- * License. You may obtain a copy of the License at:
- * opensource.org/licenses/BSD-3-Clause
- *
- *******************************************************************************
- */
- /*******************************************************************************
- * Include files
- ******************************************************************************/
- #include "main.h"
- #include "My_button.h"
- #include "timer.h"
- #include "timera_pwm.h"
- /*******************************************************************************
- * Local type definitions ('typedef')
- ******************************************************************************/
- uint16_t test_var = 0;
- en_pin_state_t pc13;
- /*******************************************************************************
- * Local pre-processor symbols/macros ('#define')
- ******************************************************************************/
- /*******************************************************************************
- * Global variable definitions (declared in header file with 'extern')
- ******************************************************************************/
- /*******************************************************************************
- * Local function prototypes ('static')
- ******************************************************************************/
- /*******************************************************************************
- * Local variable definitions ('static')
- ******************************************************************************/
- /*******************************************************************************
- * Function implementation - global ('extern') and local ('static')
- ******************************************************************************/
- // Clock Config
- static void App_ClkCfg(void)
- {
- /* Set bus clock div. */
- CLK_SetClockDiv(CLK_BUS_CLK_ALL, (CLK_HCLK_DIV1 | CLK_EXCLK_DIV2 | CLK_PCLK0_DIV1 | CLK_PCLK1_DIV2 |
- CLK_PCLK2_DIV4 | CLK_PCLK3_DIV4 | CLK_PCLK4_DIV2));
- /* sram init include read/write wait cycle setting */
- SRAM_SetWaitCycle(SRAM_SRAM_ALL, SRAM_WAIT_CYCLE1, SRAM_WAIT_CYCLE1);
- SRAM_SetWaitCycle(SRAM_SRAMH, SRAM_WAIT_CYCLE0, SRAM_WAIT_CYCLE0);
- /* flash read wait cycle setting */
- EFM_SetWaitCycle(EFM_WAIT_CYCLE5);
- /* XTAL config */
- stc_clock_xtal_init_t stcXtalInit;
- (void)CLK_XtalStructInit(&stcXtalInit);
- stcXtalInit.u8State = CLK_XTAL_ON;
- stcXtalInit.u8Drv = CLK_XTAL_DRV_HIGH;
- stcXtalInit.u8Mode = CLK_XTAL_MD_OSC;
- stcXtalInit.u8StableTime = CLK_XTAL_STB_2MS;
- (void)CLK_XtalInit(&stcXtalInit);
- /* MPLL config */
- stc_clock_pll_init_t stcMPLLInit;
- (void)CLK_PLLStructInit(&stcMPLLInit);
- stcMPLLInit.PLLCFGR = 0UL;
- stcMPLLInit.PLLCFGR_f.PLLM = (1UL - 1UL);
- stcMPLLInit.PLLCFGR_f.PLLN = (50UL - 1UL);
- stcMPLLInit.PLLCFGR_f.PLLP = (2UL - 1UL);
- stcMPLLInit.PLLCFGR_f.PLLQ = (2UL - 1UL);
- stcMPLLInit.PLLCFGR_f.PLLR = (2UL - 1UL);
- stcMPLLInit.u8PLLState = CLK_PLL_ON;
- stcMPLLInit.PLLCFGR_f.PLLSRC = CLK_PLL_SRC_XTAL;
- (void)CLK_PLLInit(&stcMPLLInit);
- /* 3 cycles for 126MHz ~ 200MHz */
- GPIO_SetReadWaitCycle(GPIO_RD_WAIT3);
- /* Switch driver ability */
- PWC_HighSpeedToHighPerformance();
- /* Set the system clock source */
- CLK_SetSysClockSrc(CLK_SYSCLK_SRC_PLL);
- }
- // Port Config
- static void App_PortCfg(void)
- {
- GPIO_SetDebugPort(GPIO_PIN_TDI, DISABLE);
- }
- /**
- * @brief Main function of the project
- * @param None
- * @retval int32_t return value, if needed
- */
- int32_t main(void)
- {
- /* Register write unprotected for some required peripherals. */
- LL_PERIPH_WE(LL_PERIPH_ALL);
- // Clock Config
- App_ClkCfg();
- // Port Config
- App_PortCfg();
- /* Register write protected for some required peripherals. */
- // Timer Init
- timer0_init();
- // GPIO Init
- gpio_init();
- // LCD_Init();
- My_button_init_attach_start();
- // Timera PWM Init
- TimeraPwmInit();
- DDL_DelayMS(1U);
- TimeraPwmStart();
- DDL_DelayMS(1U);
- // LL_PERIPH_WP(LL_PERIPH_ALL);
- for (;;)
- {
- // test_var++;
- TimeraPwmSetDuty(test_var);
- // pc13 = gpio_read_pc13();
- }
- }
- /**
- * @brief TMR0 compare interrupt callback function
- * @param None
- * @retval None
- */
- void TMR0_CompareIrqCallback(void)
- {
- TMR0_ClearStatus(TMR0_UNIT, TMR0_CH_FLAG);
- static uint32_t _t0 = 0U;
- static uint32_t tik5ms = 0U;
- _t0++;
- tik5ms++;
- if (tik5ms >= 5U) // 50ms掃描一次按鍵
- {
- button_ticks();
- tik5ms = 0U;
- }
- if (_t0 >= 1000U)
- {
- gpio_toggle();
- // test_var++; TimeraPwmSetDuty((uint8_t)test_var); // 修正這一行
- _t0 = 0U;
- }
- }
- /*******************************************************************************
- * EOF (not truncated)
- ******************************************************************************/
復(fù)制代碼 我在debug的時(shí)候 無(wú)論怎么修改test_var pwm的占空比都無(wú)法修改 使用的芯片是 HC32F460JEUA
|
|