打印
[研电赛技术支持]

【GD32F470紫藤派使用手册】第一讲 GPIO-流水灯实验

[复制链接]
936|2
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
本帖最后由 聚沃科技 于 2024-4-30 11:23 编辑


1.1 实验内容
通过本实验主要学习以下内容:
• GPIO结构及原理;
• GPIO输出功能实现;
• LED驱动原理。
1.2 实验原理
1.2.1 GPIO外设原理
GD32F4xx系列MCU最多可支持 140 个通用 I/O 引脚(GPIO),分别为 PA0 ~ PA15PB0 ~ PB15PC0 ~ PC15PD0 ~ PD15PE0 ~ PE15PF0 ~ PF15PG0 ~ PG15PH0 ~ PH15 PI0 ~ PI11,各片上设备用其来实现逻辑输入/输出功能。每个 GPIO 端口有相关的控制和配置寄存器以满足特定应用的需求。 GPIO 引脚上的外部中断在中断/事件控制器(EXTI)中有相关的控制和配置寄存器。  
GPIO 端口和其他的备用功能(AFs)共用引脚,在特定的封装下获得最大的灵活性。 GPIO 引脚通过配置相关的寄存器可以用作备用功能引脚,备用功能输入/输出都可以。每个 GPIO 引脚可以由软件配置为输出(推挽或开漏)、输入、外设备用功能或者模拟模式。每个GPIO 引脚都可以配置为上拉、下拉或无上拉/下拉。除模拟模式外,所有的 GPIO 引脚都具备大电流驱动能力。  
GD32F4xx系列的GPIO端口结构如下图所示,由该图可知,GPIO结构可大致分为三个部分:1、输出控制,可配置为推挽输出以及备用功能输出,在推挽输出情况下,输出驱动由输出控制寄存器进行控制,在备用功能输出情况下,输出驱动由外设备用功能驱动,具体输出会通过对电源以及对地的mos管进行实现,上下拉电阻对输出也有作用;2、输入控制,输入可配置内部上拉或者下拉,内部上下拉电阻均为40K左右,然后通过内部施密特触发器输入到内部,之后可以外设通过备用功能输入或者通过输入状态寄存器读取,施密特触发器的实现功能为输入电压由低到高变化时,低于VIL为低,高于VIH为高,在VILVIH之间为低,输入电压由高到低变化时,高于VIH为高,低于VIH为低,在VILVIH之间为高,因而为了可靠读取输入电平状态,输入电压高电平需要高于VIH,低电平需要低于VIL才可靠,一般VIL0.3 VDDVIH0.7 VDD3ESD保护,在标准IO接口上,ESD保护为对电源和对地的两个反向二极管,因而若引脚电压高于VDD电压,可能存在漏电现象(通过反向二极管漏电到VDD),故使用标准IO接口需注意引脚输入电压不可高于VDD电压,另外有一类IO接口为5VT引脚,该引脚可耐5V电压输入,不存在引脚漏电现象,如果设计中存在引脚先于电源上电的情况,该引脚需要使用5VT引脚,避免引脚漏电,5VT引脚可通过数据手册查看确认。
GD32F4xx系列MCU引脚的复用功能通过AF表进行查阅,具体如下图所示。
1.2.2 LED驱动原理
LED是一种半导体发光元件,可以将电能转换为光能,可通过外部电路进行驱动,有单色的也有多色的,可通过电压或电流来进行驱动,驱动亮度可调。LED驱动比较简单,后续会在硬件设计中介绍本例程所用LED驱动的原理。
1.3 硬件设计
本节主要介绍GPIO驱动LED电路。该电路如下图所示,该电路中具有四个LED,一端接地,另外一端通过4.7k欧姆限流电阻连接至GPIO,当GPIO输出高电平时,LED电亮,反之熄灭。对应的GPIO引脚分别为PE3/PC13/PG3/PA5
1.4 代码解析
1.4.1 驱动初始化函数
驱动初始化函数如下所示,主要功能为延迟初始化、LCD初始化等,其中延迟使用systick定时器进行实现。
C
void driver_init(void)
{
    delay_init();
//    rcu_periph_clock_enable(RCU_AF);
//    gpio_pin_remap_config(GPIO_SWJ_SWDPENABLE_REMAP,ENABLE);
    #if (LCD_DEBUG == 1)
//    #include "bsp_lcd.h"      
    bsp_lcd_init();                 /* 初始化LCD */
    bsp_lcd_clear(WHITE);
    //显示log图片
    bsp_show_log();   
    //设置打印窗口
    bsp_lcd_printf_init(10,109,bsp_lcd_parameter.width-1,bsp_lcd_parameter.height-1,FONT_ASCII_16_8,WHITE,BLUE);   
    #endif   
}
延迟配置函数如下所示,通过该函数开启sysitck
C
void delay_init(void)
{
    SystemCoreClockUpdate();
    systick_config();
    delay_us_mul=SystemCoreClock/1000000;
}
如果需要进行LCD显示,需要打开LCD_DEBUG宏定义。
1.4.2 LED配置函数
LED相关配置函数实现在bsp_led.c文件中,首先将LED进行注册,注册语句如下,注册之后即可通过别名的方式对相关LED进行相关配置。
C
LED_DEF(LED1,E,3,RESET);      /* PE3定义为LED1,LED OFF的IO初始态低 */
LED_DEF(LED2,C,13,RESET);      /* PC13定义为LED2 */
LED_DEF(LED3,G,3,RESET);      /* PG3定义为LED3 */
LED_DEF(LED4,A,5,RESET);      /* PA5定义为LED4 */
LED初始化函数如下,可以通过别名数组的方式对LED GPIO进行成组初始化。
C
const void* LED_INIT_GROUP[]={&LED1,&LED2,&LED3,&LED4};  
void bsp_led_init(typdef_gpio_general *LEDx)
{
    driver_gpio_general_init(LEDx);
}
void bsp_led_group_init(void)
{
    uint8_t i;
    for(i=0;i<LED_INIT_SIZE;i++)
    {
        bsp_led_init(((typdef_gpio_general *)LED_INIT_GROUP));   
    }
}
LED初始化之后即可对相关LED进行输出相关操作,开发板历程中提供了输出高、低以及翻转的配置函数,可供使用者方便调用。
C
void bsp_led_on(typdef_gpio_general *LEDx)
{
    driver_gpio_pin_write(LEDx,(bit_status)!(LEDx->default_state));
}
void bsp_led_off(typdef_gpio_general *LEDx)
{
    driver_gpio_pin_write(LEDx,LEDx->default_state);
}
void bsp_led_toggle(typdef_gpio_general *LEDx)
{
    driver_gpio_pin_toggle(LEDx);
}
1.4.3 主函数
本例程主函数如下所示,首先进行驱动初始化,之后进行LED初始化,然后初始化串口并打印”Stream LED demo.“log,在while(1)主循环中延迟100ms进行顺序循环翻转LED,以实现流水灯现象。
C
int main(void)
{
  uint8_t i=0;
        driver_init();
        bsp_led_group_init();     
        bsp_uart_init(&BOARD_UART);         /* 板载UART初始化 */
        printf_log("Stream LED demo.\r\n");
        while(1)
        {
        delay_ms(100);
        bsp_led_toggle(((typdef_gpio_general *)LED_INIT_GROUP[i++%LED_SIZE]));   
        }
}
1.5 实验结果
将本例程编译通过后,烧录到紫藤派开发板中,运行后可观察到LED1-LED4顺序点亮,实现流水灯的功能。

本教程由GD32 MCU方案商聚沃科技原创发布,了解更多GD32 MCU教程,关注聚沃科技官网,GD32MCU技术交流群:859440462


使用特权

评论回复
沙发
shenxiaolin| | 2024-4-30 15:42 | 只看该作者
流水灯是最基础的试验,也是验证环境的基础

使用特权

评论回复
板凳
trucyw| | 2024-5-2 22:02 | 只看该作者
为什么叫紫藤

使用特权

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

本版积分规则

29

主题

49

帖子

1

粉丝