[APM32E0] APM32E030的定时器驱动(PWM)

[复制链接]
31|0
口天土立口 发表于 2025-10-15 19:23 | 显示全部楼层 |阅读模式
本帖最后由 口天土立口 于 2025-10-15 19:25 编辑

8544268ef845cc3747.png

APM32E030的定时器有三类,不同定时器支持的功能互有差异,部分定时器支持产生PWM波形;

驱动代码如下:
  1. #define TIM_INS     (TMR3)

  2. /* 定时器更新中断处理函数 */
  3. static tim_update_deal_func_f tim_update_deal_func;
  4. /* 100%占空比值 */
  5. static uint32_t DUTY_100;
  1. /*
  2. * @brief       PWM引脚初始化
  3. *
  4. * @param       None
  5. *
  6. * @retval      None
  7. *
  8. */
  9. static void bsp_tim_pwm_gpio_init(void)
  10. {
  11.     GPIO_Config_T gpioConfig;
  12.    
  13.     /*  PC6 -> TMR3_CH1
  14.      *  PC7 -> TMR3_CH2
  15.      *  PC8 -> TMR3_CH3
  16.      *  PC9 -> TMR3_CH4
  17.      */
  18.     RCM_EnableAHBPeriphClock(RCM_AHB_PERIPH_GPIOC);
  19.     GPIO_ConfigStructInit(&gpioConfig);
  20.     gpioConfig.pin     = GPIO_PIN_6 | GPIO_PIN_7 | GPIO_PIN_8 | GPIO_PIN_9;
  21.     gpioConfig.mode    = GPIO_MODE_AF;
  22.     gpioConfig.outtype = GPIO_OUT_TYPE_PP;
  23.     gpioConfig.speed   = GPIO_SPEED_50MHz;
  24.     gpioConfig.pupd    = GPIO_PUPD_NO;
  25.     GPIO_Config(GPIOC, &gpioConfig);
  26.    
  27.     GPIO_ConfigPinAF(GPIOC, GPIO_PIN_SOURCE_6, GPIO_AF_PIN0);
  28.     GPIO_ConfigPinAF(GPIOC, GPIO_PIN_SOURCE_7, GPIO_AF_PIN0);
  29.     GPIO_ConfigPinAF(GPIOC, GPIO_PIN_SOURCE_8, GPIO_AF_PIN0);
  30.     GPIO_ConfigPinAF(GPIOC, GPIO_PIN_SOURCE_9, GPIO_AF_PIN0);
  31. }
  1. /*
  2. * @brief       定时器初始化
  3. *
  4. * @param       ms: 定时间隔
  5. *
  6. * @retval      None
  7. *
  8. */
  9. void bsp_tim_init(uint16_t ms)
  10. {
  11.     TMR_TimeBase_T timeBaseConfig;
  12.     TMR_OCConfig_T OCcongigStruct;
  13.    
  14.     /* 寄存器AUTORLD为16bit */
  15.     if ((ms >= 1) && (ms <= 6553)) {
  16.         bsp_tim_pwm_gpio_init();
  17.         
  18.         /* 定时器周期 */
  19.         RCM_EnableAPB1PeriphClock(RCM_APB1_PERIPH_TMR3);
  20.         TMR_Reset(TIM_INS);
  21.         TMR_ConfigTimeBaseStruct(&timeBaseConfig);
  22.         /* CK_CNT=fCK_PSC/(PSC+1) */
  23.         timeBaseConfig.div = 7200 - 1;              /* 10KHz */
  24.         timeBaseConfig.period = (ms * 10) - 1;
  25.         timeBaseConfig.clockDivision = TMR_CKD_DIV1;
  26.         timeBaseConfig.counterMode = TMR_COUNTER_MODE_UP;
  27.         timeBaseConfig.repetitionCounter = 0;
  28.         TMR_ConfigTimeBase(TIM_INS, &timeBaseConfig);
  29.         
  30.         /* PWM */
  31.         DUTY_100 = timeBaseConfig.period;
  32.         TMR_OCConfigStructInit(&OCcongigStruct);
  33.         /* PWM 模式 1(计数器值 < 输出比较值时置为高,否则反之) */
  34.         OCcongigStruct.OC_Mode = TMR_OC_MODE_PWM1;
  35.         /* 输出使能 */
  36.         OCcongigStruct.OC_OutputState = TMR_OUTPUT_STATE_ENABLE;
  37.         OCcongigStruct.OC_OutputNState = TMR_OUTPUT_NSTATE_DISABLE;
  38.         /* 默认50%占空比 */
  39.         OCcongigStruct.Pulse = (DUTY_100 + 1) / 2;
  40.         OCcongigStruct.OC_Polarity = TMR_OC_POLARITY_HIGH;
  41.         OCcongigStruct.OC_NPolarity = TMR_OC_NPOLARITY_HIGH;
  42.         OCcongigStruct.OC_Idlestate = TMR_OCIDLESTATE_RESET;
  43.         OCcongigStruct.OC_NIdlestate = TMR_OCNIDLESTATE_RESET;
  44.         TMR_OC1Config(TIM_INS, &OCcongigStruct);
  45.         TMR_OC2Config(TIM_INS, &OCcongigStruct);
  46.         TMR_OC3Config(TIM_INS, &OCcongigStruct);
  47.         TMR_OC4Config(TIM_INS, &OCcongigStruct);
  48.         /* 使能预装载功能: 写入比较寄存器CC的值在更新事件后才起作用 */
  49.         TMR_OC1PreloadConfig(TIM_INS, TMR_OC_PRELOAD_ENABLE);
  50.         TMR_OC2PreloadConfig(TIM_INS, TMR_OC_PRELOAD_ENABLE);
  51.         TMR_OC3PreloadConfig(TIM_INS, TMR_OC_PRELOAD_ENABLE);
  52.         TMR_OC4PreloadConfig(TIM_INS, TMR_OC_PRELOAD_ENABLE);
  53.         
  54.         /* 使能更新中断 */
  55.         TMR_EnableInterrupt(TIM_INS, TMR_INT_UPDATE);
  56.         /* 使能中断 */
  57.         NVIC_SetPriority(TMR3_IRQn, 0);
  58.         NVIC_EnableIRQ(TMR3_IRQn);   
  59.         
  60.         /* 使能定时器 */
  61.         TMR_Enable(TIM_INS);
  62.     }
  63. }
  1. /*
  2. * @brief       中断
  3. *
  4. * @param       None
  5. *
  6. * @retval      None
  7. *
  8. */
  9. void TMR3_IRQHandler(void)
  10. {
  11.     if (TMR_ReadIntFlag(TIM_INS,  TMR_INT_FLAG_UPDATE) == SET) {
  12.         TMR_ClearIntFlag(TIM_INS,  TMR_INT_FLAG_UPDATE);
  13.         (tim_update_deal_func != NULL) ? tim_update_deal_func() : NULL;
  14.     }
  15. }
  1. /*
  2. * @brief       定时器更新处理函数注册
  3. *
  4. * @param       func: 定时器更新中断处理函数
  5. *
  6. * @retval      None
  7. *
  8. */
  9. void bsp_tim_update_deal_func_register(tim_update_deal_func_f func)
  10. {
  11.     tim_update_deal_func = func;
  12. }
  1. /*
  2. * @brief       PWM占空比设置
  3. *
  4. * @param       duty1: PWM1占空比
  5. *              duty2: PWM2占空比
  6. *              duty3: PWM3占空比
  7. *              duty4: PWM4占空比
  8. *
  9. * @retval      None
  10. *
  11. */
  12. void bsp_pwm_duty_set(uint8_t duty1, uint8_t duty2, uint8_t duty3, uint8_t duty4)
  13. {
  14.     (duty1 <= 100) ? \
  15.         TMR_SetCompare1(TIM_INS, (DUTY_100 + 1) * duty1 / 100) : NULL;
  16.     (duty2 <= 100) ? \
  17.         TMR_SetCompare2(TIM_INS, (DUTY_100 + 1) * duty2 / 100) : NULL;
  18.     (duty3 <= 100) ? \
  19.         TMR_SetCompare3(TIM_INS, (DUTY_100 + 1) * duty3 / 100) : NULL;
  20.     (duty4 <= 100) ? \
  21.         TMR_SetCompare4(TIM_INS, (DUTY_100 + 1) * duty4 / 100) : NULL;
  22. }


