[MM32硬件] 【灵动微电子MM32F5330测评】3、定时器实现LED闪烁

[复制链接]
 楼主| qintian0303 发表于 2024-7-1 11:13 | 显示全部楼层 |阅读模式
<
本帖最后由 qintian0303 于 2024-7-1 11:14 编辑

       我们在第一部分实现了LED控制和按键的采集,接下来我们体验定时器的基本定时功能,实现LED的闪烁。我们在上一部分的基础上增加定时闪烁功能,例如按键按下时对应的LED开始闪烁,再按下时关闭闪烁功能。主要设计的两部分,一个是定时器的初始化以及中断处理,另一个就是按键控制的逻辑判断。
       咱们先看一看板载芯片的定时器资源情况:
1.png

       这次只是用定时器定时功能,所以选择基础定时器就可以,基础定时器(TIM6 / TIM7)均基于一个 16 位自动重载递增计数器和一个 16 位预分频器。
       先看第一部分定时器的初始化,定时10ms:
  1. void MM_TIM6_Init(void)
  2. {
  3.     uint32_t TIM6_Clock;
  4.     uint16_t Prescaler;
  5.     uint16_t Period
  6.    
  7.     NVIC_InitTypeDef        NVIC_InitStruct;
  8.     TIM_TimeBaseInitTypeDef TIM_TimeBaseStruct;

  9.     RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM6, ENABLE);

  10.     TIM6_Clock = TIM_GetTIMxClock(TIM6);
  11.    
  12.     Period = 10000;
  13.     Prescaler = TIM6_Clock/10000/100;

  14.     TIM_TimeBaseStructInit(&TIM_TimeBaseStruct);
  15.     TIM_TimeBaseStruct.TIM_Prescaler         = (Prescaler - 1);
  16.     TIM_TimeBaseStruct.TIM_CounterMode       = TIM_CounterMode_Up;
  17.     TIM_TimeBaseStruct.TIM_Period            = (Period - 1);
  18.     TIM_TimeBaseStruct.TIM_ClockDivision     = TIM_CKD_Div1;
  19.     TIM_TimeBaseStruct.TIM_RepetitionCounter = 0;
  20.     TIM_TimeBaseInit(TIM6, &TIM_TimeBaseStruct);

  21.     TIM_ITConfig(TIM6, TIM_IT_Update, ENABLE);

  22.     NVIC_InitStruct.NVIC_IRQChannel = TIM6_IRQn;
  23.     NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 0;
  24.     NVIC_InitStruct.NVIC_IRQChannelSubPriority = 1;
  25.     NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE;
  26.     NVIC_Init(&NVIC_InitStruct);

  27.     TIM_Cmd(TIM6, ENABLE);
  28.    
  29. }
      重点是操作,为了实现我们添加了部分标志位:
  1. <article data-content="[{&quot;type&quot;:&quot;block&quot;,&quot;id&quot;:&quot;C3ml-1719558559989&quot;,&quot;name&quot;:&quot;code&quot;,&quot;data&quot;:{&quot;wrap&quot;:false,&quot;tokensPerLine&quot;:[],&quot;language&quot;:&quot;&quot;,&quot;theme&quot;:&quot;default&quot;},&quot;nodes&quot;:[{&quot;type&quot;:&quot;block&quot;,&quot;id&quot;:&quot;VF4X-1719558559988&quot;,&quot;name&quot;:&quot;code-line&quot;,&quot;data&quot;:{},&quot;nodes&quot;:[{&quot;type&quot;:&quot;text&quot;,&quot;id&quot;:&quot;Wr4c-1719558559987&quot;,&quot;leaves&quot;:[{&quot;text&quot;:&quot;uint8_t blink_flag = 0;&quot;,&quot;marks&quot;:[]}]}]},{&quot;type&quot;:&quot;block&quot;,&quot;id&quot;:&quot;odNN-1719558645342&quot;,&quot;name&quot;:&quot;code-line&quot;,&quot;data&quot;:{},&quot;nodes&quot;:[{&quot;type&quot;:&quot;text&quot;,&quot;id&quot;:&quot;JIjd-1719558645341&quot;,&quot;leaves&quot;:[{&quot;text&quot;:&quot;uint8_t key1_flag = 0;&quot;,&quot;marks&quot;:[]}]}]},{&quot;type&quot;:&quot;block&quot;,&quot;id&quot;:&quot;0alW-1719558646024&quot;,&quot;name&quot;:&quot;code-line&quot;,&quot;data&quot;:{},&quot;nodes&quot;:[{&quot;type&quot;:&quot;text&quot;,&quot;id&quot;:&quot;I8PT-1719558646023&quot;,&quot;leaves&quot;:[{&quot;text&quot;:&quot;uint8_t key2_flag = 0;&quot;,&quot;marks&quot;:[]}]}]},{&quot;type&quot;:&quot;block&quot;,&quot;id&quot;:&quot;0Nhu-1719558646026&quot;,&quot;name&quot;:&quot;code-line&quot;,&quot;data&quot;:{},&quot;nodes&quot;:[{&quot;type&quot;:&quot;text&quot;,&quot;id&quot;:&quot;Iznk-1719558646025&quot;,&quot;leaves&quot;:[{&quot;text&quot;:&quot;uint8_t key3_flag = 0;&quot;,&quot;marks&quot;:[]}]}]},{&quot;type&quot;:&quot;block&quot;,&quot;id&quot;:&quot;goGI-1719558646028&quot;,&quot;name&quot;:&quot;code-line&quot;,&quot;data&quot;:{},&quot;nodes&quot;:[{&quot;type&quot;:&quot;text&quot;,&quot;id&quot;:&quot;JQOu-1719558646027&quot;,&quot;leaves&quot;:[{&quot;text&quot;:&quot;uint8_t key4_flag = 0;&quot;,&quot;marks&quot;:[]}]}]},{&quot;type&quot;:&quot;block&quot;,&quot;id&quot;:&quot;E9zL-1719558818333&quot;,&quot;name&quot;:&quot;code-line&quot;,&quot;data&quot;:{},&quot;nodes&quot;:[{&quot;type&quot;:&quot;text&quot;,&quot;id&quot;:&quot;2cGX-1719558818332&quot;,&quot;leaves&quot;:[{&quot;text&quot;:&quot;uint16_t blink_cnt = 0;&quot;,&quot;marks&quot;:[]}]}]}],&quot;state&quot;:{}}]"><div yne-bulb-block="code" data-theme="default" style="white-space:pre-wrap;" data-language="">uint8_t blink_flag = 0;
  2. uint8_t key1_flag = 0;
  3. uint8_t key2_flag = 0;
  4. uint8_t key3_flag = 0;
  5. uint8_t key4_flag = 0;
  6. uint16_t blink_cnt = 0;</div></article>
      在外部中断中不在直接操作LED翻转,而是进行标志位的变化,定时器中断中进行定时翻转,在按键状态为1的情况下:
  1. void EXTI4_IRQHandler(void)
  2. {
  3.     /* K1 */
  4.     if (SET == EXTI_GetITStatus(EXTI_Line4))
  5.     {
  6.         if(key1_flag == 0)
  7.             key1_flag = 1;
  8.         else
  9.             key1_flag = 0;
  10.         EXTI_ClearITPendingBit(EXTI_Line4);
  11.     }
  12. }

  13. void TIM6_IRQHandler(void)
  14. {
  15.     if (RESET != TIM_GetITStatus(TIM6, TIM_IT_Update))
  16.     {
  17.     if((blink_flag == 0)&&(key1_flag == 1||key2_flag == 1||key3_flag == 1||key4_flag == 1))
  18.     {
  19.         blink_cnt++;
  20.         if(blink_cnt>=50)
  21.         {
  22.             blink_flag =1;
  23.             blink_cnt = 0;
  24.         }
  25.     }
  26.         TIM_ClearITPendingBit(TIM6, TIM_IT_Update);
  27.     }
  28. }
      最后在主while进行判断处理:
  1. while (1)
  2.     {
  3.         if(blink_flag == 1)
  4.         {
  5.             if(key1_flag == 1)
  6.                 MM_LED1_Toggle;
  7.             if(key2_flag == 1)
  8.                 MM_LED2_Toggle;
  9.             if(key3_flag == 1)
  10.                 MM_LED3_Toggle;
  11.             if(key4_flag == 1)
  12.                 MM_LED4_Toggle;
  13.             
  14.             blink_flag = 0;
  15.         }
  16.     }
      效果视频如下:
