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

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


       这次只是用定时器定时功能,所以选择基础定时器就可以,基础定时器(TIM6 / TIM7)均基于一个 16 位自动重载递增计数器和一个 16 位预分频器。
       先看第一部分定时器的初始化,定时10ms:

复制
void MM_TIM6_Init(void)

{

    uint32_t TIM6_Clock;

    uint16_t Prescaler;

    uint16_t Period

    

    NVIC_InitTypeDef        NVIC_InitStruct;

    TIM_TimeBaseInitTypeDef TIM_TimeBaseStruct;



    RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM6, ENABLE);



    TIM6_Clock = TIM_GetTIMxClock(TIM6);

    

    Period = 10000;

    Prescaler = TIM6_Clock/10000/100;



    TIM_TimeBaseStructInit(&TIM_TimeBaseStruct);

    TIM_TimeBaseStruct.TIM_Prescaler         = (Prescaler - 1);

    TIM_TimeBaseStruct.TIM_CounterMode       = TIM_CounterMode_Up;

    TIM_TimeBaseStruct.TIM_Period            = (Period - 1);

    TIM_TimeBaseStruct.TIM_ClockDivision     = TIM_CKD_Div1;

    TIM_TimeBaseStruct.TIM_RepetitionCounter = 0;

    TIM_TimeBaseInit(TIM6, &TIM_TimeBaseStruct);



    TIM_ITConfig(TIM6, TIM_IT_Update, ENABLE);



    NVIC_InitStruct.NVIC_IRQChannel = TIM6_IRQn;

    NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 0;

    NVIC_InitStruct.NVIC_IRQChannelSubPriority = 1;

    NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE;

    NVIC_Init(&NVIC_InitStruct);



    TIM_Cmd(TIM6, ENABLE);

    

}

      重点是操作,为了实现我们添加了部分标志位:

复制
<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;

uint8_t key1_flag = 0;

uint8_t key2_flag = 0;

uint8_t key3_flag = 0;

uint8_t key4_flag = 0;

uint16_t blink_cnt = 0;</div></article>

      在外部中断中不在直接操作LED翻转,而是进行标志位的变化,定时器中断中进行定时翻转,在按键状态为1的情况下:

复制
void EXTI4_IRQHandler(void)

{

    /* K1 */

    if (SET == EXTI_GetITStatus(EXTI_Line4))

    {

        if(key1_flag == 0)

            key1_flag = 1;

        else

            key1_flag = 0;

        EXTI_ClearITPendingBit(EXTI_Line4);

    }

}



void TIM6_IRQHandler(void)

{

    if (RESET != TIM_GetITStatus(TIM6, TIM_IT_Update))

    {

    if((blink_flag == 0)&&(key1_flag == 1||key2_flag == 1||key3_flag == 1||key4_flag == 1))

    {

        blink_cnt++;

        if(blink_cnt>=50)

        {

            blink_flag =1;

            blink_cnt = 0;

        }

    }

        TIM_ClearITPendingBit(TIM6, TIM_IT_Update);

    }

}

      最后在主while进行判断处理:

复制
while (1)

    {

        if(blink_flag == 1)

        {

            if(key1_flag == 1)

                MM_LED1_Toggle;

            if(key2_flag == 1)

                MM_LED2_Toggle;

            if(key3_flag == 1)

                MM_LED3_Toggle;

            if(key4_flag == 1)

                MM_LED4_Toggle;

            

            blink_flag = 0;

        }

    }

      效果视频如下:


---------------------
作者:qintian0303
链接:https://bbs.21ic.com/icview-3387166-1-1.html
来源:21ic.com
此文章已获得原创/原创奖标签,著作权归21ic所有,任何人未经允许禁止转载。 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值