测试代码如下:
  1. /* 占空比 */
  2. uint8_t pwm1_duty = 20;
  3. uint8_t pwm2_duty = 40;
  4. uint8_t pwm3_duty = 60;
  5. uint8_t pwm4_duty = 80;
  1. void test_gpio_init(void)
  2. {
  3.     GPIO_Config_T gpioConfig;
  4.     RCM_EnableAHBPeriphClock(RCM_AHB_PERIPH_GPIOA);
  5.     GPIO_ConfigStructInit(&gpioConfig);
  6.     gpioConfig.pin     = GPIO_PIN_5;
  7.     gpioConfig.mode    = GPIO_MODE_OUT;
  8.     gpioConfig.outtype = GPIO_OUT_TYPE_PP;
  9.     gpioConfig.speed   = GPIO_SPEED_50MHz;
  10.     gpioConfig.pupd    = GPIO_PUPD_NO;
  11.     GPIO_Config(GPIOA, &gpioConfig);
  12. }
  1. void test_gpio_toggle(void)
  2. {
  3.     (GPIO_ReadOutputBit(GPIOA, GPIO_PIN_5) == BIT_SET) ? \
  4.         GPIO_ClearBit(GPIOA, GPIO_PIN_5) : \
  5.         GPIO_SetBit(GPIOA, GPIO_PIN_5);
  6. }
  1. // 应用初始化
  2. void app_init(void)
  3. {
  4.     test_gpio_init();
  5.     bsp_tim_update_deal_func_register(test_gpio_toggle);
  6.     bsp_tim_init(100);
  7. }
  1. // 应用任务
  2. void app_task(void)
  3. {
  4.     bsp_pwm_duty_set(pwm1_duty, pwm2_duty, pwm3_duty, pwm4_duty);
  5. }
3280568ef84ba9aac9.png

详细代码,请查看附件!
PWM.zip (2.12 MB, 下载次数: 0)




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

本版积分规则

26

主题

54

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部