OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 6022|回复: 5

HAL库尴尬的地方,啊哈哈哈哈哈

[复制链接]

37

主题

477

帖子

2

精华

金牌会员

Rank: 6Rank: 6

积分
2285
金钱
2285
注册时间
2017-8-24
在线时间
375 小时
发表于 2019-12-13 18:02:00 | 显示全部楼层 |阅读模式
刚才看了一下HAL库的串口驱动源码,发现以下内容
stm32f4xx_hal_uart.c的3016行
  • <div>#if (USE_HAL_UART_REGISTER_CALLBACKS == 1)</div>
  • <div>      /*Call registered Rx complete callback*/</div>
  • <div>      huart->RxCpltCallback(huart);</div>
  • <div>#else</div>
  • <div>      /*Call legacy weak Rx complete callback*/</div>
  • <div>      HAL_UART_RxCpltCallback(huart);</div>
  • <div>#endif /* USE_HAL_UART_REGISTER_CALLBACKS */</div>

[color=rgb(51, 102, 153) !important]复制代码

这里貌似是可以通过用户定义的串口处理结构体的函数处理指针自己定义回调函数,仔细看了一下,发现全局都找不到这个宏定义
如果是默认不打开允许用户自定义,起码有这个宏定义为0呀,但是整个工程都搜索不到

按照HAL库的习惯,应该给用户另一个用户代码区,可以自己添加这个宏还不行嘛,但是还是找不到留给用户的这个区

而且作为基本不懂的库源码,让用户去修改或者添加内容也不合适呀,再换个角度,库它也调用头文件吧,但是找了一圈,
各个引用的头文件,首先包含了#include "stm32f4xx_hal.h",这个头文件下面只有一个头文件#include "stm32f4xx_hal_conf.h"
这里也找不到供用户配置的区域。

仔细看了一下,这里有个模块的头文件
  • <div>#ifdef HAL_UART_MODULE_ENABLED</div>
  • <div> #include "stm32f4xx_hal_uart.h"</div>
  • <div>#endif /* HAL_UART_MODULE_ENABLED */</div>

[color=rgb(51, 102, 153) !important]复制代码


转了一圈终于进去驱动文件的头文件了,当然它为了形成框架,模块公用也能理解,进去再看看
发现有这么个头文件#include "stm32f4xx_hal_def.h"
然后又是三个头文件
  • #include "stm32f4xx.h"
  • #include "Legacy/stm32_hal_legacy.h"
  • #include <stddef.h>

[color=rgb(51, 102, 153) !important]复制代码

挨个进去看看,第一个
找到同系列兼容文件
  • #if defined(STM32F405xx)
  •   #include "stm32f405xx.h"
  • #elif defined(STM32F415xx)
  •   #include "stm32f415xx.h"
  • #elif defined(STM32F407xx)
  •   #include "stm32f407xx.h"
  • #elif defined(STM32F417xx)

[color=rgb(51, 102, 153) !important]复制代码

进去看看
  • #include "core_cm4.h"             /* Cortex-M4 processor and core peripherals */
  • #include "system_stm32f4xx.h"
  • #include <stdint.h>

[color=rgb(51, 102, 153) !important]复制代码

第一个进去最终找到编译器平台相关文件以及数据类型文件
第二个系统文件也只是声明了几个全局的变量和函数,例如CPU频率及初始化等
第三是数据类型声明也不用看了
回去,再往下,还有一个头文件
  • #if defined (USE_HAL_DRIVER)
  • #include "stm32f4xx_hal.h"
  • #endif /* USE_HAL_DRIVER */
  • #ifdef __cplusplus
  • }
  • #endif /* __cplusplus */
  • #endif /* __STM32F4xx_H */

[color=rgb(51, 102, 153) !important]复制代码

这里声明了一些HAL初始化的一些函数
回去再回去再去这里看看#include "Legacy/stm32_hal_legacy.h"
这里貌似是兼容全平台的一些外设常量的重定义,里面没有头文件
最后又是系统的一些东西,完全找不到

