《嵌入式系统》知识总结9:使用STM32固件库操纵GPIO

news2024/12/24 9:20:54

STM32固件库(函数库)

“STM32 标准函数库”它是由 ST 公司针对 STM32 提供的函数接口,即 API (Application Program Interface),开发者可调用这些函数接口来配置 STM32的寄存器,使开发人员得以脱离最底层的寄存器操作,有开发快速、易于阅读、维护成本低等优点。

当我们调用库 API 的时候不需要去了解库底层的寄存器操作,就像开始学习 C 语言的时候,用 printf()函数时只是学习它的使用格式,并没有去研究它的源码实现,但需要深入研究的时候,经过千锤百炼的库源码就是最佳学习范例。
实际上,库是架设在寄存器与用户驱动层之间的代码,向下处理与寄存器直接相关的配置,向上为用户提供配置寄存器的接口。

库开发方式直接配置寄存器方式的区别如图所示

 CMSIS 标准

所谓 CMSIS 标准,实际是新建了一个软件抽象层

CMSIS 标准中最主要的为 CMSIS 核心层,它包括了:
内核函数层:其中包含用于访问内核寄存器的名称、地址定义,主要由 ARM 公司提供。
设备外设访问层:提供了片上的核外外设的地址和中断定义,主要由芯片生产商提供。


可见 ,CMSIS 层位于硬件层与操作系统或用户层之间,提供了与芯片生产商无关的硬件抽象层,可以为接口外设、实时操作系统提供简单的处理器软件接口,屏蔽了硬件差异,这对软件的移植是有极大的好处的。STM32的库,就是按照 CMSIS 标准建立的。 

 固件库中与GPIO相关的api

(1)开启外设时钟

使用复位和时钟控制RCC驱动程序(stm32f10x_rcc.c)
有3个针对不同总线连接的外设时钟命令函数
• RCC_AHBPeriphClockCmd
• RCC_APB1PeriphClockCmd
• RCC_APB2PeriphClockCmd
GPIO通过APB2总线连接系统
开启GPIO外设时钟的函数
RCC_APB2PeriphClockCmd

(2)初始化外设

1. 定义外设初始化结构变量(PPP是外设名称)
PPP_InitTypeDef PPP_InitStructure;
2. 用允许的成员值填充外设初始化结构成员
PPP_InitStructure.member1 = val1;
...
3. 调用PPP_Init函数初始化外设
PPP_Init(PPP, &PPP_InitStructure);
4. 允许外设开始工作(不是所有的外设都需要)
PPP_Cmd(PPP, ENABLE)

typedef struct
{ uint16_t GPIO_Pin;
/* 指定配置的GPIO引脚 */
GPIOSpeed_TypeDef GPIO_Speed;
/* 指定GPIO引脚输出的最高频率 */
GPIOMode_TypeDef GPIO_Mode;
/* 指定GPIO引脚配置的工作模式 */
}GPIO_InitTypeDef;

//GPIO_InitTypeDef成员1:GPIO_Pin
//要进行配置的GPIO引脚编号
//其值是常量GPIO_Pin_y(y是0...15和ALL)

#define GPIO_Pin_0 ((uint16_t)0x0001)
/*!< Pin 0 selected */
#define GPIO_Pin_1 ((uint16_t)0x0002)
/*!< Pin 1 selected */
......
#define GPIO_Pin_15 ((uint16_t)0x8000)
/*!< Pin 15 selected */
#define GPIO_Pin_All ((uint16_t)0xFFFF)
/*!< All pins selected */

//GPIO_InitTypeDef成员2:GPIO_Speed
//定义在枚举类型GPIOSpeed_TypeDef 中

typedef enum
{ GPIO_Speed_10MHz = 1,
GPIO_Speed_2MHz,
// 不赋值的枚举变量自动加1,故此常量值为2
GPIO_Speed_50MHz // 常量值为3
}GPIOSpeed_TypeDef;
//选择最高输出频率
G P I O _ I n i t S t r u c t u r e . G P I O _ S p e e d =GPIO_Speed_50MHz;


//GPIO_InitTypeDef成员3:GPIO_Mode
//定义在枚举类型GPIOMode_TypeDef 中

