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

查看: 7188|回复: 15

[STM32L476] 【NUCLEO-L476RG开发】STM32的Eclipse+GCC配置和样例

  [复制链接]

48

主题

609

回帖

0

蝴蝶豆

金牌会员

最后登录
2020-11-3
发表于 2015-11-16 11:28:43 | 显示全部楼层 |阅读模式
本帖最后由 ataudio 于 2015-11-20 17:09 编辑

L476的板子收到一段时间了,尽管开始就冲着低功耗来的。但目前手头F407的开发设备正在收尾,没太多时间熟悉L476,不过同为M4核,几乎完全可pin2pin的设计,相信后期的开发移植不是太大的问题。
当然,L476毕竟是新的芯片,要说短期能开发什么大应用,对我这种水平来说,比较困难。但基础的配置和应用,前面各位大神都有很好的分享了。我再次再次抛几块砖头了。
IMG_20151116_111440.jpg
因为开发板分享有了时间限制,所以先占个位置,后续修改补充。支持论坛分发的开发板发布开发共享,物尽其用。

看到沐版和网友的回复,亚历山大。希望大家莫给予这么大的期望嘛,我能拿出来的东东当不起“神奇”二字。
首先是一份应该称得上详尽的环境配置和样例,有兴趣的网友皆可以按此配置成功:

1.  前言
STM32比较常用的开发环境是MDK跟IAR,但是这两个都是商业软件。Eclipse作为开源界最常用的IDE,功能强大,扩展性强大,关键还可以免费使用。使用量大,无论咨询资料,还是请教高手,途径更多,“借力”更方便。
既然用到了Eclipse,编译器当然要考虑到同样开源免费的GCC。本文就是介绍利用Eclipse+GCC开发STM32的基本方法,不涉及基于OpenOCD的GDB调试。当然,操作系统仍然是Windows。
系统:Windows 7,平台:Eclipse+GCC的STM32开发环境,具有网络条件。
题外话:学习和使用这一个配置方案基于2点。1,公司的windows系统,使用破解的MDK。结果,我收到了律师函。随后和Keil代理公司通电话,想要采购价格,据说很高很高,但最后居然没成功地把报价邮件发到我的邮箱;2、为了能干活,尝试stmcu.org论坛里QianFan指导的Ubuntu下交叉编译ARM,结果ST-Link的驱动配置成功,但无法工作。而且Linux也不是办公的好选择。最后,还是灰溜溜回到了Windows。
配置过程借鉴了网友的文章,修正了其中的一些错误。
Eclipse+GCC配置成功并推广的话,也顺手替公司省了不少银子。
闲话少说,言归正传吧。
2.  编译环境安装说明
ARM开发,总是按照开发板为例建立模版配置,然后在此模版下,进行实际项目开发。无论MDK还是IAR,还是其它IDE,莫不如是。
本文先STM32F4Discovery开发板为例说明Eclipse环境配置。其它的开发板,如STM32L476RGNecleo版,配置大同小异。涉及到不同配置点时,我会分别对F407和L476两种芯片的配置方法做出说明。最后的点灯程序,则是完整版的L476程序。按照L4与M4其它芯片的pin2pin替换,同样的内核,估计可以方便移植很多F407的程序。
我们配置平台需要用到的软件和对应版本如下图:
1.PNG

