8 固件库

文章目录

  • 8.1 什么是固件库
  • 8.2 什么时候使用
  • 8.3 封装注意点
    • 8.3.1 fsl
  • 8.4 GPIO库函数定义
    • 8.4.1 初始化结构体 gpio_pin_config_t
    • 8.4.2 定义引脚模式的枚举类型

8.1 什么是固件库

固件库是指“RT1052 函数库”,是由 NXP 公司针对 RT1052 提供的函数接口,即
API (Application Program Interface)。

  • 开发者可调用这些函数接口来配置 RT1052 的寄存器,使开发人员得以脱离最底层的寄存器操作

8.2 什么时候使用

绝大部分时候,我们愿意牺牲一点 CPU 资源,选择库开发

一般只有在对代码运行时间要求极苛刻的地方,才用直接配置寄存器的方式代替,如频繁调用的中断服务函数。

8.3 封装注意点

6 /* volatile 表示易变的变量,防止编译器优化, */
7 #define __IO volatile /* 可读写,一般用于定义有可读写权限的寄存器 */
8 #define __I volatile const /* 只读,一般用于定义只读权限的寄存器 *//* 使用更简短直观的方式来定义无符号 32 、 16 、 8 位变量 */
11 typedef unsigned int uint32_t;
12 typedef unsigned short uint16_t;
13 typedef unsigned char uint8_t;15 /* GPIO 寄存器结构体 */
16 typedef struct {
17 __IO uint32_t DR; /* DR 数据寄存器, 地址偏移 : 0x0 */
18 __IO uint32_t GDIR; /* GDIR 方向寄存器, 地址偏移 : 0x4 */
19 __I uint32_t PSR; /* PSR 状态寄存器, 地址偏移 : 0x8 */
20 __IO uint32_t ICR1; /* ICR1 中断配置寄存器 1, 地址偏移 : 0xC */
21 __IO uint32_t ICR2; /* ICR2 中断配置寄存器 2, 地址偏移 : 0x10 */
22 __IO uint32_t IMR; /* IMR 中断掩码寄存器 , 地址偏移 : 0x14 */
23 __IO uint32_t ISR; /* ISR 中断状态寄存器 , 地址偏移 : 0x18 */
24 __IO uint32_t EDGE_SEL; /* EDGE_SEL 边沿选择寄存器, 地址偏移 : 0x1C */
25 } GPIO_Type;

“__IO”代表了 C 语言中的关键字“volatile”,在 C 语言中该关键字用于修饰易变的变量,要求编译器不要优化
“__I”则代表“volatile const”在“__IO”的基础上增加不可修改的属性

寄存器很多时候是由外设或 RT1052 芯片状态修改的,也就是说即使 CPU 不执行代码修改这些变量,变量的值也有可能被外设修改、更新。

  • 所以每次使用这些变量的时候,我们都要求 CPU 去该变量的地址重新访问。
  • 若没有这个关键字修饰,在某些情况下,编译器认为没有代码修改该变量,就直接从 CPU 的某个缓存获取该变量值,这时可以加快执行速度,但该缓存中的是陈旧数据,与我们要求的寄存器最新状态可能会有出入。

8.3.1 fsl

文件名中的 fsl 大概是飞思卡尔半导体(freescale)的缩写,nxp 公司收购了 freescale,在固件库中它们使用 fsl 这个名字

8.4 GPIO库函数定义

8.4.1 初始化结构体 gpio_pin_config_t

1 /* GPIO 引脚配置结构体定义 */
2 typedef struct _gpio_pin_config {
3
4 /* 指定引脚的方向 */
5 uint8_t direction;
6
7 /* 设置一个默认的输出电平,在输入方向时本设置无效 */
8 uint8_t outputLogic;
9
10 /* 设置引脚的中断模式 */
11 uint8_t interruptMode;
12
13 } gpio_pin_config_t;

结构体中包含了初始化 GPIO 所需要的信息,包括引脚输入输出方向、默认输出电平以及中断模式。

然后把这个结构体作为“GPIO 初始化函数”的输入参数,该函数能根据这个变量值中的内容去配置寄存器,从而实现 GPIO 的初始化。

