IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 嵌入式 -> stm32引脚配置—F1与F4系列 -> 正文阅读

[嵌入式]stm32引脚配置—F1与F4系列

一、stm32的GPIO模式简介

stm32的GPIO引脚共有输入、输出和复用三种模式,每种模式又有多种使用形式:

1、输入模式

????????a.输入上拉

????????b.输入下拉

????????c.输入浮空

????????d.模拟输入

2、输出模式

????????a.开漏输出

????????b.推挽输出

3、复用模式

????????a.推挽式复用

????????b.开漏式复用

各形式说明:

上拉:GPIO通过上拉电阻接到VCC,即高电平;

下拉:GPIO通过下拉电阻接到GND,即低电平;

浮空:GPIO不上拉也不下拉,处于浮空状态(浮空状态的高低电平不稳定,一般不浮空);

推挽输出:既可以输出高电平也可以输出低电平;

开漏输出:输出低电平时引脚接地,无法真正输出高电平,即高电平时没有驱动能力,需要外接上拉电阻;这种方式适合在连接的外设电压比单片机电压低的时候。

复用:GPIO可以用作其他功能引脚,例如复用为串口、ADC、SPI等,每个引脚可复用的功能不同,具体需查看芯片手册引脚定义章节。

二、GPIO配置

????????stm32的引脚配置相关库函数及定义在”stm32f10x_gpio.c”和”stm32f10x_gpio.h”(F4系列:”stm32f4xx_gpio.c”和”stm32f4xx_gpio.h”)这两个文件里面。要使用相关外设就必须要使能,关于使能的库函数及定义在”stm32f10x_rcc.c”和”stm32f10x_rcc.h”(F4系列:”stm32f4xx_rcc.c”和”stm32f4xx_rcc.h”)里面。

1、GPIO初始化函数

void GPIO_Init(GPIO_TypeDef* GPIOx, GPIO_InitTypeDef* GPIO_InitStruct);

????????函数有两个参数,GPIOx则是哪组GPIO(GPIOA、GPIOB、GPIOB……),第二个参数则是一个结构体变量,该结构体成员如下(在.h头文件中找到):

F10x系列:

typedef struct
{
? uint16_t GPIO_Pin;???????????? /*引脚号选择,多个引脚时用|隔开,GPIO_Pin_0---15*/
? GPIOSpeed_TypeDef GPIO_Speed;? /*速率选择*/
? GPIOMode_TypeDef GPIO_Mode;??? /*模式选择*/
}GPIO_InitTypeDef;

F4xx系列:

typedef struct
{
? uint32_t GPIO_Pin;????????????? /*引脚号选择,多个引脚时用|隔开,GPIO_Pin_0---15*/
? GPIOMode_TypeDef GPIO_Mode;???? /*模式选择*/
? GPIOSpeed_TypeDef GPIO_Speed;?? /*速率选择*/
? GPIOOType_TypeDef GPIO_OType;?? /*输出类型,推挽输出、开漏输出,如为输入模式则去掉该项*/
? GPIOPuPd_TypeDef GPIO_PuPd;???? /*上拉下拉选择*/
}GPIO_InitTypeDef;

????????对结构体成员赋值即可完成该引脚的配置,而每个成员又是一个枚举变量,因此我们只需选择其中一个枚举值进行赋值即可,相关的枚举值在_gpio.h头文件里能找到。

2、外设使能函数及选择

(关于使能函数的选择,本人有幸体会过找错函数的尴尬:那是一个课堂上,需要点亮一个LED的简单任务,就因为选错了使能函数使得LED不能点亮,不断更改程序都无果,以致于使我觉得是板子的问题,于是叫来了助教,助教一眼就看出我的使能函数错了,我******这段话是个废话)

????????不同外设的使能函数不同,不同系列芯片同种外设的使能函数也有差异,这与芯片内部构造有关。在"stm32f10x_rcc.h"(F4系列:”stm32f4xx_rcc.h”)头文件中可以找到多种使能函数:

void ?? RCC_AHB1PeriphClockCmd(uint32_t RCC_AHB1Periph, FunctionalState NewState);

void ???RCC_AHB2PeriphClockCmd(uint32_t RCC_AHB2Periph, FunctionalState NewState);

void??? RCC_AHB3PeriphClockCmd(uint32_t RCC_AHB3Periph, FunctionalState NewState);

void??? RCC_APB1PeriphClockCmd(uint32_t RCC_APB1Periph, FunctionalState NewState);

void??? RCC_APB2PeriphClockCmd(uint32_t RCC_APB2Periph, FunctionalState NewState);

????????函数都有两个参数,第一个参数是外设,第二个参数是新状态(使能(ENABLE)或不使能(DISABLE))。既然不同外设的使能函数不同,那么怎么选择函数呢?

关于使能函数的选择

这里介绍两种本人常用方法(当然记住最好):

第一种方法:

????????在"stm32f10x_rcc.c"源文件中找到该函数,在函数的上面就有介绍,例如:找到介绍有RCC_APB2Periph_AFIO, RCC_APB2Periph_GPIOA,就说明该函数就是使能复用(AFIO)及GPIOA外设的。

第二种方法:

????????在”stm32f10x_rcc.h”头文件中找相关参数定义。例如:要使能GPIOA;则找到这个xxxxxGPIOA,对照前面的APB2就知道要找的函数为:

void? RCC_APB2PeriphClockCmd(uint32_t RCC_APB2Periph, FunctionalState NewState);

3、完整的GPIO初始化步骤

(1)用作普通IO

a、首先使能外设时钟

/*Stm32f10x*/
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC|RCC_APB2Periph_GPIOD, ENABLE);//使能PC,PD端口时钟


