STM32F HAL库太大

时间:2019-02-09 00:10:55

标签: stm32 stm32-hal

我刚刚在微控制器项目中用光了闪存。如何减小HAL库的大小,或者减少它占用我项目的很大比例?

5 个答案:

答案 0 :(得分:4)

尝试:

  • 对于编译器使用-ffunction-sections-fdata-sections,对于链接器使用--gc-sections消除未使用的代码和数据(“垃圾收集”)。
  • 对链接器和编译器都使用-O2 -flto的链接器时间优化(LTO)。

答案 1 :(得分:3)

只有一种方法-停止使用HAL库,并在寄存器级别执行。如果HAL的大小很重要,则可以使用小型micro,这是唯一的方法。

答案 2 :(得分:3)

如果您准备妥协可移植性和易用性,则可以使用ST提供的Low Level(LL)驱动程序。另外,您的表现可能还会有所提高。

ST论坛上的帖子:

低层(LL)驱动程序旨在提供一个快速的轻量级的面向专家的层,该层比HAL更接近硬件。与HAL相反,对于优化访问不是关键功能的外围设备,或者需要大量软件配置和/或复杂上层堆栈(例如USB)的外围设备,则不提供LL API。

HAL和LL驱动程序是互补的,并且涵盖了广泛的应用程序要求:

  1. HAL提供具有高可移植性级别的高级且面向功能的API。它们向最终用户隐藏了MCU和外围设备的复杂性。
  2. LL提供了寄存器级别的低级API,优化程度更高,但可移植性却更低。他们需要对MCU和外围设备规格有深入的了解

LL驱动程序功能:

  • 用于初始化外围主要功能的一组函数 数据结构中指定的参数

  • 用于填充初始化数据结构的一组函数 每个字段的重置值

  • 用于执行外围设备反初始化(外围设备 寄存器恢复为默认值)

  • 一组直接和原子寄存器访问的内联函数

  • 与HAL完全独立,因为LL驱动程序可以在 独立模式(没有HAL驱动程序)或混合模式(有HAL) 驱动程序)

低层驱动程序根据STM32外设的可用功能提供硬件服务。这些服务完全反映了硬件功能,并且提供了一次操作,必须遵循微控制器产品线参考手册中描述的编程模型进行调用。结果,LL服务不会执行任何处理,也不需要任何额外的内存资源来保存其状态,计数器或数据指针:所有操作都是通过更改相关外设寄存器的内容来执行的。

Link

答案 3 :(得分:2)

您是否尝试将编译器标志设置为-Os

答案 4 :(得分:2)

除了所有这些出色的响应之外,我还要补充一点,可以在HAL中配置stm32f3xx_hal_conf.h以禁用未使用的模块。

/**
  * @brief This is the list of modules to be used in the HAL driver 
  */
#define HAL_MODULE_ENABLED
#define HAL_ADC_MODULE_ENABLED
#define HAL_CAN_MODULE_ENABLED
/* #define HAL_CAN_LEGACY_MODULE_ENABLED */
#define HAL_CEC_MODULE_ENABLED
#define HAL_COMP_MODULE_ENABLED
#define HAL_CORTEX_MODULE_ENABLED
#define HAL_CRC_MODULE_ENABLED
#define HAL_DAC_MODULE_ENABLED
#define HAL_DMA_MODULE_ENABLED
#define HAL_FLASH_MODULE_ENABLED
#define HAL_GPIO_MODULE_ENABLED
#define HAL_HRTIM_MODULE_ENABLED
#define HAL_I2C_MODULE_ENABLED
#define HAL_I2S_MODULE_ENABLED
#define HAL_IRDA_MODULE_ENABLED
#define HAL_IWDG_MODULE_ENABLED
#define HAL_OPAMP_MODULE_ENABLED
#define HAL_PCD_MODULE_ENABLED
#define HAL_PWR_MODULE_ENABLED
#define HAL_RCC_MODULE_ENABLED
#define HAL_RTC_MODULE_ENABLED
#define HAL_SDADC_MODULE_ENABLED
#define HAL_SMARTCARD_MODULE_ENABLED
#define HAL_SMBUS_MODULE_ENABLED
#define HAL_SPI_MODULE_ENABLED
#define HAL_TIM_MODULE_ENABLED
#define HAL_TSC_MODULE_ENABLED
#define HAL_UART_MODULE_ENABLED
#define HAL_USART_MODULE_ENABLED
#define HAL_WWDG_MODULE_ENABLED