前言:EFR32芯片开发工具主要有两个,Simplicity Studio、IAR FOR ARM。个人习惯和不喜欢Simplicity Studio代码生成工具生成许多没有作用的文件和代码原因,采用IAR作为开发工具。
1. 开发文件准备:在工程目录下建立CMSIS文件夹
1.1复制软件Simplicity Studio安装目录的emlib文件夹到工程目录SimplicityStudio\v4\developer\sdks\gecko_sdk_suite\v2.2\platform\emlib
1.2复制EFR32FG1P文件夹到工程目录CMSIS文件夹下
SimplicityStudio\v4\developer\sdks\gecko_sdk_suite\v2.2\platform\Device\SiliconLabs\EFR32FG1P
1.3复制Include文件夹到工程目录CMSIS文件夹下
SimplicityStudio\v4\developer\sdks\gecko_sdk_suite\v2.2\platform\CMSIS\Include
1.4工程目录下建立BSP、USER文件夹,如下图所示:
2. IAR建立工程
2.1选取对应型号,如下图
2.2 在工程目录中添加main.c和CMSIS\EFR32FG1P\Source下的system_efr32fg1p.c和CMSIS\EFR32FG1P\SourceIAR下的startup_efr32fg1p.s文件,并添加库函数到工程中,如下图
2.3 工程头文件路径添加,并添加全局宏定义EFR32FG1P132F128GM48 如下图所示
$PROJ_DIR$\USER
$PROJ_DIR$\CMSIS\EFR32FG1P\Include
$PROJ_DIR$\CMSIS\Include
$PROJ_DIR$\emlib\inc
3.正式编写程序
/**
******************************************************************************
* @file main.c
* @author Garen
* @version V1.0.0
* @date 2018-05-21
* @brief 程序入口main函数所在文件
*
******************************************************************************
*/
/* Includes ------------------------------------------------------------------*/
#include "em_chip.h"
#include "em_cmu.h"
#include "em_emu.h"
#include "em_gpio.h"
/* extern variables ---------------------------------------------------------*/
/* Private typedef -----------------------------------------------------------*/
/* Private define ------------------------------------------------------------*/
/* Private macro -------------------------------------------------------------*/
/* Private variables ---------------------------------------------------------*/
/* Private function prototypes -----------------------------------------------*/
/* Private functions ---------------------------------------------------------*/
/**
* @brief 时钟初始化
* @retval None
*/
void BSP_ClocksInit(void)
{
// Device errata
CHIP_Init();
// Initialize the system clocks //时钟采用外部晶振38.4M
CMU_HFXOInit_TypeDef hfxoInit = CMU_HFXOINIT_DEFAULT;
CMU_HFXOInit(&hfxoInit);
SystemHFXOClockSet(38400000UL);
// Enable HFXO oscillator, and wait for it to be stable
CMU_OscillatorEnable(cmuOsc_HFXO, true, true);
// Use HFXO as high frequency clock
CMU_ClockSelectSet(cmuClock_HF, cmuSelect_HFXO);
// HFRCO not needed when using HFXO
CMU_OscillatorEnable(cmuOsc_HFRCO, false, false);
CMU_ClockSelectSet(cmuClock_LFA, cmuSelect_LFRCO);
CMU_ClockSelectSet(cmuClock_LFB, cmuSelect_LFRCO);
CMU_ClockSelectSet(cmuClock_LFE, cmuSelect_LFRCO);
// Default to LFRCO, it's the only option always present,
// the code below will pick a better option if available
CMU_Osc_TypeDef lowFrequencyClockSource = cmuOsc_LFRCO;
CMU_Select_TypeDef lowFrequencyClockSelect = cmuSelect_LFRCO;
if (CMU->STATUS & CMU_STATUS_LFXOENS)
{
lowFrequencyClockSource = cmuOsc_LFXO;
lowFrequencyClockSelect = cmuSelect_LFXO;
}
// Enable necessary clocks and set clock selections
CMU_ClockEnable(cmuClock_CORELE, true);
CMU_OscillatorEnable(lowFrequencyClockSource, true, true);
CMU_ClockSelectSet(cmuClock_LFA, lowFrequencyClockSelect);
CMU_ClockSelectSet(cmuClock_LFB, lowFrequencyClockSelect);
CMU_ClockSelectSet(cmuClock_LFE, lowFrequencyClockSelect);
}
/**
* @brief 初始化led对应的IO
* @retval None
*/
void BSP_LedInit(void)
{
CMU_ClockEnable(cmuClock_HFPER, true);
CMU_ClockEnable(cmuClock_GPIO, true);
GPIO_PinModeSet(gpioPortC,11, gpioModePushPull, 1);
}
/**
* @brief 点亮LED
* @retval None
*/
void BSP_LedOn(void)
{
GPIO_PinOutClear(gpioPortC, 11);
}
/**
* @brief 程序总入口main()函数
* @retval int
*/
int main(void)
{
//Initialize the system clocks
BSP_ClocksInit();
// Initialize the LEDs on the board
BSP_LedInit();
//led on
BSP_LedOn();
while(1)
{
}
}