typedef enum
{ GPIO_Mode_AIN = 0x0, // 模拟输入模式
GPIO_Mode_IN_FLOATING = 0x04, // 浮空输入模式
GPIO_Mode_IPD = 0x28, // 下拉输入模式
GPIO_Mode_IPU = 0x48, // 上拉输入模式
GPIO_Mode_Out_OD = 0x14, // 通用开漏输出模式
GPIO_Mode_Out_PP = 0x10, // 通用推挽输出模式
GPIO_Mode_AF_OD = 0x1C, // 复用开漏输出模式
GPIO_Mode_AF_PP = 0x18 // 复用推挽输出模式
}GPIOMode_TypeDef;
//选择工作模式为推挽输出
GPIO_InitStructure.GPIO_Mode= GPIO_Mode_Out_PP;


(3)控制外设工作

外设驱动库提供控制外设工作的有关函数
对GPIO主要是输入和输出数据
本例中只需要输出函数,例如
• 字输出GPIO_Write函数
• 位输出GPIO_WriteBit函数
• 置位GPIO_SetBits函数
• 复位GPIO_ResetBits函数

void GPIO_SetBits (GPIO_TypeDef *GPIOx,
uint16_t GPIO_Pin)
void GPIO_ResetBits (GPIO_TypeDef *GPIOx,
uint16_t GPIO_Pin)

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

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

相关文章

《阿里大数据之路》研读笔记(1)

首先先看到OLAP和OLTP的区别&#xff1a; OLTP(Online transaction processing):在线/联机事务处理。典型的OLTP类操作都比较简单&#xff0c;主要是对数据库中的数据进行增删改查&#xff0c;操作主体一般是产品的用户或者是操作人员。 OLAP(Online analytical processing):…

libVLC 抓取视频帧并渲染(QGraphicsView)

作者: 一去、二三里 个人微信号: iwaleon 微信公众号: 高效程序员 在《libVLC 抓取视频帧并渲染(QWidget)》介绍完 QWidget 对视频帧的渲染之后,是时候介绍第二种方式了 - QGraphicsView/QGraphicsScene/QGraphicsItem 图形视图框架。 基本步骤:自定义一个 QGraphicsIte…

RK3588平台开发系列讲解(驱动基础篇)等待队列

平台内核版本安卓版本RK3588Linux 5.10Android 12文章目录 一、等待队列二、等待队列头三、等待队列项四、添加/删除队列五、等待唤醒六、等待事件沉淀、分享、成长,让自己和他人都能有所收获!😄 📢 Linux 内核的等待队列是以双循环链表为基础数据结构,与进程调度机制紧…

KeepChatGPT: chatGPT增强插件,解决报错、保持活跃,让AI更丝滑

KeepChatGPT&#xff1a; chatGPT增强插件&#xff0c;解决报错、保持活跃&#xff0c;让AI更丝滑 这是一个ChatGPT的畅聊与增强插件。开源免费。不仅能解决所有报错不再刷新&#xff0c;还有保持活跃、取消审计、克隆对话、净化首页、展示大屏、展示全屏、言无不尽、拦截跟踪…

周赛348(模拟、反向思维、数位DP)

