HC32F460 timer0 唤醒 stop 模式

文章详细介绍了如何配置timer0的A通道在异步计数时钟下工作,以唤醒STOP模式。通过初始化timer0,设置中断源并启用中断,然后进入STOP模式,当timer0计数值达到预设值时触发中断,从而唤醒系统。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

timer0 唤醒STOP模式,注意这模式 唤醒只能用 timer0 A通道,而且还要运行在异步计数时钟

代码如下

/* TMR0 unit and channel definition */
#define TMR0_UNIT                       (CM_TMR0_1)
#define TMR0_CLK                        (FCG2_PERIPH_TMR0_1)
#define TMR0_CH                         (TMR0_CH_A)
#define TMR0_TRIG_CH                    (AOS_TMR0)
#define TMR0_CH_INT                     (TMR0_INT_CMP_A)
#define TMR0_CH_FLAG                    (TMR0_FLAG_CMP_A)
#define TMR0_INT_SRC                    (INT_SRC_TMR0_1_CMP_A)
#define TMR0_IRQn                       (INT030_IRQn)

#define TMR0_CMP_VALUE                  ( 100U )//1024





 void TMR0_Config(void)
{
    stc_tmr0_init_t stcTmr0Init;
    stc_irq_signin_config_t stcIrqSignConfig;

    /* Enable timer0 and AOS clock */
    FCG_Fcg2PeriphClockCmd(TMR0_CLK, ENABLE);
    FCG_Fcg0PeriphClockCmd(FCG0_PERIPH_AOS, ENABLE);

    /* TIMER0 configuration */
    (void)TMR0_StructInit(&stcTmr0Init);
    stcTmr0Init.u32ClockSrc     = TMR0_CLK_SRC_LRC;
    stcTmr0Init.u32ClockDiv     = TMR0_CLK_DIV16;
    stcTmr0Init.u32Func         = TMR0_FUNC_CMP;
    stcTmr0Init.u16CompareValue = (uint16_t)TMR0_CMP_VALUE;
    (void)TMR0_Init(TMR0_UNIT, TMR0_CH, &stcTmr0Init);
    DDL_DelayMS(1U);
    TMR0_HWStopCondCmd(TMR0_UNIT, TMR0_CH, ENABLE);
    DDL_DelayMS(1U);
    TMR0_IntCmd(TMR0_UNIT, TMR0_CH_INT, ENABLE);
    DDL_DelayMS(1U);
//    AOS_SetTriggerEventSrc(TMR0_TRIG_CH, BSP_KEY_KEY10_EVT);

    /* Interrupt configuration */
    stcIrqSignConfig.enIntSrc    = TMR0_INT_SRC;
    stcIrqSignConfig.enIRQn      = TMR0_IRQn;
    stcIrqSignConfig.pfnCallback = &TMR0_CompareIrqCallback;
    (void)INTC_IrqSignIn(&stcIrqSignConfig);
    NVIC_ClearPendingIRQ(stcIrqSignConfig.enIRQn);
    NVIC_SetPriority(stcIrqSignConfig.enIRQn, DDL_IRQ_PRIO_DEFAULT);
    NVIC_EnableIRQ(stcIrqSignConfig.enIRQn);
	
}




/**
 * @brief  Main function of PWC Stop wakeup project
 * @param  None
 * @retval int32_t return value, if needed
 */
int32_t main(void)
{
    uint8_t u8Count;
    /* Register write enable for some required peripherals. */
    LL_PERIPH_WE(LL_PERIPH_GPIO | LL_PERIPH_PWC_CLK_RMU | LL_PERIPH_FCG | LL_PERIPH_EFM | LL_PERIPH_SRAM);

    /* System Clock init */
    BSP_CLK_Init();
    /* LED init */
    BSP_LED_Init();
    /* Key init */
   // BSP_KEY_Init();
	
		TMR0_Config();
	
    STOP_Config();
	
		
	
		BSP_LED_On(LED_RED);
    /* KEY10 */
//    while (PIN_RESET != GPIO_ReadInputPins(BSP_KEY_KEY10_PORT, BSP_KEY_KEY10_PIN)) {
//        ;
//    }
    DDL_DelayMS(DLY_MS);
	  BSP_LED_Off(LED_RED);
    /* Register write protected for some required peripherals. */
    LL_PERIPH_WP(LL_PERIPH_GPIO | LL_PERIPH_FCG | LL_PERIPH_EFM | LL_PERIPH_SRAM);

    for (;;) {
        u8Count = 10U;
        do {
            BSP_LED_Toggle(LED_BLUE);
            DDL_DelayMS(DLY_MS);
        } while ((--u8Count) != 0U);

		
        if (LL_OK == STOP_IsReady()) {
           BSP_LED_On(LED_RED);
					TMR0_Start(TMR0_UNIT, TMR0_CH);  
            PWC_STOP_Enter();
        }
    }
}

 

### HC32F460 Timer0 PWM 输出配置 对于HC32F460单片机中的Timer0模块,其具备PWM输出功能。为了实现可调占空比的PWM信号输出,需先初始化定时器并设置相应的寄存器参数来控制PWM特性。 #### 初始化与配置过程 在开始之前,确保已包含必要的头文件,并定义好使用的GPIO端口以及对应的通道编号: ```c #include "hc32f460.h" // 定义用于PWM输出的IO引脚和对应关系 #define PWM_PORT PORTA #define PWM_PIN PIN1 ``` 接着是对Timer0进行基本设定,包括使能时钟、清除计数器状态、选择工作模式等操作: ```c void Init_Timer0_PWM(void){ M4_TMRA_TypeDef *tmra = &M4_TMRA; // 使能外设时钟 CLK_PeriphClockCmd(CLK_PERIPH_TMRAG | CLK_PERIPH_GPIO, ENABLE); GPIO_Init(PWM_PORT, PWM_PIN, FUNMUX_TIMER_OUTPUT); tmra->TSCR &= ~TMRA_TSCR_TRGS_Msk; /* 清除触发源 */ tmra->TCR |= TMRA_TCR_CKS_DIV_1; /* 设置分频系数 */ // 配置为PWM模式 tmra->TPER = SystemCoreClock / (2*PWM_FREQUENCY)-1 ;/* 计算周期值 */ } ``` 上述代码片段中`SystemCoreClock`代表系统核心频率,而`PWM_FREQUENCY`则是期望产生的PWM波形频率[^1]。 随后,在具体应用场合下调整占空比可以通过修改比较匹配寄存器(`CMPB`)内的数值完成: ```c void Set_Pwm_Duty(uint16_t dutyCyclePercent){ uint32_t compareValue; if(dutyCyclePercent >= 100){ compareValue = 0xFFFF; }else{ compareValue = ((uint32_t)dutyCyclePercent * TPER_Value)/100u; } M4_TMRA->TCPER = compareValue; } ``` 这里假设`dutyCyclePercent`表示百分制下的占空比例;通过改变此函数传入的不同百分比可以灵活地在线更改PWM的实际宽度[^2]。 最后需要注意的是实际开发过程中还需考虑硬件连接方式、电源管理等因素的影响,以上仅提供了一个基础框架供参考。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

mg_hover

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值