荆州公司网站建设,建设部网站办事大厅栏目,纯英文网站建设,上海新站专家网络公司超子物联网 HAL库学习 汇总入口#xff1a; 超子物联网HAL库笔记#xff1a;[汇总] 写作不易#xff0c;如果您觉得写的不错#xff0c;欢迎给博主来一波点赞、收藏~让博主更有动力吧#xff01; 1. HAL库简介
HAL库
HAL库#xff08;Hardware Abstraction Layer#… 超子物联网 HAL库学习 汇总入口 超子物联网HAL库笔记[汇总] 写作不易如果您觉得写的不错欢迎给博主来一波点赞、收藏~让博主更有动力吧 1. HAL库简介
HAL库
HAL库Hardware Abstraction Layer是STMicroelectronics提供的STM32微控制器的硬件抽象层库。它通过一套统一的API接口简化了对STM32外设的配置和操作使开发者能够更快速地进行嵌入式系统开发而不必深入了解底层硬件细节。
HAL库的优点
高层次抽象HAL库提供了高层次的抽象接口简化了对硬件外设的操作。开发者可以通过调用库函数完成复杂的硬件配置而不必直接操作寄存器。易于使用由于提供了丰富的库函数和示例代码开发者可以快速上手进行开发减少了开发时间。一致性和移植性HAL库在不同的STM32系列中保持了一致的API接口增强了代码的移植性和重用性。如果需要更换STM32系列微控制器代码的修改量较小。简化调试由于HAL库屏蔽了底层的寄存器操作调试过程中更容易定位和解决问题减少了开发和维护的复杂性。代码维护性好HAL库的高层次封装和良好的代码结构使得代码更容易维护和更新。
对比标准固件库的不同
抽象层次 标准固件库直接操作寄存器提供底层硬件访问要求开发者对STM32微控制器的寄存器有较深入的理解。HAL库提供高层次的抽象接口屏蔽底层寄存器操作使开发者可以更快速地进行开发。代码复杂性 标准固件库代码较复杂涉及大量的寄存器配置开发者需要处理更多的细节。HAL库代码简洁易读通过调用库函数进行配置和操作减少了代码量和复杂性。学习曲线
标准固件库学习曲线较陡需要花费较多时间了解和掌握硬件细节。HAL库学习曲线较缓提供了丰富的示例代码和文档开发者可以快速上手。
开发效率
标准固件库适合对性能和功耗有严格要求的项目但开发和调试时间较长。HAL库提高了开发效率适合快速开发和原型设计缩短了开发周期。
移植性
标准固件库不同系列的STM32微控制器之间存在较大的差异代码移植工作量较大。HAL库提供一致的API接口增强了代码的移植性和重用性不同系列之间的移植工作量较小。
2. 创建HAL库工程模板
1. 制作文件模板 先找一个位置存放工程模板 在工程模板中 添加 User、Library 、 Hardware 、 CMSIS 文件夹 User main.cLibrary IncludeSourceHardware IncludeSourceCMSIS IncludeSource 下载HAL库 源码 STM32Cube MCU和MPU包: 相关产品 解压并打开 拷贝HAL库Library 进入\\STM32Cube_FW_F1_V1.8.0\\Drivers\\STM32F1xx_HAL_Driver 把头文件夹 Inc 和源文件夹 Src 移动到自己的Library的对应的文件中 拷贝启动文件CMSIS\Include 先进入内核文件\\STM32Cube_FW_F1_V1.8.0\\Drivers\\CMSIS进入头文件\\CMSIS\\Include 把所有文件拷贝到自己的CMSIS/Include文件中 再进入\\CMSIS\\Device\\ST\\STM32F1xx\\Include 把所有文件拷贝到自己的CMSIS/Include文件中 拷贝源文件CMSYS\Source 进入\\STM32Cube_FW_F1_V1.8.0\\Drivers\\CMSIS\\Device\\ST\\STM32F1xx\\Source\\Templates把\\Templates 文件的的system_stm32f1xx.c拷贝到自己的CMSIS/Source文件中再进入/arm文件下把所有文件拷贝到自己的CMSIS/Source文件中 编辑Hardware文件夹 分别在源文件家和头文件夹添加stm32f1xx_it.c 和stm32f1xx_it.h 代码如下
stm32f1xx_it.c
/*-------------------------------------------------*/
/* */
/* 实现各种中断服务函数的源文件 */
/* */
/*-------------------------------------------------*/#include stm32f1xx_hal.h
#include stm32f1xx_it.h /*-------------------------------------------------*/
/*函数名不可屏蔽中断处理函数 */
/*参 数无 */
/*返回值无 */
/*-------------------------------------------------*/
void NMI_Handler(void)
{}/*-------------------------------------------------*/
/*函数名硬件出错后进入的中断处理函数 */
/*参 数无 */
/*返回值无 */
/*-------------------------------------------------*/
void HardFault_Handler(void)
{}
/*-------------------------------------------------*/
/*函数名软中断SWI 指令调用的处理函数 */
/*参 数无 */
/*返回值无 */
/*-------------------------------------------------*/
void SVC_Handler(void)
{}
/*-------------------------------------------------*/
/*函数名可挂起的系统服务处理函数 */
/*参 数无 */
/*返回值无 */
/*-------------------------------------------------*/
void PendSV_Handler(void)
{}
/*-------------------------------------------------*/
/*函数名SysTic系统嘀嗒定时器处理函数 */
/*参 数无 */
/*返回值无 */
/*-------------------------------------------------*/
void SysTick_Handler(void)
{ HAL_IncTick();
}
stm32f1xx_it.h
/********************************************************************************* file GPIO/GPIO_IOToggle/Inc/stm32f1xx_it.h* author MCD Application Team* brief This file contains the headers of the interrupt handlers.******************************************************************************* attention** h2centercopy; Copyright (c) 2016 STMicroelectronics.* All rights reserved./center/h2** This software component is licensed by ST under BSD 3-Clause license,* the License; You may not use this file except in compliance with the* License. You may obtain a copy of the License at:* opensource.org/licenses/BSD-3-Clause********************************************************************************//* Define to prevent recursive inclusion -------------------------------------*/
#ifndef __STM32F1xx_IT_H
#define __STM32F1xx_IT_H#ifdef __cplusplus
extern C {
#endif/* Includes ------------------------------------------------------------------*/
/* Exported types ------------------------------------------------------------*/
/* Exported constants --------------------------------------------------------*/
/* Exported macro ------------------------------------------------------------*/
/* Exported functions ------------------------------------------------------- */void NMI_Handler(void);
void HardFault_Handler(void);
void MemManage_Handler(void);
void BusFault_Handler(void);
void UsageFault_Handler(void);
void SVC_Handler(void);
void DebugMon_Handler(void);
void PendSV_Handler(void);
void SysTick_Handler(void);#ifdef __cplusplus
}
#endif#endif /* __STM32F1xx_IT_H *//************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ 最后需要把自己的Library文件中的Include 文件中的stm32f1xx_hal_conf_template.h 更名为 stm32f1xx_hal_conf.h 。否则编译会找不到这个头文件 文件结构
CMSISIncludecmsis_armcc.hcmsis_armclang.hcmsis_compiler.hcmsis_gcc.hcmsis_iccarm.hcmsis_version.hcore_armv8mbl.hcore_armv8mml.hcore_cm0.hcore_cm0plus.hcore_cm1.hcore_cm23.hcore_cm3.hcore_cm33.hcore_cm4.hcore_cm7.hcore_sc000.hcore_sc300.hmpu_armv7.hmpu_armv8.hstm32f100xb.hstm32f100xe.hstm32f101x6.hstm32f101xb.hstm32f101xe.hstm32f101xg.hstm32f102x6.hstm32f102xb.hstm32f103x6.hstm32f103xb.hstm32f103xe.hstm32f103xg.hstm32f105xc.hstm32f107xc.hstm32f1xx.hsystem_stm32f1xx.htz_context.hSourcestartup_stm32f100xb.sstartup_stm32f100xe.sstartup_stm32f101x6.sstartup_stm32f101xb.sstartup_stm32f101xe.sstartup_stm32f101xg.sstartup_stm32f102x6.sstartup_stm32f102xb.sstartup_stm32f103x6.sstartup_stm32f103xb.sstartup_stm32f103xe.sstartup_stm32f103xg.sstartup_stm32f105xc.sstartup_stm32f107xc.ssystem_stm32f1xx.c
DebugConfigProject_STM32F103C8_1.0.0.dbgconfTarget_1_STM32F103C8_1.0.0.dbgconf
HardwareIncludestm32f1xx_it.hSourcestm32f1xx_it.c
LibraryIncludeLegacystm32f1xx_hal_can_ex_legacy.hstm32f1xx_hal_can_legacy.hstm32_hal_legacy.hstm32f1xx_hal.hstm32f1xx_hal_adc.hstm32f1xx_hal_adc_ex.hstm32f1xx_hal_can.hstm32f1xx_hal_cec.hstm32f1xx_hal_conf.hstm32f1xx_hal_cortex.hstm32f1xx_hal_crc.hstm32f1xx_hal_dac.hstm32f1xx_hal_dac_ex.hstm32f1xx_hal_def.hstm32f1xx_hal_dma.hstm32f1xx_hal_dma_ex.hstm32f1xx_hal_eth.hstm32f1xx_hal_exti.hstm32f1xx_hal_flash.hstm32f1xx_hal_flash_ex.hstm32f1xx_hal_gpio.hstm32f1xx_hal_gpio_ex.hstm32f1xx_hal_hcd.hstm32f1xx_hal_i2c.hstm32f1xx_hal_i2s.hstm32f1xx_hal_irda.hstm32f1xx_hal_iwdg.hstm32f1xx_hal_mmc.hstm32f1xx_hal_nand.hstm32f1xx_hal_nor.hstm32f1xx_hal_pccard.hstm32f1xx_hal_pcd.hstm32f1xx_hal_pcd_ex.hstm32f1xx_hal_pwr.hstm32f1xx_hal_rcc.hstm32f1xx_hal_rcc_ex.hstm32f1xx_hal_rtc.hstm32f1xx_hal_rtc_ex.hstm32f1xx_hal_sd.hstm32f1xx_hal_smartcard.hstm32f1xx_hal_spi.hstm32f1xx_hal_sram.hstm32f1xx_hal_tim.hstm32f1xx_hal_tim_ex.hstm32f1xx_hal_uart.hstm32f1xx_hal_usart.hstm32f1xx_hal_wwdg.hstm32f1xx_ll_adc.hstm32f1xx_ll_bus.hstm32f1xx_ll_cortex.hstm32f1xx_ll_crc.hstm32f1xx_ll_dac.hstm32f1xx_ll_dma.hstm32f1xx_ll_exti.hstm32f1xx_ll_fsmc.hstm32f1xx_ll_gpio.hstm32f1xx_ll_i2c.hstm32f1xx_ll_iwdg.hstm32f1xx_ll_pwr.hstm32f1xx_ll_rcc.hstm32f1xx_ll_rtc.hstm32f1xx_ll_sdmmc.hstm32f1xx_ll_spi.hstm32f1xx_ll_system.hstm32f1xx_ll_tim.hstm32f1xx_ll_usart.hstm32f1xx_ll_usb.hstm32f1xx_ll_utils.hstm32f1xx_ll_wwdg.hstm32_assert_template.hSourceLegacystm32f1xx_hal_can.cstm32f1xx_hal.cstm32f1xx_hal_adc.cstm32f1xx_hal_adc_ex.cstm32f1xx_hal_can.cstm32f1xx_hal_cec.cstm32f1xx_hal_cortex.cstm32f1xx_hal_crc.cstm32f1xx_hal_dac.cstm32f1xx_hal_dac_ex.cstm32f1xx_hal_dma.cstm32f1xx_hal_eth.cstm32f1xx_hal_exti.cstm32f1xx_hal_flash.cstm32f1xx_hal_flash_ex.cstm32f1xx_hal_gpio.cstm32f1xx_hal_gpio_ex.cstm32f1xx_hal_hcd.cstm32f1xx_hal_i2c.cstm32f1xx_hal_i2s.cstm32f1xx_hal_irda.cstm32f1xx_hal_iwdg.cstm32f1xx_hal_mmc.cstm32f1xx_hal_msp_template.cstm32f1xx_hal_nand.cstm32f1xx_hal_nor.cstm32f1xx_hal_pccard.cstm32f1xx_hal_pcd.cstm32f1xx_hal_pcd_ex.cstm32f1xx_hal_pwr.cstm32f1xx_hal_rcc.cstm32f1xx_hal_rcc_ex.cstm32f1xx_hal_rtc.cstm32f1xx_hal_rtc_ex.cstm32f1xx_hal_sd.cstm32f1xx_hal_smartcard.cstm32f1xx_hal_spi.cstm32f1xx_hal_sram.cstm32f1xx_hal_tim.cstm32f1xx_hal_timebase_rtc_alarm_template.cstm32f1xx_hal_timebase_tim_template.cstm32f1xx_hal_tim_ex.cstm32f1xx_hal_uart.cstm32f1xx_hal_usart.cstm32f1xx_hal_wwdg.cstm32f1xx_ll_adc.cstm32f1xx_ll_crc.cstm32f1xx_ll_dac.cstm32f1xx_ll_dma.cstm32f1xx_ll_exti.cstm32f1xx_ll_fsmc.cstm32f1xx_ll_gpio.cstm32f1xx_ll_i2c.cstm32f1xx_ll_pwr.cstm32f1xx_ll_rcc.cstm32f1xx_ll_rtc.cstm32f1xx_ll_sdmmc.cstm32f1xx_ll_spi.cstm32f1xx_ll_tim.cstm32f1xx_ll_usart.cstm32f1xx_ll_usb.cstm32f1xx_ll_utils.c
ListingsProject.map
Objectsmain.dmain.oProject.axfProject.build_log.htmProject.htmProject.lnpProject.sctProject_Project.depstartup_stm32f101xb.ostm32f1xx_hal.dstm32f1xx_hal.ostm32f1xx_hal_cortex.dstm32f1xx_hal_cortex.ostm32f1xx_hal_gpio.dstm32f1xx_hal_gpio.ostm32f1xx_hal_gpio_ex.dstm32f1xx_hal_gpio_ex.ostm32f1xx_hal_rcc.dstm32f1xx_hal_rcc.ostm32f1xx_hal_rcc_ex.dstm32f1xx_hal_rcc_ex.osystem_stm32f1xx.dsystem_stm32f1xx.o
Usermain.c2. Keil 创建工程 创建工程、选择User为目录。 点击木箱子设置分组 User 、 Library 、 Hardware 、 CMSIS 导入文件 这里只导入必备的。以后用哪个再加那个Library stm32f1xx_hal.cstm32f1xx_hal_cortex.cstm32f1xx_hal_gpio.cstm32f1xx_hal_gpio_ex.cstm32f1xx_hal_rcc.cstm32f1xx_hal_rcc_ex.cCNSIS system_stm32f1xx.cstartup_stm32f103xb.sUser main.c 在魔术棒中设置 C/C中 在Define输入STM32F103xB (目的是通知编译器我们用的是xb) 添加头文件路径Hardware、CMSIS、Library。以后有别的添加则再添加。 Target中 选择ARM编译器为v6.16 否则会报错 在main.c中引入头文件stm32f1xx_hal.h 在hal.c中可找到 最后编译即可。0错误0警告
3. HAL库结构初步分析 以HAL库的串口为例来讲解 串口分为USART和UART 他们分别是同步通信和异步通信。一般我们用异步的 所以这里我们添加uart.c的文件。 hal库之中串口包含三种方式 轮询、中断、DMA。所以在库文件中必须添加DMA库 所以我们这里添加DMA.c的文件 在HAL库中每个外设都有两个关键的部分 Private私有的是HAL库内部自己调用的Exported对外的我们的应用程序中去调用。Exported分为四个部分 types各种Struct结构体用于外设功能配置。对应了CubeMax软件的配置项constants上方各种Struct结构体中的成员的可以配置的选项macro宏定义相当于直接对寄存器操作。因为在某些时候调用api反而效率不高functionsAPI函数。这些是可以在文件中验证的。hal_uart.c中 可见 我们对CubeMax的操作实际上就是与这些结构体、成员变量一一对应的 一个外设的相关结构体会被定义在一个总的结构体中。比如串口是UART_HandleTypedef