3772|4

104

帖子

0

TA的资源

一粒金砂(中级)

楼主
 

【LPC54100】万利板子双核blinky [复制链接]

本帖最后由 guo8113 于 2015-4-12 22:16 编辑

     今晚基于LPC54xxx LPCXpresso中的DualCore例子,稍加修改,在万利的板子上顺利跑通。附件为工程。

     做了一年左右的TMS320DM8168异构多核(ARM cortex-A8+DSP+M3+M3),发现cortex系列的多核也就这个样子,相当于单芯片集成了两个MCU,共用一套外设,有个mailbox可以用核间中断传递32位数据,然后再加个mutex用于共享地址的互斥。相比于带MMU的异构多核应用要方便简单的多。

     双核通信的机制有人在论坛介绍了,不再啰嗦。只写Keil写双核程序的步骤:AN11609资料也有讲。

     1.建立M0+的工程,配置其ROM,RAM:



   2.在“user”自定义编译等工具中使用以下命令,将生成的m0+的axf(arm可执行文件)文件转为C数组(这里采用双核烧写一个镜像的形式运行)。

fromelf --cadcombined --output="\M0_image_array.c" "\CM0_RAM.axf”



3.编写m0+代码啦,

需要使用mailbox了,主要就是开中断,写中断响应函数。注意,mailbox模块只需要在一个核中进行初始化,一般先启动的核初始化mailbox,并为另一个核(m0+)设置程序入口,允许时钟,启动运行。
所以,在m0+中没有初始化mailbox。
  1. static void MAILBOX_mutexWait(void) {
  2.   while (LPC_MAILBOX->MUTEX == 0) __NOP();      /* Wait forever for mutex     */
  3. }
  4. static void MAILBOX_mutexRelease(void) {
  5.   LPC_MAILBOX->MUTEX = 1;                       /* release mutex              */
  6. }
  7.   NVIC_EnableIRQ(MAILBOX_IRQn);                 /* Enable mailbox interrupt   */
  8. ///////中断服务程序
  9.   void MAILBOX_IRQHandler(void) {
  10.        pledState = (uint32_t *)LPC_MAILBOX->IRQ0;    /* get address of ledState    */
  11.         MAILBOX_mutexWait();
  12.         // 对共享的地址处数据进行操作
  13.         MAILBOX_mutexRelease();
  14.         LPC_MAILBOX->IRQ0CLR = 0xFFFFFFFF;            /* Clear own mailbox          */
  15.         LPC_MAILBOX->IRQ1SET = 1;                     /* Signal change to M4        */
  16. }
复制代码

4.编译,会将其可执行文件转为.c文件,这个文件是需要被m4核的程序包含进去的。

5.新建M4核的工程,包含m0+的执行文件转换成的.c文件。

6.编写M4程序

需要对mailbox进行初始化。

  1. static void MAILBOX_Initialize(void) {

  2.   LPC_SYSCON->AHBCLKCTRL0    |= (1ul << 26);    /* Enable clock for Mailbox   */
  3.   LPC_SYSCON->PRESETCTRLSET0  = (1ul << 26);    /* assert reset for Mailbox   */
  4.   LPC_SYSCON->PRESETCTRLCLR0  = (1ul << 26);    /* deassert reset for Mailbox */

  5.   MAILBOX_mutexRelease();
  6. }
复制代码
然后同m0+核,对mailbox操作。
  1. NVIC_EnableIRQ(MAILBOX_IRQn);                 /* Enable mailbox interrupt   */
复制代码

另外还要在M4中规定ROM,RAM地址,以及规定m0+链接时的地址,并启动m0+



规定M0+程序的地址:

  1. #define M0plus_IMAGE_START    0x20000   /* address where the M0+ Image is located in the flash */

  2. const __attribute__((at(M0plus_IMAGE_START)))
  3. #include "CM0plus_Image.c"
复制代码
启动M0+核:

  1.   /* Boot M0+ core */
  2.   /* Setup M0+ stack pointer and  reset vector ( from M0+ flash image) */
  3.   LPC_SYSCON->CPSTACK = (*(uint32_t *)(M0plus_IMAGE_START + 0));
  4.   LPC_SYSCON->CPBOOT  = (*(uint32_t *)(M0plus_IMAGE_START + 4));

  5.   /* Enable M0+ clock and perform M0+ reset */
  6.   LPC_SYSCON->CPUCTRL |= ((0xC0C4ul << 16) |
  7.                           (     1ul <<  3)  );                     /* enable M0+ clock   */
  8.   LPC_SYSCON->CPUCTRL |= ((0xC0C4ul << 16) |
  9.                           (     1ul <<  5)  );                     /* assert M0+ reset   */
  10.   LPC_SYSCON->CPUCTRL  = ((0xC0C4ul << 16) |
  11.                           (LPC_SYSCON->CPUCTRL & ~(1ul << 5)));    /* deassert M0+ reset */
复制代码


7.编译,烧写。完事。


ps:第一次发帖,如有遗漏,尽情谅解。

daulcore.zip

1.38 MB, 下载次数: 32

此帖出自NXP MCU论坛

最新回复

不错,学习了…  详情 回复 发表于 2015-4-14 12:19
点赞 关注(1)
 

回复
举报

2002

帖子

24

TA的资源

五彩晶圆(高级)

沙发
 
之前没接触过双核,觉得蛮复杂的,楼主水平很高,能开个课就好了。请教一下,两个核心是并发运行的还是交替工作的,如果是同时运行,怎么确保数据或硬件端口操作的安全性。比如一个核心怎么知道另一个核心有没有在使用串口0
此帖出自NXP MCU论坛

点评

两个核可以认为是俩单片机,并行运行。对于总线(外设)的同时访问,由总线仲裁完成。当然设计时要规划好,此核不能跑到彼核的代码或内存上去了,除非你的意图就是如此。  详情 回复 发表于 2015-4-13 10:58
 
 
 

回复

104

帖子

0

TA的资源

一粒金砂(中级)

板凳
 
shower.xu 发表于 2015-4-13 00:02
之前没接触过双核,觉得蛮复杂的,楼主水平很高,能开个课就好了。请教一下,两个核心是并发运行的还是交替工作的,如果是同时运行,怎么确保数据或硬件端口操作的安全性。比如一个核心怎么知道另一个核心有没有在使用串口0

两个核可以认为是俩单片机,并行运行。对于总线(外设)的同时访问,由总线仲裁完成。当然设计时要规划好,此核不能跑到彼核的代码或内存上去了,除非你的意图就是如此。
此帖出自NXP MCU论坛
 
 
 

回复

6

帖子

0

TA的资源

一粒金砂(初级)

4
 
不错啊。。。。
此帖出自NXP MCU论坛
 
 
 

回复

862

帖子

2

TA的资源

纯净的硅(初级)

5
 
不错,学习了…
此帖出自NXP MCU论坛
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/9 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表