STM32 HAL库 .c/.h 文件介绍

HAL库中各个文件的介绍:

 

startup_stm32l475xx.s

启动文件的主要作用是进行RAM中堆、栈内存的分配和初始化,中断向量表及中断函数的定义等,进行完这一系列工作后执行系统复位从而跳转至用户main函数开始执行。

stm32l4xx_hal_ppp.c/.h

基本外设的操作函数文件,ppp 代表外设名称。其中stm32l4xx_hal_cortex.c/.h 比较特殊,它是一些 Cortex 内核通用函数声明和定义,例如中断优先级 NVIC 配置,系统软复位以及Systick 配置等。

stm32l4xx_hal_ppp_ex.c/.h

扩展外设特性的操作函数文件。

stm32l4xx_hal.c

HAL库的通用函数文件,如HAL_Init,HAL_DeInit,HAL_Delay等。

stm32l4xx_hal.h

HAL库的通用函数文件的头文件。

stm32l4xx_hal_conf.h

HAL库的配置文件,使用宏定义选择某种外设是否使能,以及一些时钟参数的配置。

stm32l4xx_hal_def.h

HAL库中的通用数据类型定义和宏定义。

stm32l4xx_it.c/stm32l4xx_it.h

中断服务函数的定义和声明,放置的基本都是一些空函数,除SysTick_Handler函数外。

stm32l4xx.h

stm32l4xx.h文件会根据 C/C++选项卡里面定义的全局宏定义标识符选择程序中包含的头文件。

stm32l475xx.h

主要是该型号芯片寄存器定义声明以及封装的内存操作。

system_stm32l4xx.c/system_stm32l4xx.h

源文件中包含SystemInit函数和SystemCoreClockUpdate函数的定义,SystemInit 函数的作用是进行时钟系统的一些初始化操作以及中断向量表偏移地址设置,但它并没有设置具体的时钟值。SystemCoreClockUpdate 函数是在系统时钟配置进行修改后,调用这个函数来 更新全局变量 SystemCoreClock 的值,开放这个变量可以方便用户使用系统时钟进行一些计算时使用。

stm32l4xx_hal_msp.c

MSP,全称为MCU support package,即芯片支持包,表明该文件和芯片型号是强相关的。函数名字中带有 MspInit 的函数,它们的作用是进行MCU级别硬件初始化设置,并且它们通常会被上一层的初始化函数所调用,这样做的目的是为了把 MCU 相关的硬件初始化剥夺出来,方便用户代码在不同型号的 MCU 上移植。 stm32l4xx_hal_msp.c 文件定义了两个函数 HAL_MspInit 和 HAL_MspDeInit。这两个函数分别被文件 stm32l4xx_hal.c中的HAL_Init和 HAL_DeInit所调用。HAL_MspInit函数的主要作用是进行 MCU 相关的硬件初始化操作。例如我们要初始化某些硬件,我们可以硬件相关的初始化配置写在 HAL_MspDeinit 函数中。这样的话,在系统启动后调用了 HAL_Init 之后,会自动调用硬件初始化函数。

 

如main函数中调用MX_USART3_UART_Init()函数,

MX_USART3_UART_Init()函数调用HAL_UART_Init()函数进行串口初始化,

HAL_UART_Init()函数内部会判断若串口未初始化则调用HAL_UART_MspInit()函数进行初始化。

串口的初始化过程为MX_USART3_UART_Init()---->HAL_UART_Init()---->HAL_UART_MspInit()。为什么串口相关初始化不在 HAL_UART_Init 函数内部一次初始化而还要调用函数 HAL_UART_MspInit()呢?这实际就是 HAL 库的一个优点,它通过开放一个回调函数 HAL_UART_MspInit(),让用户自己去编写与串口相关的 MCU 级别的硬件初始化,而与 MCU 无关的串口参数相关的通用配置则放在 HAL_UART_Init。 我们要初始化一个串口,首先要设置和 MCU 无关的东西,例如波特率,奇偶校验,停止位等, 这些参数设置和 MCU 没 有 任 何 关 系 , 可 以 使 用 STM32F1 , 也 可 以 是 STM32F2/F3/F4/F7/H7 上的串口。而一个串口设备它需要一个 MCU 来承载,例如用 STM32L4 来做承载,PA9 做为发送,PA10 做为接收,MSP 就是要初始化 STM32L4 的 PA9,PA10,配置 这 两 个 引 脚 。 所以 HAL 驱 动 方 式 的 初 始 化 流 程 就 是 : HAL_USART_Init()—>HAL_USART_MspInit() ,先初始化与 MCU 无关的串口协议,再初始化 与 MCU 相关的串口引脚。在 STM32 的 HAL 驱动中 HAL_PPP_MspInit()作为回调,被HAL_PPP_Init()函数所调用。当我们需要移植程序到 STM32F1 平台的时候,我们只需要修改 HAL_PPP_MspInit 函数内容而不需要修改 HAL_PPP_Init 入口参数内容。

 

 

 

 

 

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

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

