打印
[MM32生态]

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

[复制链接]
1121|13
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
本帖最后由 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 | 只看该作者
阻塞方式效率太低

使用特权

评论回复
评论
freeelectron 2022-12-3 16:09 回复TA
所以用非阻塞的 
板凳
tpgf| | 2023-1-2 13:12 | 只看该作者
请问什么是阻塞点灯,什么又是非阻塞点灯呢

使用特权

评论回复
地板
qcliu| | 2023-1-2 13:18 | 只看该作者
在什么情况下我们会用到阻塞方式的点灯呢

使用特权

评论回复
5
drer| | 2023-1-2 13:31 | 只看该作者
阻塞方式点灯,即就是死等,在等待期间mcu干不了其他事情(中断除外

使用特权

评论回复
6
coshi| | 2023-1-2 13:38 | 只看该作者
哪种方式能更加节省单片机的资源呢

使用特权

评论回复
7
kxsi| | 2023-1-2 13:50 | 只看该作者
非阻塞点灯很不错 定时器感觉准不准啊

使用特权

评论回复
8
wiba| | 2023-1-2 14:09 | 只看该作者
定时器能够一次性定时的最长时间是多少啊

使用特权

评论回复
9
Jacquetry| | 2023-1-5 17:15 | 只看该作者
非阻塞点灯很不错

使用特权

评论回复
10
adolphcocker| | 2023-1-9 14:48 | 只看该作者
为什么不使用pwm呢              

使用特权

评论回复
11
freeelectron|  楼主 | 2023-1-15 16:34 | 只看该作者
adolphcocker 发表于 2023-1-9 14:48
为什么不使用pwm呢

pwm你要额外使用一个定时器,而且还只能是特定的引脚

使用特权

评论回复
12
wwppd| | 2023-2-2 16:01 | 只看该作者
MM32L0136C7P的性能怎么样

使用特权

评论回复
13
biechedan| | 2023-2-4 17:27 | 只看该作者
使用定时器就可以无阻塞点灯了。              

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

65

主题

785

帖子

11

粉丝