STM32HAL(一)外设驱动框架与回调函数应用

前言:这段时间开始学习STM32F4,同时为了以后的便捷性性就开始学HAL库了

目录

HAL库文件

基本文件结构

API命名规则

HAL库回调函数

HAL_ XXX _MspInit() / _MspDeInit()

HAL_PPP_MspInit()

HAL_PPP_MspDeInit()

HAL_PPP_ProcessCpltCallback

HAL_PPP_ErrorCallback


HAL库文件

基本文件结构

stm32f1xx_hal_XXX.cstm32f1xx_hal_XXX.h

这些是基础的外设驱动文件,包含外设的基本功能函数声明与定义,如初始化、读写、控制及状态获取等

stm32f1xx_hal_XXX_ex.cstm32f1xx_hal_XXX_ex.h

扩展文件,提供对基础外设驱动的补充功能,包括更高级或特定配置的功能实现。

API命名规则

  • 函数命名HAL_XXX_Function
    • XXX 表示外设或功能模块名称,例如 GPIO 对应通用输入输出端口,TIM 对应定时器。
    • Function 描述函数执行的操作,如初始化 (Init)、读 (Read)、写 (Write) 等。
    • Eg. HAL_GPIO_表示GPIO相关函数,HAL_TIM_对应定时器函数等。
  • 如:初始化/反初始化函数:HAL_XXX_Init(), HAL_XXX_DeInit()

    外设读写函数:HAL_ XXX _Read(),HAL_XXX_Write(),HAL_XXX_Transmit(), HAL_XXX_Receive()

    控制函数:HAL_ XXX _Set (),HAL_ XXX _Get ()

    状态和错误:HAL_ XXX _GetState (), HAL_ XXX _GetError ()

HAL库回调函数

HAL_ XXX _MspInit() / _MspDeInit()

上述函数是与外设(XXX代表任何特定外设,比如USART, TIM, SPI)相关的CMSIS-OS(或称为HAL库的OS抽象层)初始化和反初始化函数。这两个函数主要用于处理与操作系统(如果有使用)和硬件相关的低级设置,它们是用户自定义的函数,需要用户根据实际项目需求来实现。

HAL_PPP_MspInit()

  • 目的此函数用于外设的初期硬件配置和资源分配,特别是那些不在HAL库标准初始化中涵盖的部分。它通常涉及到GPIO的配置(如复用、上拉/下拉设置)、时钟使能、DMA通道配置(如果该外设使用了DMA)、NVIC中断使能等操作。
  • 调用时机:当你调用像HAL_UART_Init()这样的HAL外设初始化函数时,HAL库内部会自动调用对应的HAL_UART_MspInit()来完成底层的系统配置。
  • 实现:用户需要根据项目需求,在这个函数里添加必要的硬件初始化代码。这为开发者提供了高度的灵活性,以便于适应不同的硬件设计和系统要求。

HAL_PPP_MspDeInit()

  • 目的:与HAL_PPP_MspInit()相对应,此函数用于释放由HAL_PPP_MspInit()配置的资源,进行硬件状态的恢复或清理工作。它在你调用诸如HAL_UART_DeInit()之类的函数时被调用,用来反初始化外设相关的硬件设置,如关闭时钟、禁用中断、释放DMA通道等。
  • 调用时机:当不再需要某个外设服务,准备重新配置或释放资源时。
  • 实现:同样需要用户根据实际配置进行实现,确保所有之前由MspInit配置的资源得到妥善清理,以便于外设能够被正确地重新初始化或系统资源可以被其他组件复用。

注意事项

这两个函数不是HAL库本身提供的,而是作为用户层接口,需要用户在自己的项目中定义和实现。

HAL_PPP_ProcessCpltCallback

是一个在STM32 HAL库中用于处理特定外设(PPP代表任何特定的外设,如USART、SPI、I2C、ADC等)操作完成回调的函数指针。这个函数让用户有机会在某个外设操作(如数据传输、转换完成等)完成后执行自定义的操作。它是HAL库提供的一种事件通知机制,使得用户代码能够在异步操作完成时得到通知并采取相应行动。

目的:

  • 通知机制:当一个异步过程(如DMA传输、ADC转换等)完成时,HAL库会自动调用这个回调函数,通知用户层程序操作已经成功结束。
  • 后续处理:允许用户在操作完成的瞬间执行后续逻辑,比如数据处理、状态更新、触发下一个任务或控制流程等。
  • 灵活性:提供了一种灵活的方式来定制化处理各种操作完成后的场景,增强了代码的模块化和可维护性。

