【【萌新的STM32 学习-6】】

萌新的STM32 学习-6

在这里插入图片描述
在这里插入图片描述
BSP 文件夹,用于存放正点原子提供的板级支持包驱动代码,如:LED、蜂鸣器、按键等。
本章我们暂时用不到该文件夹,不过可以先建好备用。
CMSIS 文件夹,用于存放 CMSIS 底层代码(ARM 和 ST 提供)
SYSTEM 文件夹,用于存放正点原子提供的系统级核心驱动代码
Middlewares 文件夹
该文件夹用于存放正点原子和其他第三方提供的中间层代码(组件/Lib 等),如:USMART、
MALLOC、TEXT、FATFS、USB、LWIP、各种 OS、各种 GUI 等等。本章我们暂时用不到该
文件夹,不过可以先建好备用,后面的实验将会陆续添加各种文件。
Output 文件夹
该文件夹用于存放编译器编译工程输出的中间文件,比如:.hex、.bin、.o 文件等等。这里
不需要操作,后面只需要在 MDK 里面设置该文件夹为编译过程中间文件的存放文件夹就行。
Projects 文件夹
该文件夹用于存放编译器(MDK、IAR 等)工程文件,我们主要用 MDK,为了方便区分,
我们在该文件夹下新建:MDK-ARM 文件夹,用于存放 MDK 的工程文件
在这里插入图片描述
ST 公司为了方便用户开发 STM32芯片开发提供了三种库函数,从时间产生顺序是:标准库、HAL 库和 LL 库。
我们在进行操作时可以直接操作寄存器
这样的话执行效率高 但是时间成本也高
标准库是最早的

  1. 标准外设库(Standard Peripheral Libraries)标准外设库(Standard Peripherals Library)是对 STM32 芯片的一个完整的封装,包括所有标准器件外设的器件驱动器,是 ST 最早推出的针对 STM 系列主控的库函数。标准库的设计的初衷是减少用户的程序编写时间,进而降低开发成本。几乎全部使用 C 语言实现并严格按照“Strict ANSI-C”、MISRA-C 2004 等多个 C 语言标准编写。但标准外设库仍然接近于寄存器操作,主要就是将一些基本的寄存器操作封装成了 C 函数。开发者仍需要关注所使用的外设是在哪个总线之上,具体寄存器的配置等底层信息。

  2. HAL 库HAL 是 Hardware Abstraction Layer 的缩写,即硬件抽象层。是 ST 为可以更好的确保跨STM32 产品的最大可移植性而推出的 MCU 操作库。这种程序设计由于抽离应用程序和硬件底层的操作,更加符合跨平台和多人协作开发的需要。HAL 库是基于一个非限制性的 BSD 许可协议(Berkeley Software Distribution)而发布的开源代码。 ST 制作的中间件堆栈(USB 主机和设备库,STemWin)带有允许轻松重用的许可模式, 只要是在 ST 公司的 MCU 芯片上使用,库中的中间件(USB 主机/设备库,STemWin)协议栈即被允许修改,并可以反复使用。至于基于其它著名的开源解决方案商的中间件(FreeRTOS,FatFs,LwIP 和 PolarSSL)也都具有友好的用户许可条款。HAL 库是从 ST 公司从自身芯片的整个生产生态出发,为了方便维护而作的一次整合,以改变标准外设库带来各系列芯片操作函数结构差异大、分化大、不利于跨系列移植的情况。相比标准外设库,STM32Cube HAL 库表现出更高的抽象整合水平,HAL 库的 API 集中关注各外设的公共函数功能,这样便于定义一套通用的用户友好的 API 函数接口,从而可以轻松实现从一个 STM32 产品移植到另一个不同的 STM32 系列产品。但由于封闭函数为了适应最大的兼容性,HAL 库的一些代码实际上的执行效率要远低于寄存器操作。但即便如此,HAL 库仍是 ST未来主推的库。

  3. LL 库:LL 库(Low Layer)目前与 HAL 库捆绑发布,它设计为比 HAL 库更接近于硬件底层的操作,代码更轻量级,代码执行效率更高的库函数组件,可以完全独立于 HAL 库来使用,但 LL库不匹配复杂的外设,如 USB 等。所以 LL 库并不是每个外设都有对应的完整驱动配置程序。

