[活动] 【APM32F411V Tiny Board测评】3、GPIO的输入与输出

[复制链接]
1046|1
 楼主| 孤独的单行者 发表于 2024-5-22 20:42 | 显示全部楼层 |阅读模式
本帖最后由 孤独的单行者 于 2024-5-28 10:22 编辑

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

       LED原理图:
2.png

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

  4. #define APM_LED3_On        GPIO_SetBit(GPIOE,GPIO_PIN_5)
  5. #define APM_LED3_Off        GPIO_ResetBit(GPIOE,GPIO_PIN_5)
  6. #define APM_LED3_Toggle        GPIO_ToggleBit(GPIOE,GPIO_PIN_5)

  7. void APM_GPIOInit(void)
  8. {
  9.     GPIO_Config_T  configStruct;

  10.     /* Enable the GPIO_LED Clock */
  11.     RCM_EnableAHB1PeriphClock(RCM_AHB1_PERIPH_GPIOE);

  12.     /* Configure the GPIO_LED pin */
  13.     GPIO_ConfigStructInit(&configStruct);
  14.     configStruct.pin = GPIO_PIN_6|GPIO_PIN_5;
  15.     configStruct.mode = GPIO_MODE_OUT;
  16.     configStruct.speed = GPIO_SPEED_50MHz;
  17.     GPIO_Config(GPIOE, &configStruct);
  18. }

  19. void APM_EINTInit(void)
  20. {
  21.     GPIO_Config_T     GPIO_configStruct;
  22.     EINT_Config_T     EINT_configStruct;

  23.     /* Enable the BUTTON Clock */
  24.     RCM_EnableAHB1PeriphClock(RCM_AHB1_PERIPH_GPIOA);

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

  31.     /* Enable the SYSCFG Clock */
  32.     RCM_EnableAPB2PeriphClock(RCM_APB2_PERIPH_SYSCFG);
  33.    
  34.     /* Connect Button EINT Line to Button GPIO Pin */
  35.     SYSCFG_ConfigEINTLine(SYSCFG_PORT_GPIOA, SYSCFG_PIN_0);
  36.     /* Configure Button EINT line */
  37.     EINT_configStruct.line = EINT_LINE_0;
  38.     EINT_configStruct.mode = EINT_MODE_INTERRUPT;
  39.     EINT_configStruct.trigger = EINT_TRIGGER_FALLING;
  40.     EINT_configStruct.lineCmd = ENABLE;
  41.     EINT_Config(&EINT_configStruct);
  42.     /* Enable and set Button EINT Interrupt to the lowest priority */
  43.     NVIC_EnableIRQRequest(EINT0_IRQn, 0x0f, 0x0f);
  44.    
  45.     SYSCFG_ConfigEINTLine(SYSCFG_PORT_GPIOA, SYSCFG_PIN_1);
  46.     /* Configure Button EINT line */
  47.     EINT_configStruct.line = EINT_LINE_1;
  48.     EINT_configStruct.mode = EINT_MODE_INTERRUPT;
  49.     EINT_configStruct.trigger = EINT_TRIGGER_FALLING;
  50.     EINT_configStruct.lineCmd = ENABLE;
  51.     EINT_Config(&EINT_configStruct);
  52.    
  53.     /* Enable and set Button EINT Interrupt to the lowest priority */
  54.     NVIC_EnableIRQRequest(EINT1_IRQn, 0x0f, 0x0f);

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

  1. void EINT0_IRQHandler(void)
  2. {
  3.     if(EINT_ReadIntFlag(EINT_LINE_0))
  4.     {
  5.         APM_LED3_Toggle;

  6.         /*Clear EINT_LINE0 interrupt flag*/
  7.         EINT_ClearIntFlag(EINT_LINE_0);
  8.     }
  9. }

  10. void EINT1_IRQHandler(void)
  11. {
  12.     if(EINT_ReadIntFlag(EINT_LINE_1))
  13.     {
  14.         APM_LED2_Toggle;

  15.         /*Clear EINT_LINE0 interrupt flag*/
  16.         EINT_ClearIntFlag(EINT_LINE_1);
  17.     }
  18. }
      效果如下:按键一次对应的LED翻转一次
效果展示 (1).gif

szt1993 发表于 2024-5-23 16:34 | 显示全部楼层
GPIO其实就是高低电平的通道设计
您需要登录后才可以回帖 登录 | 注册

本版积分规则

13

主题

152

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部