首页 > 其他分享 >【GD32F303红枫派使用手册】第二节 GPIO-流水灯实验

【GD32F303红枫派使用手册】第二节 GPIO-流水灯实验

时间:2024-05-29 10:33:21浏览次数:19  
标签:count LED 引脚 void 红枫 GD32F303 使用手册 gpio GPIO

2.1 实验内容

通过本实验主要学习以下内容:

  • GPIO结构及原理;
  • GPIO输出功能实现;
  • LED驱动原理。

2.2 实验原理

2.2.1 GPIO外设原理

GD32F303系列MCU最多可支持 112 个通用I/O 引脚(GPIO),分别为 PA0 ~ PA15, PB0 ~ PB15, PC0 ~ PC15,PD0 ~ PD15, PE0 ~ PE15, PF0 ~ PF15 和 PG0 ~ PG15,各片上设备用其来实现逻辑输入/输出功能。每个 GPIO 端口有相关的控制和配置寄存器以满足特定应用的需求。

GPIO 端口和其他的备用功能(AFs)共用引脚,在特定的封装下获得最大的灵活性。 GPIO引脚通过配置相关的寄存器可以用作备用功能输入/输出。每个 GPIO 引脚可以由软件配置为输出(推挽或开漏)、输入、外设备用功能或者模拟模式。每个 GPIO 引脚都可以配置为上拉、下拉或浮空。除模拟模式外,所有的 GPIO 引脚都具备大电流驱动能力。

GD32F303系列的GPIO端口结构如下图所示,由该图可知,GPIO结构可大致分为三个部分:1、输出控制,可配置为推挽输出以及备用功能输出,在推挽输出情况下,输出驱动由输出控制寄存器进行控制,在备用功能输出情况下,输出驱动由外设备用功能驱动,具体输出会通过对电源以及对地的mos管进行实现;2、输入控制,输入可配置内部上拉或者下拉,内部上下拉电阻均为40K左右,然后通过内部施密特触发器输入到内部,之后可以外设通过备用功能输入或者通过输入状态寄存器读取,施密特触发器的实现功能为输入电压由低到高变化时,低于VIL为低,高于VIH为高,在VIL和VIH之间为低,输入电压由高到低变化时,高于VIH为高,低于VIH为低,在VIL和VIH之间为高,因而为了可靠读取输入电平状态,输入电压高电平需要高于VIH,低电平需要低于VIL才可靠,一般VIL为0.3 VDD,VIH为0.7 VDD;3、ESD保护,在标准IO接口上,ESD保护为对电源和对地的两个反向二极管,因而若引脚电压高于VDD电压,可能存在漏电现象(通过反向二极管漏电到VDD),故使用标准IO接口需注意引脚输入电压不可高于VDD电压,另外有一类IO接口为5VT引脚,该引脚可耐5V电压输入,不存在引脚漏电现象,如果设计中存在引脚先于电源上电的情况,该引脚需要使用5VT引脚,避免引脚漏电,如下图所示,5VT引脚可通过数据手册查看确认。

另外,需注意GD32F303系列MCU的复用功能需要按组重映射,如下图所示,以I2C0引脚重映射配置为例,当IIC0_REMAP配置为0时,IIC0的引脚为PB6和PB7,当IIC0_REMAP配置为1时,IIC0的引脚为PB8和PB9,PB6和PB9不可一同使用,其他外设的重映射可以参考官方用户手册。在配置重映射时,需要先打开AF时钟,然后再进行重映射配置。

烧录口也具有重映射功能,如下图所示,比如PB3默认作为JTAG功能使用,如果读者希望作为GPIO使用,则需要配置禁用JTAG使能SWD。 

  • 注意,GD32F303系列MCU除了烧录口以外,其他引脚默认为浮空输入状态,在复位阶段引脚电平不确定,由外部决定,如果读者希望复位过程中有固定电平,需要外接上下拉电阻,烧录口的默认上下拉情况如下图 所示。

2.2.2 LED驱动原理

