在线时间7 小时
UID3433719
注册时间2018-1-17
NXP金币0
该用户从未签到
新手上路
- 积分
- 30
- 最后登录
- 2018-6-12
|
相信在双核的道路上迷茫的同学肯定看过小马哥的讲解了把,小马哥的讲解确实太详细了,不过我觉得对于初学者我觉得有些配置可以省略一些步骤,先来点干货把!!!!!
拿到LPC5411模块我也一脸懵逼,不过有那么多的资料的情况下还是蛮顺利的,还成功的操作了对双核的管理,下面我教大家怎么快速配置双核!!!!
一:下载LPC官网的SDK_2.3.1_LPC54114J256(版本可能不同,放在是LPC54114的就可以)
我会给大家提供一个链接,也是官网下载的哦
二:解压文件,并建立一个一个整合的双核文件夹,把双核的工程建立在里面,随便打开一个,我已图片的步骤教你们
①解压文件
②随便打开一个工程 并保存在文件夹下,我保存的是在例程下的
③安装小马哥修改按键对应IO口(板子不同所以必须修改)
修改后
④直接编译第一次必须调试才能把程序下进去,后面就可以不用了(可以不用修改例程的代码,当我认为我的效果是更号的,所以我改了一下)
hello_world_core1.c代码:
#include "board.h"
#include "mcmgr.h"
#include "fsl_debug_console.h"
#include "fsl_common.h"
#include "pin_mux.h"
#include "fsl_gpio.h"
#define LED_INIT() GPIO_PinInit(GPIO, BOARD_LED_RED_GPIO_PORT, BOARD_LED_RED_GPIO_PIN, &led_config);
#define LED_TOGGLE() GPIO_PortToggle(GPIO, BOARD_LED_RED_GPIO_PORT, 1u << BOARD_LED_RED_GPIO_PIN);
#define APP_READY_EVENT_DATA (1)
void delay(void)
{
volatile uint32_t i = 0;
for (i = 0; i < 1000000; ++i)
{
__asm("NOP"); /* delay */
}
}
int main(void)
{
uint32_t startupData, i;
mcmgr_status_t status;
/* ¶¨ÒåÊä³öLED½á¹¹Ìå*/
gpio_pin_config_t led_config = {
kGPIO_DigitalOutput, 0,
};
MCMGR_EarlyInit();
MCMGR_Init();
/* »ñÈ¡Æô¶¯Êý¾Ý */
do
{
status = MCMGR_GetStartupData(&startupData);
} while (status != kStatus_MCMGR_Success);
/* Make a noticable delay after the reset */
/* Use startup parameter from the master core... */
for (i = 0; i < startupData; i++)
delay();
/* Init board hardware.*/
/* enable clock for GPIO */
CLOCK_EnableClock(kCLOCK_Gpio0);
CLOCK_EnableClock(kCLOCK_Gpio1);
BOARD_BootClockRUN();
BOARD_InitDebugConsole();
MCMGR_TriggerEvent(kMCMGR_RemoteApplicationEvent, APP_READY_EVENT_DATA);
while (1)
{
delay();
PRINTF("M1ºËÔËÐÐÖÐ\r\n");
delay();
delay();
}
}
hello_world_core0.c代码:
#include "fsl_debug_console.h"
#include "fsl_gpio.h"
#include "board.h"
#include "mcmgr.h"
#include "fsl_common.h"
#include "pin_mux.h"
#define CORE1_BOOT_ADDRESS (void *)0x20010000
#define BUTTON_1_INIT() GPIO_PinInit(BOARD_SW1_GPIO, BOARD_SW1_GPIO_PORT, BOARD_SW1_GPIO_PIN, &sw_config)
#define IS_BUTTON_1_PRESSED() !GPIO_PinRead(BOARD_SW1_GPIO, BOARD_SW1_GPIO_PORT, BOARD_SW1_GPIO_PIN)
#define BUTTON_1_NAME "SW1"
#define BUTTON_2_INIT() GPIO_PinInit(BOARD_SW2_GPIO, BOARD_SW2_GPIO_PORT, BOARD_SW2_GPIO_PIN, &sw_config)
#define IS_BUTTON_2_PRESSED() !GPIO_PinRead(BOARD_SW2_GPIO, BOARD_SW2_GPIO_PORT, BOARD_SW2_GPIO_PIN)
#define BUTTON_2_NAME "SW2"
#if defined(__CC_ARM)
extern uint32_t Image$$CORE1_REGION$$Base;
extern uint32_t Image$$CORE1_REGION$$Length;
#define CORE1_IMAGE_START &Image$$CORE1_REGION$$Base
#elif defined(__ICCARM__)
extern unsigned char core1_image_start[];
#define CORE1_IMAGE_START core1_image_start
#elif defined(__GNUC__)
extern const char m0_image_start[];
extern const char* m0_image_end;
extern int m0_image_size;
#define CORE1_IMAGE_START ((void *)m0_image_start)
#define CORE1_IMAGE_SIZE ((void *)m0_image_size)
#endif
#define APP_READY_EVENT_DATA (1)
/*******************************************************************************
* Prototypes
******************************************************************************/
#ifdef CORE1_IMAGE_COPY_TO_RAM
uint32_t get_core1_image_size(void);
#endif
void delay(void);
void MCMGR_RemoteCoreUpEventHandler(uint16_t remoteData, void *context);
void MCMGR_RemoteCoreDownEventHandler(uint16_t remoteData, void *context);
void MCMGR_RemoteExceptionEventHandler(uint16_t remoteData, void *context);
/*******************************************************************************
* Code
******************************************************************************/
#ifdef CORE1_IMAGE_COPY_TO_RAM
uint32_t get_core1_image_size()
{
uint32_t core1_image_size;
#if defined(__CC_ARM)
core1_image_size = (uint32_t)&Image$$CORE1_REGION$$Length;
#elif defined(__ICCARM__)
#pragma section = "__sec_core"
core1_image_size = (uint32_t)__section_end("__sec_core") - (uint32_t)&core1_image_start;
#elif defined(__GNUC__)
core1_image_size = (uint32_t)m0_image_size;
#endif
return core1_image_size;
}
#endif
volatile uint16_t RemoteReadyEventData = 0;
static void RemoteReadyEventHandler(uint16_t eventData, void *context)
{
RemoteReadyEventData = eventData;
}
int main(void)
{
volatile int resetDone = 0;
volatile int exceptionNumber = 0;
volatile int startupDone = 0;
/* Define the init structure for the switches*/
gpio_pin_config_t sw_config = {kGPIO_DigitalInput, 0};
/* Initialize MCMGR - low level multicore management library.
Call this function as close to the reset entry as possible,
(into the startup sequence) to allow CoreUp event triggering. */
MCMGR_EarlyInit();
/* Initialize MCMGR, install generic event handlers */
MCMGR_Init();
/* Init board hardware.*/
/* attach 12 MHz clock to FLEXCOMM0 (debug console) */
CLOCK_AttachClk(kFRO12M_to_FLEXCOMM0);
BOARD_InitPins_Core0();
BOARD_BootClockFROHF48M();
BOARD_InitDebugConsole();
/* Configure BUTTONs */
BUTTON_1_INIT();
BUTTON_2_INIT();
#ifdef CORE1_IMAGE_COPY_TO_RAM
/* Calculate size of the image - not required on MCUXpresso IDE. MCUXpresso copies the secondary core
image to the target memory during startup automatically */
uint32_t core1_image_size;
core1_image_size = get_core1_image_size();
PRINTF("Copy Secondary core image to address: 0x%x, size: %d\n", CORE1_BOOT_ADDRESS, core1_image_size);
/* Copy Secondary core application from FLASH to the target memory. */
memcpy(CORE1_BOOT_ADDRESS, (void *)CORE1_IMAGE_START, core1_image_size);
#endif
/* Install remote core up event handler */
MCMGR_RegisterEvent(kMCMGR_RemoteCoreUpEvent, MCMGR_RemoteCoreUpEventHandler, (void*)&startupDone);
/* Install remote core down event handler */
MCMGR_RegisterEvent(kMCMGR_RemoteCoreDownEvent, MCMGR_RemoteCoreDownEventHandler, (void*)&resetDone);
/* Install remote exception event handler */
MCMGR_RegisterEvent(kMCMGR_RemoteExceptionEvent, MCMGR_RemoteExceptionEventHandler, (void*)&exceptionNumber);
/* Register the application event before starting the secondary core */
MCMGR_RegisterEvent(kMCMGR_RemoteApplicationEvent, RemoteReadyEventHandler, NULL);
//Æô¶¯M1ºË
PRINTF("启动M1核运行\r\n");
MCMGR_StartCore(kMCMGR_Core1, CORE1_BOOT_ADDRESS, 1, kMCMGR_Start_Synchronous);
while (1)
{
delay();
delay();
delay();
delay();
delay();
delay();
delay();
delay();
delay();
delay();
delay();
delay();
delay();
delay();
delay();
MCMGR_StopCore(kMCMGR_Core1);
PRINTF("停止M1核运行\r\n");
}
}
void delay(void)
{
for (uint32_t i = 0; i < 0x7fffffU; i++)
{
__NOP();
}
}
void MCMGR_RemoteCoreUpEventHandler(uint16_t remoteData, void *context)
{
int *startupDone = (int *)context;
*startupDone = 1;
}
void MCMGR_RemoteCoreDownEventHandler(uint16_t remoteData, void *context)
{
int *resetDone = (int *)context;
*resetDone = 1;
}
void MCMGR_RemoteExceptionEventHandler(uint16_t remoteData, void *context)
{
int *exceptionNumber = (int *)context;
*exceptionNumber = remoteData;
}
完成效果 其实程序的流程就是 让M0核开启M1核启动 ,M1核就串口打印“M1核运行中”,然后停止M1核,就是这么一个控制
其实M1核是否运行可以查看板子上的蓝灯是否在闪烁(小技巧哦)
好了不说了,直接上效果图了
第一次发帖子,展示效果不是很好,希望能帮到大家
,也希望大佬多多指点!!!!!加油
|
评分
-
查看全部评分
|