【MPC5748G】Bootloader移植(CAN通讯方式)

前言

笔者所在的公司近期选型用的新MCU,型号为NXP的MPC5748G,最近接到搞bootloader的任务,CSDN浏览一番发现MPC5744系列的文章比较多,于是参考了两个大佬的程序,将bootloader移植到了MPC5748G中。
参考的上位机
参考的MCU中的下位机
参考的5748 bootloader demo
上面第三个链接中,该作者只提供了bootloader的跳转demo,具体思路为将此demo作为框架,将第二个链接中的下位机代码移植过来,适配5748G。
具体程序流程大致为,上电后4秒内,LED1闪烁等待上位机指令,如果没有,4s后跳转至用户app。如果上位机有CAN指令,则执行flash 擦除、编程等操作,上位机显示进度,编程时,LED2闪烁。编程完成后,跳转至app。

5748G flash分布以及启动原理

5748G的flash分布情况可以参考官方RM文档的Memory Map章节,同5744一样,分为16K、32K、64K、256K四种block
其中指定了可以作为boot区的block:(RM文档57.1.3)
5748Gboot区
系统启动时,按照序号顺序依次检索这些地址的数据前半字是否具为0x005A,如果是,则确定此block为启动boot区。
在这里插入图片描述
在这里只启动CPU0,假设我们想将00FC0000起始的分区作为boot区,则该地址的数据必须为005A0002,该值由SDK自动生成,编译到elf文件或者hex文件中。
如果你用的是SDK_S32_PA_11的SDK包,该值的生成被定义在工程中的stattup_MPC5748G.S文件中:
在这里插入图片描述
在这里插入图片描述
可是很不幸,开头参考的三个链接中,所用的SDK都很老,所以在此例程中,该值被定义在了flashrchw.c中:

在这里插入图片描述
当确定好boot启动分区之后(0xFC0000),需要修改链接文件,从而才能正确编译。

在这里插入图片描述
这里将FC0000作为起始地址,FC0010存放boot程序入口地址,FC0400作为boot程序入口
同时别忘了修改flashrchw.c文件:
在这里插入图片描述
将RCHW2_0修改为上面的boot程序入口地址。
编译出来之后,可以查看一下HEX文件:
在这里插入图片描述
可以看到,与预期的相同。当系统上电后,MCU寻址到FC0000,识别到0x005A0002,即确定了此boot区与启动的CPU核心。随即在FC0010处寻址到了cpu的入口地址(即我们的boot程序起始地址),然后跳转到FC0400,开始运行boot程序

boot程序解析

上电后,boot程序首先开中断、设置频率等操作,初始化GPIO与CAN。然后向上位机发送一帧进入bootloader指示:
在这里插入图片描述
之后就是等待、CAN协议、flash擦除编程等逻辑操作了。具体实现代码可以查看源码。
我们规定app的起始地址必须为0x01000000,boot中实现跳转的代码与地址:

#define Bootloader_StartAddr 0x00FC0010
#define APP_StartAddr 0x01000010

void bootloader_entry(void)
{
	Prepare_Before_Jump_m();/*de-initialize the used peripherals and clean RAM*/
	(*(void (*)(void))(*(uint32_t*)Bootloader_StartAddr))();
	while(1);
}

void app_entry(void)
{
	Prepare_Before_Jump_m();/*de-initialize the used peripherals and clean RAM*/

	uint32_t result = *(uint32_t *)APP_StartAddr;
	if(result!=0xFFFFFFFF)
		(*(void (*)(void))(*(uint32_t*)APP_StartAddr))();/*run the function via function pointer convert with a certain address*/
	else
		(*(void (*)(void))(*(uint32_t*)Bootloader_StartAddr))();

	while(1);/*stop here for anyhow*/
}

app程序

这里将app程序的flash分区改为0x01000000,此后此boot的所有app必须按照此地址修改:
在这里插入图片描述
注意flashrchw.c中也要对应修改。

上位机

在这里插入图片描述
上位机使用时需要注意,我用的是创芯科技的CAN盒,需要替换ControlCAN.dll文件,不然识别连接不成功:
在这里插入图片描述

移植过程中的问题

1.我一开始在boot中加入了uart,方便调试,但是跳转app经常不成功,后来屏蔽uart相关代码之后恢复正常,猜测可能是uart没有deinit,如果想用uart调试的同学请自行添加deinit uart相关代码。
2.CAN引脚复用寄存器IMCR。

SIUL2.IMCR[188].B.SSS = 0b0010; //Set PB1 as CAN0_RX.

如果你在RM0文档搜这个寄存器的话,会发现数量有500多个!具体要用哪个呢?搜索半天才发现RM文档附带了一个xls文件,所有的引脚复用等说明在这个表里面可以找到。
3.5748G RAM大小。官方给出的总大小为768K
在这里插入图片描述
但是ld文件中却声明了只有256K

SRAM_SIZE =  256K;    
/* Define SRAM Base Address */
SRAM_BASE_ADDR = 0x40000000;

因为主函数中具有跳转时清除RAM的功能,一开始我直接设置的768K,结果每次程序清完这768K的RAM之后,跳转app都不成功,后面只修改为清256K,才恢复正常,个人猜测原因可能是这768K RAM不全是CPU0用的,CPU0只可使用256K?


