stm32F1xx外设GPIO的用法总结

目录

    • 前言
    • 一、概念
    • 二、主要文件
    • 三、库函数和寄存器
    • 四、几个数据结构
    • 五、使用方式

前言

本文笔记总结stm32F1xx的GPIO的寄存器说明和标准库中的函数说明、用法,使用案例;

一、概念

GPIO为通用输入输出端口的简称,作为主控芯片的一个外设在芯片中是一个必要的外设,主控芯片与外接芯片通信离不开IO的操作;
gpio外设端口一般包括方向、驱动能力、复用模式等属性,可以通过芯片的寄存器进行配置,在不同的芯片中配置大同小异;

二、主要文件

头文件 stm32f10x_gpio.h
源文件 stm32f10x_gpio.c

三、库函数和寄存器

GPIO包括PA PB PC PD PD等几组端口,每组有16个引脚最多即pin0到pin15;
寄存器

typedef struct
{__IO uint32_t CRL;//gpio配置低寄存器配置GPIO端口pin0到pin7号脚,每个脚的配置占4个bit为一组7个引脚占满这个32位寄存器, 4个bit中的低两位设置引脚为输入还是输出高两位对针对低两位的方向进行进一步设置具体看手册详细了解__IO uint32_t CRH; //同CRL设置pin8到pin15引脚__IO uint32_t IDR; //当设置引脚为普通IO(非复用)模式时,方向为输入时,读取此寄存器获取对应引脚的电平,低15bit有效对应pin0到pin15,只能以16bit读不能写__IO uint32_t ODR; //当设置引脚为普通IO(非复用)模式时,方向为输出时,读取此寄存器获取对应引脚的电平,低15bit有效对应pin0到pin15__IO uint32_t BSRR; //端口引脚对应bit位设置和清除寄存器,低16位用于设置pin0到pin15为高定平只有写入1才有效,高16位用于设置pin0到pin15为低电平只有写入1才有效,此寄存器只有对应为1才有效用于配置引脚为高还是低__IO uint32_t BRR; //端口引脚对应bit位清除寄存器,低15位有效__IO uint32_t LCKR;  //端口锁定寄存器
} GPIO_TypeDef;

库函数

==void GPIO_DeInit(GPIO_TypeDef* GPIOx)==
对某个GPIO端口进行复位,实际操作RCC外设APB2RSTR寄存器,对应的位置1时复位相应外设,随后置0释放复位;==void GPIO_AFIODeInit(void)==
对GPIO复用模块进行复位,对应的位置1时复位,不需要写0再去释放执行一次复位即可;==void GPIO_Init(GPIO_TypeDef* GPIOx, GPIO_InitTypeDef* GPIO_InitStruct)==
对GPIO端口的某个脚或者某几个脚进行配置, 对引脚的具体配置见这个GPIO_InitTypeDef结构体的成员;==void GPIO_StructInit(GPIO_InitTypeDef* GPIO_InitStruct)==
将GPIO_InitStruct这个结构体配置成默认模式,纯软件的配置==uint8_t GPIO_ReadInputDataBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin)==
当引脚设置为普通gpio模式方向为输入时获取某个引脚的电平, 读取的IDR寄存器低15bin,并根据引脚号进行判断==uint16_t GPIO_ReadInputData(GPIO_TypeDef* GPIOx)==
当引脚设置为普通gpio模式方向为输入时获取某个端口所有引脚的电平, 读取的IDR寄存器低15bit==uint8_t GPIO_ReadOutputDataBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin)==
当引脚设置为普通gpio模式方向为输出时获取端口某个引脚的电平, 读取的ODR寄存器低15bit,并根据引脚号进行判断==uint16_t GPIO_ReadOutputData(GPIO_TypeDef* GPIOx)==
当引脚设置为普通gpio模式方向为输出时获取端口所有引脚的电平, 读取的ODR寄存器低15bit==void GPIO_SetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin)==
设置端口的某个引脚为高, 实际操作的BSRR寄存器==void GPIO_ResetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin)==
复位端口的某个引脚为低, 实际操作的BRR寄存器==void GPIO_WriteBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin, BitAction BitVal)==
设置端口的某个引脚为高或者低,实际操作的BSRR  和 BRR 可以代替以上两个函数==void GPIO_Write(GPIO_TypeDef* GPIOx, uint16_t PortVal)==
设置一个端口的所有引脚的电平,适用于端口设置为普通IO且为输出方向,实际调用的ODR寄存器==void GPIO_PinLockConfig(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin)==
操作端口锁定, 这个函数的用处在于,对gpio端口的某个引脚的配置更加严谨,防止不该操作引脚的流程去操作引脚==void GPIO_EventOutputConfig(uint8_t GPIO_PortSource, uint8_t GPIO_PinSource)==
配置端口的某个脚为作为事件输出==void GPIO_EventOutputCmd(FunctionalState NewState)==
触发这个脚的事件输出,事件输出的波形是一个脉冲,如果按平常的方式操作io的电平需要先写高延时一段再写低或者反之,使用此方式调用一次即可==void GPIO_PinRemapConfig(uint32_t GPIO_Remap, FunctionalState NewState)==
设置引脚的复用功能, 实际操作AFIO外设的MAPR2或MAPR寄存器==void GPIO_EXTILineConfig(uint8_t GPIO_PortSource, uint8_t GPIO_PinSource)==
设置某个端口的某个脚为外部中断的中断输入源==void GPIO_ETH_MediaInterfaceConfig(uint32_t GPIO_ETH_MediaInterface)==
设置ETH接口为MII或者RMII

