2# 关于 STM32 中 GPIO 库文件

1. 前言

        STM32 的资源非常丰富,所以加大了编程的难度,但是好在有官方的库函数,于是我们就可以先不用学习 寄存器 的作用,而是在前人的库函数基础上,进行搭建项目,这些库函数就是位于 Libraries/STM32F10x_StdPeriph_Driver 这个文件夹下。加上有 Eclipse 这个优秀的编译器,所以找出学习要点非常的简单。下图就是在 GPIO 头文件中定义的宏定义,结构体,函数等:

image.png

        所以学习 GPIO 这个头文件也是一样,从这些点开始,然后进行补充。

2. 关于结构体

        在 STM32 中最常见的就是对 GPIO 口的初始化。

typedef struct
{
  uint16_t GPIO_Pin;              GPIO的引脚号
  GPIOSpeed_TypeDef GPIO_Speed;   GPIO的引脚的运行速度
  GPIOMode_TypeDef GPIO_Mode;     GPIO的引脚的运行模式
}GPIO_InitTypeDef;

3. 关于函数方法

        下图就是 GPIO 的全部函数方法,但是常用的并不多。

函数方法.png

常用的如下:

初始化 GPIO(GPIOx, GPIO_InitStruct)口
void GPIO_Init(GPIO_TypeDef* GPIOx, GPIO_InitTypeDef* GPIO_InitStruct);
读取 GPIO(GPIOx, GPIO_InitStruct)口高低电平
uint8_t GPIO_ReadInputDataBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
按16位引脚的方式读取(GPIOx)高低电平信息
uint16_t GPIO_ReadInputData(GPIO_TypeDef* GPIOx);
将指定位置的引脚设置为高电平(GPIOx,GPIO_Pin)
void GPIO_SetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
将指定位置的引脚设置为低电平(GPIOx,GPIO_Pin)
void GPIO_ResetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);

4. 可用模板

        这个模板是对 GPIO 的初始化,我称为 MYGPIOCON 。

// 定义一个GPIO_InitTypeDef类型的结构体
GPIO_InitTypeDef GPIO_InitStructure;
 
// 开启LED相关的GPIO外设时钟
RCC_APB2PeriphClockCmd( LED1_GPIO_CLK, ENABLE);
 
// 选择要控制的GPIO引脚
GPIO_InitStructure.GPIO_Pin = LED1_GPIO_PIN;

// 设置引脚模式为通用推挽输出
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;

// 设置引脚速率为50MHz
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
 
// 调用库函数,初始化GPIO
GPIO_Init(LED1_GPIO_PORT, &GPIO_InitStructure);

5. 样例项目

        样例项目 test_GPIO 是在新建项目基础上进行的。

第一步:创建一个源目录

        第一步是创建一个源目录(source dir) my 用来存放我们写的库文件,在 my 目录下创建两个目录 inc(存放 .h 头文件),src(存放 .c 源文件)。
方法如下:
        创建一个源目录(source dir) my,创建的原因:只有源目录下的 .c 文件才会被编译,被链接到

创建一个源目录.png

        在 my 文件夹下创建 inc 和 src 目录。

image.png

第二步:将 my/inc 加入到 includes 路径中

        将 my/inc 加入到 includes 路径中。

项目右键 => 属性

image.png

Paths and Symbols =>Add

属性.png

通过 Workspace 选择路径,并应用。

选择路径.png

        第二步是 在 src 目录下创建 bsp_led.c,在 inc 目录下创建 bsp_led.h 文件。

image.png

第三部:编写库函数

        第三部编写库函数
        这部分本来也不难,只是一个打字的活,但是难的是如何快速写出来,并且写的舒服。

  1. 修改文字大小,不修改看着中文会特别小(如图)
中文注释.png

修改方法:
窗口=>首选项

首选项.png

常规小六子 => 外观 => 颜色和字体 => 基本 => 文本字体=>编辑


颜色与字体.png

将字体设置为 16 号,并确定。

image.png
中文显示.png
  1. 使用代码提示
    先在 my/inc/bsp_led.h 文件中写下以下文字。
    提示: [ALT +/ ] 可以显示代码提示
#ifndef INC_BSP_LED_H_
#define INC_BSP_LED_H_

#include "stm32f10x.h"

#define LED_GPIO_PORT   GPIOB
#define LED_GPIO_PIN    GPIO_Pin_5
#define LED_GPIO_CLK    RCC_APB2Periph_GPIOB

