【【萌新的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.mzph.cn/news/29999.shtml

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

相关文章

深度学习之用PyTorch实现逻辑回归

0.1 学习视频源于:b站:刘二大人《PyTorch深度学习实践》 0.2 本章内容为自主学习总结内容,若有错误欢迎指正! 代码(类比线性回归): # 调用库 import torch import torch.nn.functional as F#…

HDFS小文件解决方案---archive归档文件命令

小文件解决方案 背景Archive概述创建archive查看归档文件查看归档之后的样子查看归档文件之前的样子 提取archivearchive注意事项 背景 hdfs并不擅长存储小文件,因为每个文件最少一个block,每个block的元数据都会在namenode占用内存,如果存在…

Linux驱动之设备树添加蜂鸣器驱动

目录 一、蜂鸣器简介 二、硬件原理分析 三、蜂鸣器驱动原理 四、开发环境 五、修改设备树文件 1、添加 pinctrl 节点 2、添加 BEEP 设备节点 3、检查 PIN 是否被其他外设使用 六、蜂鸣器驱动程序编写 七、测试程序编写 八、运行验证 在 I.MX6U-ALPHA 开发板上有一个有源…

一种水文水利行业满管非满管双声道流量计安装调试

供电电源 用户应该特别注意:若是交流(AC220V)供电的主机插入直流电源,或者直流(DC24V)供电的主机接入AC220V电源,就会把流量计烧毁。 普通主机(包括固定式主机、盘装式主机&#x…

前沿分享-无创检测血糖RF波

非侵入性血糖仪,利用射频 (RF) 波连续测量血液中的葡萄糖水平。利用射频波技术连续实时监测血液中的葡萄糖水平,使用的辐射要比手机少得多。 大概原理是血液中的葡萄糖是具有介电特性,一般来说就是介电常数。 电磁波波幅的衰减反映了介质对电…

火车头采集器AI伪原创【php源码】

大家好,本文将围绕python作业提交什么文件展开说明,python123怎么提交作业是一个很多人都想弄明白的事情,想搞清楚python期末作业程序需要先了解以下几个事情。 火车头采集ai伪原创插件截图: I have a python project, whose fold…

FFmpeg常见命令行(二):FFmpeg转封装

前言 在Android音视频开发中,网上知识点过于零碎,自学起来难度非常大,不过音视频大牛Jhuster提出了《Android 音视频从入门到提高 - 任务列表》。本文是Android音视频任务列表的其中一个, 对应的要学习的内容是:如何使…

C# 2048小游戏核心算法

文章目录 01.程序结构划分02.去零03.合并04.上移05.下移/左移/右移&#xff0c;只是取数据的方向不同06.提高可读性 01.程序结构划分 02.去零 有序向量“唯一化”的思路。 /// <summary>/// 去零/// </summary>/// <param name"row">对于一行或一…

Clash 意外退出后 chrome / google 谷歌 浏览器无法连接互联网

解决方案&#xff1a; 以管理员模式打开命令行&#xff0c;输入&#xff1a;netsh winsock reset &#xff0c;然后重启电脑 如果还不行的话&#xff0c; 在 chromevs中选中 设置>隐私和安全>安全>使用安全 dns> 使用您当前的服务提供商 即可

数据结构和算法——哈希查找冲突处理方法(开放地址法-线性探测、平方探测、双散列探测、再散列,分离链接法)

目录 开放地址法&#xff08;Open Addressing&#xff09; 线性探测&#xff08;Linear Probing&#xff09; 散列表查找性能分析 平方探测&#xff08;Quadratic Probing&#xff09; 定理 平方探测法的查找与插入 双散列探测法&#xff08;Double Hashing&#xff09…

分布式 - 消息队列Kafka:Kafka生产者发送消息的3种方式

文章目录 1. Kafka 生产者2. kafaka 命令行操作3. Kafka 生产者发送消息流程4. Kafka 生产者发送消息的3种方式1. 发送即忘记2. 同步发送3. 异步发送 5. Kafka 消息对象 ProducerRecord 1. Kafka 生产者 Kafka 生产者是指使用 Apache Kafka 消息系统的应用程序&#xff0c;它们…

Pytorch深度学习-----神经网络模型的保存与加载(VGG16模型)

系列文章目录 PyTorch深度学习——Anaconda和PyTorch安装 Pytorch深度学习-----数据模块Dataset类 Pytorch深度学习------TensorBoard的使用 Pytorch深度学习------Torchvision中Transforms的使用&#xff08;ToTensor&#xff0c;Normalize&#xff0c;Resize &#xff0c;Co…

Git介绍及常用命令详解

一、Git的概述 Git是一个分布式版本控制工具&#xff0c;通常用来对软件开发过程中的源代码文件进行管理。 Git 会跟踪我们对文件所做的更改&#xff0c;因此我们可以记录已完成的工作&#xff0c;并且可以在需要时恢复到特定或以前的版本。Git 还使多人协作变得更加容易&…

Linux系统中的自旋锁(两幅图清晰说明)

总结&#xff1a; 多CPU下的自旋锁采取的是忙等待&#xff08;原地打转&#xff09;机制&#xff0c;虽然忙等待的线程占用了它所在的cpu&#xff0c;但其他线程仍可放到其他CPU上执行。所以自旋锁上锁和解锁之间的临界区代码要尽量的短&#xff0c;最好不要超过5行&#xff0c…

jenkins流水线

1.拉取代码 https://gitee.com/Wjc_project/yygh-parent.git2、项目编译 mvn clean package -Dmaven.test.skiptrue ls hospital-manage/target3、构建镜像 ls hospital-manage/target docker build -t hospital-manage:latest -f hospital-manage/Dockerfile ./hospital-ma…

AWD攻防学习总结(草稿状态,待陆续补充)

AWD攻防学习总结 防守端1、修改密码2、备份网站3、备份数据库4、部署WAF5、部署文件监控脚本6、部署流量监控脚本/工具7、D盾扫描&#xff0c;删除预留webshell8、代码审计&#xff0c;seay/fortify扫描&#xff0c;漏洞修复及利用9、时刻关注流量和积分信息&#xff0c;掉分时…

业绩难言乐观,皓泽电子撤回上市申请,小米等为其关联方

撰稿|行星 来源|贝多财经 8月8日&#xff0c;深圳证券交易所披露的信息显示&#xff0c;由于河南皓泽电子股份有限公司&#xff08;下称“皓泽电子”&#xff09;及其保荐人主动要求撤回申请文件&#xff0c;深交所终止了皓泽电子的发行注册程序。 据此前招股书披露&#xff…

python爬虫实战(1)--爬取新闻数据

想要每天看到新闻数据又不想占用太多时间去整理&#xff0c;萌生自己抓取新闻网站的想法。 1. 准备工作 使用python语言可以快速实现&#xff0c;调用BeautifulSoup包里面的方法 安装BeautifulSoup pip install BeautifulSoup完成以后引入项目 2. 开发 定义请求头&#xf…

Fast Tone Mapping for High Dynamic Range Images

Abstract 我们提出了一种快速、有效、灵活的色调再现方法&#xff0c;在低动态范围再现设备中保留了高动态范围场景的可视性和对比度印象。 一个单一的参数控制能见度和对比度在一个简单和优雅的方式和互动速度。 新方法使用简单&#xff0c;计算效率高。 实验表明&#xff0c…

Jenkins+Docker+SpringCloud微服务持续集成

JenkinsDockerSpringCloud微服务持续集成 JenkinsDockerSpringCloud持续集成流程说明SpringCloud微服务源码概述本地运行微服务本地部署微服务 Docker安装和Dockerfile制作微服务镜像Harbor镜像仓库安装及使用在Harbor创建用户和项目上传镜像到Harbor从Harbor下载镜像 微服务持…