四、几个数据结构

gpio配置结构体:

typedef struct
{uint16_t GPIO_Pin;             /*!< Specifies the GPIO pins to be configured.This parameter can be any value of @ref GPIO_pins_define */GPIOSpeed_TypeDef GPIO_Speed;  /*!< Specifies the speed for the selected pins.This parameter can be a value of @ref GPIOSpeed_TypeDef */GPIOMode_TypeDef GPIO_Mode;    /*!< Specifies the operating mode for the selected pins.This parameter can be a value of @ref GPIOMode_TypeDef */
}GPIO_InitTypeDef;

gpio模式枚举:

typedef enum
{ GPIO_Mode_AIN = 0x0,  //配置io进行ad输入采集时的模式GPIO_Mode_IN_FLOATING = 0x04,   //当配置io为双边沿中断触发时GPIO_Mode_IPD = 0x28, //配置io为普通io方向为输入时GPIO_Mode_IPU = 0x48, //配置io为普通io方向为输入时GPIO_Mode_Out_OD = 0x14, //配置io为普通io方向为输出时GPIO_Mode_Out_PP = 0x10, //配置io为普通io方向为输出时GPIO_Mode_AF_OD = 0x1C, //配置io为复用io时GPIO_Mode_AF_PP = 0x18  //配置io为复用io时
}GPIOMode_TypeDef;

五、使用方式

基本用法编程序列
1、使能某个端口
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
2、进行GPIO配置
GPIO_Init(GPIOA, &GPIO_InitStructure);
对引脚的模式、方向、速率进行设置;
3、操作读写
可以读写某个引脚或者端口中所有引脚;

扩展用法编程序列
当使用其作为某个复用功能时,如SPI、I2C、CAN等时,需要使用
GPIO_Init(GPIOA, &GPIO_InitStructure)配置复用,GPIO_PinRemapConfig配置具体复用为什么引脚;

当使用其作为中断时,需要GPIO_EXTILineConfig配置中断线,并调用NVIC相关的函数NVIC_Init 配置优先级、中断触发类型,编辑中断处理函数处理中断清除和中断中具体处理的业务;

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/50726.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Super 4PCS配准算法

Nicolas Mellado&#xff0c;CNRS&#xff08;Centre national de la recherche scientifique&#xff0c;法国国家科学研究中心&#xff09;的研究员&#xff0c;在IRIT&#xff08;Institut de Recherche en Informatique de Toulouse&#xff0c;图卢兹计算机科学研究所&…

