[MM32生态] 【EV Board (MM32L0136C7P)测评】+非阻塞点灯、定时器1ms周期中断

[复制链接]
1504|13
 楼主| freeelectron 发表于 2022-12-2 17:30 | 显示全部楼层 |阅读模式
本帖最后由 freeelectron 于 2022-12-2 17:33 编辑

#申请原创# 本文主要实现以下功能:

最简单的方式是用的阻塞方式点灯,即就是死等,在等待期间mcu干不了其他事情(中断除外),这种方式不太友好,本文使用非阻塞方式点灯;

普通定时器1ms一次中断,为整个系统应用层提供时钟,

1、定时器16配置为1ms中断一次
  1. #define TIM               (TIM_Type *)TIM16

  2. static uint32_t systemtick=0;
  3.         
  4. /* Setup the timer. */
  5. void TimInit(void)
  6. {
  7.     RCC_EnableAPB2Periphs(RCC_APB2_PERIPH_TIM16, true);
  8.     RCC_ResetAPB2Periphs(RCC_APB2_PERIPH_TIM16);
  9.     /* Set the counter counting step. */
  10.     TIM_Init_Type tim_init;
  11.         
  12.     tim_init.ClockFreqHz = 48000000;
  13. //    tim_init.StepFreqHz = 48; /* 1s. */
  14.         tim_init.StepFreqHz = 1000000; /* 1s. */

  15.     tim_init.Period = 1000u - 1u;
  16.     tim_init.EnablePreloadPeriod = true;
  17.     tim_init.PeriodMode = TIM_PeriodMode_Continuous;
  18.     tim_init.CountMode = TIM_CountMode_Increasing;
  19.     TIM_Init(TIM, &tim_init);

  20.     /* Enable interrupt. */
  21.     NVIC_EnableIRQ(TIM16_IRQn);
  22.     TIM_EnableInterrupts(TIM, TIM_INT_UPDATE_PERIOD, true);

  23.     /* Start the counter. */
  24.     TIM_Start(TIM);
  25. }

  26. /* TIM_BASIC Period timeout ISR. */
  27. void TIM16_IRQHandler(void)
  28. {
  29.     uint32_t flags = TIM_GetInterruptStatus(TIM);
  30.     if ( 0u != (flags & TIM_STATUS_UPDATE_PERIOD ) ) /* Check update status. */
  31.     {
  32.                 systemtick++;
  33.     }
  34.     TIM_ClearInterruptStatus(TIM, flags);
  35. }


  36. uint32_t SystemGetTick(void)
  37. {
  38.         return systemtick;
  39. }
