请选择 进入手机版 | 继续访问电脑版
查看: 4939|回复: 3

[LPC双核挑战赛] 双核快速配置

[复制链接]

该用户从未签到

2

主题

3

帖子

3

新手上路

Rank: 1

积分
30
最后登录
2018-6-12
发表于 2018-5-31 19:01:36 | 显示全部楼层 |阅读模式
      相信在双核的道路上迷茫的同学肯定看过小马哥的讲解了把,小马哥的讲解确实太详细了,不过我觉得对于初学者我觉得有些配置可以省略一些步骤,先来点干货把!!!!!
    拿到LPC5411模块我也一脸懵逼,不过有那么多的资料的情况下还是蛮顺利的,还成功的操作了对双核的管理,下面我教大家怎么快速配置双核!!!!
   一:下载LPC官网的SDK_2.3.1_LPC54114J256(版本可能不同,放在是LPC54114的就可以)
       我会给大家提供一个链接,也是官网下载的哦
   二:解压
文件,并建立一个一个整合的双核文件夹,把双核的工程建立在里面,随便打开一个,我已图片的步骤教你们
      ①解压文件

1.png

②随便打开一个工程 并保存在文件夹下,我保存的是在例程下的

2.png

③安装小马哥修改按键对应IO口(板子不同所以必须修改)
3.png 修改后 4.png
④直接编译第一次必须调试才能把程序下进去,后面就可以不用了(可以不用修改例程的代码,当我认为我的效果是更号的,所以我改了一下)
    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核是否运行可以查看板子上的蓝灯是否在闪烁(小技巧哦)

好了不说了,直接上效果图了

5.png
第一次发帖子,展示效果不是很好,希望能帮到大家
,也希望大佬多多指点!!!!!加油

评分

参与人数 1 +3 收起 理由
doatello + 3

查看全部评分

回复

使用道具 举报

  • TA的每日心情
    擦汗
    2021-9-9 22:51
  • 签到天数: 415 天

    [LV.9]以坛为家II

    79

    主题

    3088

    帖子

    21

    金牌会员

    Rank: 6Rank: 6

    积分
    5181
    最后登录
    2022-5-23
    发表于 2018-5-31 23:05:17 | 显示全部楼层
    赞一个,谢谢分享
    该会员没有填写今日想说内容.
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2024-3-26 15:16
  • 签到天数: 266 天

    [LV.8]以坛为家I

    3298

    主题

    6545

    帖子

    0

    管理员

    Rank: 9Rank: 9Rank: 9

    积分
    32000
    最后登录
    2024-4-9
    发表于 2018-6-1 08:32:35 | 显示全部楼层
    感谢分享!!
    签到签到
    回复

    使用道具 举报

  • TA的每日心情
    奋斗
    2019-8-2 21:20
  • 签到天数: 1 天

    [LV.1]初来乍到

    4

    主题

    14

    帖子

    0

    注册会员

    Rank: 2

    积分
    101
    最后登录
    2020-12-8
    发表于 2019-12-13 18:40:02 | 显示全部楼层
    谢谢!
    该会员没有填写今日想说内容.
    回复

    使用道具 举报

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

    本版积分规则

    关闭

    站长推荐上一条 /4 下一条

    Archiver|手机版|小黑屋|恩智浦技术社区

    GMT+8, 2024-4-18 11:15 , Processed in 0.442345 second(s), 23 queries , MemCache On.

    Powered by Discuz! X3.4

    Copyright © 2001-2021, Tencent Cloud.

    快速回复 返回顶部 返回列表