#define __SRAM_BASE_ADDR		0x40000000
#define __SRAM_SIZE				0x00040000
...
void CleanRAM(void)
{
    uint32_t cnt;
    uint32_t *pRam;

    /*
     * clean system SRAM
     */
    cnt = __SRAM_SIZE/4;
    pRam = (uint32_t*)__SRAM_BASE_ADDR;

    while(cnt--)
        *pRam++ = 0;

    /*
	 * clean system Local DMEM
	 */
	//cnt = __LOCAL_DMEM_SIZE/4;
	//pRam = (uint32_t*)__LOCAL_DMEM_BASE_ADDR;

	//while(cnt--)
	//	*pRam++ = 0;
}

下载地址

MPC5748G_bootloader+app

参考

【MPC5744P】Hex文件解析
【MPC5744P】Bootloader下位机开发(CAN通讯)
【MPC5744P】Bootloader上位机开发(CAN通讯)
【MPC5744P】S32DS编译生成Hex文件的方法
MPC5748G之flash bootloader & app

  • 5
    点赞
  • 38
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
### 回答1: MPC5748G 是一款由飞思卡尔(NXP)公司生产的微控制器芯片,它具有高性能和丰富的外设,非常适合用于汽车电子控制系统等需要高可靠性和实时性的应用。而 bootloader(启动加载程序)则是芯片上的一段特殊代码,它的主要作用是在系统启动时负责初始化硬件、加载操作系统或其他应用程序,并且提供更新固件的能力。 MPC5748G bootloader 的设计目的是为了简化芯片的启动过程,并提供一种可靠且安全的方式来更新设备的固件。当芯片系统上电或复位时,bootloader 首先进行硬件初始化,例如配置时钟、外设和中断等。然后,它会根据特定的引导模式选择加载什么内容,这可能是操作系统、应用程序或其他可执行代码。在加载过程中,bootloader 还会检查固件的完整性和签名,以确保固件的可信度,防止恶意代码的注入。 MPC5748G bootloader 还具备固件更新的功能,这意味着在设备已部署的情况下,可以通过加载新的固件来升级系统功能或修复软件漏洞。在固件更新过程中,bootloader 会负责检测和验证新固件的完整性,确保更新过程的安全性和可靠性。此外,为了避免固件更新过程中出现错误或中断引发的问题,bootloader 还会实现相应的错误恢复机制。 总之,MPC5748G bootloader 是飞思卡尔公司为其 MPC5748G 微控制器芯片设计的一段特殊代码,用于初始化硬件、加载操作系统或其他应用程序,以及提供固件更新的能力。它确保系统的可靠启动和固件的安全更新,为设备和系统的稳定运行提供了重要的支持。 ### 回答2: MPC5748G是一款高性能的微控制器芯片,其内部集成了强大的处理器核心和丰富的外设功能。Bootloader是一种用于初始化系统和加载应用程序的程序,通常位于芯片的内部存储器中。 MPC5748GBootloader具备以下主要功能: 1. 初始化系统:Bootloader会在系统上电时先进行一系列的初始化工作,包括设置系统时钟、初始化外设、配置引脚等。这些初始化步骤能够确保系统的正确运行和外设的正常工作。 2. 加载应用程序:Bootloader能够从外部存储器(如闪存、SD卡等)中读取应用程序的二进制文件,并将其加载到内部存储器中的指定位置。加载完成后,可以通过跳转指令将控制权交给应用程序。 3. 更新固件:Bootloader还具备固件更新的功能。它可以通过通信接口(如CAN、UART等)接收来自外部设备的新固件文件,并进行校验和更新。这对于产品发展和维护非常重要。 4. 系统监控:Bootloader可以用于监控系统的运行状态和性能指标,以便进行故障排查和性能优化。它可以采集和记录系统运行时的数据,为开发者提供有用的调试信息。 总之,MPC5748GBootloader在启动过程中扮演了重要的角色,能够确保系统正常启动和应用程序的正常执行。通过这个Bootloader,我们可以轻松地进行固件更新、系统监控和调试工作,为产品的开发和维护提供了便利。 ### 回答3: MPC5748G是一种微处理器,具有强大的处理能力和丰富的外设功能。而bootloader(引导加载程序)是一种位于内存中的程序,用于初始化系统并加载操作系统或其他应用程序。 MPC5748Gbootloader通常用于初始化系统环境,包括设置外设的时钟和引脚功能,为操作系统或应用程序的运行提供必要的条件。bootloader还负责检测外部存储设备(如闪存)中的固件更新,并将新固件加载到内存中执行。这样可以方便地对MPC5748G的固件进行更新和升级。 通过使用bootloader,可以实现诸如固件更新、升级和修复的功能。同时,它还可以提供一些基本的调试和诊断功能,以便开发人员可以更好地了解和调试系统。 另外,MPC5748Gbootloader还可以与其他设备进行通信,如通过串口、以太网或CAN总线。这样,可以实现与其他设备的数据传输和通信,从而满足更加丰富的应用需求。 总的来说,MPC5748Gbootloader在系统的启动过程中起着重要的作用。它负责初始化系统环境、加载固件、提供调试和诊断功能,并与其他设备进行通信。通过合理的配置和使用,可以充分发挥MPC5748G的强大功能,为应用开发和系统维护提供便捷和灵活的方式
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值