第二章 STM32F103C8T6的HAL库GPIO口使用
前言
本章开始学习STM32hal库的GPIO口,以简易通俗的方式讲解STM32片上及外设含义与通用I/O口的使用,末尾附带源代码供参考学习。
一、片上资源/外设含义
STM32主要有以下功能,在今后的学习中会经常看到这些英文缩写,希望能够记住他们代表的功能含义,今天主要讲解GPIO口,即通用I/O口的使用。
二、引脚定义
在使用各个引脚前需要先查看该引脚的主功能是什么,即默认使用功能是什么,例如本次配置通用I/O口的使用,I(input)代表输入,O(output)代表输出,需要找到类型为I/O且主功能为字母带数字的引脚,后续如果要是用例如CAN、USART、定时器等功能还需要对引脚进行复用(后面会进行讲解),像NRST只能作为复位引脚,类型为S代表电源引脚,其中I/O口电平中FT代表5V兼容,可以容忍5V的输入电压,而正常的STM32的引脚仅能接受3.3V的电压输入。
三、GPIO端口模式
在配置GPIO口使用时,会有各种模式选择,每种模式对应不同的特征,具体需要根据使用场景进行确定。
本次讲解GOIP的高低电平输出与输入。
1.引脚高低电平输出
下面语句第一条为PB5输出高电平,第二条为PB5输出低电平,STM32有GPIOA、GPIOB两个端口,其端口有众多引脚,本次语句中用的为PB5引脚,SET代表输出高电平,RESET代表输出低电平。
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_5, GPIO_PIN_SET);
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_5, GPIO_PIN_RESET);
下面该语句代表反转电平,即反转PB5引脚电平,每当执行一次该语句PB5的引脚电平就变为相反状态。
HAL_GPIO_TogglePin(GPIOB, GPIO_PIN_5);
例如下面语句现象为PB5每隔500ms进行一次高低电平转换,给PB5引脚接一个LED灯,则灯会亮500ms,接着灭500ms依次循环下去。
while(1)
{
HAL_GPIO_TogglePin(GPIOB, GPIO_PIN_5);
delay_ms(500);
}
在此之前可像之前创建main文件时同样的步骤创建个led.c和.h文件,将以下语句放在里面,该语句为LED灯的配置,含有对时钟的使能,引脚选择,模式选择,是否上拉,传输速度以及初始化引脚。
#include "main.h"
void led_init(void)
{
GPIO_InitTypeDef gpio_init_struct;
__HAL_RCC_GPIOB_CLK_ENABLE(); /* GPIOB时钟使能 */
gpio_init_struct.Pin = GPIO_PIN_5; /* 引脚 */
gpio_init_struct.Mode = GPIO_MODE_OUTPUT_PP; /* 推挽输出 */
gpio_init_struct.Pull = GPIO_PULLUP; /* 上拉 */
gpio_init_struct.Speed = GPIO_SPEED_FREQ_HIGH; /* 高速 */
HAL_GPIO_Init(GPIOB, &gpio_init_struct); /* 初始化GPIOB引脚 */
}
下面是led.h文件的程序,其中要声明一下led初始化函数,方便后续调用。
#ifndef __led_H
#define __led_H
void led_init();
#endif
主函数中要对led配置进行初始化,然后在while循环语句中写入引脚状态,若默认该引脚状态为高电平或者低电平可以在配置初始化最后面写入高低电平输出语句。
#include "main.h"
int main(void)
{
led_init();
while(1)
{
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_5, GPIO_PIN_RESET);
}
}
main.h中要添加上led.h库文件
#ifndef __main_H
#define __mian_H
#include "stm32f1xx.h"
#include "stm32f1xx_hal.h"
#include "stm32f1xx_it.h"
#include "delay.h"
#include "sys.h"
#include "led.h"
#endif
2.引脚输入
引脚输入一般为对于外部高低电平的判断,本次采用按键作为外部输入,配置与led大致相同,可以创建一个key.c和.h文件,模式选择输入模式,需要注意引脚是否为I/O口,之前选择PB4一直没有反应,发现PB4不能作为输入引脚。
下面是key.c库文件
void key_init(void)
{
GPIO_InitTypeDef gpio_init_struct;
__HAL_RCC_GPIOB_CLK_ENABLE(); /* GPIOB时钟使能 */
gpio_init_struct.Pin = GPIO_PIN_6; /* 引脚 */
gpio_init_struct.Mode = GPIO_MODE_INPUT; /* 输入 */
gpio_init_struct.Pull = GPIO_PULLDOWN; /* 下拉 */
gpio_init_struct.Speed = GPIO_SPEED_FREQ_HIGH; /* 高速 */
HAL_GPIO_Init(GPIOB, &gpio_init_struct); /* 初始化GPIOB引脚 */
}
对于引脚输入功能,需要有相应的读取引脚输入状态的语句,HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_6)为读取PB6的引脚状态,可以以此进行判断,对于引脚初始状态和配置中上拉或者下拉有关,例如在主函数while语句中判断PB6的状态执行相应的操作,设定读取PB6高电平,则应设置为下拉模式,当由高电平出现时,则PB5输出高电平,否则输出低电平。
while(1)
{
if (HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_6)==SET)
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_5, GPIO_PIN_SET);
else
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_5, GPIO_PIN_RESET);
}
总结
以上就是今天要讲的内容,本文仅仅简单介绍了一些STM32的片上资源和外设含义,引脚定义和GPIO口的使用,能够帮助读者更好地掌握STM32的应用,如果有疑问的地方或者需要源代码可以私信我,若有讲错的地方还请批评指正,让我们一起学习,一起进步。
源代码链接:https://pan.baidu.com/s/1hzCq_nN06fB_h3cj6ShVmQ
提取码:zstu