难道说这个功能只是预留的还没成熟暂时不给启用的吗,还是需要用户自己定义全局宏
不太理解这里,就是配置文件留一个用户可以写的区域也可以呀

所以感觉CubeMX还是跟HAL搭配的不是很好,很多时候按照生成的工程根本下不去手写程序,只能改动生成的代码区域,然后软件更新配置,又给恢复过去了,一年前就是这样,现在还是,用起来始终不如意,功能写多一点就得各种改
天然懒,天然呆
能吃会睡,未来可期
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

9

主题

30

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
224
金钱
224
注册时间
2014-5-2
在线时间
49 小时
发表于 2019-12-29 11:03:49 | 显示全部楼层
USE_HAL_UART_REGISTER_CALLBACKS 是在stm32f4xx_hal_conf.h配置的,你找不到估计是和你创建这个工程方式有关,使用cubemx创建的工程,确实没有有这个定义,但是你从st提供的固件库打开其中某一个例程就可以发现有这个定义(倒数第三个):
/* ########################### System Configuration ######################### */
/**
  * @brief This is the HAL system configuration section
  */     
#define  VDD_VALUE                    (3300U) /*!< Value of VDD in mv */
#define  TICK_INT_PRIORITY            (0x0FU) /*!< tick interrupt priority */
#define  USE_RTOS                     0
#define  PREFETCH_ENABLE              1
#define  INSTRUCTION_CACHE_ENABLE     1
#define  DATA_CACHE_ENABLE            1U

#define  USE_HAL_ADC_REGISTER_CALLBACKS         0U /* ADC register callback disabled       */
#define  USE_HAL_CAN_REGISTER_CALLBACKS         0U /* CAN register callback disabled       */
#define  USE_HAL_CEC_REGISTER_CALLBACKS         0U /* CEC register callback disabled       */
#define  USE_HAL_CRYP_REGISTER_CALLBACKS        0U /* CRYP register callback disabled      */
#define  USE_HAL_DAC_REGISTER_CALLBACKS         0U /* DAC register callback disabled       */
#define  USE_HAL_DCMI_REGISTER_CALLBACKS        0U /* DCMI register callback disabled      */
#define  USE_HAL_DFSDM_REGISTER_CALLBACKS       0U /* DFSDM register callback disabled     */
#define  USE_HAL_DMA2D_REGISTER_CALLBACKS       0U /* DMA2D register callback disabled     */
#define  USE_HAL_DSI_REGISTER_CALLBACKS         0U /* DSI register callback disabled       */
#define  USE_HAL_ETH_REGISTER_CALLBACKS         0U /* ETH register callback disabled       */
#define  USE_HAL_HASH_REGISTER_CALLBACKS        0U /* HASH register callback disabled      */
#define  USE_HAL_HCD_REGISTER_CALLBACKS         0U /* HCD register callback disabled       */
#define  USE_HAL_I2C_REGISTER_CALLBACKS         0U /* I2C register callback disabled       */
#define  USE_HAL_FMPI2C_REGISTER_CALLBACKS      0U /* FMPI2C register callback disabled    */
#define  USE_HAL_I2S_REGISTER_CALLBACKS         0U /* I2S register callback disabled       */
#define  USE_HAL_IRDA_REGISTER_CALLBACKS        0U /* IRDA register callback disabled      */
#define  USE_HAL_LPTIM_REGISTER_CALLBACKS       0U /* LPTIM register callback disabled     */
#define  USE_HAL_LTDC_REGISTER_CALLBACKS        0U /* LTDC register callback disabled      */
#define  USE_HAL_MMC_REGISTER_CALLBACKS         0U /* MMC register callback disabled       */
#define  USE_HAL_NAND_REGISTER_CALLBACKS        0U /* NAND register callback disabled      */
#define  USE_HAL_NOR_REGISTER_CALLBACKS         0U /* NOR register callback disabled       */
#define  USE_HAL_PCCARD_REGISTER_CALLBACKS      0U /* PCCARD register callback disabled    */
#define  USE_HAL_PCD_REGISTER_CALLBACKS         0U /* PCD register callback disabled       */
#define  USE_HAL_QSPI_REGISTER_CALLBACKS        0U /* QSPI register callback disabled      */
#define  USE_HAL_RNG_REGISTER_CALLBACKS         0U /* RNG register callback disabled       */
#define  USE_HAL_RTC_REGISTER_CALLBACKS         0U /* RTC register callback disabled       */
#define  USE_HAL_SAI_REGISTER_CALLBACKS         0U /* SAI register callback disabled       */
#define  USE_HAL_SD_REGISTER_CALLBACKS          0U /* SD register callback disabled        */
#define  USE_HAL_SMARTCARD_REGISTER_CALLBACKS   0U /* SMARTCARD register callback disabled */
#define  USE_HAL_SDRAM_REGISTER_CALLBACKS       0U /* SDRAM register callback disabled     */
#define  USE_HAL_SRAM_REGISTER_CALLBACKS        0U /* SRAM register callback disabled      */
#define  USE_HAL_SPDIFRX_REGISTER_CALLBACKS     0U /* SPDIFRX register callback disabled   */
#define  USE_HAL_SMBUS_REGISTER_CALLBACKS       0U /* SMBUS register callback disabled     */
#define  USE_HAL_SPI_REGISTER_CALLBACKS         0U /* SPI register callback disabled       */
#define  USE_HAL_TIM_REGISTER_CALLBACKS         0U /* TIM register callback disabled       */
#define  USE_HAL_UART_REGISTER_CALLBACKS        0U /* UART register callback disabled      */
#define  USE_HAL_USART_REGISTER_CALLBACKS       0U /* USART register callback disabled     */
#define  USE_HAL_WWDG_REGISTER_CALLBACKS        0U /* WWDG register callback disabled      */


