打印
[MM32硬件]

【灵动微电子MM32F5330测评】2、GPIO的输入输出:按键和LED

[复制链接]
56|2
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
        本章节针对GPIO的输入输出进行系统的学习和测试,其实主要就是GPIO的输出控制,对应的就是LED的控制,对应输入的采集就是板载的按键,本开发板板载了4个不同颜色的LED以及4个用户按键,复位按键采用的是不同形式的按键,可以有效避免误触的发生。
        按键原理图:

        LED原理图:

        咱们先进行一下简单的分配,Kn对应LEDn的方式进行对应控制,由上图可以看出4个LED不同颜色,同时也通过不同的电阻进行限流,尽可能让他们的亮度相近,注意是低电平点亮。按键中的连接方式也有所不同,比如K1按下后是高电平,其初始状态是下拉接地的,初始化时上下拉的要求就不高了;而其余三个按键都没有外部配置上拉或者下拉,按键按下时接地,所以在进行按键初始化的时候建议上拉。
        规划一下展示的具体内容,LED的展示没有什么特殊的,输入按键的检测有几种方法可以实现,一种是GPIO设置为输入引脚,实时获取IO口装填,这种扫描方式是最原始的方法,不过效果不好;第二种使用外部中断,在中断处理LED,这种触发方式基本上能实现动作一次操作一次的方法(不考虑防抖)。综合对比选择第二种,接下来我们就开始具体的代码实现。
        输出GPIO的初始化:
#define MM_LED1_Off        GPIO_SetBits(GPIOB, GPIO_Pin_11)
#define MM_LED1_On        GPIO_ResetBits(GPIOB, GPIO_Pin_11)
#define MM_LED1_Toggle    GPIO_WriteBit(GPIOB, GPIO_Pin_11, GPIO_ReadOutputDataBit(GPIOB, GPIO_Pin_11) ? Bit_RESET : Bit_SET)
#define MM_LED2_Off        GPIO_SetBits(GPIOB, GPIO_Pin_10)
#define MM_LED2_On        GPIO_ResetBits(GPIOB, GPIO_Pin_10)
#define MM_LED2_Toggle    GPIO_WriteBit(GPIOB, GPIO_Pin_10, GPIO_ReadOutputDataBit(GPIOB, GPIO_Pin_10) ? Bit_RESET : Bit_SET);

#define MM_LED3_Off        GPIO_SetBits(GPIOC, GPIO_Pin_7)
#define MM_LED3_On        GPIO_ResetBits(GPIOC, GPIO_Pin_7)
#define MM_LED3_Toggle    GPIO_WriteBit(GPIOC, GPIO_Pin_7, GPIO_ReadOutputDataBit(GPIOC, GPIO_Pin_7) ? Bit_RESET : Bit_SET);
#define MM_LED4_Off        GPIO_SetBits(GPIOC, GPIO_Pin_6)
#define MM_LED4_On        GPIO_ResetBits(GPIOC, GPIO_Pin_6)
#define MM_LED4_Toggle    GPIO_WriteBit(GPIOC, GPIO_Pin_6, GPIO_ReadOutputDataBit(GPIOC, GPIO_Pin_6) ? Bit_RESET : Bit_SET);

void MM_GPIO_LED_Init(void)
{
    GPIO_InitTypeDef GPIO_InitStruct;

    RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOB, ENABLE);
    RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOC, ENABLE);

    GPIO_StructInit(&GPIO_InitStruct);
    GPIO_InitStruct.GPIO_Pin   = GPIO_Pin_10 | GPIO_Pin_11 ;
    GPIO_InitStruct.GPIO_Speed = GPIO_Speed_High;
    GPIO_InitStruct.GPIO_Mode  = GPIO_Mode_Out_PP;
    GPIO_Init(GPIOB, &GPIO_InitStruct);

    GPIO_StructInit(&GPIO_InitStruct);
    GPIO_InitStruct.GPIO_Pin   = GPIO_Pin_6 | GPIO_Pin_7;
    GPIO_InitStruct.GPIO_Speed = GPIO_Speed_High;
    GPIO_InitStruct.GPIO_Mode  = GPIO_Mode_Out_PP;
    GPIO_Init(GPIOC, &GPIO_InitStruct);   
   
    MM_LED1_Off;
    MM_LED2_Off;
    MM_LED3_Off;
    MM_LED4_Off;
}
       LED的初始状态为关闭的,需要通过按键去唤醒;
        按键通过外部中断采集初始化(以按键1为例):
void MM_GPIO_KEY_Init(void)
{
    EXTI_InitTypeDef EXTI_InitStruct;
    GPIO_InitTypeDef GPIO_InitStruct;
    NVIC_InitTypeDef NVIC_InitStruct;

    RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOC, ENABLE);
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE);

    /* K1->PC4->EXTI_Line4 */
    GPIO_StructInit(&GPIO_InitStruct);
    GPIO_InitStruct.GPIO_Pin  = GPIO_Pin_4;
    GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IPD;
    GPIO_Init(GPIOC, &GPIO_InitStruct);

    SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOC, EXTI_PinSource4);

    EXTI_StructInit(&EXTI_InitStruct);
    EXTI_InitStruct.EXTI_Line    = EXTI_Line4;
    EXTI_InitStruct.EXTI_Mode    = EXTI_Mode_Interrupt;
    EXTI_InitStruct.EXTI_Trigger = EXTI_Trigger_Rising;
    EXTI_InitStruct.EXTI_LineCmd = ENABLE;
    EXTI_Init(&EXTI_InitStruct);

    NVIC_InitStruct.NVIC_IRQChannel = EXTI4_IRQn;
    NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 0;
    NVIC_InitStruct.NVIC_IRQChannelSubPriority = 1;
    NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE;
    NVIC_Init(&NVIC_InitStruct);
}
       我们可以看到按键1采用的是上拉下拉配置,外部中断上升沿出发,这个和它的外部连接方式有关,每个按键要根据自己的方式进行选择,然后在中断里面处理:
void EXTI4_IRQHandler(void)
{
    if (SET == EXTI_GetITStatus(EXTI_Line4))
    {
        MM_LED1_Toggle;

        EXTI_ClearITPendingBit(EXTI_Line4);
    }
}
       每一个GPIO对应的中断线是一定的,不过中断处理函数不一样,比如5-9在一个中断处理函数中进行。
        到这里我们就完成了按键的中断采集和GPIO输出控制的基本函数,实现按下对应的按键,对应的LED翻转的操作,效果如下:

使用特权

评论回复
沙发
caigang13| | 2024-7-2 08:33 | 只看该作者
对MCU来讲矩阵键盘是最利用IO管脚的。

使用特权

评论回复
板凳
qintian0303|  楼主 | 2024-7-2 09:22 | 只看该作者
caigang13 发表于 2024-7-2 08:33
对MCU来讲矩阵键盘是最利用IO管脚的。

这是只是一个demo板,主要是用于功能验证的,实际上多按键的方案就不是这样弄了

使用特权

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

本版积分规则

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

120

主题

1001

帖子

4

粉丝