实现方式:

  • 定义:用户需要在自己的代码中定义这个回调函数,其原型通常如下所示:
    void HAL_PPP_ProcessCpltCallback(PERIPH_HandleTypeDef *hperiph);

    其中PERIPH_HandleTypeDef *hperiph是指向相应外设句柄的指针,包含了外设的状态信息和配置。

  • 注册:用户需要在初始化外设或配置操作时,将这个回调函数的地址赋给相应的句柄结构体中的回调函数指针成员。这样,当操作完成时,HAL库就能找到并调用这个函数。
  • 使用场景:例如,在使用HAL库进行DMA传输时,可以设置HAL_DMA_Transmit_DMA()之后的完成回调为HAL_PPP_ProcessCpltCallback,以在DMA传输完成后执行特定的处理逻辑。

HAL_PPP_ErrorCallback

是STM32 HAL库中用于处理特定外设(PPP代表任何特定外设,如USART、SPI、I2C等)错误情况的回调函数。当外设发生错误时,HAL库会自动调用这个用户自定义的函数,以便用户可以及时得知错误情况并采取相应的错误处理措施。这为开发者提供了一种灵活的方式,来应对硬件操作过程中可能出现的各种异常情况。

目的:

  • 错误通知:当外设操作中检测到错误,如通信错误、DMA传输错误、超时、硬件故障等,HAL库通过调用此回调函数来通知用户。
  • 错误处理:用户可以在该函数中实现具体的错误处理逻辑,比如清除错误标志、重启外设、记录错误日志、执行故障恢复流程等。
  • 提高鲁棒性:通过适当的错误处理,可以增强系统的稳定性和可靠性,避免因单一错误导致整个系统崩溃。

实现方式:

  • 定义:用户需根据需要在自己的代码中定义此函数,其原型通常如下:
    void HAL_PPP_ErrorCallback(PERIPH_HandleTypeDef *hperiph);

    其中PERIPH_HandleTypeDef *hperiph指向发生错误的外设句柄,包含了错误状态和其他相关信息。

  • 注册:通常情况下,HAL库在初始化外设时会默认注册一个空的错误回调函数。用户可根据需要覆盖这个默认的回调,将自己的实现赋值给外设句柄结构中的相应成员,例如huart.ErrorCode和huart.ErrorCallback。
  • 使用场景:适用于所有使用HAL库进行外设操作的场合,尤其是涉及复杂交互和可能产生多种错误条件的应用中。

注意事项:错误码检查:在HAL_PPP_ErrorCallback内部,应该检查外设句柄中的错误码(hperiph.ErrorCode)来确定具体的错误类型,从而采取相应的处理措施。

 

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

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

相关文章

刚上手Java会踩的坑

1. 用号比较的坑 对Integer类型的两个参数使用号比较是否相等,或者使用String类型的两个变量进行比较,天真的认为他们是理所应当的。 其实操作只适用于基本数据类型如int , byte, boolean, short, char, long, float, double这些基本数据类型。 其它…

instanceof 关键字的作用

instanceof 严格来说是 Java 中的一个双目运算符,用来测试一个对象是否为一个类的实例,用法为: boolean result obj instanceof Class其中 obj 为一个对象,Class 表示一个类或者一个接口,当 obj 为 Class 的对象&…

JavaEE-JPA(相关概念及Spring JPA)

JPA JPA 相关概念 ORM 框架 (Object Relational Mapping) 建立 Java 程序实体类与数据库表之间的映射关系。使用 ORM 框架进行编程 Java 程序会根据开发者配置,在运行时自动把数据对象持久化到数据库中,比直接使用 JDBC 编程更为方便和强大。 常见的 …

Android面试题之Kotlin常见集合操作技巧

