[MM32硬件] 【灵动微电子MM32F0121测评】+3PWM驱动LED灯做呼吸灯

[复制链接]
 楼主| stb988 发表于 2025-6-18 15:00 | 显示全部楼层 |阅读模式
在之前做了开箱与串口打印,这次就做一个呼吸灯,用PWM波驱动开发板自带的LED,开发板的LED是在B14,B15 io口,
用TIM1驱动,关键代理如下
  1. void TIM1_Configure(void)
  2. {
  3.     RCC_ClocksTypeDef       RCC_Clocks;
  4.     GPIO_InitTypeDef        GPIO_InitStruct;
  5.     TIM_OCInitTypeDef       TIM_OCInitStruct;
  6.     TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStruct;
  7.     uint32_t                TIM_ClockFrequency = 0;
  8.     uint32_t                HPRE = 0, PPRE2 = 0;

  9.     uint32_t TimerPeriod = 0, Channel1Pulse = 0, Channel2Pulse = 0, Channel3Pulse = 0;

  10.     HPRE  = READ_BIT(RCC->CFGR, RCC_CFGR_HPRE)  >> RCC_CFGR_HPRE_Pos;
  11.     PPRE2 = READ_BIT(RCC->CFGR, RCC_CFGR_PPRE2) >> RCC_CFGR_PPRE2_Pos;

  12.     RCC_GetClocksFreq(&RCC_Clocks);

  13.     if (HPRE < 8)
  14.     {
  15.         if (PPRE2 < 4)
  16.         {
  17.             TIM_ClockFrequency = RCC_Clocks.PCLK1_Frequency;
  18.         }
  19.         else
  20.         {
  21.             TIM_ClockFrequency = RCC_Clocks.PCLK1_Frequency * 2;
  22.         }
  23.     }
  24.     else
  25.     {
  26.         if (PPRE2 < 4)
  27.         {
  28.             TIM_ClockFrequency = RCC_Clocks.PCLK1_Frequency * 2;
  29.         }
  30.         else
  31.         {
  32.             TIM_ClockFrequency = RCC_Clocks.PCLK1_Frequency * 4;
  33.         }
  34.     }

  35.     /* Compute the value to be set in ARR regiter to generate signal frequency at 100 Khz */
  36.     TimerPeriod = TIM_ClockFrequency / 100000;

  37.     /* Compute CCR1 value to generate a duty cycle at 75% for channel 1 */
  38.     Channel1Pulse = (uint32_t)750 * TimerPeriod / 1000;

  39.     /* Compute CCR2 value to generate a duty cycle at 50% for channel 2 */
  40.     Channel2Pulse = (uint32_t)500 * TimerPeriod / 1000;

  41.     /* Compute CCR3 value to generate a duty cycle at 25% for channel 3 */
  42.     Channel3Pulse = (uint32_t)250 * TimerPeriod / 1000;

  43.     RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1, ENABLE);

  44.     TIM_TimeBaseStructInit(&TIM_TimeBaseInitStruct);
  45.     TIM_TimeBaseInitStruct.TIM_Prescaler         = 0;
  46.     TIM_TimeBaseInitStruct.TIM_CounterMode       = TIM_CounterMode_Up;
  47.     TIM_TimeBaseInitStruct.TIM_Period            = TimerPeriod;
  48.     TIM_TimeBaseInitStruct.TIM_ClockDivision     = TIM_CKD_Div1;
  49.     TIM_TimeBaseInitStruct.TIM_RepetitionCounter = 0;
  50.     TIM_TimeBaseInit(TIM1, &TIM_TimeBaseInitStruct);

  51.     TIM_OCStructInit(&TIM_OCInitStruct);
  52.     TIM_OCInitStruct.TIM_OCMode       = TIM_OCMode_PWM1;
  53.     TIM_OCInitStruct.TIM_OutputState  = TIM_OutputState_Enable;
  54.     TIM_OCInitStruct.TIM_Pulse        = 0;
  55.     TIM_OCInitStruct.TIM_OCPolarity   = TIM_OCPolarity_High;
  56.     TIM_OCInitStruct.TIM_OCIdleState  = TIM_OCIdleState_Set;

  57.     TIM_OCInitStruct.TIM_Pulse = Channel1Pulse;
  58.     TIM_OC1Init(TIM1, &TIM_OCInitStruct);

  59.     TIM_OCInitStruct.TIM_Pulse = Channel2Pulse;
  60.     TIM_OC2Init(TIM1, &TIM_OCInitStruct);

  61.     TIM_OCInitStruct.TIM_Pulse = Channel3Pulse;
  62.     TIM_OC3Init(TIM1, &TIM_OCInitStruct);


  63.     RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOB, ENABLE);



  64.     GPIO_PinAFConfig(GPIOB, GPIO_PinSource14,  GPIO_AF_7);   /* TIM1_CH1 */

  65.     GPIO_PinAFConfig(GPIOB, GPIO_PinSource15,  GPIO_AF_7);   /* TIM1_CH2 */



  66.     GPIO_StructInit(&GPIO_InitStruct);

  67.     GPIO_InitStruct.GPIO_Pin   = GPIO_Pin_14 | GPIO_Pin_15 ;

  68.     GPIO_InitStruct.GPIO_Speed = GPIO_Speed_High;

  69.     GPIO_InitStruct.GPIO_Mode  = GPIO_Mode_AF_PP;

  70.     GPIO_Init(GPIOB, &GPIO_InitStruct);

  71.     TIM_Cmd(TIM1, ENABLE);

  72.     TIM_CtrlPWMOutputs(TIM1, ENABLE);
  73. }
然后在例程中的这里改一下
  1. void TIM1_PWM_Output_Sample(void)
  2. {
  3.         uint16_t i =0;
  4.     printf("\r\nTest %s", __FUNCTION__);

  5.     TIM1_Configure();

  6.     while (1)
  7.     {
  8.          TIM1->CCR1 = 1440 - (i++%1440);

  9.          TIM1->CCR2 = (i++%1440);



  10.           PLATFORM_DelayMS(1);
  11.     }
  12. }
下面上效果
VID_20250618_144455.mp4_20250618_145227.gif
AdaMaYun 发表于 2025-7-31 17:56 | 显示全部楼层
PWM驱动LED灯做呼吸灯
您需要登录后才可以回帖 登录 | 注册

本版积分规则

53

主题

393

帖子

2

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