你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

第三期:聊聊STM32CubeMX及HAL库的使用情况、技巧等

[复制链接]
dsjsjf 提问时间:2018-11-5 08:50 /
    ST从2014年推出了STM32CubeMX,同时配套的是HAL库。我是在2014年的ST研讨会上了解到这个工具,然后回来后立马下载,用了觉得蛮好用的,就一直用到了现在。
    四年多的时间,STM32CubeMX和HAL库也在不断更新,到现在,已经支持STM32全系列,功能及生态支持上也很强大,各种中间件(FatFs、FreeRTOS、LWIP、USB、GUI等等)可无缝对接。
    说说我目前的使用情况:
1、在硬件设计的时候,我就会使用到STM32CubeMX,使用它来分配MCU的各外设及其对应的管脚、晶振时钟等;
2、再通过Configuration配置各外设、中间件的具体功能。然后生成工程。
以上两步可以节约很多时间,工程的创建、端口功能复用配置、各中间件移植的步骤都省去了。
3、添加自己的代码。
        STM32CubeMX生成的工程可以直接编译,但还仅仅是基础代码。这时就需要添加自己的功能性代码。生成的工程中一般有main.c\xxx_hal_msp.c\xxx_it.c 这几个是可以添加自己代码的。记得要把自己的代码添加在/* USER CODE BEGIN x */ 和/* USER CODE END x */之间,这样下次在STM32CubeMX修改了配置,再次生成代码,这之间的自己的代码不会被覆盖。
        不过,我现在基本不修改生成的代码,我会新建一个文件夹,写自己的代码。比如,使用了FreeRTOS后,可以在CubeMX中创建任务时造成代码为As weak,这样生成的main.c文件中的任务函数为
  1. /* USER CODE END Header_MainTask */

  2. __weak void MainTask(void const * argument)

  3. {

  4.   /* init code for LWIP */

  5.   MX_LWIP_Init();



  6.   /* USER CODE BEGIN 5 */

  7.   /* Infinite loop */

  8.   for(;;)

  9.   {

  10.     osDelay(1);

  11.   }

  12.   /* USER CODE END 5 */

  13. }
复制代码

因为使用了__weak,所以在我自己的代码中,只要重写一个void MainTask(void const * argument)就可以了。

4、如果在程序调试的过程中,CubeMX中的配置修改了,可以直接重新生成代码,不会影响之前的。
5、还是很希望STM32CubeMX能够在添更多的中间件,比如Modbus、CanOpen等常用的协议及开源代码。

大家可以聊聊自己在工作学习中使用STM32CubeMX及HAL库(LL库)的情况,技巧、心得,遇到的问题等等,一起交流进步。

收藏 评论31 发布时间:2018-11-5 08:50

举报

31个回答
stm1024 回答时间:2018-11-5 08:54:00
一般都是先生成HAL代码,然后再修修改改,这样可能更方便一点。
不过总体上来说,HAL确实提升了开发的效率,省的不停滴查手册

点评

是的,不过涉及到细节部分,还是需要看手册(Reference manual、Datasheet等)的,毕竟手册是最详细的资料。  发表于 2018-11-5 09:03
waiman-156411 回答时间:2018-11-5 10:36:19
我的方法类似你用的,也是用文件夹区分BSP,API,APP等,然后每一层用一个.h文件include。
接入HAL的,只是修改main.c和stm32f1xx_it.c 这两个文件。所以重新生成工程(或者换芯片),也不用修改自己的代码。
而且这样的分布,如果只是修改BSP里面的.c文件,只会重新编译BSP文件夹里面的不好影响到其他层。
这样的好处,就是提升编译速度。

点评

有道理,模块化程序设计思路。  发表于 2018-11-5 11:10
一代睡神的崛起 回答时间:2018-11-5 13:13:08
一如既往的喜欢标准库,也使用过HAL库但是编译起来太烧配置,因为使用得比较少也不好做过多的评论。听说HAL驱动集成得很好

点评

标准库很经典,不过时代在进步,想以后跨平台移植方便还是HAL库,想省Flash空间,还是有LL库可选择的。  发表于 2018-11-5 13:19
确实很烧Flash空间,不过现在的MCU的Flash也足够大,动不支就是1M 2M的大小,哈哈,烧烧也无所谓。。  发表于 2018-11-5 13:18
bjx1234 回答时间:2018-11-5 13:27:48
不怎么好用,而且能保证生成的驱动就一点问题没有吗?

点评

不排除它还有别的Bug,但它还是给我提供了很多方便,在接收它的方便的同时,我会去适应它。微软、谷歌、苹果的软件不也在不断更新嘛  发表于 2018-11-5 14:18
其实我之前在用HAL库操作内部Flash时,也遇到过问题,当时以为是Bug。后来发现还是我没弄明白,调用函数错误导致。  发表于 2018-11-5 14:17
maxtch 回答时间:2018-11-5 13:56:10
标准库和 HAL 我都不用。开发起来代码复杂度和直接操作寄存器差不了多少,烧空间。所谓的跨平台,这种 HAL 因为没有别的厂家支持,也只不过是一种供应商锁定的方法罢了。

点评

其实别的厂商也有类似的。现在的MCU外设越来越强大,操作寄存器是很直接,但是用到USB、以太网等外设呢?  发表于 2018-11-5 14:21
az158 回答时间:2018-11-5 14:08:51
stm32cubemx,确实很诱人,我是在去年的时候了解到这个工具,开发起来很快捷。而且HAL库的风格不同芯片之间很类似,换芯片非常容易。在使用的时候,也是基本不去动它生成的代码。不过整体封装度太高。虽说省了开发是配置芯片的麻烦,可也同时提高了出问题后debug的难度,程序阅读难度提高(虽说LL比较轻量但是感觉官方对这个不是特别重视。。可能是我的错觉)。现在还处在观望阶段,会去学习,但是开发还是标准库(比较新的的芯片基本不用)。
使用技巧,没啥特别的,就是基本不去碰它生成的代码。留文件对接函数接口

点评

HAL库其实是把操作寄存器的各项功能封装成函数,由你的程序来调用。对于调用来说,相对简单,但是你要读写HAL函数的实现,还是有点难度。  发表于 2018-11-5 14:28
奏奏奏 回答时间:2018-11-5 15:02:28
一直在这个论坛里推stm32cubemx与HAL库,
其实我也想顺便推荐一下LL库,但是LL库目前没有在项目中使用,不敢误人子弟。

之前想用STM32F107VCT6的时候用TCP联网,看了教程也不会用,自己觉得可能用MCU做这些应用并不是太合适。
单纯的控制,GPIO,中断,CAN,I2C,定时器,PWM,串口,这些基本功能还是挺方便的

点评

你的经验,分享出来,对别人就是一种帮助。在互联网、物联网的大趋势下,MCU也不仅仅是简单的控制,接入网络也是需要的,目前我做过Modbus-TCP。  发表于 2018-11-5 15:30
maxtch 回答时间:2018-11-5 15:15:10
至于 USB、网络这类复杂外设,网上可以找到不依赖 HAL 或标准库的独立支持库。而且这类库普遍体积都非常小。

点评

都有各自的习惯以及侧重点  发表于 2018-11-5 15:32
yangjiaxu 回答时间:2018-11-5 16:37:56
该说不说HAL十分方便移植,但是缺点就是不好优化啊,生成的下载文件 都好大

点评

确实是大,也可以选择LL库。不过在Flash容量足够的情况下,还是可以用HAL的。  发表于 2018-11-5 17:09
12下一页

所属标签

相似问题

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
微信公众号二维码 微信公众号
手机版二维码 手机版