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 小米 华为 单反 装机 图拉丁
 
   -> 嵌入式 -> STM32F103单片机IO口的一些功能配置问题(8中模式之寄存器和库函数版) -> 正文阅读

[嵌入式]STM32F103单片机IO口的一些功能配置问题(8中模式之寄存器和库函数版)


前言

本文从寄存器和库函数俩个角度去分析和解读,方便使用和学习,同时本人也致力于实用性的发文,不做无谓的啰嗦,有啥说啥实事求是的原则!当然如果文章有错误的地方也希望读者朋友们可以指出来,希望我可以做的更好,同时也希望这篇文章对大家有用!


前言

一、GPIO的功能描述(8种模式)

二、使用方法

1.寄存器版的使用

2.库函数的使用:

总结


一、GPIO的功能描述(8种模式

???????? 每个GPI/O端口有两个32位配置寄存器(GPIOx_CRL,GPIOx_CRH),两个32位数据寄存器
(GPIOx_IDR和GPIOx_ODR),一个32位置位/复位寄存器(GPIOx_BSRR),一个16位复位寄存
器(GPIOx_BRR)和一个32位锁定寄存器(GPIOx_LCKR),共计7个寄存器来控制。
????????根据数据手册中列出的每个I/O端口的特定硬件特征, GPIO端口的每个位可以由软件分别配置成多种模式。
GPIO的八种模式
名称寄存器库函数(标准库)
输入浮空

详见下图GPIO口配置表

一般情况的值如下:

0x00 ---- //模拟输入

0x04 ---- //浮空输入

0x28 ---- //下拉输入

0x48 ---- //上拉输入

0x14 ---- //开漏输出

0x10 ---- //通用推挽输出

0x1C ---- //复用开漏输出

0x18 ---- //复用推挽

GPIO_Mode_IN_FLOATING
输入上拉
GPIO_Mode_IPU
输入下拉
GPIO_Mode_IPD
模拟输入
GPIO_Mode_AIN
开漏输出
GPIO_Mode_Out_OD
─?通用推挽式输出
GPIO_Mode_Out_PP
─?复用推挽式复用输出功能
GPIO_Mode_AF_PP
─?复用开漏输出功能
GPIO_Mode_AF_OD
???????? 每个I/O端口位可以自由编程,然而I/0端口寄存器必须按32位字被访问(不允许半字或字节访
问)。GPIOx_BSRR和GPIOx_BRR寄存器允许对任何GPIO寄存器的读/更改的独立访问;我们常用的 IO 端口寄存器只有 4 个:CRL、CRH、IDR、ODR;CRL 和 CRH 控制着每个 IO 口的模式及输出速率。
端口位配置表:

?

?输出模式位:

?

端口配置低寄存器(GPIOx_CRL) (x=A..E)

偏移地址:0x00
复位值:0x4444 4444

?

?

端口配置高寄存器(GPIOx_CRH) (x=A..E)

偏移地址:0x04
复位值:0x4444 4444

?

?

????????初学者在看到这个表的时候是不是感到迷茫?不要怂,我们一起上!上表虽然有32位,我们把CNF和MODE俩个为一组(算一位)这样就就好理解的多了吧。每一组分为配置位(CNF)和模式位(MODE)共4位把他组合起来变为0xXX就是我们最终需要的了。例如:配置推挽输出--->? 00 11 = 0x3,表示推挽输出速度为50MHz.


二、使用方法



1.寄存器版的使用

???????? CRH 的作用和 CRL 完全一样,只是 CRH控制的是低 8 位输出口,而 CRH 控制的是高 8
位输出口。这里我们对 CRL 就不做详细介绍了。 给个实例,比如我们要设置 PORTC 的 11 位为上拉输入,12 位为推挽输出。代码如下:
??????? ? GPIOC->CRH&=0XFFF00FFF; //清掉所要使用的这?2 个位原来的设置,同时也不影响其他位的设置
? ? ? ? 0XFFF00FFF----在位置上具有表示具体是哪个IO口的作用,例如:“0XFFF00FFF”共8个位的位置次序就表示从 0X 以后对应的 IO引脚关系为15,14,13,12,11,10,9,8这8个IO口。
???????? GPIOC->CRH|=0X00038000; //PC11 输入,PC12 输出
???????? GPIOC->ODR=1<<11;//PC11 上拉
??????? ?ODR 是一个端口输出数据寄存器,也只用了低 16 位。该寄存器为可读写,从该寄存器读
出来的数据可以用于判断当前 IO 口的输出状态。而向该寄存器写数据,则可以控制某个 IO 口
的输出电平。

?

具体使用情况下表:

?


2.库函数的使用:

还是先来一段端口的初始化代码如下(示例):

GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5; //PB.5 端口配置
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;//速度 50MHz
GPIO_Init(GPIOB, &GPIO_InitStructure);//根据设定参数配置 GPIO
???????? 上面代码的意思是设置 GPIOB 的第 5 个端口为推挽输出模式,同时速度为 50M。结构体 GPIO_InitStructure 的第一个成员变量 GPIO_Pin 用来设置是要初始化 哪个或者哪些 IO 口 ;第二个成员变量 GPIO_Mode 是用来设置对应 IO 端口的输出 输入模式 ,第三个成员变量 GPIO_Speed 是 IO 口速度设置,有三个可选值:
???????????????????????????????????????????????????????? GPIO_Speed_10MHz?
????????????????????????????????????????????????????????GPIO_Speed_2MHz
????????????????????????????????????????????????????????GPIO_Speed_50MHz
??????? ?GPIO_Init 这个函数有两个参数,第一个参数是用来 指定 GPIO ,取值范围为 GPIOA~GPIOG 。 第二个参数为初始化参数结构体指针,结构体类型为 GPIO_InitTypeDef

接下来对几种常见的IO口操作做一简单介绍:

1.获取某个 IO 口的电平状态:

例如要想知道某个 IO 口的电平状态,你只要读这个寄存器,再看某个位的状态就可以了。使 用起来是比较简单的。 在固件库中操作 IDR 寄存器读取 IO 端口数据是通过:

GPIO_ReadInputDataBit 

函数实现的:

uint8_t GPIO_ReadInputDataBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin)
比如我要读 GPIOA.5 的电平状态,那么方法是:
GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_5);

