【003】使用GNU ARM工具链进行STM32开发

使用GNU ARM工具链进行STM32开发

关键词:STM32、ARM、GNU、Eclipse、HAL

STM32 HAL库与STD库

  因为本教程采用STM32F4XX系列芯片,因此所有比较均基于此款芯片,但与其他STM32系列差别不大,可作为参考。

  STD库即标准库,STM32F4xx系列芯片标准库全称STSW-STM32065,提供全覆盖的寄存器地址映射及声明,提供通用API(Application Programming Interface),采用‘Strict ANSI-C’标准编写。使用STD标准库能够在更接近硬件的层次上实现更灵活的程序设计,得到更高的效率。

HAL(Hardware AbstractionLayer),即硬件抽象层,如图1所示。其位于操作系统内核与硬件电路之间,目的在于将硬件抽象化。它隐藏了特定平台的硬件接口细节,为操作系统提供虚拟硬件平台,使其具有硬件无关性,可在多种平台上进行移植。在Linux等操作系统中,经常能够见到HAL层。想必意法半导体推出HAL库的目的,也是为了进一步提高程序的可移植性,降低芯片的使用难度。

【003】使用GNU ARM工具链进行STM32开发_第1张图片

图1 硬件抽象层示意图

  可以从可移植性、易用性、灵活性、效率这四个方面来衡量两个库之间的差异:

  • 可移植性

  HAL库具有更高的可移植性,能够配合STM32提供的STM32CubeMX轻松产生不同芯片的初始化代码进行抑制。

  STD库在移植的时候要更多的考虑芯片之间上下兼容的问题。针对不同的芯片需要手动修改部分代码,需要对芯片之间的差异有一定了解。

  • 易用性

  HAL库针对初学者来说似乎不用关心芯片内部运作方式,仿佛是在编写PC上的程序。看似降低了学习的门槛,但是也同时错过了了解芯片工作方式的机会。

  STD需要自己进行一些手动的配置,知道芯片上电后的基本设置。在入门时期来看,HAL库更有利于上手,能够较快的体验到成功感,但是从后期进一步深入学习来看,STD库能对细节的把握更加透彻。

  • 灵活性

  HAL库由于高度的抽象,相对来说灵活度较低。且由于HAL库推出的时间并不长,还有很多需要进一步完善的地方。因此STD具有更高的灵活性。

  • 效率

  由于STD能够直接进行寄存器中的位操作,可以跟据不同的需求设计不同的操作方式,因为STD库的效率更高。实际应用中,如果芯片的性能远大于要实现的功能,那么可以不考虑此因素。

基于ARM GUN工具链的HAL库配置

  在【002】搭建开源嵌入式集成开发环境一文中,我们已经搭建好基于ARM GNU工具链的嵌入式开发环境。让我们再来仔细看一下创建的工程结构,如图2所示。stm32f4-hal文件已经存在于工程之中,位于Example->system->src->stm32f4-hal。

【003】使用GNU ARM工具链进行STM32开发_第2张图片

图2 STM32工程结构

  展开stm32f4-hal文件夹如图3所示。可以看到原工程为了减少占用空间仅添加了基本的.c文件至hal文件夹,而我们需要做的就是去STM32的官方网站下载完整的stm32f4-hal库并添加在工程中的stm32f4-hal文件夹内即可。

【003】使用GNU ARM工具链进行STM32开发_第3张图片

图3 stm32f4-hal文件夹内部结构


基于ARM GUN工具链的STD库配置

  STD库配置相比HAL库较为复杂,首先需要删除无用的文件及文件夹。整理完之后的工程结构如图4所示。

【003】使用GNU ARM工具链进行STM32开发_第4张图片

图4 STD库工程结构

  与图3相比,主要是移除了与Hal库有关或者与STD库重复的文件。解压下载的官方STD库得到如图5所示文件夹。这里我们将STD库即STM32F4xx_StdPeriph_Driver文件夹复制到工程DEVICE文件夹中,除了STD库该文件夹下还有三个文件分别是startup_stm32f429_439xx.S(启动文件,注意S需要大写)、stm32f4xx_it.c(中断文件)、system_stm32f4xx.c(系统配置文件)。这三个文件分别来自:

STM32F4xx_DSP_StdPeriph_Lib_V1.8.0\Libraries\CMSIS\Device\ST\STM32F4xx\Source\Templates\TrueSTUDIO\startup_stm32f429_439xx.s

STM32F4xx_DSP_StdPeriph_Lib_V1.8.0\Libraries\CMSIS\Device\ST\STM32F4xx\Source\Templates\system_stm32f4xx.c

STM32F4xx_DSP_StdPeriph_Lib_V1.8.0\Project\STM32F4xx_StdPeriph_Templates\stm32f4xx_it.c

【003】使用GNU ARM工具链进行STM32开发_第5张图片

图5 STM32F4xx标准库

  在工程文件夹ldscripts添加STM32F439NI_FLASH.ld文件,来自:

STM32F4xx_DSP_StdPeriph_Lib_V1.8.0\Project\STM32F4xx_StdPeriph_Templates\TrueSTUDIO\STM32F429_439xx\STM32F439NI_FLASH.ld

  右击工程打开属性,这里我们需要设置预定义的宏,添加include路径,按图6、图7所示为汇编编译器添加宏定义以及路径信息。

【003】使用GNU ARM工具链进行STM32开发_第6张图片

图6 配置编译器宏定义

【003】使用GNU ARM工具链进行STM32开发_第7张图片

图7 配置编译器include路径信息

之后为C编译器和C++编译器添加相同的信息。更改连接器信息,添加STM32F439NI_FLASH.ld脚本文件如图8所示。

【003】使用GNU ARM工具链进行STM32开发_第8张图片

图8 配置编译其连接脚本

到此,STM32的标准库配置完成,可以点击Build按钮进行验证。

联系作者

你可能感兴趣的:(嵌入式开发)