1、Java Runtime Environment(JRE):Eclipse是Java编写的,没JRE的话Eclipse跑不起来。下载地址:http://www.java.com/en/download/manual.jsp安装简单,一路Next。
2、最新版的Eclipse:下载地址http://www.eclipse.org/downloads/ ,推荐下载Eclipse IDE for C/C++ Developers版本,如果是其他版本还需要另外安装CDT等插件,此版本集成了CDT。下载下来解压,就可以双击运行里面的eclipse.exe了。
3、GCC for ARM。下载地址:http://launchpad.net/gcc-arm-embedded,安装版(带有-win32.exe)。安装也是一路Next,安装完后最后有一项Add path toenvironment variable. 一定要勾上。此版本的GCC里面的所有命令都是带arm-none-eabi-前缀的,即使这样加到PATH环境变量也不会对装有原版的GCC有任何影响。安装完后在CMD命令提示符中输入arm-none-eabi-gcc-v,应该会显示GCC的版本信息。如果提示找不到命令,就说明GCC的安装有问题。
2.PNG
4、MinGW,用于编译Win32的编译工具集,:下载地址:http://sourceforge.net/projects/mingw/files/Installer/,下载mingw-get-setup.exe,里面附带了一个叫MSYS的Linux Shell工具包,这里只需要用到里面的Make工具。双击运行后点里的Install,安装好后MinGW自带了一个图形安装器,如下图:
3.PNG
其中最下面一个msys-base必选,其他的如果不知道是干嘛的就没必要选了。勾选后在Install菜单中选择Apply Changes开始安装。
安装好后需要自行添加路径到系统的PATH环境变量。方法是在计算机图标上右击属性,在高级系统设置菜单中点击环境变量按钮,在用户变量或者系统变量中找到PATH,默认安装的就把“C:\MinGW\bin;C:\MinGW\msys\1.0\bin;”添加在最后面。如果添加在用户环境变量里就只对当前登录的用户有效,系统变量则对所有用户有效。如果装在其他分区的记得做相应修改。完了之后重新开一个CMD窗口,输入make -v,如果正常显示make的版本信息,说明安装成功了,如果找不到命令,说明安装有问题。系统环境变量添加的页面如下:
4.PNG
5、STM32官方固件库,F4的固件库下载地址是http://www.st.com/web/en/catalog/tools/PF257901(STM32F4xx_DSP_StdPeriph_Lib_V1.6.1) 。L4的固件库下载地址:https://www.stmcu.org.cn/document/list/index/category-914(STM32Cube_FW_L4_V1.1.0)。其他芯片在官网也可以找到。下载后解压备用。
6、ST-Link Utility,ST-Link的工具包,用于向开发板中下载程序。如果是其它Nucleo板子,可以直接将生成的.hex文件拷贝到更目录,不用下载。ST-Link Utility的下载地址:http://www.st.com/web/en/catalog/tools/PF258168
7、mBed的源码,其实只用到两个TOOLCHAIN_GCC_ARM相关的文件,下载地址:http://github.com/mbedmicro/mbe ... G/TOOLCHAIN_GCC_ARM(F407);http://github.com/mbedmicro/mbed/tree/master/ libraries\mbed\targets\cmsis\TARGET_STM\TARGET_STM32L4\TARGET_NUCLEO_L476RG\TOOLCHAIN_GCC_ARM(L476)。
在Eclipse下面开发可以采用用Eclipse管理Makefile的方法,也可以采用CDT自带的Cross GCC插件。本文选用Cross GCC插件,自己配置GCC 编译命令的方法。

STM32的Eclipse gcc开发环境配置.pdf (620.51 KB, 下载次数: 209)

评分

参与人数 1ST金币 +20 收起 理由
zero99 + 20

查看全部评分

<
回复

使用道具 举报

48

主题

609

回帖

0

蝴蝶豆

金牌会员

最后登录
2020-11-3
 楼主| 发表于 2015-12-23 13:48:15 | 显示全部楼层
本帖最后由 ataudio 于 2015-12-24 17:06 编辑
huixiesui 发表于 2015-12-19 12:58
我从ST AC6 下载集成了这个ECLIPSE编译器,但是不能实现printf() ,以前用keil 选择了 micro LIB,可以使 ...

试试重定向printf()
...
#undef __GNUC__
#ifdef __GNUC__
  #define PUTCHAR_PROTOTYPE int __io_putchar(int ch)
#else
  #define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)