返回值是 :

1(Bit_SET)或者 0(Bit_RESET);

2.?控制一个IO的输出状态:(输出高电平还是低电平)

???????? 在 STM32 固件库中,通过 BSRR 和 BRR 寄存器设置 GPIO 端口输出是通过函数 GPIO_SetBits() 和函数 GPIO_ResetBits() 来完成的。 v
oid GPIO_SetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
void GPIO_ResetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin)

在多数情况下,我们都是采用这两个函数来设置 GPIO 端口的输入和输出状态。比如我们要设 置 GPIOB.5 输出 1,那么方法为:

GPIO_SetBits(GPIOB, GPIO_Pin_5);

反之如果要设置 GPIOB.5 输出位 0,方法为:

GPIO_ResetBits (GPIOB, GPIO_Pin_5)
3.?控制一个或多个IO的输出状态:(输出高电平还是低电平)
????????在固件库中设置 ODR 寄存器的值来控制 IO 口的输出状态是通过函数 GPIO_Write 来实现
的:
void GPIO_Write(GPIO_TypeDef* GPIOx, uint16_t PortVal);

该函数一般用来往一次性一个 GPIO 的多个端口设值。

????????BSRR 寄存器是端口位设置/清除寄存器。该寄存器和 ODR 寄存器具有类似的作用,都可以用来设置 GPIO 端口的输出位是 1 还是 0。下面我们看看该寄存器的描述如下图:

?

?

??????? ?该寄存器通过举例子可以很清楚了解它的使用方法。例如你要设置 GPIOA 的第 1 个端口
值为 1,那么你只需要往寄存器 BSRR 的低 16 位对应位写 1 即可:
GPIOA->BSRR=1<<1;

????????如果你要设置 GPIOA 的第 1 个端口值为 0,你只需要往寄存器高 16 位对应为写 1 即可:

GPIOA->BSRR=1<<(16+1)

????????该寄存器往相应位写 0 是无影响的,所以我们要设置某些位,我们不用管其他位的值。


一、GPIO的功能描述(8种模式)

总结

这次的分享就到这里就先结束了,这个文章是结合STM32F103数据手册所得,可能也写得不尽人意总会有不完善的忘大家可以揪出来让我加以改正,谢谢!


????????
  嵌入式 最新文章
基于高精度单片机开发红外测温仪方案
89C51单片机与DAC0832
基于51单片机宠物自动投料喂食器控制系统仿
《痞子衡嵌入式半月刊》 第 68 期
多思计组实验实验七 简单模型机实验
CSC7720
启明智显分享| ESP32学习笔记参考--PWM(脉冲
STM32初探
STM32 总结
【STM32】CubeMX例程四---定时器中断(附工
上一篇文章      下一篇文章      查看所有文章
加:2021-11-10 12:33:50  更:2021-11-10 12:34:28 
 
开发: 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年11日历 -2024/11/26 8:40:47-

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