LED是一种半导体发光元件,可以将电能转换为光能,可通过外部电路进行驱动,有单色的也有多色的,可通过电压或电流来进行驱动,驱动亮度可调。LED驱动比较简单,后续会在硬件设计中介绍本例程所用LED驱动的原理。

2.3 硬件设计

本节主要介绍GPIO驱动LED电路。该电路如下图所示,该电路中具有两个LED,共阳极连接3.3V,另外一端通过1k欧姆限流电阻连接至GPIO,当GPIO输出低电平时,LED电亮,反之熄灭。

2.4 代码解析

2.4.1 延迟函数

实现延迟初始化函数如下所示,历程中的延迟使用systick定时器进行实现。首先进行systick配置(driver_init()),之后配置微秒延迟计数。

C
void driver_init(void)
{
    rcu_periph_clock_enable(RCU_AF);
    gpio_pin_remap_config(GPIO_SWJ_SWDPENABLE_REMAP,ENABLE);
    
    systick_config();
    delay_us_mul=SystemCoreClock/1000000;    
}

 systick配置函数如下所示,通过该函数开启sysitck。

C
static void systick_config(void)
{          
    SystemCoreClockUpdate();
    /* setup systick timer for 1000Hz interrupts */
    if (SysTick_Config(SystemCoreClock / 1000U)){
        /* capture error */
        while (1){
        }
    }
    /* configure the systick handler priority */
    NVIC_SetPriority(SysTick_IRQn, 0xFU);
}

微秒及毫秒配置函数如下所示,微秒通过systick定时查询实现,毫秒通过微秒实现。

C
void delay_us(uint32_t count)
{
    uint32_t temp;
    count=count*delay_us_mul;

    if(count>SysTick->LOAD ){
        count=SysTick->LOAD ;
    }
    temp=SysTick->VAL;
    if(temp>count)
    {
        while(SysTick->VAL>(temp-count) && SysTick->VAL<=temp);
    }
    else {
        while(SysTick->VAL<=temp);
        while(SysTick->VAL>(SysTick->LOAD-(count-temp)));        
    }
}
void delay_ms(uint32_t count)
{  
    count=count*10;
    do{
        delay_us(100);
    }while(count--);
}

2.4.2 LED配置函数

LED相关配置函数实现在bsp_led.c文件中,首先将LED进行注册,注册语句如下,注册之后即可通过别名的方式对相关LED进行相关配置。

C
LED_Def(LED0,E,5,SET);      // PE5定义为LED0,LED OFF的IO初始态高
LED_Def(LED1,E,6,SET);      // PE6定义为LED1

gpio_Def_extern(LED0);
gpio_Def_extern(LED1);

#define gpio_Def_extern(name) \
    extern typdef_gpio_general name

 LED初始化函数如下,可以通过别名数组的方式对LED GPIO进行成组初始化。

C
const void* LED_INIT_GROUP[]={&LED0,&LED1};
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[i]));    
    }
}

 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);
}

 2.4.3 主函数

本例程主函数如下所示,首先进行延迟初始化,之后进行LED初始化,然后先翻转LED1,之后延迟200ms后延迟LED0和LED1,从而实现LED0和LED1的交替闪烁。

C
int main(void)
{
    delay_init();
    bsp_led_group_init();     
    bsp_led_toggle(&LED1);  
        while (1)
        {
        delay_ms(1000);
        bsp_led_toggle(&LED0);
        bsp_led_toggle(&LED1);
        }
}

2.5 实验结果

将本例程编译通过后,烧录到红枫派开发板中,运行后可观察到LED0和LED1每秒钟交叉闪烁,实现流水灯的功能。

若读者希望使用其他IO驱动LED,只需修改注册函数中对应的LED引脚即可,使用非常方便。

由聚沃科技原创,来源于:【红枫派开发板】第二讲 GPIO-流水灯实验 - 苏州聚沃电子科技有限公司 (gd32bbs.com) 

GD32MCU技术交流群:859440462  

 

标签:count,LED,引脚,void,红枫,GD32F303,使用手册,gpio,GPIO
From: https://blog.csdn.net/weixin_45254847/article/details/139288147