你所搜STM32Cube_FW_F4_Vxx这个库,能找到很多歌stm32f4xx_hal_conf.h,但是大小又不一样,根本原因就是因为这是个配置文件,项目不同进行了裁剪,
回复 支持 1 反对 0

使用道具 举报

6

主题

412

帖子

0

精华

资深版主

Rank: 8Rank: 8

积分
2722
金钱
2722
注册时间
2019-8-14
在线时间
415 小时
发表于 2019-12-13 18:03:48 | 显示全部楼层
冲冲冲,妹妹
臭妹妹,冲冲冲
回复 支持 反对

使用道具 举报

2

主题

14

帖子

1

精华

中级会员

Rank: 3Rank: 3

积分
357
金钱
357
注册时间
2019-6-18
在线时间
48 小时
发表于 2019-12-13 18:10:16 | 显示全部楼层
楼主请带我玩转STM32
回复 支持 反对

使用道具 举报

37

主题

477

帖子

2

精华

金牌会员

Rank: 6Rank: 6

积分
2285
金钱
2285
注册时间
2017-8-24
在线时间
375 小时
 楼主| 发表于 2019-12-13 18:19:14 | 显示全部楼层
万里阳光 发表于 2019-12-13 18:10
楼主请带我玩转STM32

你们大佬都这么低调吗,或许这就是大佬吧 $$%QCZF$$LL_%Q2J61}IB.jpg
天然懒,天然呆
能吃会睡,未来可期
回复 支持 反对

使用道具 举报

0

主题

2

帖子

0

精华

新手入门

积分
9
金钱
9
注册时间
2020-6-7
在线时间
2 小时
发表于 2020-12-4 21:42:08 | 显示全部楼层
不同版本的hal库不一样,这个在AC6的模式会出一堆warning。蛋疼的hal库
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-13 17:46

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表