在Simplicity Studio下创建适用于EFR32的工程项目
1、使用平台
使用平台描述了在Simplicity Stdio下创建工程时所使用的操作系统与软件版本等。
- 操作系统:Windows 10
- Simplcity Studio版本:Simlicity Studio V4
- MCU型号:Silicon Labs的EFR32FG1x系列
2、Simplcity Studio上使用的SDK与编译器版本
- 32 bit MCU SDK版本:5.2.2.0
- Flex SDK:1.2.1.0
- GNU ARM Toolchain版本:4.9.2015.q3
由于接触Simplicity Studio平台与EFR32FG1x系列芯片时,其Flex SDK的版本为1.2.1.0,所以就使用了当时的这个最新版本的SDK,但是自己刚刚才将如何创建一个“干净”的工程探索的差不多的时候,Flex SDK突然更新到一个新的版本2.0.0,最重要的是这个新版本不与1.2.1.0的兼容,API全部变样,连Radio的底层操作流程都换思路了。那我也没精力从头再来了,所以继续使用了1.2.1.0版本的SDK。
3、新建MCU工程
- 首先,打开Simplicity Studio,如图1所示;
图1、Simplicity Studio的Lanucher界面
- 打开Simplicity Studio,使用File->New->Project...新建工程;
-
在弹出的"New Project"对话框中选择Silicon Labs MCU Project,如图2所示,然后点击Next,出现"New Silicon Labs Project"对话框,如图3所示;
图2、New Project对话框
图3、New Silicon Labs project对话框
-
然后在"New Silicon Labs Project"对话框中的Part栏选择要使用的芯片型号(我这里随便选择一款,如EFR32FG1P131F256GM32),在SDK栏中选择“Gecko SDK Suite: Flex 1.2.1.0, MCU 5.2.2.0(v1.1.1)”,如果没有此版本的SDK,则点击右下方的Manage SDKs...,在出现的对话框中查看是否此版本的SDK没有勾选,若没有勾选,则勾选上确认即可,然后返回到上一对话框重新选择SDK即可,若没有发现有此版本的SDK,则需要在安装此版本的SDK后,再重新以上操作,完成填写后如图4所示,最后点击Next;
图4、完成填写后的New Silicon Labs Project对话框
- 此时出现如图5所示的对话框。在此对话框中选择“Simplicity Configurator Program - Create a project whose contents are driven from Simplicity Configurator”选项,然后点击Next;
图5、选择要生成的工程类型
- 然后出现如图6所示的对话框。在对话框中的Project name栏中填写工程项目名称并选择工程项目要保存的路径(这里创建一个名为TestProject的工程,路径我使用默认路径),点击Next;
图6、填写工程项目名称与工程路径
- 最后出现如图7所示的对话框。选择所使用的工具链(这里选择的是GUN ARM v4.9.3),然后直接点击Finish以完成工程项目的创建,随后会打开一个以.hwconf为扩展名,以填写的工程名称为文件名的配置文件,在其中可以对所选用芯片进行GPIO、外设等配置,创建完成后的Simplicity Studio的界面如图8所示。
图7、选择工具链
图8、创建后的工程界面
4、 从Simplicity Studio安装路径添加项目所需的资源
- 在Simplicity IDE的“Project Explorer”面板(如果没有此面板,请从菜单栏中Window->Show View->Other...->General->Project Explorer中调出此面板)中找到刚才创建的工程项目,然后在项目名上单击右键->New->Folder创建新文件夹,如图9所示,出现New Folder对话框,在其Folder name栏中填入新建文件夹的名称;这里我们新建两个文件夹,一个名为railSdk121Config,另一个名为railSdk121Source;
图9、选中工程时的右键菜单
- 然后在Simplicity Studio的安装路径下找到路径 "SiliconLabs\SimplicityStudio\v4\developer\sdks\gecko_sdk_suite\v1.1\platform\radio\rail_lib\autogen\librail_release",复制其中的librail_efr32xg1_gcc_release.a文件到工程项目的railSdk121Source文件夹中。
- 再找到路径"SiliconLabs\SimplicityStudio\v4\developer\sdks\gecko_sdk_suite\v1.1\platform\radio\rail_lib\chip\efr32"和"SiliconLabs\SimplicityStudio\v4\developer\sdks\gecko_sdk_suite\v1.1\platform\radio\rail_lib\chip\efr32\rf\common\cortex",分别复制文件rail_chip_specific.h和pa.h到工程项目的railSdk121Source文件夹中。
- 接着找到路径"SiliconLabs\SimplicityStudio\v4\developer\sdks\gecko_sdk_suite\v1.1\platform\radio\rail_lib\common",复制其中的全部文件到工程项目的railSdk121Source文件夹中(复制的文件分别为rail.h、rail_assert_error_codes.h、rail_types.h)。
- 最后找到路径“SiliconLabs\SimplicityStudio\v4\developer\sdks\gecko_sdk_suite\v1.1\platform\emlib\src”,复制em_core.h文件到工程项目的emlib文件夹中。
添加完上述资源后,Simplicity Studio的“Project Explorer”面板中的当前工程的目录结构如图10所示。
图10、添加资源后的工程目录结构
5、创建Radio Configuration工程项目
- 选择File->New->Project...新建工程;
- 在弹出的"New Project"对话框中选择Silicon Labs AppBuilder Project,然后点击Next;
- 出现Applications对话框,选择Radio configuration for EFR32 radio family(Stackless applications);
- 然后点击Next直到出现Project Configuration对话框为止;
- 在Project Configuration对话框中的Project name栏中填入Radio工程项目名称,然后选择要保存工程项目的路径,点击Next;
- 出现Project setup对话框,在其中的Part栏中输入所使用的芯片型号(与创建MCU工程时所用的芯片型号必须一致,此为EFR32FG1P131F256GM32),然后点击Finish,此时会打开“工程项目名.isc”的配置文件,如图11所示。
图11、Radio配置界面
- 接着配置关于radio的参数,配置完成后,点击Generate按钮,此时工程项目下生成或更新3个文件,分别为rail_config.c、rail_config.h和efr32-standalone-radio-config-configuration.h,将前两个文件复制到MCU工程项目中的railSdk121Config文件夹中,将最后一个文件复制到MCU工程项目中的railSdk121Source文件夹中。
完成后的工程目录结构如图12所示,其中“blank_efr32-standalone-radio-config”即为新创建的Radio Configuration工程。
图12、添加Radio资源后的MCU工程目录结构
6、配置MCU工程的属性并添加头文件搜索路径
- 在MCU工程项目名(TestProject)上点击鼠标右键,在弹出菜单中选择Properties选项,出现Properties for xxx对话框,其中xxx为MCU工程项目名称(这里即为TestProject),如图13所示;
图13、MCU工程属性对话框
- 在属性对话框的左边选择C/C++ Build->Settings,再在Settings界面下选择Tool Settings选项卡,在此选项卡中选择GNU ARM C Linker->Libraries,然后在右边的Libraries(-l)中加入参数m,在Library search path(-L)中加入参数 "${StudioSdkPath}/platform/base/hal/micro/cortexm3/",注意,引号一起填入,此处的${StudioSdkPath}是Simplicity Studio中的一个环境变量,表示当前的SDK所在的根路径,比如在我的电脑中,它等于D:\SiliconLabs\SimplicityStudio\v4\developer\sdks\gecko_sdk_suite\v1.1(可能与您的路径不相同,请自行查找到Simplicity Studio的安装路径,然后再在其中查找SDK的路径),当前上面的参数你可以不适用这个环境变量,而直接使用绝对路径;
- 然后,选择GNU ARM C Linker->Miscellaneous,在右边的Other objects中加入${ProjDirPath}/railSdk121Source/librail_efr32xg1_gcc_release.a,注意,没有引号,此处的${ProjDirPath}与上面的${StudioSdkPath}一样,是Simplicity Studio的一个环境变量,它表示当前工程的根路径,此环境变量一般指的是Simplicity Studio的工作空间中的工程的路径,比如我这里它是E:\Works\SimplicityStudio\v4_workspace\TestProject,其中v4_workspace是当前的工作空间名称,TestProject是当前的MCU工程名称;若当前的MCU工程不在当前使用的工作空间中,则请使用绝对路径;
- 点击OK确定,然后再次打开Properties for xxx对话框,检查GNU ARM C Linker->Miscellaneous->Other objects栏中刚刚填入的内容有无包含引号,如有,则修改内容,将引号去掉即可(如果这里有引号,编译项目时会出错);
- 接着,选择GNU ARM C Compiler->Includes,在其中添加包含路径,这里将前面在MCU工程项目中新建的两个文件夹的路径填进去,分别为"${ProjDirPath}/railSdk121Config"、"${ProjDirPath}/railSdk121Source",注意,都有引号,与之前一样,若当前的MCU工程不在当前使用的工作空间中,则请使用绝对路径;
- 最后,点击OK确认即可;若之后又在工程项目中新建了其他文件夹且存放了头文件,则需要将文件路径添加到此处(Properties for xxx对话框->Settings->ToolSettings->GNU ARM C Compiler->Includes),完成后如图14所示。
图14、添加完头文件搜索路径后的MCU工程属性界面
到此,整个项目的创建就结束了。此时,可以直接编译MCU工程(TestProject),如果编译无错误提示,则项目的创建是无问题的;如果编译出错,则检测是否在创建工程或配置工程的哪个环节出错了。
7、5.2.2.0版本的MCU的SDK中USART的使用问题
在使用USART时,根据EFR32FG1x的Datasheet描述,em_usart.c中的波特率设置函数有问题,所以在使用前请先修改em_usart.c中的第497~499行,这3行位于函数
void USART_BaudrateSyncSet(USART_TypeDef *usart, uint32_t refFreq, uint32_t baudrate)
将第497~499这3行修改为以下内容:
float clkFactor = refFreq; clkFactor = 256 * (clkFactor / (2 * baudrate) - 1); clkdiv = (uint32_t)clkFactor & 0xFFFFFFF8;
8、解决使用JTAG仿真调试时经常失败的问题
在编译项目时,若经常遇到仿真时仿真失败的情况,此时只需要修改em_cmu.c中函数
void CMU_HFXOInit(const CMU_HFXOInit_TypeDef *hfxoInit)
的第2、3行语句(在em_cmu.c文件的第4511、4512行)为以下内容即可:
if (BUS_RegBitRead(&CMU->STATUS, 2) && CMU_ClockSelectGet(cmuClock_HF) != cmuSelect_HFXO) { CMU_OscillatorEnable(cmuOsc_HFXO, false, true); }