// 注意末尾没有分号
#define LED(a)      if(a)   GPIO_SetBits(LED_GPIO_PORT,LED_GPIO_PIN); else  GPIO_ResetBits(LED_GPIO_PORT,LED_GPIO_PIN)

// 通过模板编写
void LED_GPIO_Config(void);

#endif /* INC_BSP_LED_H_ */

写下上述文字可以发现, Eclipse 并不是全部内容都会提示,只提示与宏定义相关的。而函数定义的却没有。所以我们应该加上一些东西。设置如下:
窗口=>首选项

首选项.png

C/C++ => Editor => Content Assist => Advanced

代码提示.png

代码提示的功能就有了,只是需要使用 [ALT] + /

然后是编写 my/src/bsp_led.c 文件

#include "bsp_led.h"
void LED_GPIO_Config(void)
{
    /* 定义一个 GPIO_InitTypeDef 类型的结构体 */
    GPIO_InitTypeDef GPIO_InitStructure;

    /* 开启 LED 相关的 GPIO 外设时钟 */
    RCC_APB2PeriphClockCmd(LED_GPIO_CLK, ENABLE);

    /* 选择要控制的  GPIO 引脚 */
    GPIO_InitStructure.GPIO_Pin = LED_GPIO_PIN;

    /* 设置引脚模式为通用推挽输出 */
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;

    /* 设置引脚速率为 50MHz(如果为输入模式没有此项) */
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

    /* 调用库函数,初始化 GPIO */
    GPIO_Init(LED_GPIO_PORT, &GPIO_InitStructure);
}

虽然字不多,但是同样此处可以偷懒,方式就是建立模板(Templates),我把这个模板名称为 "MYGPIOCONF"。并且 MYGPIOCONF 使用的频率应该是最高的,定义一个端口都要进行配置 GPIO。
创建方式如下:

  1. 窗口=>首选项
首选项.png
  1. C/C++ => Editor => Templates
Templates.png
  1. 新建
新建模板.png

将下文加入到模式中(确认没有 [Tab])

/* 定义一个 GPIO_InitTypeDef 类型的结构体 */
GPIO_InitTypeDef GPIO_InitStructure;

/* 开启 LED 相关的 GPIO 外设时钟 */
RCC_APB2PeriphClockCmd(LED_GPIO_CLK, ENABLE);

/* 选择要控制的  GPIO 引脚 */
GPIO_InitStructure.GPIO_Pin = LED_GPIO_PIN;

/* 设置引脚模式为通用推挽输出 */
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;

/* 设置引脚速率为 50MHz(如果为输入模式没有此项) */
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

/* 调用库函数,初始化 GPIO */
GPIO_Init(LED_GPIO_PORT, &GPIO_InitStructure);
  1. 尝试模板好不好用,将 my/src/bsp_led.c 改为下文
MYGPIOCONF.png

光标在 MYGPIOCONF 处,然后按下 [ALT] + / ,会补充原文。

第四部:编写主函数

在主函数下,写入以下代码,可以看见,现在代码结构很清晰,而且还为以后写 STM32 代码打下一定基础。

#include "stm32f10x.h"
#include "bsp_led.h"

/* 定义与延时相关 */
#define SOFT_DELAY Delay(0xFFFFF);

/* 简单延时函数 */
void Delay(__IO u32 nCount);

int main(void)
{
    LED_GPIO_Config();
    while(1){
        LED(1);
        SOFT_DELAY;
        LED(0);
        SOFT_DELAY;
    }
}

// 简单延时函数
void Delay(__IO u32 nCount)
{
    for(;nCount!=0;nCount--);
}

第五步:烧录

这步其实挺简单的,只是对器材有点刻薄。
点击小虫子,就能进行烧录调试了。
如果想要只下载不调试,可以在文中加入 quit。
如同前面介绍的 bilibili 中一样。


image.png
image.png
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,569评论 4 363
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,499评论 1 294
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 109,271评论 0 244
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,087评论 0 209
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,474评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,670评论 1 222
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,911评论 2 313
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,636评论 0 202
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,397评论 1 246
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,607评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,093评论 1 261
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,418评论 2 254
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,074评论 3 237
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,092评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,865评论 0 196
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,726评论 2 276
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,627评论 2 270

推荐阅读更多精彩内容