当前位置: 首页 > java >正文

嵌入式学习笔记 - HAL库对外设的封装

一 外设封装结构

HAL库对外设的封装使用了xx_HandleTypeDef类型的外设句柄结构体,这个句柄结构体的第一个成员Instance(xx_TypeDef类型)一般为该外设的所有寄存器的起始基地址,第二个成员Init(xx_InitTypeDef类型)一般为该外设的设置的需要设置的参数,以CAN 模块举例说明:

typedef struct
{
  CAN_TypeDef                 *Instance;  /*!< Register base address  */

① 第一个变量是一个指针*Instance,类型为CAN_TypeDef,如下,其实是所有CAN外设的寄存器的集合:

在初始化外设函数HAL_xx_INIT()执行之前时,HAL将这个变量(指针)赋值为该外设的基地址

  CAN_InitTypeDef             Init;       /*!< CAN required parameters        */

② 第二个变量一般为结构体Init,这个结构体是一个很多参数的集合如下图,在初始化外设函数HAL_xx_INIT()执行之前时,HAL会将外设结构体句斌的Init成员的这些参数赋值,

最终HAL会在HAL_xx_INIT()执行时把这些参数赋值到第一个变量代表的地址中

  CanTxMsgTypeDef*            pTxMsg;     /*!< Pointer to transmit structure  */

  CanRxMsgTypeDef*            pRxMsg;     /*!< Pointer to reception structure for RX FIFO0 msg */

  CanRxMsgTypeDef*            pRx1Msg;    /*!< Pointer to reception structure for RX FIFO1 msg */

  __IO HAL_CAN_StateTypeDef   State;      /*!< CAN communication state        */

  HAL_LockTypeDef             Lock;       /*!< CAN locking object             */

  __IO uint32_t               ErrorCode;  /*!< CAN Error code                 */

}CAN_HandleTypeDef;

 如果该外设有其他的附加功能参数

比如CAN外设有过滤器,并有相应的过滤器寄存器参数,也是以同样的方式将这个过滤器的相关参数赋值到第一个变量代表的基地址的寄存器里,如下图:

CAN外设过滤器结构体参数:

将过滤器参数赋值到CAN外设句柄的第一个变量指示的地址

http://www.xdnf.cn/news/14249.html

相关文章:

  • 【Linux命令】查看内核版本命令
  • C++批量读取指定后缀文件
  • 【C++进阶篇】哈希的应用(位图)
  • 深度解析Vue.js组件开发与实战案例
  • 商用密码基础知识介绍(上)
  • python与java的区别
  • 深入解析ReentrantReadWriteLock读写锁机制
  • 【python深度学习】Day53 对抗生成网络
  • 人工智能学习23-BP-图像编码
  • c++编译第三方项目报错# pragma warning( disable: 4273)
  • HTML5白云飘飘动态效果教程
  • 华为云Flexus+DeepSeek征文 | 基于华为云Dify-LLM应用开发平台构建写作助手
  • 达梦分布式集群DPC_DPC的执行计划新增操作符详解_yxy
  • 区间合并:牛奶
  • 【慢摹】TRL训练器细节详解(SFT/PPO/DPO/GRPO)
  • 自用方案总结
  • 如何在 Elementary OS 上安装 Snap Store
  • Thymeleaf功能标签th:block
  • java面试总结-20250605
  • 5G核心网Non-IP数据报文转发机制:Unstructured会话与协议栈解析
  • 抖音 pc + 翻页
  • C#最佳实践:推荐使用泛型而非装箱、拆箱
  • 60、数据访问-数据库场景的自动配置分析与整合测试
  • c++26新功能—契约编程
  • 单测时如何让 mock 的接口在长链路调用时一直生效
  • 从STM32到NXP:GPIO就像装修房子,多了个“智能开关”
  • 基于 SpringBoot+Servlet+JSP 的医院医保管理系统的设计与实现,论文7000字,可根据实际情况调整
  • ES+索引库文档操作
  • [CVPR 2025] DiCo:动态协作网络助力半监督3D血管分割新突破
  • AI Agent实战 - LangChain+Playwright构建火车票查询Agent