打印
[MM32硬件]

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

[复制链接]
125|5
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
本帖最后由 qintian0303 于 2024-7-1 11:14 编辑

       我们在第一部分实现了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;
        }
    }
      效果视频如下:

使用特权

评论回复
沙发
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的应用,一点一点循序渐进

使用特权

评论回复
5
qintian0303|  楼主 | 2024-7-2 09:21 | 只看该作者
jhcj2014 发表于 2024-7-1 22:52
你们板子很好调,我的板子折腾得不想弄了,原先用J-LINK OB连不上,买了一个新J-LINK 用J-FLASH 能连上,但 ...

直接找了一个下载器用SWD模式,只需要接2根线就可以了

使用特权

评论回复
6
jhcj2014| | 2024-7-2 12:26 | 只看该作者
qintian0303 发表于 2024-7-2 09:21
直接找了一个下载器用SWD模式,只需要接2根线就可以了

就是连不上MCU

使用特权

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

本版积分规则

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

118

主题

999

帖子

4

粉丝