本帖最后由 海洋无限 于 2020-9-30 21:25 编辑
今天搭建开发板开发环境,keil+JLink,其实论坛很多 人都写过了,坑也填的差不多了,这里就不多废话了,我搭建和顺利,基本没出现什么问题。这里只说一个我踩到的雷,估计大多数人都碰不到。对一个自己之前没有用过的开发板,搭建工程时,我不太喜欢使用提供的Project Sample,一般我都会从头搭建,顺便熟悉下库文件及文件放置的规律。我是在官网上下载的资料,开始搭建,同时为了驱动LCD,我也下载了论坛上的驱动LCD的样例程序,这里犯了一个严重的错误,CPU相关的库文件及配置文件我在搭建时混着用了,编译出错了,然后我用BC进行了对比,发现库文件中的定义不同,如下:
当时没反应过来,我就编译了下LCD的代码,OK,心里想不会是官方的例程编不过吧,对比了两个库文件下的readme,才发现官网的比较新,这才意识到文件混用了,马上改正后编译顺利通过,这里浪费了一些时间,这里建议大家直接用官网的例程就可以了,不会出现我出现的问题,这里是个小插曲。
言归正传,按照例程copy LED代码,使能System tick定时器,驱动LED闪烁,写Key读取代码(这里是单个按键,矩阵按键准备等下次再弄)并驱动LED闪烁,
#define LED0_PORT (PortE) // LED1
#define LED0_PIN (Pin06)
#define LED1_PORT (PortA) // LED2
#define LED1_PIN (Pin07)
#define LED2_PORT (PortB) // LED3
#define LED2_PIN (Pin05)
#define LED3_PORT (PortB) // LED4
#define LED3_PIN (Pin09)
/* LED0~3 toggle definition */
#define LED0_TOGGLE() (PORT_Toggle(LED0_PORT, LED0_PIN))
#define LED1_TOGGLE() (PORT_Toggle(LED1_PORT, LED1_PIN))
#define LED2_TOGGLE() (PORT_Toggle(LED2_PORT, LED2_PIN))
#define LED3_TOGGLE() (PORT_Toggle(LED3_PORT, LED3_PIN))
static void SysClkInit(void)
{
en_clk_sys_source_t enSysClkSrc;
stc_clk_sysclk_cfg_t stcSysClkCfg;
stc_clk_xtal_cfg_t stcXtalCfg;
stc_clk_mpll_cfg_t stcMpllCfg;
MEM_ZERO_STRUCT(enSysClkSrc);
MEM_ZERO_STRUCT(stcSysClkCfg);
MEM_ZERO_STRUCT(stcXtalCfg);
MEM_ZERO_STRUCT(stcMpllCfg);
/* Set bus clk div. */
stcSysClkCfg.enHclkDiv = ClkSysclkDiv1; // Max 168MHz
stcSysClkCfg.enExclkDiv = ClkSysclkDiv2; // Max 84MHz
stcSysClkCfg.enPclk0Div = ClkSysclkDiv1; // Max 168MHz
stcSysClkCfg.enPclk1Div = ClkSysclkDiv2; // Max 84MHz
stcSysClkCfg.enPclk2Div = ClkSysclkDiv4; // Max 60MHz
stcSysClkCfg.enPclk3Div = ClkSysclkDiv4; // Max 42MHz
stcSysClkCfg.enPclk4Div = ClkSysclkDiv2; // Max 84MHz
CLK_SysClkConfig(&stcSysClkCfg);
/* Switch system clock source to MPLL. */
/* Use Xtal32 as MPLL source. */
stcXtalCfg.enMode = ClkXtalModeOsc;
stcXtalCfg.enDrv = ClkXtalLowDrv;
stcXtalCfg.enFastStartup = Enable;
CLK_XtalConfig(&stcXtalCfg);
CLK_XtalCmd(Enable);
/* MPLL config. */
stcMpllCfg.pllmDiv = 1u;
stcMpllCfg.plln =42u;
stcMpllCfg.PllpDiv = 2u;
stcMpllCfg.PllqDiv = 2u;
stcMpllCfg.PllrDiv = 2u;
CLK_SetPllSource(ClkPllSrcXTAL);
CLK_MpllConfig(&stcMpllCfg);
/* flash read wait cycle setting */
EFM_Unlock();
EFM_SetLatency(EFM_LATENCY_5);
EFM_Lock();
/* Enable MPLL. */
CLK_MpllCmd(Enable);
/* Wait MPLL ready. */
while(Set != CLK_GetFlagStatus(ClkFlagMPLLRdy))
{
;
}
/* Switch system clock source to MPLL. */
CLK_SetSysClkSource(CLKSysSrcMPLL);
}
#define ACTIVE_LEVEL_LOW (0)
#define ACTIVE_LEVEL_HIGH (1)
#define KEY_ACTIVE_LEVEL ACTIVE_LEVEL_LOW
#define KEY_PORT (PortD)
#define KEY1_PIN (Pin03)
#define KEY2_PIN (Pin04)
#define KEY3_PIN (Pin05)
#define KEY4_PIN (Pin06)
然后编译,烧写后看到开发板Green LED 灯周期闪烁,Blue LED 在SW2每按下一次状态翻转一次,收工。
|