GD32的GPIO口的输出功能-LED0闪烁实验
硬件:深圳标航科技有限公司 暴风 开发板
处理器:GD32F103VET6
开发环境:MDK(keil 5) + STM32CubeMX
1.1 GD32F103VET6的IO引脚图
由于GD32和STM32是PIN对PIN的,他们的引脚排列、封装、大小都完全相同,所以GD32F103VET6的引脚结构与STM32F103VET6完全一样,由于大家都对STM32比较熟悉,所以这里直接采用STM32F103VET6的引脚图当做GD32F103VET6的引脚图,该引脚图如图1所示。
图1 GD32F103VET6的引脚分布图
由图可见,GD32F103VET6 (在后续介绍中,简写为GD32)一共有100个引脚,其中既可以做输入,也可以做输出的引脚(成为IO引脚)一共有80个,这80个引脚分为PA、PB、PC、PD和PE一共5组,每组包含16个引脚。在图1中,这些IO引脚的颜色为灰色。
我们在STM32CubeMX的引脚搜索框中输入某组引脚名,可以看到该组引脚会闪烁,闪烁时颜色为灰色和黑色交替变化。例如,我们在引脚搜索框中输入PE,可以看到变为黑色时的效果如图2所示。
图2 在引脚搜索框输入PE时芯片PE组引脚变黑色示意图
如果输入的是具体的某一个引脚,比如PE12,可以看到PE12闪烁,颜色也是灰色和黑色交替变化。将鼠标移到PE12的上方用左键点击,会弹起PE12引脚的功能列表如图3所示。
图3 PE12引脚功能列表示意图
可以看到,PE12除了作为输入(GPIO_Input)和输出(GPIO_Output)外,还有其他7种功能。处理器的IO引脚除了可以作为输入输出引脚外,还能够作为其他模块,比如定时器的输出、SPI模块的引脚、串口的功能引脚等功能,具有“通用性”,所以这类引脚我们用通用IO引脚来描述,叫GPIO引脚,以区别于功能比较单一的如51单片机之类的IO引脚。
1.2 GD32的引脚输出功能应用配置
将GD32的GPIO引脚配置为输出后,可以让该引脚输出高电平或者低电平以控制外部电路。
比如,如图4所示的LED灯电路,LED的阳极接3.3V,阴极接PE12,由二极管的单向导电性可知,要想让LED0亮,我们应该让PE12输出低电平。
图4 LED0电路示意图
又如,如图5所示的有源蜂鸣器(有源蜂鸣器是有电流流过蜂鸣器时,蜂鸣器会发声)电路,要想有源蜂鸣器响,则应该让电流流过蜂鸣器,而要想让蜂鸣器有电流流过,三极管S8050的CE端必须导通,而要想S8050的CE端导通,则必须让PB2输出高电平。所以,此时要配置PB2输出高电平,蜂鸣器才会发声。
图5 有源蜂鸣器电路图
了解了GPIO口的输出功能后,下面我们通过一个例子来进一步学习GPIO引脚输出功能的使用。
【例1】已知LED0与GD32的连接图如图4所示,编写程序,实现LED0的闪烁效果。
【实现过程】
1.配置芯片时钟,分为2步。
①.配置芯片高速时钟使用外部晶体/陶瓷晶振和GD32的内部时钟调整模组配合产生的时钟作为芯片主要时钟源,其配置过程如图6所示。
图6 配置芯片高速时钟选项示意图
②.配置芯片系统时钟频率,其配置过程如图7所示。
图7 系统时钟配置过程图
配置好后,HCLK以及定时器模块的内部时钟频率都为72MHz,而APB1总线和APB2总线挂接的模块的频率则为36Mhz。
2.配置调试选项。在本教程中,我们使用的调试工具都为如图8所示的10PIN的ST-link。
图8 10PIN的ST-LINK示意图
这需要在STM32CubeMX的调试选择项中选择调试方式为Serial wire(串口线),其选择过程如图9所示。
图9 调试选择示意图
注意:如果不选择该选项,则使用ST-LINK下载程序时,就需要按复位键,然后再在MDK中点击下载按钮下载程序。
在图9中将调试模式设置为Serail Wire后,可以看到PA13和PA14这两个默认的串口下载数据和时钟引脚会变为绿色,如图10所示。
图10 调试设备配置完成后PA13和PA14引脚图
3.配置IO引脚。整个配置过程步骤为:
(1)找到PE12,将其功能设置为GPIO_Output(输出),如图11所示,设置好后可以看到PE12变为绿色。
图11 PE12设置为输出的过程示意图
(2)配置PE12的输出功能的其他选项,这些选项的配置过程和含义如图12所示。
图12 PE12作为输出时的配置选项示意图
下面我们对这些选项进行逐一介绍。
①GPIO output level。该选项用于初始化IO引脚的电平,有高电平High和低电平Low两个选项,如果选择High,则初始化后,LED0将不会亮;如果选择Low,则初始化完成后LED0将会亮。这里我们采用默认的Low,当STM32CubeMX生成代码后,编译并将生成的hex文件下载到开发板中,可以看到LED亮。
②GPIO mode。该选项为IO引脚做输出时其内部电路的驱动选项,有两个选择,分别为:
●Output Push Pull。该选项为推挽输出选项。
●Output Drain Open。该选项为开漏输出选项。
配置为推挽输出,则IO引脚内部的电路为推挽电路,这种电路可以输出0也可以输出1。配置为开漏输出,则IO引脚内部的电路为开漏电路,这种电路只能输出0不能输出1,要想输出1则必须在引脚的外面引出一个上拉电阻或者使能IO引脚内部的上拉电阻。开漏输出一般用于大电流场合,在本教程的例子中,这些IO引脚控制电路都是小电流场合,所以这里我们采用默认,配置为推挽输出。
●GPIO Pull-up Pull-down。该选项为上下拉电阻使能选项。GD32/STM32的每个IO引脚的内部都有一对受控的上拉电阻和下拉电阻,该选项就用于配置是否使能里面的上拉或者下拉电阻,它里面有3个选择:
·No Pull-up and No Pull-down。既不使能上拉电阻也不使能下拉电阻。
·Pull-up使能上拉电阻。
·Pull-down使能下拉电阻。
由于内部电路的驱动方式使用了推挽方式,所以这里不需要使能上拉电阻也不需要使能下拉电阻,所以我们采用默认的选项--GPIO Pull-up Pull-down既不使能上拉也不使能下拉。
●Maximum output speed。该选项用于配置IO引脚的响应速度,对于本教程的低频场合对这个响应速度不做要求,所以里面的3个选项任意选择一个即可,这里我们采用默认。
●USER Label。该选项为程序员为方便记忆,为引脚取一个别名的选项。比如本例子中,可以为PE12取名为LED0,以方便记忆。不过,这里我们不打算这样做,而是仍然采用默认。
4.配置工程管理
配置工程管理有三个选项,分别是工程Project、代码生成Code Generator和高级设置Advanced Settings三个选项。下面分别介绍这三个选项的配置。
①Project。工程选项主要是填写工程的名字、工程的存放路径、使用的IDE工具和版本、堆栈设置等,他们的设置如图13所示。
图13 工程管理中的Project选项的设置
②Code generator。代码生成选项的配置如图14所示。
图14 代码生成选项示意图
③Advanced Setting。高级设置这里使用默认设置即可。
5.点击Stm32CubeMX右上角的Generate code按钮,生成代码,该按钮如图15所示。
图15 Generate code
6.代码生成后,会弹出如图16所示的对话框。
图16 代码输出结果示意图
其中,
①打开文件夹选项。如果点击该按钮,将会打开生成的MDK工程所在的文件夹;
②打开工程选项。如果点击该选项,将会打开工程。
③关闭选项。点击它,将会关闭该对话框。
我们点击打开工程选项,打开工程,然后编译工程,并将编译结果下载到开发板上,可以看到LED0处于点亮的状态。
7.在工程中添加代码。经过步骤6后,LED0是点亮了,但是例子的目标还没有实现。要想实现例1的目标,可以在主函数中采用如下的结构:
int main(void){ 系统初始化; while(1) { LED0亮; 延时以便能观察到灯亮; LED0灭; 延时以便能观察到灯灭; } }
注意,如果灯亮或灭的持续时间太短,则人眼可能捕捉不到,大家可以试一下。
对于系统初始化,在使用STM32CubeMX输出工程时CubeMX已经调用HAL库的函数/组件进行了初始化,我们不用管。那目前的问题就是如何使得LED0亮/暗和延时,下面分别介绍。
(1)LED0的亮/暗
①亮。使用如下语句来实现
HAL_GPIO_WritePin(GPIOE, GPIO_PIN_12, GPIO_PIN_RESET);
②灭。使用如何语句实现。
HAL_GPIO_WritePin(GPIOE, GPIO_PIN_12, GPIO_PIN_SET);
可以看到,设置IO引脚输出高低电平可以通过调用HAL库中的GPIO写函数HAL_GPIO_WritePin来实现,该函数的最后一个参数为IO引脚的状态,设置为GPIO_PIN_RESET,则引脚输出低电平,设置为GPIO_PIN_SET,则引脚输出高电平。
(2)延时。
HAL库提供了一个基于Systick的延时函数—HAL_Delay()。该函数只有一个整型参数,它延时时以ms为单位,比如如果我们想延时1S,则参数应该设置为1000,也即延时语句应该为
HAL_Delay(1000);
最终,main函数的内容如图17所示
图17 主函数内容示意图
8.对工程进行编译,并将结果下载到开发板上,可以看到开发板上的LED0闪烁,每次亮暗持续时间各位1S,例1目标完成。
1.3 结论及注意事项
1.对于GD32的GPIO引脚,每一个引脚都可以配置为多个功能,作为输出时要配置为GPIO_Output功能。
2.配置为输出功能时,要配置以下两个关联项
①引脚内部电路的驱动方式。IO引脚内部的驱动方式有两种,一种是推挽,一种是开漏。非大电流、灌电流的情况下,使用推挽方式,这种方式下引脚可以输出1也可以输出0,所以不需要配置上拉电阻/下拉电阻的使能。
②输出响应速度,通常使用默认即可。
3.一定要注意在STM32CubeMX中设置调试方式,否则使用ST-LINK下载的时候,你只能按下复位键并同时按下载,才能下载程序。
4.对于GD32/stm32的每一个模块电路,使用的时候都要先使能该模块的时钟,不过,在配置STM32CubeMX输出工程时没有体会到这一点,但是大家一定要警惕。
5.STM32CubeMX在生成代码时,默认调用的是HAL库的函数,HAL库的函数的取名方式为
HAL+模块名称+模块动作(函数参数)
比如本项目中学到的GPIO引脚输出高低电平的函数HAL_GPIO_WritePin。
6.HAL库的延时函数HAL_Delay()的延时以ms为单位。