8.4.2 定义引脚模式的枚举类型

1 /* GPIO 方向枚举定义 */
2 typedef enum _gpio_pin_direction {
3 kGPIO_DigitalInput = 0U, /* 设置引脚为输入方向 */
4 kGPIO_DigitalOutput = 1U, /* 设置引脚为输出方向 */
5 } gpio_pin_direction_t;
6
7 /* GPIO 中断模式枚举定义 */
8 typedef enum _gpio_interrupt_mode {
9 kGPIO_NoIntmode = 0U, /* 设置引脚为通用 IO 功能(不使用中断) */
10 kGPIO_IntLowLevel = 1U, /* 设置引脚低电平引起中断 */
11 kGPIO_IntHighLevel = 2U, /* 设置引脚高电平引起中断 */
12 kGPIO_IntRisingEdge = 3U, /* 设置引脚上升沿引起中断 */
13 kGPIO_IntFallingEdge = 4U, /* 设置引脚下降沿引起中断 */
14 kGPIO_IntRisingOrFallingEdge = 5U, /* 设置引脚上升沿和下降沿都引脚中断 */
15 } gpio_interrupt_mode_t

“U”表示该数字是无符号类型,在这里其实不写也可以,是一种编程习惯。

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

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

相关文章

mongoose学习记录