HAL库效率低
LL库不匹配部分复杂的外设
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
我们要先知道 STM32 芯片的某个外设的性能和工作模式,才能借助 HAL 库来帮助我们编程,甚至修改 HAL 库来适配我们的开发项目。HAL 库的 API 虽多,但是查找和使用有规律可循,只要学会其中一个,其他的外设就是类似的,只是添加自己的特性的 API 而已。需要按照芯片使用手册建议的步骤去配置芯片。HAL 库驱动提供了芯片的驱动接口,但我们需要强调一个概念是使用 HAL 库的开发是对芯片功能的开发,而不是开发这个库,也不是有也这个库能就直接开发。如果我们对芯片的功能不作了解的话,仍然不知道按照怎样的步骤和寻找哪些可用的接口去实现想要实现的功能。ST 提供芯片使用手册《STM32F1xx 参考手册.pdf》告诉我们使用某一外设功能时如何具体地去操作每一个用到的寄存器的细节,后面我们的例程讲解过程也会结合这个手册来分析配置过程。嵌入式的软件开发流程总遵循以下步骤:组织工具链、编写代码、生成可执行文件、烧录到芯片、芯片根据内部指令执行我们编程生成的可执行代码。

HAL_Init()函数
源码在 142 行到 167 行,简化函数如下(下面的代码只针对 F1 的 HAL 固件 1.8.3 版本,
其它版本可能有差异):

HAL_StatusTypeDef HAL_Init(void)
{/* 配置 Flash 的预取控制器 */
#if (PREFETCH_ENABLE != 0)
#if defined(STM32F101x6) || defined(STM32F101xB) || defined(STM32F101xE) || defined(STM32F101xG) || \ defined(STM32F102x6) || defined(STM32F102xB) || \defined(STM32F103x6) || defined(STM32F103xB) || defined(STM32F103xE) || defined(STM32F103xG) || \ defined(STM32F105xC) || defined(STM32F107xC)/* Prefetch buffer is not available on value line devices */__HAL_FLASH_PREFETCH_BUFFER_ENABLE();
#endif
#endif /* 使能 Flash 的预取控制器 *//* 配置中断优先级顺序 */HAL_NVIC_SetPriorityGrouping(NVIC_PRIORITYGROUP_4);/* 使用滴答定时器作为时钟基准,配置 1ms 滴答(重置后默认的时钟源为 HSI) */HAL_InitTick(TICK_INT_PRIORITY);/* 初始化其它底层硬件(如果必要) */HAL_MspInit();/* 返回函数状态 */return HAL_OK;
}

该函数是 HAL 库的初始化函数,原则上在程序中必须优先调用,其主要实现如下功能:
1)使能 Flash 的预取缓冲器(根据闪存编程手册,打开预取指令可以提高对 I-Code 总线
的访问效率,且 AHB 时钟的预分频系数不为 1 时,必须打开预取缓冲器)
2)设置 NVIC 优先级分组为 4。
3)配置滴答定时器每 1ms 产生一个中断。
在这个阶段,系统时钟还没有配置好,因此系统还是默认使用内部高速时钟源 HSI 在跑
程序。对于 F1 来说,HSI 的主频是 8MHZ。所以如果用户不配置系统时钟的话,那么系统将
会使用 HSI 作为系统时钟源。
4)调用 HAL_MspInit 函数初始化底层硬件,HAL_MspInit 函数在 stm32f1xx_hal.c 文件里
面做了弱定义。关于弱定义这个概念,后面会有讲解,现在不理解没关系。正点原子的 HAL
库例程是没有使用到这个函数去初始化底层硬件,而是单独调用需要用到的硬件初始化函数。
用户可以根据自己的需求选择是否重新定义该函数来初始化自己的硬件。
注意事项:为了方便和兼容性,正点原子的 HAL 库例程中的中断优先级分组设置为分组
2,即把源码的 HAL_NVIC_SetPriorityGrouping(NVIC_PRIORITYGROUP_4)改为如下代码:
HAL_NVIC_SetPriorityGrouping(NVIC_PRIORITYGROUP_2);
中断优先级分组为 2,也就是 2 位抢占优先级,2 位响应优先级,抢占优先级和响应优先
级的值的范围均为 0-3。
HAL 库使用注意事项本小节根据经验跟大家讲述一些关于 HAL 库使用的注意事项,供读者参考。1,即使我们已经在使用库函数作为开发工具了,我们可以忽略很多芯片的硬件外设使用上的细节,但当发生问题时,我们仍需要回归到芯片使用手册查看当前操作是否违规或缺漏;2,使用 HAL 库和其它第三方的库开发类似,把我们需要编写的软件和第三方的库分开成相互独立的文件,开发过程中我们尽量不去修改第三方的软件源码,需要修改的部分尽量在自己的代码中实现;这样一旦我们需要更新第三方库时,我们原来编写的功能也能很快地匹配新的库去执行功能;3,即使 HAL 库目前较以前已经相对更完善了,但它仍无法覆盖我们要想实现的所有细节功能,甚至可能存在错误,我们要有怀疑精神,辩证地去使用好这个工具;如我们在 PWM一节编码时发现 HAL 库中有个宏定义 TIM_RESET_CAPTUREPOLARITY 括号不匹配导致编译报错,这时我们不得不修改一下 HAL 库的源码了。4,注意 HAL 库的执行效率。由于 HAL 库的驱动对相同外设大多是可重入的,在执行HAL 驱动的 API 函数的效率没有直接寄存器操作来得高,如果在对时序要求比较严苛的代码,建议使用简洁的寄存器操作代替;5,我们在例程中使用 delay.c 中的延时函数取代 Hal_Delay();取消原来 HAL 库的 Systick 延时设置;但这会有一个问题:原来 HAL 库的超时处理机制不再适用,所以对于设置了超时的函数,可能会导致停留在这个函数的处理中,无法按正常的超时退出;6,我们建议如无致命 BUG 出现,尽量使用开发学习时已经测试稳定的 HAL 库来继续进行开发,不必要频繁更新 HAL 库,因为更新 HAL 库后可能会导致原来能正常运行的代码,在更新 HAL 库之后反面反面无法运行的情况,有些函数操作的结构方式变化了等等,这里只是笔者的建议,大家自己的实际情况权衡。

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

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

