开发板使用的LPC54114芯片,是基于 ARM® Cortex®-M4内核而构建,具有可选的Cortex®-M0+协处理器,兼备高性能和低功耗特性,让您能够尽享先进集成带来的各种优势,以及极致灵活的连接特性。 LPC5411x的系统框架
主要特点:
LPC5411x有单核和双核选项。单核选项配置的CPU是Cortex®-M4,适用于那些无需软件分区的单核处理系统,而双核选项则增加了一个Cortex®-M0+作为协处理器,更加适合于始终开机应用。在这些应用中MCU能够以节电模式运行,侦听传入数据,并在侦听到传入数据时,唤醒任一内核,收集或处理信息。在主动模式下,为了优化功效和吞吐率,开发人员可以利用高功效的Cortex®-M0+内核执行数据收集、整合,以及系统任务管理,同时通过Cortex®-M4内核更加快速地执行传感器融合等计算密集型算法,实现低功耗目标。 双核架构:
为了确保Cortex-M4和Cortex-M0+两个内核可以独立运行,自由访问系统资源, LPC541xx把SRAM划分成了三个地址连续但是可以独立操作的区块以供CPU访问。 针对始终开机应用,该系列提供了多种低功耗常开的数字和模拟传感器,它们会时刻处于监听状态并可唤醒任意一个CPU内核或相关外设模块来做数据处理。例如芯片中配置的数字麦克风子系统(DMIC)在监听状态的功耗只有不到50uA。用户可以选择唤醒Cortex-M4内核处理数据密集型任务,也可以选择唤醒Cortex-M0+内核运行系统控制相关任务。 低功耗模式:
Cortex-M4出色的功率效率
通过选择性为SRAM 供电来降低功耗
以上内容来源于网络查找资料。 实现双核通讯,就要了解双核的开发、启动、通讯和互斥等方方面面。 首先到NXP官网下载SDK包SDK_2.2.1_LPCXpresso54114,通过SDK包中的例程来学习。 在SDK的boardslpcxpresso54114mul ticore_exampleshello_world下有一个hello world的例程,下面有两个文件,一个M0的,一个是M4的。 每个文件都是一keil建立的工程,都可以单独编译,但是如果你先打开hello_worldcm4mdk这个M4的工程先编译的话,将出错,原因是没有M0生成的core1_image.bin,看到这个错误,大家可能已经想到,这个bin文件应该就是M0的运行文件。不错,我首先必须编译M0,生成core1_image.bin这个文件。 为了方便项目管理,我们把M0和M4两个工程天加到一个工作空间中。 首先打开一个工程下的后缀为.uvmpw的文件,打开后
在WorkSpace上右键。
点击弹出的对话
可以点击增加和删除来管理项目。 通过这样我们把M0和M4的两个工程添加到了一个工作空间中了。 你需要编译和操作那个工程,就在那个工程上右键
会弹出对话框,点击Set as Active Project。就激活了当前项目,没有激活的很多是操作不了的。 既然M4工程中需要调用MO编译的bin文件,那么keil怎么生成bin文件呢? 在 Realview MDK 的集成开发环境中,默认情况下可以生成 *.axf 格式的调试文件和 *.hex 格式的可执行文
件。虽然这两个格式的文件非常有利于 ULINK 仿真器的下载和调试 ,但是在很多情况下还是需要bin文件。那么 Realview MDK 集成开发环境有他的优势,可以将 *.axf 格式文件或 *.hex 格式文件转换成 *.bin 。 在 Realview MDK 中, 生成 *.bin 格式文件的工具是 ARM 公司的 RVCT 开发套件中的 fromelf.exe 。默认安装下,它 位 于 C : KeilARMBIN40 文件 夹 下。
构选 After Build/Rebuild 框 中的 Run #1 多选框 ,在 后边 的文本 框 中 输 入
C:KeilARMBIN31fromelf.exe --bin -o ./bin/test.bin ./test.axf 命令 行 。重新编译 文件,在 ./bin/ 文件 夹 下生成了 test.bin 文件。 fromelf.exe 转换工具的 语 法格式 如 下
例程中添加的是: $KARMARMCCbinfromelf.exe --bincombined --bincombined_base=0x20010000 --output=$Lcore1_image.bin !L 生成bin文件主要是M0的工程中设置。M0的工程弄好之后,就开始设置M4了。 在m4工程中incbin.s中应用了core1_image.bin文件。
在main文件中
可以看到是0x20010000是我们在M0中生成bin文件时定义的基地址。 现在我们来分析一下源码,使用的NXP官方的SDK例程,而我们的开发板是万利提供的,所以硬件是不同的。所以注意硬件初始化。 首先分析M0的源码:main函数在hello_world_core1.c中 根据硬件
修改LED对应的引脚,定义红灯为LED0,绿灯为LED7
定义好之后M0就是红灯闪烁。 M4源码:主函数在hello_world_core0.c文件中。 按键:
get_core1_image_size函数是获取M0工程中bin文件的大小,然后拷贝到#define CORE1_BOOT_ADDRESS (void *)0x20010000定义的RAM地址中。 初始化启动M0 MCMGR_StartCore(kMCMGR_Core1, CORE1_BOOT_ADDRESS, 1, kMCMGR_Start_Synchronous);
然后通过按键来实现启动和关闭M0核。 编译下载之后就可以看到效果了。 通过终端可以看到运行状态: 启动
此时LED0开始闪烁。 按下PB2键
LED0停止闪烁。 按下PB3键
LED0又开始闪烁。 到这里就可以正常启动和关闭M0核了。 在M0中把几个红色的LED灯都初始化一下,不然一直处于微亮状态,挺烦躁的。
接下来就是双核通讯了。 M0与M4之间通讯,API函数提供了邮箱的方式进行通讯。 这里实现M4将数据传输给M0,M0通LED显示出来,并将相同的数据传输到M4,M4通终端打印出来。 在M0和M4的程序中 添加邮箱头文件#include "fsl_mailbox.h" 使用邮箱必须先初始化并使能邮箱中断: MAILBOX_Init(MAILBOX); NVIC_EnableIRQ(MAILBOX_IRQn); 编写M0函数: M0邮箱中断函数:
在main中while下添加
根据收到的数据显示对应LED灯,并返回收到的值。 编写M4函数: M4邮箱中断函数:
在main中while下添加
循环发生1到4.
LED也在循环点亮。 需要注意的是flatform.c中已经定义邮箱中断函数MAILBOX_IRQHandler,需要把这里屏蔽掉。 双核通讯实现了跑马灯。
|