相关文章

RT-Thread设备框架学习感悟

前面几周跟着野火的教程从0到1实现了RT-Thread的内核,对RT-Thread的调度机制和线程、定时器的底层实现有了总体的了解。后面还需进一步对齐实现细节进行探索,但大致先了解其框架,后面再进行细致的了解。在学习新知识时,最重要的是…

RT-Thread中自定义MSH命令传入的参数是字符串,需用户自行检查和解析

如下是在将安富莱的dac8563模块对接到潘多拉开发板RT-Thread SPI设备框架中时导出到RT-Thread的自定义MSH命令,需要注意的是MSH传入的是字符串,需要自行对字符串进行解析处理。 #include "stdlib.h" /* 使用其中的函数:atoi(); */…

安富莱DAC8653模块

产品规格:1、供电电压 : 2.7 - 5.5V 【3.3V供电时,输出电压也可以到正负10V】2、通道数: 2路 (通过1片DAC8563实现)3、输出电压范围 : -10V ~ 10V 【客户可以自己更改为 0-10V输出范围。使…

flex布局应用与踩坑

一、预告本文不是一篇入门的文章所有请符合以下条件的战斗人员绕道: 1、初学前端,对前端的传统布局还不是很熟悉的人 2、后端人员对前端不打算深入学习的同学 二、开篇flex布局原本是好几个月前就一直想学习的东西,当时flex布局还算是比较新鲜…

RT-Thread I/O设备模型

I/O设备指的是嵌入式系统中的一些Input输入/Output输出设备,输入输出设备是嵌入式系统重要的组成部分。输入和输出设备可以看做是计算机系统和外界进行沟通的桥梁,因此在计算机组成原理中输入输出设备是重要的组成部分。 计算机组成原理中的5大组成部分…

如何使用易我数据恢复向导恢复数码相机删除的图片

1 使用"易我数据恢复向导"的高级恢复(务必将数码相机的存储卡取出单独插入SD卡槽,而不是直接用数据线连接到电脑上,这样存储卡才能以磁盘方式显示) 2 选中对应磁盘,点击下一步 3 如果出现"分区参数不正确"提示,直接取消即可开始搜索 4 搜索完…

RT-Thread对GPIO操作两种方式的区别:1)通过设备操作接口2)直接通过通用GPIO设备驱动

在学习RT-Thread设备驱动框架时,看到潘多拉开发板的RT-Thread例程资料中的文档《AN0002-RT-Thread-通用 GPIO 设备应用笔记》有如下描述,因此产生使用文档中未使用的方式1)通过设备操作接口 方法实现GPIO操作的想法! 使用潘多拉开…

清华大学-曾鸣-《ARM微控制器与嵌入式系统》I2C总线(一)

I2C是一种双向2线制同步串行通讯接口,是一类非常经典的串行总线通讯,理解好I2C通讯会帮助理解USB通讯、以太网通讯中的握手、数据帧等环节。 I2C的发展历史: SPI串行通讯主要是由MOTOROLA公司提出的,MOTOROLA公司的半导体部门独立…

清华大学-曾鸣-《ARM微控制器与嵌入式系统》I2C总线(二)

I2C(Inter IC Bus)的通讯数据帧: SCL线无方向区分,SDA线上有数据的流动方向。上图中灰色的代表的是主机向从机发送数据,此时SDA线的电平控制权由主机掌控,从机只能监听该线上的电平状态。白色代表的是从机向…

RT-Thread I2C设备驱动框架的对接使用

