[APM32F4] 【APM32F402R Micro-EVB开发板测评】+按键控制LED

[复制链接]
 楼主| jinglixixi 发表于 2025-7-22 12:07 | 显示全部楼层 |阅读模式

了解并掌握GPIO口的使用是硬件开发的基本功,利用板载的LED与KEY可以省去配接这些器件的过程,其电路如图1所示。
1e37847a2c3b8472c2e0a1bb2ef402fb f85514ba49992cf26ca33856d780d664
图1  LED与KEY电路

要实现按键对LED的控制,需要对KEY和LED进行配置,所用到的函数为:
BOARD_LED_Config()和BOARD_BUTTON_Config()

其中,函数BOARD_LED_Config()的内容为:
  1. void BOARD_LED_Config(BOARD_LED_T led)
  2. {
  3. GPIO_Config_T GPIO_ConfigStruct = {0U};
  4. RCM_EnableAPB2PeriphClock(LED_CLK[led]);
  5. GPIO_ConfigStruct.pin = LED_PIN[led];
  6. GPIO_ConfigStruct.mode = GPIO_MODE_OUT_PP;
  7. GPIO_ConfigStruct.speed = GPIO_SPEED_50MHz;
  8. GPIO_Config(LED_PORT[led], &GPIO_ConfigStruct);
  9. LED_PORT[led]->BC = LED_PIN[led];
  10. }

函数BOARD_BUTTON_Config()的内容为:
  1. void BOARD_BUTTON_Config(BOARD_BUTTON_T button, BOARD_BUTTON_MODE_T mode)
  2. {
  3. GPIO_Config_T GPIO_ConfigStruct = {0U};
  4. EINT_Config_T EINT_ConfigStruct = {0U};
  5. RCM_EnableAPB2PeriphClock(BUTTON_CLK[button] | RCM_APB2_PERIPH_AFIO);
  6. GPIO_ConfigStruct.mode = GPIO_MODE_IN_PU;
  7. GPIO_ConfigStruct.pin = BUTTON_PIN[button];
  8. GPIO_Config(BUTTON_PORT[button], &GPIO_ConfigStruct);
  9. if (mode == BUTTON_MODE_EINT)
  10. {
  11. GPIO_ConfigEINTLine(BUTTON_PORT_SOURCE[button], BUTTON_PIN_SOURCE[button]);
  12. EINT_ConfigStruct.line = BUTTON_EINT_LINE[button];
  13. EINT_ConfigStruct.mode = EINT_MODE_INTERRUPT;
  14. EINT_ConfigStruct.trigger = EINT_TRIGGER_FALLING;
  15. EINT_ConfigStruct.lineCmd = ENABLE;
  16. EINT_Config(&EINT_ConfigStruct);
  17. NVIC_EnableIRQRequest(BUTTON_IRQn[button], 0x0F, 0x0F);
  18. }
  19. }

此外,为检测按键的状态及控制LED,还需使用的函数有:
BOARD_BUTTON_GetState()和BOARD_LED_Toggle()

函数BOARD_BUTTON_GetState()的内容为:
  1. void BOARD_LED_Toggle(BOARD_LED_T led)
  2. {
  3. LED_PORT[led]->ODATA ^= LED_PIN[led];
  4. }

函数BOARD_LED_Toggle的内容为:
  1. uint32_t BOARD_BUTTON_GetState(BOARD_BUTTON_T button)
  2. {
  3. return GPIO_ReadInputBit(BUTTON_PORT[button], BUTTON_PIN[button]);
  4. }

实现按键控制LED的主程序为:
  1. int main(void)
  2. {
  3. BOARD_LED_Config(LED2);
  4. BOARD_LED_Config(LED3);
  5. BOARD_BUTTON_Config(BUTTON_KEY1, BUTTON_MODE_GPIO);
  6. while (1)
  7. {
  8. if(BOARD_BUTTON_GetState(BUTTON_KEY1)==0)
  9. {
  10. BOARD_LED_Toggle(LED2);
  11. BOARD_LED_Toggle(LED3);
  12. }
  13. }

  14. }

经程序的编译和下载,该程序的功能正确,即每按一次按键,则LED灯变换一次状态。



HeartbeatEcho 发表于 2025-7-23 10:40 | 显示全部楼层
我看有的开发板把按键下面的电容去掉了。
这样的话需要添加软件滤波算法吗?
 楼主| jinglixixi 发表于 2025-7-23 11:09 | 显示全部楼层
HeartbeatEcho 发表于 2025-7-23 10:40
我看有的开发板把按键下面的电容去掉了。
这样的话需要添加软件滤波算法吗?
...

严格时场合需要这样处理,在一般稳定的环境下可以忽略。
HeartbeatEcho 发表于 2025-8-6 20:07 | 显示全部楼层
那我还是在硬件上把这个电容添加上吧!
 楼主| jinglixixi 发表于 2025-8-8 08:48 | 显示全部楼层
HeartbeatEcho 发表于 2025-8-6 20:07
那我还是在硬件上把这个电容添加上吧!

作业天敌在此 发表于 2025-8-8 09:09 | 显示全部楼层
这个测评很实用,对于初学者来说,能够快速理解GPIO口的使用和配置。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

517

主题

2932

帖子

39

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