MPC5744 使用S32 DS中的PE组件自动生成代码(五)bootloader升级

1、概述

在之前的文章中有讲过STM32芯片实现BootLoader升级的原理。其实MPC5744的升级原理和这个差不读,就是将代码区分成两个区,然后根据标志位去跳转,看具体执行哪个区的程序。在APP中实现功能,接收到升级指令更改跳转标志位,跳转到boot区接收升级包,将APP代码区的数据更新,更新完毕,APP升级完成,最后再从boot区跳转到APP区。
STM32是ARM的内核,所以程序一旦复位指针就是跳转到地址0x00000000,开始执行相关代码,所以BootLoader的起始地址就是0x0000000,然后留出足够的内存存储BootLoader的代码片段,在0x0000000后面定义一个APP的起始地址就行。
MPC5744是power内核,这点关于起始位置的定义有点不一样,接下来会先讲下这个芯片关于flash的一些知识,然后就知道该怎么跳转了。

2、flash说明

2.1、分区说明

在相关的官方文档中有关于flash map的描述,上面可以看出flash有分为以下几个启动分区。
在这里插入图片描述
芯片内部有上面8个分区作为启动分区,芯片从低到高去找对应的boot location,以找到 boot ID为准。如果这个BOOT_ID有0x5A,则说明可以用这个分区启动。一旦设备找到启动分区,就会从偏移为4的地方取出地址数据,跳转过去。

2.2、实际测试

在工程中的【project setting】文件夹中找到flash.ld文件,其中关于memory的设置如下。

MEMORY
{
   
    flash_rchw : org = 0x01000000, len = 0x4
    cpu0_reset_vec : org = 0x01000000+0x04, len = 0x4

    m_text : org = 0x01000400, len = 2047K
    m_data : org = 0x40000000, len = 384K
    local_dmem : org = 0X50800000, len = 64K
}

然后我们通过memory窗口,输入0x01000000,查看这个地址的数据,发现这个地址是包含boot_id的。然后这个地址再偏移4的地址上存的是程序的起始地址。
在这里插入图片描述
然后再通过memory窗口查看0x01000400地址上的数据。通过和生成的bin文件进行对比,数据是完全对的上的。
在这里插入图片描述

2.3、总结

0x01000000存的是BOOT_ID 0x5A,证明这个分区是启动分区;0x01000004存的是程序块的起始地址,当检测到BOOT_ID后会获取这个地址中的地址数据,接着跳到该地址;0x01000400是程序块的起始地址,运行程序的时候会跳到这里开始执行程序。

3.程序擦写

3.1 flash模块配置

标题程序是存在flash中,所以这里需要使用flash模块,使用PE组件添加flash模块。

3.2擦写代码实现

//PE自动生成的初始化函数
FLASH_DRV_Init(); 
//写函数
status_t sWriteDataToFlash(uint32_t ulStartAddr, uint32_t *data, uint32_t length)
{
   
	uint32_t ulEndAddr;
	status_t sState=STATUS_SUCCESS;
	
	ulEndAddr = ulStartAddr+length*4-1;
	if(Flash_Unlock_g(ulStartAddr,ulEndAddr) == STATUS_SUCCESS
  • 27
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值