硬汉嵌入式论坛

 找回密码
 立即注册
查看: 3368|回复: 4
收起左侧

[客户分享] HAL库的串口驱动问题

[复制链接]

19

主题

129

回帖

186

积分

初级会员

积分
186
QQ
发表于 2019-12-13 17:57:38 | 显示全部楼层 |阅读模式
刚才看了一下HAL库的串口驱动源码,发现以下内容
stm32f4xx_hal_uart.c的3016行
  1. <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>
复制代码
这里貌似是可以通过用户定义的串口处理结构体的函数处理指针自己定义回调函数,仔细看了一下,发现全局都找不到这个宏定义
如果是默认不打开允许用户自定义,起码有这个宏定义为0呀,但是整个工程都搜索不到

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

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

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

转了一圈终于进去驱动文件的头文件了,当然它为了形成框架,模块公用也能理解,进去再看看
发现有这么个头文件#include "stm32f4xx_hal_def.h"
然后又是三个头文件
  1. #include "stm32f4xx.h"
  2. #include "Legacy/stm32_hal_legacy.h"
  3. #include <stddef.h>
复制代码
挨个进去看看,第一个
找到同系列兼容文件
  1. #if defined(STM32F405xx)
  2.   #include "stm32f405xx.h"
  3. #elif defined(STM32F415xx)
  4.   #include "stm32f415xx.h"
  5. #elif defined(STM32F407xx)
  6.   #include "stm32f407xx.h"
  7. #elif defined(STM32F417xx)
复制代码
进去看看
  1. #include "core_cm4.h"             /* Cortex-M4 processor and core peripherals */
  2. #include "system_stm32f4xx.h"
  3. #include <stdint.h>
复制代码
第一个进去最终找到编译器平台相关文件以及数据类型文件
第二个系统文件也只是声明了几个全局的变量和函数,例如CPU频率及初始化等
第三是数据类型声明也不用看了
回去,再往下,还有一个头文件
  1. #if defined (USE_HAL_DRIVER)
  2. #include "stm32f4xx_hal.h"
  3. #endif /* USE_HAL_DRIVER */

  4. #ifdef __cplusplus
  5. }
  6. #endif /* __cplusplus */

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

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

所以感觉CubeMX还是跟HAL搭配的不是很好,很多时候按照生成的工程根本下不去手写程序,只能改动生成的代码区域,然后软件更新配置,又给恢复过去了,一年前就是这样,现在还是,用起来始终不如意,功能写多一点就得各种改

回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107101
QQ
发表于 2019-12-13 20:32:01 | 显示全部楼层
楼主是说的那个用户自定义回调函数?

USE_HAL_UART_REGISTER_CALLBACKS,这个是在stm32f4xx_hal_conf.h定义的,用户可以通过注册函数设置。
回复

使用道具 举报

19

主题

129

回帖

186

积分

初级会员

积分
186
QQ
 楼主| 发表于 2019-12-14 14:41:42 | 显示全部楼层
eric2013 发表于 2019-12-13 20:32
楼主是说的那个用户自定义回调函数?

USE_HAL_UART_REGISTER_CALLBACKS,这个是在stm32f4xx_hal_conf.h ...

那里也找不到定义,感觉不给启用一样
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107101
QQ
发表于 2019-12-16 08:29:51 | 显示全部楼层
lovelessing... 发表于 2019-12-14 14:41
那里也找不到定义,感觉不给启用一样

注册API的,这两个函数:

HAL_StatusTypeDef HAL_UART_RegisterCallback(UART_HandleTypeDef *huart, HAL_UART_CallbackIDTypeDef CallbackID, pUART_CallbackTypeDef pCallback);
HAL_StatusTypeDef HAL_UART_UnRegisterCallback(UART_HandleTypeDef *huart, HAL_UART_CallbackIDTypeDef CallbackID);
回复

使用道具 举报

19

主题

129

回帖

186

积分

初级会员

积分
186
QQ
 楼主| 发表于 2019-12-17 09:26:30 | 显示全部楼层
eric2013 发表于 2019-12-16 08:29
注册API的,这两个函数:

HAL_StatusTypeDef HAL_UART_RegisterCallback(UART_HandleTypeDef *huart,  ...

好的

但是注册函数的逻辑没有启用这个宏,看样子只能是通过修改头文件,但是生成的工程没有,估计应该是需要在CubeMX里面选择什么配置才可以吧,应该是通过CubeMX的配置来改这个宏的
回复

使用道具 举报

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

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-5-18 08:58 , Processed in 0.161403 second(s), 25 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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