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

第三期:聊聊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管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版