2、定时器实现LED闪烁.gif

jhcj2014 发表于 2024-7-1 22:52 | 显示全部楼层
你们板子很好调,我的板子折腾得不想弄了,原先用J-LINK OB连不上,买了一个新J-LINK 用J-FLASH 能连上,但又显示MCU被写和读保护了,现在不知道怎么解锁。厂家就说了一个BOOT0接高电平,擦除。就一句话,太简洁了。一个晚上都解决不了。
caigang13 发表于 2024-7-2 08:13 来自手机 | 显示全部楼层
LED控制的高阶应用是呼吸灯
 楼主| qintian0303 发表于 2024-7-2 09:20 | 显示全部楼层
caigang13 发表于 2024-7-2 08:13
LED控制的高阶应用是呼吸灯

慢慢来,呼吸灯属于定时器PWM的应用,一点一点循序渐进
 楼主| qintian0303 发表于 2024-7-2 09:21 | 显示全部楼层
jhcj2014 发表于 2024-7-1 22:52
你们板子很好调,我的板子折腾得不想弄了,原先用J-LINK OB连不上,买了一个新J-LINK 用J-FLASH 能连上,但 ...

直接找了一个下载器用SWD模式,只需要接2根线就可以了
jhcj2014 发表于 2024-7-2 12:26 | 显示全部楼层
qintian0303 发表于 2024-7-2 09:21
直接找了一个下载器用SWD模式,只需要接2根线就可以了

就是连不上MCU
gangong 发表于 2024-10-25 20:35 | 显示全部楼层
楼主棒
您需要登录后才可以回帖 登录 | 注册

本版积分规则

认证:硬件工程师
简介:有着多年硬件开发经验的专业人员,专注于医疗电子领域,热衷于对新鲜事物的探索,喜欢DIY!

556

主题

2718

帖子

12

粉丝
快速回复 在线客服 返回列表 返回顶部
认证:硬件工程师
简介:有着多年硬件开发经验的专业人员,专注于医疗电子领域,热衷于对新鲜事物的探索,喜欢DIY!

556

主题

2718

帖子

12

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