打印
[活动]

【APM32F411V Tiny Board测评】3、GPIO的输入与输出

[复制链接]
232|1
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
本帖最后由 孤独的单行者 于 2024-5-28 10:22 编辑

       对于GPIO的测试,我们主要从输入与输出方面的进行展示,输入对应的是按键,输出对应的是LED的控制,板卡上这方面的资源还是挺丰富的,有两个用户按键和两个可以控制的用户LED。
       按键原理图:

       LED原理图:

       通过以上硬件,我们可以知道一些基本信息,LED通过1.5K的限流电阻连接到VDD,分别通过PE6控制LED2,PE5控制LED3,都是低电平点亮;按键按下后直接接地了,也就是说没有按下的时候最好是有个上拉的状态,也就是说对PA1和PA0配置的时候要上拉,这样才能检测到状态变化。
       在上面的分析咱们基本上对配置要求有了基本的变化,接下来直接进行我们的初始化程序:
#define APM_LED2_On        GPIO_SetBit(GPIOE,GPIO_PIN_6)
#define APM_LED2_Off        GPIO_ResetBit(GPIOE,GPIO_PIN_6)
#define APM_LED2_Toggle        GPIO_ToggleBit(GPIOE,GPIO_PIN_6)

#define APM_LED3_On        GPIO_SetBit(GPIOE,GPIO_PIN_5)
#define APM_LED3_Off        GPIO_ResetBit(GPIOE,GPIO_PIN_5)
#define APM_LED3_Toggle        GPIO_ToggleBit(GPIOE,GPIO_PIN_5)

void APM_GPIOInit(void)
{
    GPIO_Config_T  configStruct;

    /* Enable the GPIO_LED Clock */
    RCM_EnableAHB1PeriphClock(RCM_AHB1_PERIPH_GPIOE);

    /* Configure the GPIO_LED pin */
    GPIO_ConfigStructInit(&configStruct);
    configStruct.pin = GPIO_PIN_6|GPIO_PIN_5;
    configStruct.mode = GPIO_MODE_OUT;
    configStruct.speed = GPIO_SPEED_50MHz;
    GPIO_Config(GPIOE, &configStruct);
}

void APM_EINTInit(void)
{
    GPIO_Config_T     GPIO_configStruct;
    EINT_Config_T     EINT_configStruct;

    /* Enable the BUTTON Clock */
    RCM_EnableAHB1PeriphClock(RCM_AHB1_PERIPH_GPIOA);

    /* Configure Button pin as input floating */
    GPIO_ConfigStructInit(&GPIO_configStruct);
    GPIO_configStruct.mode = GPIO_MODE_IN;
    GPIO_configStruct.pin = GPIO_PIN_0|GPIO_PIN_1;
    GPIO_configStruct.pupd  = GPIO_PUPD_UP;
    GPIO_Config(GPIOA, &GPIO_configStruct);

    /* Enable the SYSCFG Clock */
    RCM_EnableAPB2PeriphClock(RCM_APB2_PERIPH_SYSCFG);
   
    /* Connect Button EINT Line to Button GPIO Pin */
    SYSCFG_ConfigEINTLine(SYSCFG_PORT_GPIOA, SYSCFG_PIN_0);
    /* Configure Button EINT line */
    EINT_configStruct.line = EINT_LINE_0;
    EINT_configStruct.mode = EINT_MODE_INTERRUPT;
    EINT_configStruct.trigger = EINT_TRIGGER_FALLING;
    EINT_configStruct.lineCmd = ENABLE;
    EINT_Config(&EINT_configStruct);
    /* Enable and set Button EINT Interrupt to the lowest priority */
    NVIC_EnableIRQRequest(EINT0_IRQn, 0x0f, 0x0f);
   
    SYSCFG_ConfigEINTLine(SYSCFG_PORT_GPIOA, SYSCFG_PIN_1);
    /* Configure Button EINT line */
    EINT_configStruct.line = EINT_LINE_1;
    EINT_configStruct.mode = EINT_MODE_INTERRUPT;
    EINT_configStruct.trigger = EINT_TRIGGER_FALLING;
    EINT_configStruct.lineCmd = ENABLE;
    EINT_Config(&EINT_configStruct);
   
    /* Enable and set Button EINT Interrupt to the lowest priority */
    NVIC_EnableIRQRequest(EINT1_IRQn, 0x0f, 0x0f);

}
      由于按键采用的是外部中断的方式继续的采集,所以要求中断处理函数:

void EINT0_IRQHandler(void)
{
    if(EINT_ReadIntFlag(EINT_LINE_0))
    {
        APM_LED3_Toggle;

        /*Clear EINT_LINE0 interrupt flag*/
        EINT_ClearIntFlag(EINT_LINE_0);
    }
}

void EINT1_IRQHandler(void)
{
    if(EINT_ReadIntFlag(EINT_LINE_1))
    {
        APM_LED2_Toggle;

        /*Clear EINT_LINE0 interrupt flag*/
        EINT_ClearIntFlag(EINT_LINE_1);
    }
}
      效果如下:按键一次对应的LED翻转一次

使用特权

评论回复
沙发
szt1993| | 2024-5-23 16:34 | 只看该作者
GPIO其实就是高低电平的通道设计

使用特权

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

本版积分规则

5

主题

102

帖子

0

粉丝