mongoose安装和连接数据库 npm i mongoose导入mongoose const mongoose require(mongoose) mongoose.set("strictQuery",true)连接数据库 mongoose.connect(mongodb:127.0.0.1:27017/test)设置回调 mongoose.connection.on(open,()>{console.log("连接成…

规则引擎专题---3、Drools组成和入门

Drools概述 drools是一款由JBoss组织提供的基于Java语言开发的开源规则引擎,可以将复杂且多变的业务规则从硬编码中解放出来,以规则脚本的形式存放在文件或特定的存储介质中(例如存放在数据库中),使得业务规则的变更不需要修改项目代码、重启…

numpy实现神经网络

numpy实现神经网络 首先讲述的是神经网络的参数初始化与训练步骤 随机初始化 任何优化算法都需要一些初始的参数。到目前为止我们都是初始所有参数为0,这样的初始方法对于逻辑回归来说是可行的,但是对于神经网络来说是不可行的。如果我们令所有的初始…

手写VUE后台管理系统7 - 整合Less样式

整合LESS 安装使用 Less(Leaner Style Sheets),是一门向后兼容的 CSS 扩展语言。 Less 官网:https://less.bootcss.com/ 安装 yarn add less安装完成就可以直接使用了 使用 以文件形式定义全局样式 在 assets 目录下创建 less …

基于卷积神经网络的肺炎影像分类分割智能诊断系统

1.研究背景与意义 项目参考AAAI Association for the Advancement of Artificial Intelligence 研究背景与意义: 肺炎是一种常见的呼吸系统感染疾病,其主要病因包括细菌、病毒和真菌等。肺炎的早期诊断对于患者的治疗和预后至关重要。传统的肺炎诊断方…

打造个性化github主页 一

文章目录 概述创建仓库静态美化GitHub 统计信息卡仓库 GitHub 额外图钉仓库 热门语言卡仓库 GitHub 资料奖杯仓库 GitHub 活动统计图仓库 打字特效添加中文网站统计仓库 总结 概述 github作为全球最大的代码托管平台,作为程序员都多多少少,都使用过他。…

【排序】直接插入排序和希尔排序

目录 一、排序思想 1、直接插入排序 2、希尔排序 二、代码实现 三、性能比较 四、排序总结 1、直接插入排序 2、希尔排序 一、排序思想 1、直接插入排序 基本思想:把待排序的序列选取一个整数逐个插入到已经排好的有序序列中,直到所有整数都插入…

智加科技获全国首张重卡无人驾驶开放道路测试牌照

2023年12月1日,智加科技获得苏州市智能网联汽车无人化测试牌照。该牌照也是江苏省及国内首张无人重卡开放高速公路全路段全场景全息路网(S17苏台高速)道路测试牌照。 该重卡无人驾驶开放道路测试牌照,经由苏州市智能网联汽车联席小…

图书整理II(两个栈实现队列)

目录 贼相似题目: 本题题目: 我们直接看题解吧: 审题目事例提示: 解题分析: 解题思路: 代码实现: 代码补充说明: 力扣题目地址: LCR 125. 图书整理 II - 力扣&#xff0…

基于深度学习面向中医诊断的舌象图像分割系统

1.研究背景与意义 项目参考AAAI Association for the Advancement of Artificial Intelligence 研究背景与意义 中医舌诊是通过观察舌的各种特征来了解人体的健康状况,从而对各种疾病做出诊断及病情评估,是传统中国医学应用最广、最有价值的诊法之一。…

如何在没有备份的情况下从 Android 手机恢复已删除的数据

电话数据对我们至关重要。我们可以更换我们使用的设备,但不能更换我们的数据。我们以前一直使用CD、USB 和硬盘来保存数据。随着技术的出现,我们遇到了云存储。我们可以随时随地、任意次数地访问存储。所有操作系统都有数据云,可以用来保存图…

docker容器内部文件挂载主机

docker images执行该命令可以发现一个centos镜像 docker run --namemycentos -itd --privilegedtrue --restartalways -p 88:80 -v C:\Users\Administrator\Desktop\dockerTest:/bin/gh:ro centosdocker run 命令用于在 Docker 上创建和运行容器。 --namemycentos 指定容器…

【面试HOT200】回溯篇

系列综述: 💞目的:本系列是个人整理为了秋招面试的,整理期间苛求每个知识点,平衡理解简易度与深入程度。 🥰来源:材料主要源于【CodeTopHot300】进行的,每个知识点的修正和深入主要参…

PAD平板签约投屏软件要如何选

又是一年年底了,年会开始多起来了,许多会务公司或活动公司会接到很多平板签约投屏业务,如年会中的签军令状、业绩保证书等。这时就面临选购一套签约投屏软件了。 目前的签约投屏软件,大多以H5做的网页版的多,但我建议…

Web安全漏洞分析-XSS(中)

随着互联网的迅猛发展,Web应用的普及程度也愈发广泛。然而,随之而来的是各种安全威胁的不断涌现,其中最为常见而危险的之一就是跨站脚本攻击(Cross-Site Scripting,简称XSS)。XSS攻击一直以来都是Web安全领…

RocketMQ消息过滤机制源码详解

#RocketMQ提供了2种消息过滤的方式: TAG 过滤 SQL92 过滤 SQL过滤默认是没有打开的,如果想要支持,必须在broker的配置文件中设置:enablePropertyFilter true 一. 示例代码 1.1 producer 代码 public class Producer {public …

实战系统玩转OpenGL和AI,助力实现各种高级酷炫视频特效几个技巧

随着计算机图形学和人工智能的发展,通过将OpenGL和AI相结合,我们可以实现各种令人印象深刻的高级酷炫视频特效。本文将介绍几个技巧,帮助您在实践中更好地应用这些技术,并附上相应的源码。 火焰效果: 利用OpenGL的纹理映射和着色器…

程序员学习方法

https://www.zhihu.com/question/24187324 https://www.zhihu.com/question/505750740 windows系统: 如何业余开展 Windows 系统的学习? - 知乎 wifi工作原理: WiFi的工作原理是什么? - 知乎 发

LLM:《第 3 部分》从数学角度评估封闭式LLM的泛化能力

一、说明 在 OpenAI 或 Anthropic 等封闭式大型语言模型 (LLM) 领域,对智能和多功能性的真正考验在于它们处理高特异性查询并在响应中表现出独特性的能力。在这篇博客中,我的目标是提供测试这些模型泛化能力的机制。 封闭式LLM意味着您不知道训练语料库的…

ORA-00257: archiver error. Connect internal only, until freed 处理方法

1、产生原因 通过PL/SQL登录用户账号提示此信息,导致无法正常登录,查询资料显示出现ORA-00257错误由于归档日志已满,占用了全部的硬盘剩余空间导致的,通过简单删除日志释放存储空间就能够解决。 2、解决办法 2.1 root用户登录服务…