SAPUI5基础知识20 - 对话框和碎片(Dialogs and Fragments)

1. 背景 在 SAPUI5 中&#xff0c;Fragments 是一种轻量级的 UI 组件&#xff0c;类似于视图&#xff08;Views&#xff09;&#xff0c;但它们没有自己的控制器&#xff08;Controller&#xff09;。Fragments 通常用于定义可以在多个视图中重用的 UI 片段&#xff0c;从而提…

linux系统安装pytorch_中文地址命名实体识别案例

命名实体有关文章参考这篇文章 中文地址命名实体识别训练和预测 win10系统安装cuda环境参考这篇文章 搭建Pytorch的GPU环境超详细 1、下载python https://www.python.org/downloads/release/python-368/ 2、下载python包 https://pypi.org/search/?q=transformers 1、搜…

如何录制电脑内部声音?全方位介绍电脑录音软件:8款在线录音!(2024重新整理)

如何录制电脑内部声音&#xff1f;不管是娱乐圈还是现实生活&#xff0c;【录音】这个功能的重要性不言而喻。而电脑录音已在影视配音、音视频剪辑、会议记录、在线教育等多个领域发光发热&#xff01; 本文将为您推荐8款电脑录音软件&#xff0c;并详细介绍电脑录音的多种方式…

Git 从入门到精通:全面掌握版本控制(IntelliJ IDEA 中 Git 的使用指南)

引言 Git 是目前世界上最流行的版本控制系统&#xff0c;由 Linux 内核的创始人 Linus Torvalds 开发。它不仅拥有强大的分支管理功能&#xff0c;还具备了优秀的合并能力。本文将从 Git 的基本概念开始&#xff0c;逐步深入到 Git 的使用和一些高级技巧。 Git 简介 Git 是一…

Python番外篇:变量是盒子还是标签

引言 前面通过几十篇文章&#xff0c;大概把Python的一些比较实用的基础做了一些介绍&#xff0c;学会这些&#xff0c;基本能应付日常的小的需求开发了&#xff0c;写一些小工具&#xff0c;提高工作的处理效率。 接下来&#xff0c;准备开始进入一个新的篇章&#xff0c;也…

del 语句

使用 del 语句可以删除任何对象&#xff0c;包括字典对象。删除之后&#xff0c;之前的引用将失效&#xff0c;尝试使用该对象会导致 NameError 错误。因此&#xff0c;删除字典对象的命令是 del myDict。 元组 (Tuple) 元组是不可变的&#xff0c;因此你不能修改元组的内容&a…

C#如何引用dll动态链接库文件的注释

1、dll动态库文件项目生成属性中要勾选“XML文档文件” 注意&#xff1a;XML文件的名字切勿修改。 2、添加引用时XML文件要与DLL文件在同一个目录下。 3、如果要是添加引用的时候XML不在相同目录下&#xff0c;之后又将XML文件复制到相同的目录下&#xff0c;需要删除引用&am…

MySQL之索引优化

1、在进行查询时&#xff0c;索引列不能是表达式的一部分&#xff0c;也不能是函数的参数&#xff0c;否则无法使用索引 例如下面的查询不能使用 actor_id 列的索引&#xff1a; #这是错误的 SELECT actor_id FROM sakila.actor WHERE actor_id 1 5; 优化方式&#xff1a;…

微信小程序安装vant组件库和使用

第一步打开终端输入 npm install vant/weapp --save 第二步 npm cache clean --force 第三步 npm i vant/weapp -S --production 第四步在app.json中的usingComponents输入 "van-button": "vant/weapp/button/index" 第五步直接在页面使用 <v…

SSM(Spring + Spring MVC + MyBatis)框架面试三道题

以下是三道关于SSM&#xff08;Spring Spring MVC MyBatis&#xff09;框架的面试题&#xff0c;由简单到困难进行排列&#xff1a; 1. 简答题&#xff1a;请简述Spring框架的核心特性。 答案&#xff1a; Spring框架的核心特性主要包括以下几个方面&#xff1a; 控制反转…

