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

查看: 7156|回复: 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管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版