2、非阻塞点灯,500ms闪烁一次
914756389c398c6567.png 196436389c387b6e5d.png
  1. void LedInit(void)
  2. {
  3.         RCC_EnableAHBPeriphs(RCC_AHB_PERIPH_GPIOB, true);
  4.     RCC_ResetAHBPeriphs(RCC_AHB_PERIPH_GPIOB);
  5.         
  6.         RCC_EnableAHBPeriphs(RCC_AHB_PERIPH_GPIOC, true);
  7.     RCC_ResetAHBPeriphs(RCC_AHB_PERIPH_GPIOC);
  8.         
  9.         
  10.         GPIO_Init_Type gpio_init;

  11.     /* LED0. */
  12.     gpio_init.Pins  = GPIO_PIN_9;
  13.     gpio_init.PinMode  = GPIO_PinMode_Out_PushPull;
  14.     gpio_init.Speed = GPIO_Speed_50MHz;
  15.     GPIO_Init(GPIOB, &gpio_init);

  16.     /* LED1. */
  17.     gpio_init.Pins  = GPIO_PIN_10;
  18.     gpio_init.PinMode  = GPIO_PinMode_Out_PushPull;
  19.     gpio_init.Speed = GPIO_Speed_50MHz;
  20.     GPIO_Init(GPIOB, &gpio_init);
  21.         
  22.         
  23.         /* LED2. */
  24.     gpio_init.Pins  = GPIO_PIN_11;
  25.     gpio_init.PinMode  = GPIO_PinMode_Out_PushPull;
  26.     gpio_init.Speed = GPIO_Speed_50MHz;
  27.     GPIO_Init(GPIOB, &gpio_init);
  28.         
  29.         
  30.         /* LED3. */
  31.     gpio_init.Pins  = GPIO_PIN_0;
  32.     gpio_init.PinMode  = GPIO_PinMode_Out_PushPull;
  33.     gpio_init.Speed = GPIO_Speed_50MHz;
  34.     GPIO_Init(GPIOC, &gpio_init);        
  35. }



  36. void SystemRun(void)
  37. {
  38.         static uint32_t tick=0;
  39.         static uint8_t state=0;
  40.         
  41.         if(SystemGetTick()-tick>500)
  42.         {
  43.                 tick=SystemGetTick();
  44.                
  45.                 if(state)
  46.                 {
  47.                         GPIO_WriteBit(GPIOB, GPIO_PIN_9, 0u);
  48.                         GPIO_WriteBit(GPIOB, GPIO_PIN_10, 0u); /* led on. */
  49.                         GPIO_WriteBit(GPIOB, GPIO_PIN_11, 0u); /* led on. */
  50.                         
  51.                         
  52.                         GPIO_WriteBit(GPIOC, GPIO_PIN_0, 0u); /* led on. */

  53.                 }
  54.                 else
  55.                 {
  56.                         GPIO_WriteBit(GPIOB, GPIO_PIN_9, 1u); /* led off. */
  57.                         GPIO_WriteBit(GPIOB, GPIO_PIN_10, 1u);
  58.                         GPIO_WriteBit(GPIOB, GPIO_PIN_11, 1u); /* led on. */

  59.                         GPIO_WriteBit(GPIOC, GPIO_PIN_0, 1u); /* led on. */
  60.                 }
  61.                
  62.                 state=!state;
  63.         }
  64. }
blink.gif



chenjun89 发表于 2022-12-2 18:51 来自手机 | 显示全部楼层
阻塞方式效率太低

评论

所以用非阻塞的  发表于 2022-12-3 16:09
tpgf 发表于 2023-1-2 13:12 | 显示全部楼层
请问什么是阻塞点灯,什么又是非阻塞点灯呢
qcliu 发表于 2023-1-2 13:18 | 显示全部楼层
在什么情况下我们会用到阻塞方式的点灯呢
drer 发表于 2023-1-2 13:31 | 显示全部楼层
阻塞方式点灯,即就是死等,在等待期间mcu干不了其他事情(中断除外
coshi 发表于 2023-1-2 13:38 | 显示全部楼层
哪种方式能更加节省单片机的资源呢
kxsi 发表于 2023-1-2 13:50 | 显示全部楼层
非阻塞点灯很不错 定时器感觉准不准啊
wiba 发表于 2023-1-2 14:09 | 显示全部楼层
定时器能够一次性定时的最长时间是多少啊
Jacquetry 发表于 2023-1-5 17:15 | 显示全部楼层
非阻塞点灯很不错
adolphcocker 发表于 2023-1-9 14:48 | 显示全部楼层
为什么不使用pwm呢              
 楼主| freeelectron 发表于 2023-1-15 16:34 | 显示全部楼层
adolphcocker 发表于 2023-1-9 14:48
为什么不使用pwm呢

pwm你要额外使用一个定时器,而且还只能是特定的引脚
wwppd 发表于 2023-2-2 16:01 | 显示全部楼层
MM32L0136C7P的性能怎么样
biechedan 发表于 2023-2-4 17:27 | 显示全部楼层
使用定时器就可以无阻塞点灯了。              
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:stm32/LoRa物联网:304350312

66

主题

786

帖子

11

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