点亮LED
参考demo从头点亮LED。
1.新建项目
Start 后新建项目(Create New Project),选空的C项目
编译烧录步骤如下,参考帖子 【EFM8BB52单片机】+假装开箱+Blink
烧录之后,点击 reset, lED0肯定是熄灭的,因为什么也没写。
2. 点灯还需要初始化?
main方法中加上下面代码,LED灯就会亮
enter_DefaultMode_from_RESET(); // 初始化
P1_B4 = 1; // 亮灯
这个初始化函数是从demo中拿的,如果没有初始化LED是不会亮的。P1_B4是头文件中已经定义好的P1.4口。
现在来看看函数中做了什么初始化工作
void enter_DefaultMode_from_RESET(void) {
// $[Config Calls]
// Save the SFRPAGE
uint8_t SFRPAGE_save = SFRPAGE;
WDT_0_enter_DefaultMode_from_RESET(); // 看门狗初始化
PORTS_1_enter_DefaultMode_from_RESET(); // 端口初始化
PBCFG_0_enter_DefaultMode_from_RESET(); // 配置
TIMER16_2_enter_DefaultMode_from_RESET(); // 定时器
INTERRUPT_0_enter_DefaultMode_from_RESET(); // 中断
// Restore the SFRPAGE
SFRPAGE = SFRPAGE_save;
// [Config Calls]$
}
测试了下,五个方法中,第2-3个方法加上就可以点亮LED灯了。第二个是端口初始化,第三个不太清楚,里面配置了 XBR2 (XBR2 - Port I/O Crossbar 2 ?)如果不加第三个方法,LED也会亮,亮度很低。
LED 灭-微亮-亮:
优化了下代码,有了最简点灯程序:
#include <SI_EFM8BB52_Register_Enums.h> // SFR declarations
//-----------------------------------------------------------------------------
// SiLabs_Startup() Routine
// ----------------------------------------------------------------------------
// This function is called immediately after reset, before the initialization
// code is run in SILABS_STARTUP.A51 (which runs before main() ). This is a
// useful place to disable the watchdog timer, which is enable by default
// and may trigger before main() in some instances.
//-----------------------------------------------------------------------------
void SiLabs_Startup (void)
{
}
int main (void)
{
P1MDIN = P1MDIN_B4__DIGITAL; // 设置 P1.4 输入模式
P1MDOUT = P1MDOUT_B4__PUSH_PULL; // 设置 P1.4 输出模式
XBR2 = XBR2_XBARE__ENABLED; // 启用 Crossbar
P1_B4 = 1; // 点亮 LED0
while (1) {}
}
注:如果没有 SiLabs_Startup() 方法,编译会出错 make: *** [makefile:31: xxxxxx.omf] Error 1。