嵌入式教程中LED灯以及程序教程中的”Hello world”都有其特殊的意义,意味着入门。此处以LED灯驱动介绍LPC5411x的工程开发流程。
1. 官网资料
从 www.nxp.com 下载对应的LPC5411x开发资料,主要是芯片用户数据手册以及对应芯片的软件开发包(sdk),选择针对MDK平台,对应芯片为LPC54114J256,下载SDK_2.2.1_LPC54114J256.zip。软件包里包含了芯片驱动,板级应用示例,移植好的第三方软件等等,具有非常重要的参考价值。
万利的LPC5411x开发板使用了板载的调试器,基于LPC11U35芯片,也可以从NXP官网下载对应LPC11U35的调试器固件以及虚拟串口驱动,对应的下载文件为LPC11Uxx-Debug-Probe-VCOM.zip。可以通过按住复位键,连接调试器usb(CN1),把下载文件中的固件firmware.bin替换掉开发板原来的固件,即可实现更新。
2. MDK工程
下载的软件开发包是基于MDK5的,里面的工程例程可以通过MDK5直接打开。sdk包中包含了devices/LPC54114文件夹,该文件夹包含了外设驱动源码、LPC54114的启动代码、链接文件等等,这部分的源码是工程开发的基础,应加入到工程。此处以MDK4介绍LPC5411x开发工程的完整搭建。
a 新建工程
选择Cortex-M4 FPU。
b 创建目录
按照sdk目录,创建LCP54114、LCP54114/utilities、LCP54114/arm、LCP54114/drivers目录存放sdk源码。其中LPC54114目录存放设备特定配置代码system_LPC54114_cm4.c,LCP54114/utilities目录存放串口调试工具代码fsl_debug_console.c,LCP54114/arm目录存放LPC54114启动代码startup_LPC54114_cm4.s和功耗控制库文件keil_lib_power.lib,LCP54114/drivers目录存放LPC54114芯片外设驱动代码。
c 添加代码
加入用户代码,创建Apps目录,从sdk中拷贝board.c、clock_config.c、pin_mux.c这三个板级代码到Apps目录。NXP的sdk板级代码中,把板级初始化代码放在board.c,把时钟配置代码放在clock_config.c,把引脚配置代码放在pin_mux.c中。在Apps目录中加入main.c,实现LED灯的闪烁驱动。
main.c的LED闪烁驱动源码如下
#include "board.h"
#include "fsl_debug_console.h"
#include "fsl_gpio.h"
#include "pin_mux.h"
#include <stdbool.h>
__asm void Delay_ms(unsigned int nCount)
{
0
ldr r1, =24000 // arm clock = 96000000hz
1
subsr1, r1, #1
bne %B1
subsr0, r0, #1
bne %B0
bx lr
}
int main(void)
{
uint32_tport_state = 0;
/* Define theinit structure for the output LED pin*/
gpio_pin_config_t led_config = {
kGPIO_DigitalOutput, 0,
};
/* Board pin,clock, debug console init */
/* attach 12MHz clock to FLEXCOMM0 (debug console) */
CLOCK_AttachClk(BOARD_DEBUG_UART_CLK_ATTACH);
/* enable clockfor GPIO*/
CLOCK_EnableClock(kCLOCK_Gpio0);
CLOCK_EnableClock(kCLOCK_Gpio1);
BOARD_InitPins();
BOARD_BootClockFROHF96M();
BOARD_InitDebugConsole();
/* Print a noteto terminal. */
PRINTF("\r\n GPIO Driver example\r\n");
/* Init outputLED GPIO. */
GPIO_PinInit(GPIO, 0, 15, &led_config);
GPIO_WritePinOutput(GPIO, 0, 15, 0);
GPIO_PinInit(GPIO, 0, 19, &led_config);
GPIO_WritePinOutput(GPIO, 0, 19, 0);
GPIO_PinInit(GPIO,0, 21, &led_config);
GPIO_WritePinOutput(GPIO, 0, 21, 0);
GPIO_PinInit(GPIO, 0, 22, &led_config);
GPIO_WritePinOutput(GPIO, 0, 22, 0);
GPIO_PinInit(GPIO, 0, 25, &led_config);
GPIO_WritePinOutput(GPIO, 0, 25, 1);
GPIO_PinInit(GPIO,0, 26, &led_config);
GPIO_WritePinOutput(GPIO, 0, 26, 1);
GPIO_PinInit(GPIO, 0, 29, &led_config);
GPIO_WritePinOutput(GPIO, 0, 29, 1);
GPIO_PinInit(GPIO, 0, 30, &led_config);
GPIO_WritePinOutput(GPIO, 0, 30, 1);
while (1) {
GPIO_TogglePinsOutput(GPIO,0, 1u << 15);
GPIO_TogglePinsOutput(GPIO,0, 1u << 21);
GPIO_TogglePinsOutput(GPIO,0, 1u << 25);
GPIO_TogglePinsOutput(GPIO,0, 1u << 29);
Delay_ms(1000);
GPIO_TogglePinsOutput(GPIO,0, 1u << 19);
GPIO_TogglePinsOutput(GPIO,0, 1u << 22);
GPIO_TogglePinsOutput(GPIO,0, 1u << 26);
GPIO_TogglePinsOutput(GPIO,0, 1u << 30);
Delay_ms(1000);
}
}
d 生成二进制代码
工程设置编译完成后用fromelf命令生成二进制可执行代码firmware.bin,LPC5411x在启动时会对用户代码进行校验,只有合法的镜像才会执行,用checksum.exe对MDK编译生成的firmware.bin进行校验和的更正,用于二进制可执行代码的直接烧录。
e 配置选项
工程设置编译器选项,预定义CPU_LPC54114J256BD64_cm4,用于sdk源码的编译要求,加入头文件定义,用–c99进行编译。
f 工程设置链接器,用LPC54114J256_cm4.scf分散加载文件。
g 工程设置调试器/烧录器,LPC54110开发板板载了CMSIS-DAP调试器。
对CMSIS-DAP Debugger进行设置
代码烧录设置,把LPC5411x_256.FLM烧录文件拷贝到MDK4安装目录\ ARM\Flash下,在Add选项下选择LPC5411x IAP 256kB Flash,其中LPC5411x_256.FLM为LPC5411x的IAP烧录代码实现,源码可以参考附件。设置好后,可以直接在MDK4下用调试器直接烧录代码。
h 编译,成功后会在工程目录生成可以直接烧录运行的二进制可执行代码firmware.bin。
3. 烧录运行
设置好调试器烧录后,可以用烧录器直接下载代码并运行。
设置成usb启动,连接CN3,LPC5411x的usb通讯口,ISP会虚拟出一个存储设备(LPC5411x内部flash),里面有一个firmware.bin的文件,即为用户程序,可以把firmware.bin文件删除,重新把新的用户程序firmware.bin拷贝到存储设备中。设置成flash启动,重新上电即可运行更新的代码。
设置成串口启动,配合NXP提供的FlashMagic工具,用串口进行代码下载。
4. 附录
此处以MDK4简单介绍LPC5411x工程开发的搭建过程,这对于其他编译集成环境(IAR、GCC等)都是类似的。
附件为基于MDK5的LPC54114J256官方sdk源码包SDK_2.2.1_LPC54114J256.zip,板载调试器官方固件以及串口驱动包LPC11Uxx-Debug-Probe-VCOM.zip,LPC5411x的IAP烧录源码工程以及烧录文件LPC5411x_256.FLM,基于MDK4的LED灯驱动工程,LPC5411x镜像校验码生成工具checksum.exe的win32源码。
源码:https://pan.baidu.com/s/1qXJDMlm