当设计模式牵手LLM

模版方法模式 何为模版设计模式 想象一下 如果我们要泡一杯茶 我们要循序渐进地 煮水温杯注水浸茶茶水入杯加点配料 如此&#xff0c;泡茶的工序就完成了&#xff0c;那么模板方法模式&#xff0c;相信各位也有了一定的概念&#xff1a;定义了一个算法的骨架&#xff0c;而…

UDP的报文结构及其注意事项

1. 概述 UDP&#xff08;User Datagram Protocol&#xff09;是一种无连接的传输层协议&#xff0c;它提供了一种简单的数据传输服务&#xff0c;不保证数据的可靠传输。在网络通信中&#xff0c;UDP通常用于一些对实时性要求较高、数据量较小、传输延迟较低的应用&#xff0c…

创建一个程序来记录每天的工作日常—6。与chatgpt结合 找一些集 来训练 ,它能自动分类到 其中一个,例如 “打扫卫生” 它会自动分类到 “家务”

改进步骤 数据增强&#xff1a;使用GPT模型生成更多的训练数据。使用更高级的模型&#xff1a;使用BERT或其他预训练的语言模型进行文本分类。经验条和经验值显示&#xff1a;在网页端显示当前的经验值&#xff0c;并添加一个经验条。 数据增强和训练数据集 我们可以通过Ope…

【JVM基础07】——类加载器-什么是类加载器?类加载器有哪些?双亲委派了解吗?

目录 1- 引言&#xff1a;类加载器1-1 类加载器是什么&#xff1f;(What)1-2 为什么要用类加载器&#xff1f; 作用&#xff1a;类加载的过程&#xff1f;(Why) 2- ⭐核心&#xff1a;类加载器详解(How)2-1 类加载器分类2-2 什么是双亲委派模型&#xff1f;2-3 为什么采用双亲委…

Pytorch基础:Tensor的squeeze和unsqueeze方法

相关阅读 Pytorch基础https://blog.csdn.net/weixin_45791458/category_12457644.html?spm1001.2014.3001.5482 在Pytorch中&#xff0c;squeeze和unsqueeze是Tensor的一个重要方法&#xff0c;同时它们也是torch模块中的一个函数&#xff0c;它们的语法如下所示。 Tensor.…

【SpringBoot】1 Gitee

本项目 Gitee 地址&#xff1a;https://gitee.com/Lin_DH/system idea中可能装个gitee的插件&#xff0c;这样操作起来比较方便。 1&#xff09;登录 Gitee 官网&#xff08;https://gitee.com/&#xff09;&#xff0c;新建仓库。 2&#xff09;复制新建的 Gitee 仓库地址&am…

Unity3D之TextMeshPro使用

文章目录 1. TextMeshPro简介2. TextMeshPro创建3. TextMeshPro脚本中调用4. TextMeshPro字体设置及中文支持过程中出现的一些问题 1. TextMeshPro简介 【官网文档】https://docs.unity.cn/cn/2020.3/Manual/com.unity.textmeshpro.html TextMeshPro 是 Unity 的最终文本解决…

软件测试---Linux

Linux命令使用&#xff1a;为了将来工作中与服务器设备进行交互而准备的技能&#xff08;远程连接/命令的使用&#xff09;数据库的使用&#xff1a;MySQL&#xff0c;除了查询动作需要重点掌握以外&#xff0c;其他操作了解即可什么是虚拟机 通过虚拟化技术&#xff0c;在电脑…

第九十七周周报

学习时间&#xff1a; 2024.7.20-2024.7.26 学习产出&#xff1a; 这周科研暂时没有进展&#xff0c;因为服务器这周都进不去&#xff0c;周一的时候上周跑的节点还被停了&#xff08;机房太热&#xff09;&#xff0c;然后这周主要在改吉安县小程序的bug&#xff0c;因为要…