刚才看了一下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 &quot;stm32f4xx_hal.h&quot;,这个头文件下面只有一个头文件#include &quot;stm32f4xx_hal_conf.h&quot;
这里也找不到供用户配置的区域。
仔细看了一下,这里有个模块的头文件
<div>#ifdef HAL_UART_MODULE_ENABLED</div><div> #include &quot;stm32f4xx_hal_uart.h&quot;</div><div>#endif /* HAL_UART_MODULE_ENABLED */</div>
[color=rgb(51, 102, 153) !important]复制代码
转了一圈终于进去驱动文件的头文件了,当然它为了形成框架,模块公用也能理解,进去再看看
发现有这么个头文件#include &quot;stm32f4xx_hal_def.h&quot;
然后又是三个头文件
#include &quot;stm32f4xx.h&quot;#include &quot;Legacy/stm32_hal_legacy.h&quot;#include <stddef.h>
[color=rgb(51, 102, 153) !important]复制代码
挨个进去看看,第一个
找到同系列兼容文件
#if defined(STM32F405xx) #include &quot;stm32f405xx.h&quot;#elif defined(STM32F415xx) #include &quot;stm32f415xx.h&quot;#elif defined(STM32F407xx) #include &quot;stm32f407xx.h&quot;#elif defined(STM32F417xx)
[color=rgb(51, 102, 153) !important]复制代码
进去看看
#include &quot;core_cm4.h&quot; /* Cortex-M4 processor and core peripherals */#include &quot;system_stm32f4xx.h&quot;#include <stdint.h>
[color=rgb(51, 102, 153) !important]复制代码
第一个进去最终找到编译器平台相关文件以及数据类型文件
第二个系统文件也只是声明了几个全局的变量和函数,例如CPU频率及初始化等
第三是数据类型声明也不用看了
回去,再往下,还有一个头文件
#if defined (USE_HAL_DRIVER)#include &quot;stm32f4xx_hal.h&quot;#endif /* USE_HAL_DRIVER */#ifdef __cplusplus}#endif /* __cplusplus */#endif /* __STM32F4xx_H */
[color=rgb(51, 102, 153) !important]复制代码
这里声明了一些HAL初始化的一些函数
回去再回去再去这里看看#include &quot;Legacy/stm32_hal_legacy.h&quot;
这里貌似是兼容全平台的一些外设常量的重定义,里面没有头文件
最后又是系统的一些东西,完全找不到
难道说这个功能只是预留的还没成熟暂时不给启用的吗,还是需要用户自己定义全局宏
不太理解这里,就是配置文件留一个用户可以写的区域也可以呀
所以感觉CubeMX还是跟HAL搭配的不是很好,很多时候按照生成的工程根本下不去手写程序,只能改动生成的代码区域,然后软件更新配置,又给恢复过去了,一年前就是这样,现在还是,用起来始终不如意,功能写多一点就得各种改 |