[研电赛技术支持]

GD32实战3__点亮LED灯[转]

[复制链接]
1261|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 | 显示全部楼层
20615fc11d934606f.png

使用特权

评论回复
原来是wjc|  楼主 | 2020-11-27 23:39 | 显示全部楼层
如上图,

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

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

使用特权

评论回复
原来是wjc|  楼主 | 2020-11-27 23:41 | 显示全部楼层
1235fc11e0a509ec.png

使用特权

评论回复
原来是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 | 显示全部楼层
413415fc11e67b17a2.png

使用特权

评论回复
原来是wjc|  楼主 | 2020-11-27 23:43 | 显示全部楼层
如上图,该功能一共要经历上面几个状态,从而也就明白我们需要提供哪些功能函数,细节读下面的代码。

使用特权

评论回复
原来是wjc|  楼主 | 2020-11-27 23:44 | 显示全部楼层
static VOID LED_Init(VOID)
{
    DRV_LED_Init();
    DRV_KEY_Init();
}

static VOID LED_SetLedStatus(IN U8 status)
{
    if (DRV_KEY_DOWN == status)
    {
        DRV_LED_On(DRV_LED1);
        DRV_LED_On(DRV_LED2);
        DRV_LED_On(DRV_LED3);
        DRV_LED_On(DRV_LED4);
    }
    else if (DRV_KEY_UP == status)
    {
        DRV_LED_Off(DRV_LED1);
        DRV_LED_Off(DRV_LED2);
        DRV_LED_Off(DRV_LED3);
        DRV_LED_Off(DRV_LED4);
    }
    else
    {
        ;
    }
}

static VOID LED_CheckKeyStatus(VOID)
{
    U8 keyStatus = 0;
   
    keyStatus = DRV_KEY_GetStatus(DRV_KEY3);
    if (DRV_KEY_DOWN == keyStatus)
    {
        APP_Delay(50); /* 50ms去抖动 */
        keyStatus = DRV_KEY_GetStatus(DRV_KEY3);
        if (DRV_KEY_DOWN == keyStatus)
        {
            LED_SetLedStatus(DRV_KEY_DOWN);
        }
    }
    else
    {
        LED_SetLedStatus(DRV_KEY_UP);
    }
}

VOID APP_LED_Test(VOID)
{
    LED_Init();
    LED_SetLedStatus(DRV_KEY_UP);
   
    while (1)
    {
        LED_CheckKeyStatus();
    }
}

使用特权

评论回复
原来是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 | 显示全部楼层
static U32 gDrvSystickDelayCount = 0;

S32 DRV_SYSTICK_Init(VOID)
{
    /* 1000Hz,1ms中断一次 */
    if (SysTick_Config(SystemCoreClock / 1000))
    {
        return OS_ERROR;
    }
   
    NVIC_SetPriority(SysTick_IRQn, 0x00);

    return OS_OK;
}

/* 1ms中断一次 */
VOID SysTick_Handler(VOID)
{
    if (gDrvSystickDelayCount > 0)
    {
        gDrvSystickDelayCount--;
    }
}

VOID DRV_SYSTICK_Delay(IN U32 ms)
{
    gDrvSystickDelayCount = ms;
    while (1)
    {
        if (gDrvSystickDelayCount <= 0)
        {
            break;
        }
    }

    return;
}

使用特权

评论回复
原来是wjc|  楼主 | 2020-11-27 23:47 | 显示全部楼层
3. LED驱动
提供初始化函数接口

使用特权

评论回复
原来是wjc|  楼主 | 2020-11-27 23:48 | 显示全部楼层
提供LED on/off接口

使用特权

评论回复
原来是wjc|  楼主 | 2020-11-27 23:49 | 显示全部楼层
#define DRV_LED1 GPIOC,GPIO_PIN_0
#define DRV_LED2 GPIOC,GPIO_PIN_2
#define DRV_LED3 GPIOE,GPIO_PIN_0
#define DRV_LED4 GPIOE,GPIO_PIN_1
#define DRV_LED_On(led) GPIO_SetBits(led);
#define DRV_LED_Off(led) GPIO_ResetBits(led);

extern void DRV_LED_Init(void);

使用特权

评论回复
原来是wjc|  楼主 | 2020-11-27 23:50 | 显示全部楼层
4. 按键驱动
提供初始化接口

使用特权

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

本版积分规则

55

主题

866

帖子

0

粉丝