本帖最后由 小马哥-1650185 于 2017-7-2 11:30 编辑
相信小伙伴们看了 小马哥 的帖子 【LPC54114双核任务二】双核之从零开始--#KEIL工程建立配置# 已经熟悉了双核平台的搭建了吧。。
亲们看完多多支持下。。。
接着上个帖子,下面详解工程配置,编译,仿真,测试。
现在我们打开双核工程,会发现这个sdk中的一些外设 和我们手上的板子 gpio不对应,前面也有人将结果需要修改一下代码,,我这里按照小马哥自己的思路在详细说下吧。 万利的LPC54114开发板上带有8个用户可以控制的LED灯(4绿4红)LD4/LD5/LD6/LD7是绿灯,低电平点亮,LD8/LD9/LD10/LD11是红灯,高电平点亮,和4个用户按键输入,按键按下IO口检测到的是低电平;
对应原理图
不喜欢看图的 我吧对应关系也列出来了
板子上的LED丝印对应IO口:
LD4<---> PIO0_30、
LD5<---> PIO0_29、
LD6<---> PIO0_26、
LD7<---> PIO0_25、
LD8<---> PIO0_22、
LD9<---> PIO0_21、
LD10<---> PIO0_19、
LD11<---> PIO0_15,
按键丝印对应IO口:
PB2<---> PIO1_8、
PB3<---> PIO1_9、
PB4<---> PIO1_10、
PB5<---> PIO1_11;
知道了这个关系,我们看工程文档的下面的图,红圈是需要修改的
修改成酱紫就可以了(注意 这个m0,,m4两个工程都要改的哦)
解释下吧:这里就是把 按键 和led 和lpc54114 板子上的外设对应起来而已。。。。
D:/360%E6%9E%81%E9%80%9F%E6%B5%8F%E8%A7%88%E5%99%A8%E4%B8%8B%E8%BD%BD/mgfzhh2011@163.com/5339bd77851e467597bcc8055682678b/7nhfffd3n08r.png
然后 看资料中的这句话
大概意思就是 首先变音M0工程,前提是需要设置下这行小字,目的是吧m0的镜像为.bin文件,方面在m4工程中的汇编模块中include一下。
具体怎么设置呢,其实工程里面已经设置ok了,我们也来看下吧
首先 选择激活m0的工程,点开target配置框,见下图1,,2,,3,,
这里主要就是 配置MDK 生产BIN文件的。
$K\ARM\ARMCC\bin\fromelf.exe --bincombined --bincombined_base=0x20010000 --output=$Lcore1_image.bin !L
关于这里,我会另外开贴解释mdk生bin的方法。
【LPC54114双核任务二】双核之从零开始--#mdk生bin#
这里的基地址和文件名很重要,和后面m4工程有关联。后面我会讲到。。。。这里就解释了文档中的
然后编译m0核就可以生成bin了。这个bin m4核会调用的。
这里简单说明一下,原m0工程主循环里面就做了一件事,翻转led11,也就是说M0核启动的话LED11会blind,m0核释放的话led11 灭掉.
当然 要想加别的什么功能也是可以的,亲民自己摸索吧,这里只讲思路,流程,原理,授渔才是关键。。。后面我会在开贴加功能。
代码摘要:
- while (1)
- {
- delay();
- LED_TOGGLE();
- }
复制代码- #define LED_INIT() GPIO_PinInit(GPIO, BOARD_LED_RED_GPIO_PORT, BOARD_LED_RED_GPIO_PIN, &led_config);
- #define LED_TOGGLE() GPIO_TogglePinsOutput(GPIO, BOARD_LED_RED_GPIO_PORT, 1u << BOARD_LED_RED_GPIO_PIN);
复制代码
。。。。。。。。。。喝水中 。。。。。。。。。。。。。。。。。。
上面M0的基本上讲完了,下面开始重点M4工程,会复杂点哦
首先激活选中m4工程,这个不会的看上面激活m0工程的方法。
先看文档吧,仔细看了英文文档既美丽有温柔,表达的很清楚哈
跟着节奏1,,2,,3,,4。。。。
这里需要把刚才的bin文件添加到m4 工程中,当然是汇编啦,格式参考已经给出来了。直接添加就是了
具体体现呢,m4工程已经加好了,文件路径,内容看下图,是不是在这里发现了 m0生成的core1_image.bin文件,很神奇吧。。。这个核文档里面稍微有些区别,明白什么意思就行,自己举一反三么。。。。
然后就是添加类似框4的代码了,原m4工程hello_world_core1.c文件中, 如下图
这里是不是神奇的见到了 m0生成bin 时候配置的那个地址 0x20010000,这就对应上了
到此 双核工程的链接 已经讲完了,亲们好好消化下吧。
然后就可以编译M4工程,烧录下载了,先看下串口打印的结果吧
框1 是初始化信息,框2是按键按下的信息,,,这里纠正一下,按下PB2停止M0的时候,led11 不会闪烁,但有可能常亮 或者常灭,因为关闭m0核心的时候,没有对led11 的gpio 做任何处理,大家知道就行了。。。
第一个红框是初始化 串口打印的信息。。。第二个是按键按下打印的
下面看下m4 的main函数吧
灯闪烁的的效果,就不上图了,亲们可以自己实测哦。。。
后面还有几点需要提醒下:
1.编译烧写m4工程后 程序是从m4核启动的,程序是只想m4的main函数的。下面这个图
2. debug中 如果 复位cpu,会出现这样的情况
到此为止,M4的debug已经 ok了,,,,啥 ???是不是忘了m0核的 debug,,,,没没没,,不急麽,下面讲,,,,
啥,都凌晨1点了,还不急,明天上班找抽啊,,,哎,,帖子已写不可收拾,,亲们多体谅下,给点鼓励,,,小马哥可是冒着明天上班迟到,打瞌睡,被罚钱的风险呢,为了亲们 快速上手也是拼了
////////////////好了 下面主要说下M0的 debug吧
先看文档这个图的流程,其实已经讲的很明白了
先退出m4的 debug吧,我们走进m0的工程看一看,就这么下图配置就行
然后这里需要添加一个脚本文件
点下edit ,复制文档代码到这个.ini文件,如下图
脚本代码如下
- FUNC void Setup (void) {
- SP = _RDWORD(0x20020000); // Setup Stack Pointer
- PC = _RDWORD(0x20020004); // Setup Program Counter
- _WDWORD(0xE000ED08, 0x20020000); // Setup Vector Table Offset Register
- _WDWORD(0x40000220, 1<<4); // enable clock for SRAM2, M0+’s RAM
- }
- LOAD %L INCREMENTAL // Download
- Setup(); // Setup for Running
- g, main
复制代码
然后点ok保存 后,关闭target 窗口,直接debug,
好像没什么反应呀,什么也看不出来,不急不急,这时候按下PB3开启m0,程序就指到m0的 main函数了
然后就可以但不调试 m0了,看下图
Run一次,led11变化一次,是不是很神奇,M0和一样可以调试debug了。
最后 附上双核的相关API吧,下一步双核通信用的到的(照搬文档的)
- (M4, M0+) void MAILBOX_SetValue(MAILBOX_Type *base, mailbox_cpu_id_t cpu_id, uint32_t mboxData);
- Set (non-zero) value “mboxData” to CPU “cpu_id”, as well as trigger its MAILBOX IRQ
- (M4, M0+) uint32_t MAILBOX_GetValue(MAILBOX_Type *base, mailbox_cpu_id_t cpu_id);
- Get mailbox value of CPU “cpu_id”.
- (M4, M0+) void MAILBOX_ClearValueBits(MAILBOX_Type *base, mailbox_cpu_id_t cpu_id, uint32_t mboxClrBits);
- Clear mailbox value bits of CPU “cpu_id” masked by “mboxClrBits”, uses 0xFFFFFFFF to clear all bits.
- (M4, M0+) uint32_t MAILBOX_GetMutex(MAILBOX_Type *base);
- Get the H/W MUTEX value, in parallel MUTEX is hardware cleared, use this in a while loop to try lock MUTEX.
- (M4, M0+) void MAILBOX_SetMutex(MAILBOX_Type *base);
- Unlock/give the mutex. Must be called after code successfully lock the H/W MUTEX.
复制代码- (M4) void CPU_CM0pHoldReset(void);
- Hold M0+ in reset state
- (M4) void CPU_CM0pRelease(void);
- Release M0+ from reset state.
- (M4) void CPU_CM0pBoot(const uint32_t imgVecTab[2]);
- Fill the M0+ boot condition (MSP, Reset vector) and reset M0+, M0+ boot code will detect the boot condition and apply.
- (M4, M0+) void MAILBOX_IRQHandler(void);
- Mailbox IRQ handler, triggered by the other core writing non-zero to my mailbox register.
- (M4, M0+) #define mutexTake() while (MAILBOX_GetMutex(MAILBOX) == 0)\
- Try lock H/W MUTEX
- (M4, M0+) #define mutexGive() MAILBOX_SetMutex(MAILBOX)
- Unlock MUTEX
复制代码
好了,马上要睡觉了,亲们看完这个帖子 有没有思路了呢。。。
-----------------------小马哥系列之【LPC54114双核任务二】传送门--------------------
【LPC54114双核任务二】双核之从零开始--#KEIL工程建立配置#
【LPC54114双核任务二】双核之从零开始--#HelloWorld双核调试#
【LPC54114双核任务二】双核之从零开始--#MDK生成BIN#
【LPC54114双核任务二】双核之从零开始--#mailbox通信1之中断#
【LPC54114双核任务二】双核之从零开始--#mailbox通信2之mutex#
【LPC54114双核任务二】双核之从零开始--#mailbox通信3之按键#
【LPC54114双核任务二】双核之从零开始--#mailbox通信4之PC_M4_M0#
【LPC54114双核任务二】双核之从零开始--#mailbox通信5之PC_M0_M4#
【LPC54114双核任务二】双核之从零开始--#mailbox通信6之WIFI_M4_M0#
【LPC54114双核任务二】已完结,小马哥出品,谢谢大家支持。。。。
-----------------------小马哥系列之【LPC54114双核任务二】传送门--------------------
|