英语原文共 1208 页,剩余内容已隐藏,支付完成后下载完整资料
STM32F1xx HAL驱动描述
(ST公司,2020)
- HAL驱动程序概述
HAL驱动程序的设计目的是提供一组丰富的API,并方便地与应用程序上层进行交互。每个驱动程序都由一组功能组成,这些功能涵盖了最常见的外围功能。发展每个驱动程序都由一个通用API驱动,该API标准化了驱动程序的结构、函数和参数姓名。
HAL驱动程序包括一组驱动程序模块,每个模块链接到一个独立的外围设备。然而在某些情况下,模块连接到外围功能模式。例如,有几个模块用于USART外设:UART驱动模块、USART驱动模块、智能卡驱动模块、IRDA驱动模块。
HAL的主要特点如下:
bull;跨系列的可移植API集,涵盖通用外围功能和扩展API特定外围功能的情况
bull;三种API编程模型:轮询、中断和DMA
bull;API与RTOS兼容:
–完全可重入API
–在轮询模式下系统地使用超时
bull;支持外设多实例,允许对给定外设的多个实例进行并发API调用
(USART1,USART2hellip;)
bull;所有HAL API实现用户回调函数机制:
–Peripheral Init/DeInit HAL API可以调用用户回调函数来执行外围系统级别的操作
初始化/反初始化(时钟、GPIO、中断、DMA)
–外设中断事件
–错误事件
bull;对象锁定机制:安全的硬件访问,防止对共享数据的多次虚假访问资源。
bull;用于所有阻塞进程的超时:超时可以是简单的计数器或时基。
-
- HAL和用户应用程序文件
1.1.1 HAL驱动程序
HAL驱动程序由以下一组文件组成:
表一:HAL驱动程序文件
1.1.2用户应用程序文件
下表列出了使用HAL构建应用程序所需的最少文件:
表二:用户应用程序文件
STM32Cube包附带了可随时使用的项目模板,每个支持的板对应一个模板。每个项目包含上面列出的文件和支持的工具链的预配置项目。每个项目模板都提供空的主循环函数,可以作为熟悉的起点STM32Cube的项目设置。其特点如下:
bull;它包含HAL、CMSIS和BSP驱动程序的源,这些驱动程序是开发给定板上的代码。
bull;它包含所有固件组件的包含路径。
bull;它定义了支持的STM32设备,并允许相应地配置CMSIS和HAL驱动程序。
bull;它提供按以下定义预先配置的即用用户文件:
–HAL已初始化
–针对HAL_Delay()实施SysTick ISR()
–配置了最大设备频率的系统时钟。
注意:如果将现有项目复制到其他位置,则必须更新包含路径。
图1:项目模板示例
1.2 HAL数据结构
每个HAL驱动程序可以包含以下数据结构:
bull;外围把手结构
bull;初始化和配置结构
bull;具体流程结构。
1.2.1 周边把手结构
这些api有一个模块化的通用多实例体系结构,允许使用多个IP实例同时。
PPP_HandleTypeDef *handle是在HAL驱动程序中实现的主要结构。它处理外围设备/模块配置和寄存器,并嵌入所有结构和变量需要遵循外围设备流。
外设手柄用于以下用途:
bull;多实例支持:每个外设/模块实例都有自己的句柄。因此,实例资源是独立的。
bull;外围进程内部通信:句柄用于管理各进程之间的共享数据资源处理程序。例如:全局指针、DMA句柄、状态机。
bull;存储:此句柄还用于管理给定HAL驱动程序中的全局变量。
外围结构示例如下所示:
注:1、多实例特性意味着应用程序中使用的所有api都是可重入的,避免使用
全局变量,因为如果子例程依赖于一个全局变量保持不变,则子例程可能无法重入未更改,但在递归调用子例程时会修改该变量。出于这个原因遵守以下规则:
–可重入代码不包含任何静态(或全局)非常量数据:可重入函数可以工作全球数据。例如,可重入中断服务例程可以获取一块硬件工作状态(例如串口读取缓冲区),它不仅是全局的,而且是可变的。不过,典型用法不建议使用静态变量和全局数据,因为只有原子读修改写应在这些变量中使用指令。中断或信号不可能在执行这样的指令时发生。
–可重入代码不修改自己的代码。
2、当外设可以使用DMA(全双工情况)同时管理多个进程时
在PPP_HandleTypeDef中添加每个进程的DMA接口句柄。
3、对于共享和系统外设,不使用句柄或实例对象。相关外围设备例外情况如下:
–GPIO
–SYSTICK
–NVIC
–PWR
–RCC
–FLASH
1.2.2 初始化和配置结构
当通用驱动程序头文件对所有零件号通用时,这些结构在通用驱动程序头文件中定义。当他们可以从一个零件号更改为另一个零件号,结构在每个零件的扩展头文件中定义号码。
注意:config结构用于初始化子模块或子实例。参见以下示例:
1.2.3具体流程结构
特定流程结构用于特定流程(公共API)。它们在泛型中定义驱动程序头文件。例子:
1.3 API分类
HAL API分为三类:
bull;通用API:适用于所有STM32设备的通用API。因此,这些api是存在的在所有STM32微控制器的通用HAL驱动程序文件中。
bull;扩展API:
这组API分为两个子类别:
–特定于族的API:应用于给定族的API。它们位于扩展HAL驱动程序文件中
(参见下文与ADC相关的示例)。
–特定于设备部件号的API:这些API在扩展文件中实现并用分隔符分隔通过与给定零件号相关的特定定义语句。
注意:与特定API相关的数据结构由设备零件号定义语句分隔。它是位于相应的扩展头C文件中。
下表总结了驱动程序文件中不同类别HAL API的位置。
表三:API分类
- 在某些情况下,特定设备部件号的实现可能会改变。在这种情况下,将声明泛型API作为扩展文件中的弱函数。再次实现API以覆盖默认函数。
注意:特定于系列的API只与给定的系列相关。这意味着如果在另一个家族,这个家族的论点是不同的,额外的结构和论点可能是不同的需要添加。
注意:IRQ处理程序用于常见的和特定于系列的进程。
1.4 HAL驱动程序支持的设备
表四:HAL驱动程序支持的设备列表
1.5 HAL驱动程序规则
1.5.1 HAL API命名规则
HAL驱动程序中使用以下命名规则:
表五:HAL API命名规则
PPP前缀指外围功能模式,而不是外围设备本身。例如,如果根据外围模式,USART、PPP可以是USART、IRDA、UART或SMARTCARD。
bull;一个文件中使用的常量在此文件中定义。在一个头文件。除外围驱动程序功能参数外,所有常量都以大写形式写入。
bull;typedef变量名称应用uTypeDef后缀。
bull;寄存器被视为常数。在大多数情况下,它们的名称是大写的,使用相同的名称
STM32F1参考手册中的首字母缩写。
bull;外围寄存器在CMSIS标头中的PPP类型DEF结构(例如ADC_TYPE_DEF)中声明:
stm32f1xxx.h对应于stm32f100xb.h、stm32f100xe.h、stm32f101x6.h、stm32f101xb.h,stm32f101xe.h,stm32f101xg.h,stm32f102x6.h,stm32f102xb.h,stm32f103x6.h,stm32f103xb.h,
stm32f103xe.h、stm32f103xg.h、stm32f105xc.h和stm32f107xc.h。
bull;外围功能名称以HAL_前缀,然后大写对应的外围首字母缩写后面是下划线。每个单词的第一个字母都是大写(例如HAL_UART_utransmist())。仅限函数名中允许有一个下划线,以将外围缩略语与其他缩写词分开函数名称。
bull;包含PPP外围初始化参数的结构名为PPP_InitTypeDef(例如。
ADC_InitTypeDef)。
bull;包含PPP外围设备特定配置参数的结构命名
PPP_xxxxConfTypeDef(例如ADC_ChannelConfTypeDef)。
bull;外围句柄结构名为PPP_HandletTypeDef(例如DMA_HandletTypeDef)
bull;用于根据PPP_InitTypeDef中指定的参数初始化PPP外围设备的功能如下:
命名为HAL_ppp_Init(例如HAL_tim_Init()。
bull;用于将PPP外围寄存器重置为其默认值的功能称为HAL_PPP_Denit
(例如,HAL_tim_deinit())。
bull;模式后缀指的是进程模式,可以是轮询、中断或DMA。例如,当DMA除了本机资源外,还使用了该功能:HAL_PPP_函数_DMA().
bull;功能前缀应参考新功能。
示例:HAL_adc_Start()指的是注入模式
1.5.2 HAL通用命名规则
bull;对于共享和系统外设,不使用句柄或实例对象。这条规则适用于以下外围设备:
– GPIO
– SYSTICK
– NVIC
– RCC
– FLASH
示例:HAL_GPIO_Init()只需要GPIO地址及其配置参数。
bull;处理中断和特定时钟配置的宏在每个外围设备/模块中定义
司机。这些宏在外围驱动程序头文件中导出,以便
扩展文件。这些宏的列表定义如下:
注意:此列表并不详尽,可以添加其他与外围功能相关的宏,以便在用户应用程序中使用。
表六:处理中断和特定时钟配置的宏
bull;NVIC和SYSTICK是两个Armreg;Cortexreg;核心功能。与这些功能相关的API位于stm32f1x_hal_cortex.c文件。
bull;从寄存器读取状态位或标志时,它由移位值组成,具体取决于数字读取值的大小。在这种情况下,返回的状态宽度是32位。示例:STATUS = XX |
(YY lt;lt; 16) or STATUS = XX | (YY lt;lt; 8) | (YY lt;lt; 16) | (YY lt;lt; 24)'.
bull;在使用HAL_PPP_Init()API之前,PPP句柄是有效的。init函数在
修改句柄字段。
bull;使用以下定义的宏:
–条件宏:
–伪代码宏(多指令宏):
1.5.3 HAL中断处理程序和回调函数
除了API之外,HAL外围驱动程序还包括:
bull;应从stm32f1x_it.c调用的HAL_PPP_IRQHandler()外围中断处理程序
bull;用户回调函数。
UM1850型
HAL驱动程序规则
UM1850-Rev 3第19/1208页用户回调函数定义为具有“弱”属性的空函数。它们必须在用户代码。
有三种类型的用户回调函数:
bull;外围系统级初始化/反初始化回调:HAL_PPP_MspInit()和
HAL_PPP_MspDeInit
bull;处理完整回调:HAL_PPP_ProcessCpltCallback
bull;错误回调:HA_PPP_ErrorCallback。
表七:回调功能
1.6 HAL通用API
通用API提供适用于所有STM32设备的通用函数。它们由四部分组成API组:
bull;初始化和反初始化函数
剩余内容已隐藏,支付完成后下载完整资料
资料编号:[258918],资料为PDF文档或Word文档,PDF文档可免费转换为Word
以上是毕业论文外文翻译,课题毕业论文、任务书、文献综述、开题报告、程序设计、图纸设计等资料可联系客服协助查找。