相关文章

  • redis 安装、使用手册
    Linux系统Redis使用手册一、引言Redis是一个开源的,内存中的数据结构存储系统,它可以用作数据库、缓存和消息代理。由于其出色的性能和灵活性,Redis在开发社区中广受欢迎。本手册将详细介绍Redis在Linux系统中的安装、每种数据结构的命令使用以及每种数据类型的应用场景。二......
  • STM32 F1系列 全中文HAL&LL库使用手册 中英双语对照 GPT机翻 共1208页、约40万字
    STM32F1系列全中文HAL_LL库使用手册,中英文双语对照阅读。内容、格式对照官方原文,含标签导航及目录跳转。全文GPT机翻,除人工翻译外,相对更加贴合原文原意,双语版防止翻译错误方便对照。全文:1208页,约40万字。*******下有更多展示图片********由于本汉化不改变官方文档的内容......
  • 中移ML307R模块使用手册
     模块链接:https://item.taobao.com/item.htm?ft=t&id=795927858234实物图  模块信息1.模块型号:  中移ML307R-DL2.频段信息:    LTE-FDDB1/B3/B5/B8(全网通)   LTE-TDDB34/B38/B39/B40/B413.网络协议:    IPv4/IPv6/PING/NTP/DNS/TCP/UDP/HT......
  • 2022年windows的Visual Studio常用插件及使用手册
    前景提要ViusualStudio是一款很好用的C/C++集成开发工具,具有强大的扩展功能,好用的插件,但是,很多人都是只写了有什么插件,但是,没写怎么使用这种插件,使得使用的时候很是不方便,所以,笔者最近本着自己的学习,在这里写下自己关于好用的插件的研究,希望对您的学习/工作有帮助.......
  • pipenv-基本使用手册 解决python包版本冲突
    https://pipenv.pypa.io/python使用pip安装包,默认都是在全局包,当A项目使用openai0.29,B项目使用openai1.10,这个时候,就会出现两个项目只能运行一个的情况。如果安装1.10,会把原来0.29的版本更新掉,导致原来A项目就运行不了。刚接触python,很好奇为啥没有像npm一样的......
  • MySQL官方使用手册(自译)
    Chatper1OverviewOfMySQLDBMSwhatisMySQLMySQL,themostpopularOpenSourceSQLdatabasemanagementsystem,isdeveloped,distributed,andsupportedbyOracleCorporation.TheMySQLwebsite(http://www.mysql.com/)providesthelatestinformationa......
  • 基于GD32F303,CMSIS-DSP支持包,实现FFT,得到频率,还原单一频率的波形
        一般情况下M33M4的内核是支持DSP包的,用户只需要自己添加支持包,并添加相应的头文件即可,比如#include"arm_math.h",#include"arm_const_structs.h"等等。(1)main.c#include"gd32f30x.h"#include"stdio.h"#include"string.h"#include"arm_......
  • 三星刷机 线刷 刷公开版/国行和港版互刷 (三星使用手册)
    原文1:https://www.coolapk.com/feed/30245770?shareKey=YjI0YjZmOTc1OTY2NjJhYmNmYjQ~&shareUid=960037&shareFrom=com.coolapk.market_12.3.1原文2:https://www.coolapk.com/feed/48366338?shareKey=ODg3ZDg1YTE1OGMzNjVlZWQ3ZDU~&shareUid=960037&shareFrom=c......
  • NPOI使用手册
    转自: https://www.cnblogs.com/Liyuting/p/13673632.html目录1.认识NPOI 2. 使用NPOI生成xls文件2.1 创建基本内容2.1.1创建Workbook和Sheet2.1.2创建DocumentSummaryInformation和SummaryInformation2.1.3创建单元格2.1.5创建批注2.1.6创建页眉和页脚 2.2 单......
  • dzzoffice 私有网盘使用手册
    dzzoffice是一款多人协作办公工具,提供企业团队文件集中管理服务。主要功能涵盖:权限管理,群组和机构部门管理,空间设置,文件分享管理,文件基本操作等。一.用户注册打开首页链接后,点击立即注册即可跳转至注册页(前提是管理员开放注册功能),需要注意的是,因为成员间无法查看成员信息......