打印
[应用相关]

关于STM32的HAL库的一些疑问

[复制链接]
6692|21
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
xiezhaoxuan|  楼主 | 2015-10-27 11:01 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
  之前一直用STM32的标准库,最近练习使用Cube_MX编程,发现HAL库确实不太好熟悉,感觉这方面的资料还是比较少,刚刚测试了一下HAL库中自带的DAC例程,总是卡在设置系统时钟的部分,求解。。。
沙发
mmuuss586| | 2015-10-27 12:24 | 只看该作者
用的内部还是外部时钟啊?

使用特权

评论回复
板凳
玛尼玛尼哄| | 2015-10-27 12:55 | 只看该作者
MDK有个功能是查看一个文件里定义的函数列表,你开一个HAL的,再开一个STD的,对着找到名字差不多的,再对着看中文的标准库文档。

使用特权

评论回复
地板
xiezhaoxuan|  楼主 | 2015-10-27 13:31 | 只看该作者
玛尼玛尼哄 发表于 2015-10-27 12:55
MDK有个功能是查看一个文件里定义的函数列表,你开一个HAL的,再开一个STD的,对着找到名字差不多的,再对 ...

你是说照着原来的标准库来学HAL库吗,感觉这两个库完全不一样啊。。。

使用特权

评论回复
5
xiezhaoxuan|  楼主 | 2015-10-27 13:35 | 只看该作者
mmuuss586 发表于 2015-10-27 12:24
用的内部还是外部时钟啊?

我刚才找到问题了,我板子上没有外部时钟,而程序用的是外部时钟,在等待外部时钟起振的时候有个延时函数,而那个函数里面什么也没有,所以就在那死循环了。。。

使用特权

评论回复
6
xiezhaoxuan|  楼主 | 2015-10-27 13:39 | 只看该作者
mmuuss586 发表于 2015-10-27 12:24
用的内部还是外部时钟啊?

另外请教一下,HAL库中有很多 __weak 开头的函数,还有不带 __weak 的重名函数,编译器怎么就知道该进哪个函数呢,虽然有这么段程序:

#if  defined ( __GNUC__ )
  #ifndef __weak
    #define __weak   __attribute__((weak))
  #endif /* __weak */
  #ifndef __packed
    #define __packed __attribute__((__packed__))
  #endif /* __packed */
#endif /* __GNUC__ */


但是那个 __GNUC__ 好像没有定义啊,所以__weak 应该也没有定义啊,但编译器怎么就知道该编译链接哪个函数呢?求指教。。。

使用特权

评论回复
7
zchong| | 2015-10-27 21:32 | 只看该作者
xiezhaoxuan 发表于 2015-10-27 13:39
另外请教一下,HAL库中有很多 __weak 开头的函数,还有不带 __weak 的重名函数,编译器怎么就知道该进哪 ...

你别只看gnuc的,应该还有对等的iar或者mdk的的吧

使用特权

评论回复
8
zhuotuzi| | 2015-10-27 22:54 | 只看该作者
我最近也练习使用Cube_MX编程,HAL没有中文手册

使用特权

评论回复
9
xiezhaoxuan|  楼主 | 2015-10-28 09:08 | 只看该作者
zhuotuzi 发表于 2015-10-27 22:54
我最近也练习使用Cube_MX编程,HAL没有中文手册

用标准库很好实现的一个程序,用HAL已经整了三天了。。。。
主要是还没有理清楚它的运作流程。。。。

使用特权

评论回复
10
XC456| | 2015-10-28 10:44 | 只看该作者
xiezhaoxuan 发表于 2015-10-27 13:39
另外请教一下,HAL库中有很多 __weak 开头的函数,还有不带 __weak 的重名函数,编译器怎么就知道该进哪 ...

weak开头的都是用户可以重写的函数,没有重写之前是不会被调用的,这个你可以先不必去管,按照论坛的帖子从LED闪烁开始,熟悉工程创建过程再熟悉HAL库的架构,刚开始就是模仿,闷头去做,然后试着从cubemx改参数设置,改完后去工程文件里面对照看哪里变动了,慢慢你就明白了,刚开始都比较懵

使用特权

评论回复
11
android2| | 2015-10-28 12:51 | 只看该作者
楼主研究的听仔细啊

使用特权

评论回复
12
zhuotuzi| | 2015-10-28 16:33 | 只看该作者
xiezhaoxuan 发表于 2015-10-28 09:08
用标准库很好实现的一个程序,用HAL已经整了三天了。。。。
主要是还没有理清楚它的运作流程。。。。 ...

没有中文的说明手册,所以难以理解,不知道如何用这个工具。

使用特权

评论回复
13
蜕变吧| | 2015-10-29 19:43 | 只看该作者
STM32的HAL库不习惯用这个,还是以前的库好用

使用特权

评论回复
14
可可球| | 2015-10-29 20:23 | 只看该作者
__GNUC__是什么,怎么定义的

使用特权

评论回复
15
734774645| | 2015-10-29 21:01 | 只看该作者
这两个库完全不一样的,HAL更加国际标准化。

使用特权

评论回复
16
稳稳の幸福| | 2015-10-29 21:25 | 只看该作者
我也准备投入HAL的怀抱

使用特权

评论回复
17
xiezhaoxuan|  楼主 | 2015-10-30 08:28 | 只看该作者
XC456 发表于 2015-10-28 10:44
weak开头的都是用户可以重写的函数,没有重写之前是不会被调用的,这个你可以先不必去管,按照论坛的帖子 ...

  请看我上面贴的代码,我是感觉__GNUC__没有定义吧,那weak也没有定义,那就相当于程序中有两个函数吧,只不过一个是空的,一个是有内容的,我想知道KEIL是如何识别编译哪个函数的。。。。
  不知道能明白我的意思吗。。。

使用特权

评论回复
18
xiezhaoxuan|  楼主 | 2015-11-3 13:54 | 只看该作者
还在继续研究,现在又有新问题了,配置串口时,只开接收终端没有问题,只开发送没有问题,但两个一起用,过一会就会收不到数据了,还在找问题所在,只希望我把这个库用熟了,
ST就别再换新库了,我不想这样活到老学到老啊

使用特权

评论回复
19
xiezhaoxuan|  楼主 | 2015-11-3 14:36 | 只看该作者
楼上的问题已经找到,原因是我在接收中断中配置的是接收一个字节调用一次回调函数HAL_UART_RxCpltCallback,而回调函数中调用HAL_UART_Receive_IT设置接收字节数,发送数据时库内部给串口上锁,所以如果正在发送数据时进入了串口接收中断,由于串口被上锁,HAL_UART_Receive_IT检测到其他任务占用串口所以并不会被有效的执行,导致继续接收失败。目前还没有更好的解决办法,只是在HAL_UART_Receive_IT中去掉了上锁检测,希望有大神开贴介绍采用HAL库的完善的串口操作流程。

使用特权

评论回复
20
diweo| | 2015-11-3 16:33 | 只看该作者
xiezhaoxuan 发表于 2015-10-27 13:39
另外请教一下,HAL库中有很多 __weak 开头的函数,还有不带 __weak 的重名函数,编译器怎么就知道该进哪 ...

这里确实是没有定义__GUNC__,所以也没有定义__weak__, 但,或许在别的地方定义了只是你没看到呢?
功能上,用__weak__,就是库帮你先定义一个函数,保证基本功能。如果你自己又写了个同名函数,那就用你定义的那个。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

8

主题

22

帖子

1

粉丝