打印
[综合信息]

【华大测评】02+ GPIO_LED(附完整工程)

[复制链接]
1247|5
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
     任何一款开发板,都要从硬件原理,再到软件编程开始,那么首先开始的肯定是LED。


1. 电路上还是非常满意,首先,IO通过灌电流驱动一个LED足够有余,但是板子并没有节省成本去这样做,还是采用传统的三极管放大电路,去驱动LED。
2. 关于GPIO的配置,需要的注意如下:

官方历程的配置很随意,明明是LED输出,使能外部中断干啥呢?该有配置却没有;
修改后如下:
驱动能力配置为最高,且非开漏(CMOS)输出。
stc_port_init_t stcPortInit;

    /* configuration structure initialization */
    MEM_ZERO_STRUCT(stcPortInit);

    stcPortInit.enPinMode = Pin_Mode_Out;
        stcPortInit.enPinDrv =  Pin_Drv_H;
    stcPortInit.enPinOType = Pin_OType_Cmos;
    stcPortInit.enPullUp = Enable;

    /* LED0 Port/Pin initialization */
    PORT_Init(LED0_PORT, LED0_PIN, &stcPortInit);

    /* LED1 Port/Pin initialization */
    PORT_Init(LED1_PORT, LED1_PIN, &stcPortInit);

    /* LED2 Port/Pin initialization */
    PORT_Init(LED2_PORT, LED2_PIN, &stcPortInit);

    /* LED3 Port/Pin initialization */
    PORT_Init(LED3_PORT, LED3_PIN, &stcPortInit);
        


对于初始化后的输出IO口,必须给一个初始电平,这是一个良好的编程习惯。
///< LED关闭
        PORT_ResetBits(LED0_PORT, LED0_PIN);
    PORT_ResetBits(LED1_PORT, LED1_PIN);
    PORT_ResetBits(LED2_PORT, LED2_PIN);
        PORT_ResetBits(LED3_PORT, LED3_PIN);
自己编写一个bsp驱动,添加进工程即可。
效果图:


工程文件: hc32f46x_ddl.rar (1.69 MB)

使用特权

评论回复
沙发
martinhu| | 2020-7-2 09:34 | 只看该作者
可以先给初始化电平,再使能输出

使用特权

评论回复
板凳
caizhiwei|  楼主 | 2020-7-7 22:19 | 只看该作者
今天对上次测评的代码进行了优化。

使用特权

评论回复
地板
caizhiwei|  楼主 | 2020-7-7 22:20 | 只看该作者
caizhiwei 发表于 2020-7-7 22:19
今天对上次测评的代码进行了优化。

代码贴上来,新增了一个led反转接口函数。
#include "bsp_led.h"

void BSP_Led_Init(void)
{

        stc_port_init_t stcPortInit;

    /* configuration structure initialization */
    MEM_ZERO_STRUCT(stcPortInit);

    stcPortInit.enPinMode = Pin_Mode_Out;
        stcPortInit.enPinDrv =  Pin_Drv_H;
    stcPortInit.enPinOType = Pin_OType_Cmos;
    stcPortInit.enPullUp = Enable;

    /* LED0 Port/Pin initialization */
    PORT_Init(LED0_PORT, LED0_PIN, &stcPortInit);

    /* LED1 Port/Pin initialization */
    PORT_Init(LED1_PORT, LED1_PIN, &stcPortInit);

    /* LED2 Port/Pin initialization */
    PORT_Init(LED2_PORT, LED2_PIN, &stcPortInit);

    /* LED3 Port/Pin initialization */
    PORT_Init(LED3_PORT, LED3_PIN, &stcPortInit);
       
        ///< LED关闭
        PORT_ResetBits(LED0_PORT, LED0_PIN);
    PORT_ResetBits(LED1_PORT, LED1_PIN);
    PORT_ResetBits(LED2_PORT, LED2_PIN);
        PORT_ResetBits(LED3_PORT, LED3_PIN);

}


void BSP_led_blink(en_led_t LED)
{
        if(LED == LED_RED)
        {
                PORT_Toggle(LED0_PORT, LED0_PIN);
        }
        if(LED == LED_GREEN )
        {
                PORT_Toggle(LED1_PORT, LED1_PIN);;
        }
        if(LED == LED_YELLOW)
        {
                PORT_Toggle(LED2_PORT, LED2_PIN);
        }
        if(LED == LED_BLUE)
        {
                PORT_Toggle(LED3_PORT, LED3_PIN);
        }
        return;
}







使用特权

评论回复
5
caizhiwei|  楼主 | 2020-7-7 22:21 | 只看该作者
头文件:
#ifndef __BSP_LED_H__
#define __BSP_LED_H__

#include "hc32f46x_gpio.h"

/* LED0 Port/Pin definition */
#define  LED0_PORT        (PortE)
#define  LED0_PIN         (Pin06)

/* LED1 Port/Pin definition */
#define  LED1_PORT        (PortA)
#define  LED1_PIN         (Pin07)

/* LED2 Port/Pin definition */
#define  LED2_PORT        (PortB)
#define  LED2_PIN         (Pin05)

/* LED3 Port/Pin definition */
#define  LED3_PORT        (PortB)
#define  LED3_PIN         (Pin09)

/* LED0~3 toggle definition */
#define  LED0_TOGGLE()    (PORT_Toggle(LED0_PORT, LED0_PIN))
#define  LED1_TOGGLE()    (PORT_Toggle(LED1_PORT, LED1_PIN))
#define  LED2_TOGGLE()    (PORT_Toggle(LED2_PORT, LED2_PIN))
#define  LED3_TOGGLE()    (PORT_Toggle(LED3_PORT, LED3_PIN))

#define  DLY_MS           (100ul)

typedef enum led
{
    LED_RED  = 0u,                 
    LED_YELLOW  = 1u,              
    LED_BLUE  = 2u,                 
    LED_GREEN  = 3u,               
}en_led_t;


void BSP_Led_Init(void);

void BSP_led_blink(en_led_t LED);


#endif


使用特权

评论回复
6
guojunhope| | 2020-7-9 21:05 | 只看该作者
能不盲从原厂示例代码,值得学习!

使用特权

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

本版积分规则

100

主题

857

帖子

14

粉丝