相关文章

【Python】Pandas 简介,数据结构 Series、DataFrame 介绍,CSV 文件处理,JSON 文件处理

序号内容1【Python】Pandas 简介,数据结构 Series、DataFrame 介绍,CSV 文件处理,JSON 文件处理2【Python】Pandas 数据清洗操作,常用函数总结 文章目录 1. Pandas 简介2. Pandas 数据结构1. Series(一维数据&#xff…

Pandas 的Merge函数详解

在日常工作中,我们可能会从多个数据集中获取数据,并且希望合并两个或多个不同的数据集。这时就可以使用Pandas包中的Merge函数。在本文中,我们将介绍用于合并数据的三个函数 merge、 merge_ordered、 merge_asofmerge merge函数是Pandas中…

算法练习--leetcode 数组

文章目录 爬楼梯问题裴波那契数列两数之和 [数组]合并两个有序数组移动零找到所有数组中消失的数字三数之和 爬楼梯问题 输入n阶楼梯,每次爬1或者2个台阶,有多少种方法可以爬到楼顶? 示例1:输入2, 输出2 一次爬2阶&a…

743. 网络延迟时间

有 n 个网络节点,标记为 1 到 n。 给你一个列表 times,表示信号经过 有向 边的传递时间。 times[i] (ui, vi, wi),其中 ui 是源节点,vi 是目标节点, wi 是一个信号从源节点传递到目标节点的时间。 现在,…

用 Gaussian Process 建模 state-action 空间相关性,加速 Multi-Fidelity RL

1 intro 利用相邻 state-action 的空间相关性来加速学习:通过 Gaussian Process(GP)作为函数逼近器。主要贡献:两个算法。 model-based MFRL 算法 GP-VI-MFRL,估计转换函数,然后使用 value iteration 计算…

rust基础

这是笔者学习rust的学习笔记(如有谬误,请君轻喷) 参考视频: https://www.bilibili.com/video/BV1hp4y1k7SV参考书籍:rust程序设计语言:https://rust.bootcss.com/title-page.htmlmarkdown地址:h…

金鸣识别将无表格线的图片转为excel的几个常用方案

我们知道,金鸣识别要将横竖线齐全的表格图片转为excel非常简单,但要是表格线不齐全甚至没有表格线的图片呢?这就没那么容易了,在识别这类图片时,我们一般会使用以下的一种或多种方法进行处理: 1. 基于布局…

【Unity 实用工具篇】✨| 学会使用 可编程瓦片Tile Map,快速搭建2D地图

前言【【Unity 实用工具篇】✨| 学会使用 可编程瓦片Tile Map,快速搭建2D地图一、导入 Tile Map Editor二、创建调色板 Tile Palette三、快速绘制地图四、TilePalette 调色板功能介绍五、TileMap 相关组件属性介绍GirdTilemapTilemap Renderer 瓦片地图渲染器Tile Assets 瓦片…

ArcGIS Pro简介下载安装地址

ArcGIS Pro简介 ArcGIS Pro是一款功能强大的地理信息系统(GIS)软件,由Esri开发。它为用户提供了一种直观、灵活且高效的方式来处理、分析和可视化地理数据。ArcGIS Pro具有现代化的用户界面和工作流程,使用户能够更好地利用地理信…

【项目 计网2】4.4网络模型 4.5协议 4.6网络通信的过程

文章目录 4.4网络模型OSI七层参考模型TCP/IP四层模型(常用)简介四层介绍 4.5协议简介常见协议UDP协议TCP协议IP协议以太网帧协议(MAC地址封装)ARP协议(IP->MAC) 4.6网络通信的过程封装分用 4.4网络模型 …

list删除重复元素几种思路

文章目录 list删除重复元素几种思路hashsetStream流删除所有重复元素 list删除重复元素几种思路 hashset List<String> list2 new ArrayList<>();list2.add("a");list2.add("b");list2.add("a");Set<String> set new HashS…

uni-app uView自定义底部导航栏

因项目需要自定义底部导航栏&#xff0c;我把它写在了组件里&#xff0c;基于uView2框架写的&#xff08;vue2&#xff09;&#xff1b; 一、代码 在components下创建tabbar.vue文件&#xff0c;代码如下&#xff1a; <template><view><u-tabbar :value"c…

macbook 安装 Git 和 安装 Homebrew

使用MacBook 时&#xff0c;需要拉取代码&#xff0c;我们需要使用到 Git&#xff0c;但 MacBook 中并没安装&#xff0c;这里我们分享一下安装过程。其他方式可查看参考文献中的方法。 一、使用终端直接安装 在新版的 MacBook 中&#xff0c;可以使用终端直接安装 Git&#…

ensp与虚拟机搭建测试环境

1.虚拟机配置 ①首先确定VMnet8 IP地址&#xff0c;若要修改IP地址&#xff0c;保证在启动Ensp前操作 ②尽量保证NAT模式 2.ensp配置 (1)拓扑结构 (2)Cloud配置 ①首先点击 绑定信息 UDP → 增加 ②然后点击 绑定信息 VMware ... → 增加 ③最后在 端口映射设置上点击双向通…

算法练习--leetcode 链表

文章目录 合并两个有序链表删除排序链表中的重复元素 1删除排序链表中的重复元素 2环形链表1环形链表2相交链表反转链表 合并两个有序链表 将两个升序链表合并为一个新的 升序 链表并返回。 新链表是通过拼接给定的两个链表的所有节点组成的。 示例 1&#xff1a; 输入&…

Axure RP9中使用Echarts示例

目录 在Axure中拖入一个矩形框&#xff0c;并命名tes 进入Echarts官网示例页面https://echarts.apache.org/examples/zh/index.html 选择自己需要的图表&#xff0c;修改数据&#xff0c;并复制左侧js代码 把上面复制的代码替换下方的option{}; javascript: var script docum…

工作记录------单元测试(持续更新)

工作记录------单元测试 之前的工作中从来没有写过单元测试&#xff0c;新入职公司要求写单元测试&#xff0c; 个人觉得&#xff0c;作为程序员单元测试还是必须会写的 于此记录一下首次编写单元测试的过程。 首先引入单元测试相关的依赖 <dependency><groupId>…

[深度学习入门]PyTorch深度学习[Numpy基础](上)

目录 一、前言二、Numpy概述三、生成Numpy数组3.1 从已有数据中创建数组3.2 利用random模块生成数组3.3 创建特定形状的多维数组3.4 利用arange和linspace函数生成数组 四、获取元素五、Numpy的算术运算5.1 对应元素相乘5.2 点积运算 六、后记 本文的目标受众&#xff1a; 对机…

改进粒子群算法优化BP神经网络---回归+分类两种案例

今天采用改进的粒子群算法(LPSO)优化算法优化BP神经网络。本文选用的LPSO算法是之前作者写过的一篇文章&#xff1a;基于改进莱维飞行和混沌映射&#xff08;10种混沌映射随意切换&#xff09;的粒子群优化算法&#xff0c;附matlab代码 文章一次性讲解两种案例&#xff0c;回归…