[研电赛技术支持] GD32实战3__点亮LED灯[转]

[复制链接]
2187|39
 楼主| 原来是wjc 发表于 2020-11-27 23:35 | 显示全部楼层 |阅读模式
知识点1. GPIO控制2. LED灯驱动原理3. 按键检查原理
 楼主| 原来是wjc 发表于 2020-11-27 23:37 | 显示全部楼层
硬件部分 457745fc11d1b495ec.png
 楼主| 原来是wjc 发表于 2020-11-27 23:37 | 显示全部楼层
如上图,LED灯负极接地,正极通过470欧电阻后,接到了MCU的引脚上。可以看出,当MCU的GPIO口输出
 楼主| 原来是wjc 发表于 2020-11-27 23:38 | 显示全部楼层
高电平时LED亮,

低电平时LED灭。
 楼主| 原来是wjc 发表于 2020-11-27 23:39 | 显示全部楼层
 楼主| 原来是wjc 发表于 2020-11-27 23:39 | 显示全部楼层
如上图,

​ 当按键弹起时,GPIO接在3.3V上,为高电平

​ 当按键按下时,GPIO接到地上,为低电平

 楼主| 原来是wjc 发表于 2020-11-27 23:41 | 显示全部楼层
 楼主| 原来是wjc 发表于 2020-11-27 23:41 | 显示全部楼层
注意:

原理图中的K1,K2,K3分别对应板子上的K2,K3,K4,本文都是按原理图描述
0.1uF电容作用去抖动
 楼主| 原来是wjc 发表于 2020-11-27 23:42 | 显示全部楼层
功能设计
​ 设计一个小功能,KEY3按下 4个LED灯亮,弹起时4个LED灭。子功能设计包括,
 楼主| 原来是wjc 发表于 2020-11-27 23:43 | 显示全部楼层
 楼主| 原来是wjc 发表于 2020-11-27 23:43 | 显示全部楼层
如上图,该功能一共要经历上面几个状态,从而也就明白我们需要提供哪些功能函数,细节读下面的代码。
 楼主| 原来是wjc 发表于 2020-11-27 23:44 | 显示全部楼层
  1. static VOID LED_Init(VOID)
  2. {
  3.     DRV_LED_Init();
  4.     DRV_KEY_Init();
  5. }

  6. static VOID LED_SetLedStatus(IN U8 status)
  7. {
  8.     if (DRV_KEY_DOWN == status)
  9.     {
  10.         DRV_LED_On(DRV_LED1);
  11.         DRV_LED_On(DRV_LED2);
  12.         DRV_LED_On(DRV_LED3);
  13.         DRV_LED_On(DRV_LED4);
  14.     }
  15.     else if (DRV_KEY_UP == status)
  16.     {
  17.         DRV_LED_Off(DRV_LED1);
  18.         DRV_LED_Off(DRV_LED2);
  19.         DRV_LED_Off(DRV_LED3);
  20.         DRV_LED_Off(DRV_LED4);
  21.     }
  22.     else
  23.     {
  24.         ;
  25.     }
  26. }

  27. static VOID LED_CheckKeyStatus(VOID)
  28. {
  29.     U8 keyStatus = 0;
  30.    
  31.     keyStatus = DRV_KEY_GetStatus(DRV_KEY3);
  32.     if (DRV_KEY_DOWN == keyStatus)
  33.     {
  34.         APP_Delay(50); /* 50ms去抖动 */
  35.         keyStatus = DRV_KEY_GetStatus(DRV_KEY3);
  36.         if (DRV_KEY_DOWN == keyStatus)
  37.         {
  38.             LED_SetLedStatus(DRV_KEY_DOWN);
  39.         }
  40.     }
  41.     else
  42.     {
  43.         LED_SetLedStatus(DRV_KEY_UP);
  44.     }
  45. }

  46. VOID APP_LED_Test(VOID)
  47. {
  48.     LED_Init();
  49.     LED_SetLedStatus(DRV_KEY_UP);
  50.    
  51.     while (1)
  52.     {
  53.         LED_CheckKeyStatus();
  54.     }
  55. }
 楼主| 原来是wjc 发表于 2020-11-27 23:44 | 显示全部楼层
2. 定时器设计
 楼主| 原来是wjc 发表于 2020-11-27 23:45 | 显示全部楼层
 楼主| 原来是wjc 发表于 2020-11-27 23:46 | 显示全部楼层
1. 采用systick作为功能定时器,初始配置成1ms一次中断
2. 提供delay延时函数
 楼主| 原来是wjc 发表于 2020-11-27 23:46 | 显示全部楼层
  1. static U32 gDrvSystickDelayCount = 0;

  2. S32 DRV_SYSTICK_Init(VOID)
  3. {
  4.     /* 1000Hz,1ms中断一次 */
  5.     if (SysTick_Config(SystemCoreClock / 1000))
  6.     {
  7.         return OS_ERROR;
  8.     }
  9.    
  10.     NVIC_SetPriority(SysTick_IRQn, 0x00);

  11.     return OS_OK;
  12. }

  13. /* 1ms中断一次 */
  14. VOID SysTick_Handler(VOID)
  15. {
  16.     if (gDrvSystickDelayCount > 0)
  17.     {
  18.         gDrvSystickDelayCount--;
  19.     }
  20. }

  21. VOID DRV_SYSTICK_Delay(IN U32 ms)
  22. {
  23.     gDrvSystickDelayCount = ms;
  24.     while (1)
  25.     {
  26.         if (gDrvSystickDelayCount <= 0)
  27.         {
  28.             break;
  29.         }
  30.     }

  31.     return;
  32. }
 楼主| 原来是wjc 发表于 2020-11-27 23:47 | 显示全部楼层
3. LED驱动
提供初始化函数接口
 楼主| 原来是wjc 发表于 2020-11-27 23:48 | 显示全部楼层
提供LED on/off接口
 楼主| 原来是wjc 发表于 2020-11-27 23:49 | 显示全部楼层
  1. #define DRV_LED1 GPIOC,GPIO_PIN_0
  2. #define DRV_LED2 GPIOC,GPIO_PIN_2
  3. #define DRV_LED3 GPIOE,GPIO_PIN_0
  4. #define DRV_LED4 GPIOE,GPIO_PIN_1
  5. #define DRV_LED_On(led) GPIO_SetBits(led);
  6. #define DRV_LED_Off(led) GPIO_ResetBits(led);

  7. extern void DRV_LED_Init(void);
 楼主| 原来是wjc 发表于 2020-11-27 23:50 | 显示全部楼层
4. 按键驱动
提供初始化接口
您需要登录后才可以回帖 登录 | 注册

本版积分规则

87

主题

1250

帖子

0

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