freeelectron 发表于 2022-12-2 17:30

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

本帖最后由 freeelectron 于 2022-12-2 17:33 编辑

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

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

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

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

static uint32_t systemtick=0;
      
/* Setup the timer. */
void TimInit(void)
{
    RCC_EnableAPB2Periphs(RCC_APB2_PERIPH_TIM16, true);
    RCC_ResetAPB2Periphs(RCC_APB2_PERIPH_TIM16);
    /* Set the counter counting step. */
    TIM_Init_Type tim_init;
      
    tim_init.ClockFreqHz = 48000000;
//    tim_init.StepFreqHz = 48; /* 1s. */
      tim_init.StepFreqHz = 1000000; /* 1s. */

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

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

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

/* TIM_BASIC Period timeout ISR. */
void TIM16_IRQHandler(void)
{
    uint32_t flags = TIM_GetInterruptStatus(TIM);
    if ( 0u != (flags & TIM_STATUS_UPDATE_PERIOD ) ) /* Check update status. */
    {
                systemtick++;
    }
    TIM_ClearInterruptStatus(TIM, flags);
}


uint32_t SystemGetTick(void)
{
      return systemtick;
}
2、非阻塞点灯,500ms闪烁一次

void LedInit(void)
{
      RCC_EnableAHBPeriphs(RCC_AHB_PERIPH_GPIOB, true);
    RCC_ResetAHBPeriphs(RCC_AHB_PERIPH_GPIOB);
      
      RCC_EnableAHBPeriphs(RCC_AHB_PERIPH_GPIOC, true);
    RCC_ResetAHBPeriphs(RCC_AHB_PERIPH_GPIOC);
      
      
      GPIO_Init_Type gpio_init;

    /* LED0. */
    gpio_init.Pins= GPIO_PIN_9;
    gpio_init.PinMode= GPIO_PinMode_Out_PushPull;
    gpio_init.Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOB, &gpio_init);

    /* LED1. */
    gpio_init.Pins= GPIO_PIN_10;
    gpio_init.PinMode= GPIO_PinMode_Out_PushPull;
    gpio_init.Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOB, &gpio_init);
      
      
      /* LED2. */
    gpio_init.Pins= GPIO_PIN_11;
    gpio_init.PinMode= GPIO_PinMode_Out_PushPull;
    gpio_init.Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOB, &gpio_init);
      
      
      /* LED3. */
    gpio_init.Pins= GPIO_PIN_0;
    gpio_init.PinMode= GPIO_PinMode_Out_PushPull;
    gpio_init.Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOC, &gpio_init);      
}



void SystemRun(void)
{
      static uint32_t tick=0;
      static uint8_t state=0;
      
      if(SystemGetTick()-tick>500)
      {
                tick=SystemGetTick();
               
                if(state)
                {
                        GPIO_WriteBit(GPIOB, GPIO_PIN_9, 0u);
                        GPIO_WriteBit(GPIOB, GPIO_PIN_10, 0u); /* led on. */
                        GPIO_WriteBit(GPIOB, GPIO_PIN_11, 0u); /* led on. */
                        
                        
                        GPIO_WriteBit(GPIOC, GPIO_PIN_0, 0u); /* led on. */

                }
                else
                {
                        GPIO_WriteBit(GPIOB, GPIO_PIN_9, 1u); /* led off. */
                        GPIO_WriteBit(GPIOB, GPIO_PIN_10, 1u);
                        GPIO_WriteBit(GPIOB, GPIO_PIN_11, 1u); /* led on. */

                        GPIO_WriteBit(GPIOC, GPIO_PIN_0, 1u); /* led on. */
                }
               
                state=!state;
      }
}



chenjun89 发表于 2022-12-2 18:51

阻塞方式效率太低

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

使用定时器就可以无阻塞点灯了。            
页: [1]
查看完整版本: 【EV Board (MM32L0136C7P)测评】+非阻塞点灯、定时器1ms周期中断