本文首发于公众号“AntDream”,欢迎微信搜索“AntDream”或扫描文章底部二维码关注,和我一起每天进步一点点 list 创建和修改 不可变list,listOf var list listOf("a","d","f") println(list.getOrElse(3){"Unkn…

Kubernetes可视化界面之DashBoard

1.1 DashBoard Kubernetes Dashboard 是 Kubernetes 集群的一个开箱即用的 Web UI,提供了一种图形化的方式来管理和监视 Kubernetes 集群中的资源。它允许用户直接在浏览器中执行许多常见的 Kubernetes 管理任务,如部署应用、监控应用状态、执行故障排查…

用循环神经网络预测股价

循环神经网络可以用来对时间序列进行预测,之前我们在介绍循环神经网络RNN,LSTM和GRU的时候都用到了正弦函数预测的例子,其实这个例子就是一个时间序列。而在众多的时间序列例子中,最普遍的就是股价的预测了,股价序列是一种很明显的…

链表练习题

返回倒数第K个节点 快慢指针 让快指针先走k步,再使得快指针与慢指针同时走一步,这样没有开额外空间,空间复杂度较低。 代码实现如下: struct ListNode {int val;struct ListNode* next;}; int kthToLast(struct ListNode* head…

第 52 期:MySQL 半同步复制频繁报错

社区王牌专栏《一问一实验:AI 版》全新改版归来,得到了新老读者们的关注。其中不乏对 ChatDBA 感兴趣的读者前来咨询,表达了想试用体验 ChatDBA 的意愿,对此我们表示感谢 🤟。 目前,ChatDBA 还在最后的准备…

el-table实现合并特定列的所有行

el-table实现合并特定列的所有行 示例: 在这里插入图片描述 const objectSpanMethod ({ row, column, rowIndex, columnIndex }) > {if (columnIndex 5 || columnIndex 7) {// 就是只保留第一行,其他直接不要,然后行数是列表长度if …

2024年03月 Python(一级)真题解析#中国电子学会#全国青少年软件编程等级考试

Python等级考试(1~6级)全部真题・点这里 一、单选题(共25题,共50分) 第1题 下列哪个命令,可以将2024转换成’2024’ 呢?( ) A:str(2024) B:int(2024) C:float(2024) D:bool(2024) 答案:A 本题考察的是str() 语句,将数字转换成字符串用到的是str() 语句。 …

Java:IO

首 java.io中有百万计的类,如何找到自己需要的部分? 流 IO涉及到一个“流”stream的概念,可以简单理解成数据从一个源头到一个目的地。明白数据从哪来,要到哪里去,数据流中是字节还是字符之后,才能找到自…

回顾下Java中的基本数据类型以及Integer与int的区别

一、Java中的基本数据类型(Primitive Data Types)共有八种,它们分别是: byte:字节型,用于表示8位整数,取值范围从-128到127(包括-128和127)。 short:短整型&…

由于找不到d3dx9_39.dll,无法继续执行代码的5种解决方法

在现代科技发展的时代,电脑已经成为我们生活中不可或缺的一部分。然而,由于各种原因,我们可能会遇到一些电脑问题,其中之一就是“d3dx9_39.dll丢失”。这个问题可能会导致我们在运行某些游戏或应用程序时遇到错误提示,…

AI 生成第9篇测试文章:测试人员如何发挥自己在团队中的作用?

背景 在快速迭代的软件开发环境中,测试人员的角色早已超越了传统的“找bug”范畴,TA们成为了保证产品质量、促进团队协作、推动技术创新的重要力量。本文将深入探讨测试人员如何在团队中发挥更加全面和深入的作用,成为不可或缺的一环。 1. …

Vue中引入组件需要哪三步

在Vue中引入组件通常需要以下三步: 导入组件:首先,你需要在父组件中导入你想要使用的子组件。这通常是通过ES6的import语法完成的。 注册组件:接下来,你需要在父组件中注册这个子组件。这可以通过components选项完成&…

JavaScript如何让一个按钮的点击事件在完成之前禁用

在JavaScript中&#xff0c;要禁用一个按钮的点击事件直到某个操作完成&#xff0c;你可以将其点击事件用匿名函数的方式书写。 你可以将其在点击函数内设置为null来禁用按钮。 <button id"butto_n">点击抽奖</button><script>butto_n.onclick bu…

大整数运算详解升级版

目录 大整数的存储 大整数的四则运算 高精度加法 高精度减法 高精度与低精度的乘法 高精度与低精度的除法 大整数的存储 对于大整数使用数组存储&#xff0c;例如定义int型数组d[1000]&#xff0c;那么这个数组中的每一位就代表了存放的整数的每一位。如将整数235813存…

android requireActivity() 和 getActivity()使用问题

requireActivity() 和 getActivity() 都是从 Fragment 中获取宿主 Activity 的方法,但它们有一些不同的行为和使用场景。 requireActivity() 抛出异常:如果 Fragment 没有附加到任何 Activity,调用 requireActivity() 会抛出 IllegalStateException。安全性:通常在你确定 …

新品 | Forge® 1GigE IP67工业相机助力智能农业、食品和饮料行业

近日&#xff0c;51camera的合作伙伴Teledyne FLIR IIS推出Forge 1GigE IP67,它是Forge系列的最新工业相机&#xff0c;旨在在恶劣的工业环境中运行&#xff0c;同时确保高效的生产能力。Forge 1GigE IP67致力于为工厂自动化提供先进成像系统的最新产品。 Forge 1GigE IP67相机…

python-pytorch 实现seq2seq+luong general concat attention 完整代码

接上一篇https://blog.csdn.net/m0_60688978/article/details/139046644 # def getAQ(): # ask[] # answer[] # with open("./data/flink.txt","r",encoding"utf-8") as f: # linesf.readlines() # for line in lin…