#endif
...
PUTCHAR_PROTOTYPE
{
  /* Place your implementation of fputc here */
  HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, 0xFFFF);
        return ch;
}

使用eclipse+gcc编译的,请注释掉重定向printf()时的:
#undef __GNUC__
回复 支持 1 反对 0

使用道具 举报

307

主题

3125

回帖

0

蝴蝶豆

论坛元老

最后登录
2020-7-17
发表于 2015-11-16 15:08:53 | 显示全部楼层
希望是一个神奇的应用~加油
回复 支持 反对

使用道具 举报

18

主题

668

回帖

0

蝴蝶豆

金牌会员

最后登录
2017-4-9
发表于 2015-11-16 15:38:48 | 显示全部楼层
希望是一个神奇的应用~加油
回复 支持 反对

使用道具 举报

41

主题

2476

回帖

282

蝴蝶豆

论坛元老

最后登录
2020-12-8
发表于 2015-11-16 18:50:44 | 显示全部楼层
期待              
回复 支持 反对

使用道具 举报

0

主题

90

回帖

0

蝴蝶豆

中级会员

最后登录
2016-7-1
发表于 2015-11-16 20:54:53 | 显示全部楼层
赞一个      
回复 支持 反对

使用道具 举报

48

主题

609

回帖

0

蝴蝶豆

金牌会员

最后登录
2020-11-3
 楼主| 发表于 2015-11-20 16:36:06 | 显示全部楼层
