本文采用stm32f103,基于标准库工程,实现的结果是使芯片上的灯点亮(输出为GPIOC,Pin13号端口),在不需要其余外界接线的条件下,能够最清楚最明了的了解GPIO输出时需要进行的配置。
文章目录
一、了解GPIO的8中输入输出模式
通过配置GPIO的端口配置寄存器,端口可以配置成一下8种模式:
接下来我们对各个模式进行具体的介绍:
输入浮空:浮空输入模式是一种高阻抗输入模式。在该模式下,引脚不连接到外部电路,处于高阻抗状态。可以通过读取引脚电平来检测外部信号。
上拉输入:上拉输入模式是一种具有内部上拉电阻的GPIO输入模式。在该模式下,引脚连接到外部电路,通过内部上拉电阻来维持默认电平为高电平。
上拉就是把点位拉高,比如拉到Vcc。上拉就是将不确定的信号通过一个电阻嵌位在高电平。电阻同时起到限流的作用。弱强只是上拉电阻的阻值不同,没有什么严格区分
输入下拉:就是把电压拉低,拉到GND。与上拉原理相似。在该模式下,引脚连接到外部电路,通过内部下拉电阻来维持默认电平为低电平。
模拟输入:模拟输入是指传统方式的输入,数字输入是输入PCM数字信号,即0,1的二进制数字信号,通过数模转换,转换成模拟信号,经前级放大进入功率放大器,功率放大器还是模拟的。
模拟输入模式是一种用于ADC(模数转换器)输入的特殊模式。在该模式下,引脚可以接收连续变化的模拟信号,其他情况下一般不该模式。
开漏输出:输出端相当于三极管的集电极,要得到高电平状态需要上拉电阻才行,适合于做电流型的驱动,其吸收电流的能力相对强(一般20mA以内)
数字输出口,可以输出高低电平,输出的高电呈现高组态,没有驱动能力
复用开漏输出:该模式允许将GPIO引脚用作特定外设功能。在该模式下,引脚只能输出低电平,要输出高电平需要通过外部上拉电阻或其他方式。
STM32单片机内部有其他的外设,比如定时器、DAC等。复用开漏输出与普通开漏输出区别在于,开漏输出输出的是输出数据寄存器中的数据,复用开漏输出输出的是来自外设的数据。
推挽式输出:可以输出高,低电平,连接数字器件;推挽结构一般是指两个三级管分别受到互补信号的控制,总是在一个三极管导通的时候另一个截止。高低电平由IC的电源低定。推挽式输出为数字输出口,可以输出高低电平,高低电平都具有驱动能力。
复用推挽输出:该模式允许将GPIO引脚用作特定外设功能。在该模式下,引脚可以输出高电平或低电平,并具有一定的驱动能力,可以理解为GPIO口被用作第二功能时的配置情况(并非作为通用IO口使用)
二、程序编写部分
1、端口时钟配置
新建一个工程进行主程序编写(用上一篇文章的工程模版创建),打开main.c函数,进行GPIO时钟配置,第一行点击鼠标右键,在弹出的窗口中选择头文件插入,然后编写main函数,再加上while(循环函数),当while后面括号内为1时,即无限循环这段程序。(函数末尾必须空一行)
接下来我们利用函数调用,建立一个子程序进行配置,我们将函数命名为GPIO_init();
使用RCC_APB2PeriphClockCmd()函数即外设时钟使能或者失能函数,即启动我们所需要使用的GPIO口,这个函数有两个参数,第一个参数是我们要调用的端口,第二个函数即”使能“或”失能“,可以把鼠标放在函数上面,右键选择go to definition ~~~前往查看函数配置,我们使用GPIOC口,即
接下来我们用GPIO_InitTypeDef定义一个具有局部变量的结构体(结构体名字可自行命名),然后对结构体变量进行赋值,输入结构体名称.(名称后加上英文的一点.),出现一个可选窗口,里面三个变量都需要我们赋值,Mode是端口的模式,即上面介绍的8种模式,这里因为我们是点亮led灯,因此选用推挽输出;speed是晶振速度,一般默认使用50MHZ;Pin是端口中的引脚,一般端口有16个引脚,这里我们仅仅使用13引脚。
对端口配置完成后使用GPIO_Init()对端口进行初始化,同样,我们可以右键前往查看函数定义,可以看GPIO_Init()对应两个参数,第一个参数为端口,第二个参数是我们上面定义的结构体,但是要注意的是,这里结构体前要添加&(取址符,可用于函数的值传递等情况)。
这样我们就完成了对端口配置及初始化的子函数编写。
2、用于GPIO的输出函数
上面完成了子函数的编写,接下来我们进行主函数的编写,在主函数的最开始,我们要先把端口进调用初始化,即调用我们上面编写完成的子函数。
在keil5中有四个输出函数,这里我们暂时只用两种,即GPIO_SetBit()以及GPIO-ResetBits(),这两个函数都有两个参数,第一个参数是GPIOX(X代表端口A,B,C等),第二个参数为GPIO_Pin_X(X代表引脚号,即1~16个引脚),setbits是把指定端口设为高电平,restbits把指定端口设定为低电平。这里我们使用芯片上的显示灯,即GPIOC中的13引脚。(本文仅进行对灯进行亮与灭切换,因此不需要使用while循环)
在编写程序的过程中,我们会使用双斜杠//对程序进行注释,增加工程的可读性。
在这里我们先将13引脚置为低电平进行调试观察现象,所以我们将GPIO_SetBits()注释(编辑器不会识别这行程序)。
然后我们对程序进行编译,没有错误后就可进行实验调试阶段。
三、点灯环节,程序调试
1、软件调试
使用软件调试时,先进行系统设置,点击“魔术棒”,然后找到“debug”,如下图所示,更改三个地方,勾选左边软件调试的use simulator,在对下面的两个方框内容进行更改,然后确认。
点击调试图标,打开示波器,弹出的窗口比较小,将光标放至边框边缘拉动放大,如下图
点击示波器左上角的setup,在窗口中新建,然后输入名称PORTC.13(因为我们我监视的是GPIOC的13脚),然后鼠标点击名称下方的空白区,会自动生成PORTC.13开头的一行,将下方的type(类型)更改为Bit,关闭窗口。
然后我们点击调试(快捷键F5),就可以看到示波器出现一条直线,即代表这个端口输出了低电平,或者说这个时候灯已经点亮了(灯为低电平驱动)。
当我们在程序中将输出端口GPIO_SetBits()这一行的注释取消,将GPIO_ResetBits()注释,编译后调试,就会发现输出的曲线在示波器的上方,即端口输出为1。(需要退出调试模式才能修改编译,再次点击调试图标退出软件调试)
2、硬件调试
首先我们要对硬件芯片与ST_LINK V2进行接线,如下图。注意,这里ST_LINK V2用的是下面一排的端口, 3.3v与GND不能接反,否则会烧坏器件。建议接完线再检查一遍。一定是ST_LINK V2方一排的端口(2、4、6、8端口)
接完线我们对软件内的硬件调试进行设置,魔术棒内的debug,界面右边的硬件调试,然后在设置界面选择SW。
然后我们将ST_LINK V2插到电脑usb口上,这时ST_LINK V2上面的灯会亮,然后上面设置 SW的界面会出现特定的序列号,这是证明我们的芯片已经连接上了。
然后我们点击下载,即可将程序烧录至芯片中,我们先烧录13脚输出低电平的情况。
点击下载后,会发现ST_LINK V2上面的灯在闪烁,等到灯变为常亮即下载完成或者是软件状态栏显示ok的字样即可,这是我们可以看到芯片上面亮多了一个灯。
然后我们再讲GPIO_ResetBits()这一行的注释取消,将GPIO_SetBits()注释,编译后下载,发现灯熄灭。
文章如有错误的地方,请大家多多指正。