I2C和SPI是MCU和板载芯片之间最常用的通讯方式,现在先介绍下I2C总线。I2C的基本原理也很简单,只需要两根线(时钟线SCL和信号线SDA)即可实现挂载在I2C总线上设备之间的相互通讯。I2C协议并未规定I2C总线上哪个是主机?哪…

RT-Thread 简介及架构

RT-Thread,全称是 Real Time-Thread,顾名思义,它是一个嵌入式实时多线程操作系统,基本属性之一是支持多任务,允许多个任务同时运行并不意味着处理器在同一时刻真地执行了多个任务。事实上,一个处理器核心在…

iOS HTML标签字符实体,转译字符串归类大全 【转载】

为什么要用转义字符串&#xff1f; HTML中<&#xff0c;>&#xff0c;&等有特殊含义&#xff08;<&#xff0c;>&#xff0c;用于链接签&#xff0c;&用于转义&#xff09;&#xff0c;不能直接使用。这些符号是不显示在我们最终看到的网页里的&#xff0c…

RT-Thread在github上的教程中图片显示不出来问题的解决方法

在github上查看RT-Thread STM32系列BSP制作教程时发现教程中所有的图片都加载不出来&#xff0c;非常影响教程的阅读使用。 使用记事本打开文件&#xff1a; C:\Windows\System32\drivers\etc\hosts 将如下内容复制粘贴到hosts文件末尾&#xff1a; # GitHub Start 140.82.11…

在STM32CubeMX生成的MDK5工程上添加RT-Thread Nano后双击工程名无法打开.map文件的解决方法

当我们基于STM32CubeMx完成芯片的基础配置&#xff0c;再将RT-Thread Nano添加到工程编译完成之后。双击工程名称发现无法打开工程的.map文件&#xff0c;.map文件是STM32开发中非常重要的一个文件&#xff0c;map文件中详细描述了各个函数在ROM中的存储地址和大小&#xff0c;…

STM32实现USB虚拟串口原理(下)

中断传输应用如主机定期间隔送鼠标读取当前的输入信息&#xff0c;或键盘的输入键值 同步传输应用于音视频等对延迟有严格要求的场合 大容量传输对实时性没有太高要求&#xff0c;对延迟有较大的容忍&#xff0c;且在协议层面并未规定最大的容忍延迟时间&#xff0c;但能从协议…

RT-Thread中堆和栈内存的分配

在嵌入式软件开发中&#xff0c;我们经常会提到堆和栈&#xff0c;实际上堆和栈都是RAM上的物理内存空间&#xff0c;只是使用方式不同而已。栈和堆都是单片机RAM中一段连续的存储空间&#xff0c;该段空间一般在启动文件或链接脚本中指定&#xff0c;最后在C库的_main函数中进…

RT-Thread Nano版本和RT-Thread Master版本的关系

RT-Thread Nano版本和RT-Thread Master版本的关系&#xff1a; RT-Thread Master版本不仅仅是一个实时内核&#xff0c;还包含了丰富的中间层组件。 RT-Thread Nano是RT-Thread Master之上进行剪裁后形成的精简版&#xff0c;去掉了一些组件和各种开发板的BSP&#xff0c;仅保…

VSCODE修改文字编码格式为GB2312和TAB键为2个空格(MDK5和VSCODE联合开发STM32程序)

在MDK5中&#xff0c;代码、变量等的高亮显示或代码自动补全做的不是很好&#xff0c;经常会出现在A函数中有变量的高亮功能&#xff0c;在B函数中就没有了。特别是在RT-Thread创建的多个线程中&#xff0c;发现同一文件中的其它函数中的变量都有同一变量高亮&#xff0c;在RT-…

IP选路

一、IP层工作流程 &#xfffc; 二、 简单路由表 输入netstate -rn&#xff0c;得到如下&#xfffc; 其中flag的标志如下 U 该路由可以使用G 该路由是到一个网管&#xff08;路由器&#xff09;&#xff0c;否则&#xff0c;说明目的地是直接相连的 该标志区分了间接路由和…

[转]微信小程序安全浅析

本文转自&#xff1a;http://blog.csdn.net/baize_security/article/details/54582854 引言 近期微信小程序重磅发布&#xff0c;在互联网界掀起不小的波澜&#xff0c;已有许多公司发布了自己的小程序&#xff0c;涉及不同的行业领域。大家在体验小程序用完即走便利的同时&…