1.  建立模版工程
下面创建一个模版工程,以后的工程可以直接从这个工程复制,减少工作。
在Eclipse里面,创建一个基于Cross GCC的C工程,输入项目名后点Next;下面选择要创建的配置有序需要改的东西比较多,可以只勾选Debug,以后需要Release的时候再从配置好的Debug复制。然后,填写编译器前缀和路径,输入arm-none-eabi-,注意最后的小横线。路径的话因为前面已经设置了环境变量了,可以不用选。点Finish创建工程。
5.PNG 6.PNG 7.PNG
在源文件下面创建三个目录,src,inc,lib分别用于存放源文件,头文件和库文件。F407开发时,在lib下面建立一个stdperiph文件夹,把固件库STM32F4xx_DSP_StdPeriph_Lib_V1.3.0\Libraries\STM32F4xx_StdPeriph_Driver下面的src和inc文件夹复制过去。根据芯片的不同,部分源文件是多余的,比如F407就需要删除stm32f4xx_fmc.c。还需要将再创建一个cmsis文件夹,在cmsis创建一个inc子文件夹,把STM32F4xx_DSP_StdPeriph_Lib_V1.3.0\Libraries\CMSIS\Include里面的头文件复制过去。这里的头文件有一些可能用不到,比如F4就用不到cm0跟cm3的一些头文件,确定用不到的头文件可以删除。另外在STM32F4xx_DSP_StdPeriph_Lib_V1.3.0\Libraries\CMSIS\Device\ST\STM32F4xx\Include里面还有几个头文件,也复制到cmsis下面的inc里面。
而L476RG开发板则需要从对应的cmsis和stm32l4xx_ll_drv中拷贝文件到类似的目录中。由于L476使用LL库,使用了static inline的函数声明在.h文件中,cmsis和stm32l4xx_ll_drv中几乎没有.c文件。
如果愿意添加所有includes的路径到编译选项中,也可以保留StdPeriph 和CMSIS原来的结构。
另外,在这里我们用不到L4系列的HAL库,不需要加入指定目录中。因为Eclipse会自动添加目录下所有文件,所以,不属于工程上用到的文件,都不要放进去。
再在cmsis下面创建一个src文件夹,把mBed里的startup_STM32F40x.s复制过去。这是F40x系列的,其他系列的芯片去上层目录找相应的文件。复制好后千万记得把扩展名小写的s改成大写的S。而L476的.s文件也如法炮制。
注意:eclipse默认只编译大写S结尾的汇编文件。
最后在src文件夹中还需要一个时钟配置文件system_stm32f4xx.c,可以从STM32F4xx_DSP_StdPeriph_Lib_V1.3.0\Project\STM32F4xx_StdPeriph_Templates里面复制,这里面这个文件对应的晶振是25M的,如果不是25M的晶振需要相应的进行修改。当然也可以利用http://www.st.com/web/en/catalog/tools/PF257927里面的工具生成system_stm32f4xx.c文件。在L476库的同样位置拷贝同样功能的.c文件。
之后是根目录中的src跟inc目录。把从STM32F4xx_DSP_StdPeriph_Lib_V1.3.0\Project\STM32F4xx_StdPeriph_Templates中把stm32f4xx_it.h和stm32f4xx_conf.h复制到根目录下的inc目录,然后把stm32f4xx_it.c复制到src目录中,再把stm32f4xx_it.c开头的#include “main.h” 跟void SysTick_Handler(void)函数里的TimingDelay_Decrement();删掉。之后顺便创建一个main.c。
L476同样建立*it.c和*it.h文件在指定目录中。如果需要main.h,也一并创建在inc中。
最后把mBed里的STM32F407.ld复制到根目录,并改名为stm32f407vg_flash.ld。这是F40x系列的,其他系列的芯片去上层目录找相应的文件(L4:stm32l476rg_flash.ld)。确认此文件中前面几行中的flash、ram的大小和地址同芯片的实际参数相符。
文件创建工作算是完成了,完成后的F407和L476的工程文件结构依次如下显示:
8.PNG 9.PNG
而接下来F407需要在stm32f4xx.h中做一些修改。首先是有一行宏定义#defineHSE_VALUE    ((uint32_t)25000000)。如果外部晶振的频率不是25M,也需要进行对于的修改,比如8M就改成8000000。需要说明的是,如果晶振不同的话要改的地方不止这一个,在stm32f4xx_system.c中还要修改相应的PLL选项。之后在
#if !defined(STM32F40_41xxx) && !defined (STM32F427_437xx) && !defined(STM32F429_439xx) && !defined (STM32F401xx)
这一句前面,添加两行宏定义
#defineSTM32F40_41xxx
#defineUSE_STDPERIPH_DRIVER
前一行是定义设备,后一行是使用固件库的开关。L4的stm32l4xx.h里面不需要修改。
2.  编译选项配置
我们需要对编译选项进行一些设置,才能完成工程。而且,这一个步骤需要熟练掌握,对未来开发具有非常重要的作用,如果早已对Makefiles配置熟悉的人来说,则驾轻就熟。
我们右击工程,在菜单中选择Properties。选择C/C++ Build中的Setting。选中后在右边的Tool Settings里面可以设置编译选项。第一个Cross Settings就是编译器前缀与路径,创建工程的时候已经设置好了。
接下来在Cross GCCCompiler中的设置保持默认,Preprocessor中关于预处理的一些选项,保持默认。Symbols可以添加一些宏定义,比较常用的可以在Debug配置里面添加一个_DEBUG标记,在Release配置中添加一个_RELEASE标记。这样的话,代码里面就可以用#ifdef _DEBUG进行条件编译。之后是include,头文件定义。需要添加的目录是inc,lib/stdperiph/inc与lib/cmsis/inc三个目录。添加的时候通过点击Workspace按钮添加工程相对路径,而不是添加绝对路径,这样工程路径改变后照样能正常编译。Optimizatzation优化选项,根据需要选择O0-O3,数字越大优化越多,Os表示对生成代码大小进行优化,一般选O3。然后是Debug调试选项,数字越大调试信息越多。Warning编译警告选项,推荐勾选-Wall 和 -Wextra,这样会提示所有警告,一个比较好的习惯是消灭所有警告,因为每一个警告都表示一个隐患。Miscellaneous杂项,这个需要自己填写与芯片相关的几个参数,STM32F4是 -c -mcpu=cortex-m4 -mthumb -mfloat-abi=hard-mfpu=fpv4-sp-d16 其中-c参数表示只编译不链接,因为我们有很多源文件,全部编译好再统一链接。然后-mcpu=cortex-m4表示cortex-m4核心,如果是F1,F2,F3系列是cortex-m3,如果是F0系列应该是cortex-m0。-mthumb表示采用thumb指令集,cortex-m系列的都是只支持thumb指令集的。最后两项-mfloat-abi=hard-mfpu=fpv4-sp-d16,分别表示采用硬浮点数指令,浮点数协处理器型号为fpv4-sp-d16。只有F4和L4支持这两个选项,F0跟F1都是不到浮点数模块的,因此不需要填。填了反而会出错。
10.PNG
Cross GCC Linker保留默认设置。General里面的设置都不选。Libraries第三方库,我们这里没用到第三方库,所以留空,像STM32F4是自带了编译好的DSP库的,需要用到的话要在这里进行相应的设置。Miscellaneous杂项,填写 -T”${workspace_loc}/${ProjName}/stm32f407vg_flash.ld”-mcpu=cortex-m4 -mthumb -mfloat-abi=hard -mfpu=fpv4-sp-d16 -Xlinker --gc-sections--specs=nosys.specs 。其中-T”${workspace_loc}/${ProjName}/stm32f407vg_flash.ld”是指定前面生成的链接文件,接下来的几项跟编译选项是一样的。这几项必须与编译选项保持一致,因为链接器需要根据这个选项选择对应的库文件。最后一项-Xlinker --gc-sections表示移除未使用的块,意思是如果在源文件里面包括一些函数,从未被调用也不可能被调用到,则链接的时候把他们删除以节约空间。--specs=nosys.specs则是解决”_exit()”函数无法找到导致生成目标文件失败的错误。最后Shared Library Settings共享库设置,保持默认就可以。最下面还有个汇编编译器设置,保持默认即可。
在Build Artifact里面的Artifact Type选Executable,Artifact name输入${ProjName},Artifact extension中填入elf。gcc默认只能生成elf格式的结果,即使填上hex,生成的文件也是elf文件,只是扩展名是hex而已。由于下载器只认hex文件,还需要把elf文件转换为hex。如何生成.hex文件呢?在Build Steps中有一个Post-build steps,意思是在编译完成后运行的命令,在它的Command里面添加如下命令: arm-none-eabi-objcopy ”${ProjName}.elf” -O ihex “${ProjName}.hex” 利用objcopy工具生成hex文件。
上述的F4配置的所有参数,几乎都能在L4里使用。当然路径需要重新选择。

回复 支持 反对

使用道具 举报

11

主题

1139

回帖

0

蝴蝶豆

金牌会员

最后登录
2020-7-10
发表于 2015-11-20 23:57:39 | 显示全部楼层
赞一个
回复 支持 反对

使用道具 举报

33

主题

1243

回帖

0

蝴蝶豆

论坛元老

最后登录
2019-3-9
发表于 2015-11-21 01:06:05 | 显示全部楼层
好文,先收藏,说不定哪天就需要了
回复 支持 反对

使用道具 举报

74

主题

1368

回帖

194

蝴蝶豆

版主

最后登录
2020-5-12
发表于 2015-11-21 13:33:58 | 显示全部楼层
这样可以摆脱IAR、KEIL作为编译器了。
方便、简单~~~
回复 支持 反对

使用道具 举报

29

主题

290

回帖

15

蝴蝶豆

论坛元老

最后登录
2020-12-3
发表于 2015-11-22 18:00:21 | 显示全部楼层
谢谢!也帮我把问题解决了,固件库中的连接和启动文件不用直接用。
回复 支持 反对

使用道具 举报

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