1. 建立模版工程 下面创建一个模版工程,以后的工程可以直接从这个工程复制,减少工作。 在Eclipse里面,创建一个基于Cross GCC的C工程,输入项目名后点Next;下面选择要创建的配置有序需要改的东西比较多,可以只勾选Debug,以后需要Release的时候再从配置好的Debug复制。然后,填写编译器前缀和路径,输入arm-none-eabi-,注意最后的小横线。路径的话因为前面已经设置了环境变量了,可以不用选。点Finish创建工程。 在源文件下面创建三个目录,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的工程文件结构依次如下显示: 而接下来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都是不到浮点数模块的,因此不需要填。填了反而会出错。
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里使用。当然路径需要重新选择。
|