/*Stm32f4xx*/
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOF, ENABLE);//使能GPIOF时钟

b、调用void GPIO_Init();初始化引脚

?????? GPIO_Init()函数的入口参数为结构体变量,所以先要定义一个结构体变量并赋值,然后调用void GPIO_Init()完成初始化:

/*Stm32f10x*/
GPIO_InitTypeDef? GPIO_InitStructure;              //定义结构体变量
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13;?????????//C13端口
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; ??//推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;??//IO口速度为50MHz
GPIO_Init(GPIOC, &GPIO_InitStructure);?????????????//初始化GPIOC.13



/*Stm32f4xx*/
GPIO_InitTypeDef? GPIO_InitStructure;                     //定义结构体变量
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9 | GPIO_Pin_10;   //F9、10端口
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;             //普通输出模式
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;            //推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;        //100MHz
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;              //上拉
GPIO_Init(GPIOF, &GPIO_InitStructure);                    //初始化

c、完整的初始化程序

/*Stm32f10x*/
GPIO_InitTypeDef? GPIO_InitStructure;                   //定义结构体变量,变量要在程序之前定义
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC|RCC_APB2Periph_GPIOD, ENABLE);?//使能PC,PD端口时钟
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13;?????????????//C13端口
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; ??????//推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;??????//IO口速度为50MHz
GPIO_Init(GPIOC, &GPIO_InitStructure);?????????????????//初始化GPIOC_13


/*Stm32f4xx*/
GPIO_InitTypeDef? GPIO_InitStructure;                    //定义结构体变量
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOF, ENABLE);    //使能GPIOF时钟
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9 | GPIO_Pin_10;  //GPIOF9,F10初始化设置GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;            //普通输出模式
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;           //推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;       //100MHz
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;             //上拉
GPIO_Init(GPIOF, &GPIO_InitStructure);                   //初始化

(没学结构体之前学的stm32,在看到这里时并不理解,只能照着做,学完结构体以及相关知识后再看这里豁然开朗,这句也是个废话)

2、作为复用IO(以串口为例)

步骤与普通IO的一致,还需使能复用功能。

????????IO选择为复用时,F1系列 只需在结构体成员的模式种选择,F4系列需要另外调用函数:

GPIO_PinAFConfig(GPIOA,GPIO_PinSource9,GPIO_AF_USART1); //GPIOA9复用为USART1

GPIO_PinAFConfig(GPIOA,GPIO_PinSource10,GPIO_AF_USART1); //GPIOA10复用为USART1

由此可以看出F4系列的IO可以复用的功能更多,IO复用功能更强大。

完整的初始化程序:

/*Stm32f10x*/
? GPIO_InitTypeDef GPIO_InitStructure;???? 
??RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1|RCC_APB2Periph_GPIOA, ENABLE); //使能USART1,GPIOA时钟

???//USART1_TX?? GPIOA.9
? GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;         //PA.9
? GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
? GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;   //复用推挽输出
? GPIO_Init(GPIOA, &GPIO_InitStructure);            //初始化GPIOA.9

? //USART1_RX??? ? GPIOA.10初始化
? GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;            //PA10
? GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; //浮空输入
? GPIO_Init(GPIOA, &GPIO_InitStructure);                //初始化GPIOA.10?



/*Stm32f4xx*/
? GPIO_InitTypeDef GPIO_InitStructure;

? RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA,ENABLE);     //使能GPIOA时钟
??RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);    //使能USART1时钟

???//串口1对应引脚复用映射
???GPIO_PinAFConfig(GPIOA,GPIO_PinSource9,GPIO_AF_USART1);  //GPIOA9复用为USART1
???GPIO_PinAFConfig(GPIOA,GPIO_PinSource10,GPIO_AF_USART1); //GPIOA10复用为USART1
???//USART1端口配置
?  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9 | GPIO_Pin_10; //GPIOA9与GPIOA10
???GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;            //复用功能
???GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;       //速度50MHz
???GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;          //推挽复用输出
???GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;            //上拉
?? GPIO_Init(GPIOA,&GPIO_InitStructure);                   //初始化PA9,PA10

三、关于引脚的0、1输出操作

1、单一引脚的操作函数:

void GPIO_SetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);? //置位
void GPIO_ResetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);//复位

置位即置1,引脚输出高电平;复位即置0,引脚输出低电平。

函数第一个参数GPIOx为哪一组GPIO,第二个参数GPIO_Pin为哪一个引脚。例如对PA0操作:

GPIO_ResetBits(GPIOA,GPIO_Pin_0);? //PA0置0
GPIO_SetBits(GPIOA,GPIO_Pin_0);????//PA0置1

2、同时对多个引脚操作函数:

void GPIO_Write(GPIO_TypeDef* GPIOx, uint16_t PortVal);

该函数可对一组GPIO进行操作,每一组通常有16个引脚,对应16位二进制数。

第一个参数GPIOx为哪一组GPIO,第二个为一个16位的二进制数,分别对应16个引脚的输出值。例如:

GPIO_Write(GPIOA, 0xFFFF); //0xFFFF = 1111 1111 1111 1111
                           //GPIOA的所有引脚都输出1。

  嵌入式 最新文章
基于高精度单片机开发红外测温仪方案
89C51单片机与DAC0832
基于51单片机宠物自动投料喂食器控制系统仿
《痞子衡嵌入式半月刊》 第 68 期
多思计组实验实验七 简单模型机实验
CSC7720
启明智显分享| ESP32学习笔记参考--PWM(脉冲
STM32初探
STM32 总结
【STM32】CubeMX例程四---定时器中断(附工
上一篇文章      下一篇文章      查看所有文章
加:2021-08-07 12:15:04  更:2021-08-07 12:15:18 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/11 5:56:00-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码