文章目录 [6462. 最小化字符串长度](https://leetcode.cn/problems/minimize-string-length/)阅读理解 [6424. 半有序排列](https://leetcode.cn/problems/semi-ordered-permutation/)模拟 [6472. 查询后矩阵的和](https://leetcode.cn/problems/sum-of-matrix-after-queries/)…

java并发编程:volatile关键字详解

文章目录 内存可见性禁止重排序什么是重排序?重排序的类型有哪些呢&#xff1f; 内存屏障volatile的用途 在Java中&#xff0c;volatile关键字有特殊的内存语义。volatile主要有以下两个功能&#xff1a; 保证变量的内存可见性禁止volatile变量与普通变量重排序 内存可见性 …

RK3588平台开发系列讲解(驱动基础篇)中断下文之 tasklet

平台内核版本安卓版本RK3588Linux 5.10Android 12文章目录 一、中断下文之 tasklet二、tasklet相关函数介绍三、tasklet使用示例四、中断视频介绍沉淀、分享、成长,让自己和他人都能有所收获!😄 📢 介绍中断下文之 tasklet 的基础理论知识。 一、中断下文之 tasklet 中断…

C C++ 的内存管理(C++)

目录 C / C 的内存分布 C / C 程序内存区域划分&#xff1a;​ C语言内存管理 C中动态内存管理方式&#xff1a; C内存管理 C内存管理的方式&#xff1a; new / delete 操作内置类型 new 和 delete 操作自定义类型 new 和 delete 与 malloc 和 free 的区别&#xff1a; operato…

基于Springboot的漫画之家系统设计实现

&#x1f49e;文末获取源码联系&#x1f649; &#x1f447;&#x1f3fb; 精选专栏推荐收藏订阅&#x1f447;&#x1f3fb; &#x1f380;Java项目精选实战案例《600套》&#x1f618; https://blog.csdn.net/rucoding/category_12319634.html 文章目录 1、演示视频2、课题背…

QSS盒子模型入门指南:了解和应用基础知识

目录 1. QSS盒子模型的组成部分2. QSS盒子模型的属性3. QSS盒子模型的布局4. QSS盒子模型的调试工具结论 #概述 QSS&#xff08;Qt Style Sheets&#xff09;是一种用于美化和定制化Qt应用程序的样式表语言。了解和掌握QSS盒子模型的基本概念对于创建漂亮的用户界面布局至关重要…

javascript基础二十七:说说 JavaScript 数字精度丢失的问题,解决方案?

一、场景复现 一个经典的面试题 0.1 0.2 0.3 // false 为什么是false呢? 先看下面这个比喻 比如一个数 130.33333333… 这是一个除不尽的运算&#xff0c;3会一直无限循环&#xff0c;数学可以表示&#xff0c;但是计算机要存储&#xff0c;方便下次再使用&#xff0c;但…

IMX6ULL裸机篇之I2C实验-硬件原理图

一. I2C 实验简介 I2C实验&#xff0c;我们就来学习如何使用 I.MX6U 的 I2C 接口来驱动 AP3216C&#xff0c;读取 AP3216C 的传感器数据。 AP3216C是一个三合一的环境光传感器&#xff0c;ALSPSIRLED&#xff0c;ALS是环境光&#xff0c;PS是接近传感器&#xff0c;IR是红外L…

2023 华为 Datacom-HCIE 真题题库 12/12(完结)--含解析

单项选择题 1.[试题编号&#xff1a;190728] &#xff08;单选题&#xff09;以下哪种工具不能用来匹配BGP路由条目&#xff1f; A、基本ACL B、高级ACL C、IP PREFIX LIST D、Community Filter 答案&#xff1a;B 解析&#xff1a;高级ACL是一种用于过滤IPv4报文的ACL&#…

多层级table联动

elementui 多层级table联动&#xff1a; 引用&#xff1a; https://blog.csdn.net/weixin_44780971/article/details/130054925 https://blog.csdn.net/qq_42581563/article/details/114325920 需要了解的属性&#xff1a; select-all 全选的时候执行select &#xff1a; 选择…

MySQL 连接查询

文章目录 一&#xff0c;等值连接二&#xff0c;表别名三&#xff0c;多表等值连接四&#xff0c;自然连接五&#xff0c;自连接六&#xff0c;非等值内连接七&#xff0c;外连接&#xff08;一&#xff09;左外连接&#xff08;二&#xff09;右外连接&#xff08;三&#xff…

Cookie与Session的工作流程

文章目录 Cookiecookie的工作流程1.cookie从哪里来2.cookie到哪里去3.cookie是做什么的 SessionSession工作流程 Cookie与Session都是http协议中的机制,都是用来追踪浏览器用户身份的会话方式.但是又有各自的工作流程. Cookie cookie是浏览器在本地存储数据的一种机制。 cookie…

java从入门到起飞——基础概念

目录 背景注释和关键字注释关键字 常量变量数据类型计算存储单元数据类型分类 标识符小驼峰命名法&#xff08;方法、变量&#xff09;大驼峰命名法&#xff08;类&#xff09; 类型转换自动类型转换强制类型转换 计算机中的数据存储总结 背景 学编程这么长时间了&#xff0c;重…

Java Swing花样玩法:教你用代码制作六一儿童节的精美贺卡(简单版)

✨博主&#xff1a;命运之光 ✨专栏&#xff1a;Java经典程序设计 前言&#xff1a;这篇博客在打开可能会自动播放视频&#xff0c;视频有音乐&#xff0c;请及时静音哈&#x1f642; 目录 ✨前言 ✨引言 ✨简单介绍一下Javaswing这项技术简单介绍一下Javaswing这项技术&a…

电子模块|压力传感器模块HX711---硬件介绍与C51STM32驱动

电子模块|压力传感器模块HX711---硬件介绍与C51&&STM32驱动 实物照片模块简介模块特点 硬件模拟输入供电电源时钟选择串口通讯复位和断电HX711相关部分的 PCB 设计 软件驱动C51软件代码STM32软件代码 实物照片 模块简介 HX711是一款专为高精度称重传感器而设计的24位A…

全志V3S嵌入式驱动开发(音频输出和音频录制)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 之前在芯片公司的时候&#xff0c;基本没有看过音频这一块&#xff0c;只知道有个alsa框架这么个知识点。要驱动音频&#xff0c;需要两部分&#…