查看: 5017|回复: 0

[原创] 【经验分享】RT1060 OTA BL ISP下载带SDRAM app

[复制链接]

该用户从未签到

719

主题

6378

帖子

0

超级版主

Rank: 8Rank: 8

积分
25368
最后登录
2025-9-1
发表于 2021-7-8 16:47:16 | 显示全部楼层 |阅读模式
本帖最后由 小恩GG 于 2021-7-8 16:50 编辑

【经验分享】RT1060OTA BL ISP下载带SDRAM app

一 文档说明

   前面给出文章【经验分享】RT1060 OTA bootloader ISP配套APP,提到了如何将一个客户的工程修改为能够满足SDK ota_bootloader的应用,从而可以使用ISP(uart/usb)方式去实现代码下载,然后复位后定时溢出自动跳转到APP运行。不过最近有客户在调自己的APP的时候,都满足了文章里面的要求,还是发现能够使用ISP下载,但是下载复位之后,APP运行的功能并不准确的问题。于是,仔细分析了客户的代码,发现客户使用了SDRAM,而工程还是使用dcd的方式,所以导致添加ota_hdr,并且偏移地址之后,导致dcd的丢失,从而放在SDRAM的代码并不能准确运行。
    本文就这样的情况给出解决方案,并且给出测试情况。

二 问题分析与解决

   既然客户应用代码使用了dcd,而偏移之后就不能直接在APP中使用DCD,所以可以考虑把dcd的配置部分放到ota_bootloader里面。因为本身SDK代码中的ota_bootloader并没有添加dcd部分,所以本文给出ota_bootloader添加dcd的方法。

2.1 ota_bootloader 添加dcd
2.1.1 添加dcd.c dcd.h文件
   Dcd.c, dcd.h两个文件,可以从其他的SDK工程中拿到,比如:
SDK_2.9.3_EVK-MIMXRT1060\boards\evkmimxrt1060\demo_apps\hello_world
添加dcd.c,dcd.h两个文件到board文件夹。
从dcd.c代码中可以看到,是把dcd_data[]数组放到了.boot_hdr.dcd_data"区域,并且还需要在宏定义preprocessor中使能XIP_BOOT_HEADER_DCD_ENABLE=1
2.1.2 修改mcuxpresso IDE ld添加相关dcd空间
  1.   .ivt : AT(ivt_begin)
  2.   {
  3.         . = 0x0000 ;   
  4.         KEEP(* (.boot_hdr.ivt))           /* ivt section */
  5.     . = 0x0020 ;
  6.         KEEP(* (.boot_hdr.boot_data))     /* boot section */
  7.     . = 0x0030 ;        
  8.     KEEP(*(.boot_hdr.dcd_data))   
  9.     __boot_hdr_end__ = ABSOLUTE(.) ;
  10.     . = 0x1000 ;      
  11.         
  12.   } > m_ivt
复制代码

1.jpg
图1
0X60001000开始放IVT,注意0x6000100c开始4个字节放DCD入口地址, 0x60001020放boot data, 0x60001030开始放DCD数据。

2.1.2 添加IVT dcd入口地址
   工程->MIMXRT1062下的hardware_init_MIMXRT1062.c,修改image_vector_table,填入DCD地址为之前的dcd_data数组入口地址

2.jpg
图2
到目前为止,已经完成了dcd在ota_bootloader中的添加,编译代码,生成image,可以通过对比查看:

3.jpg
图3
DCD的入口地址正确,DCD的数据也正确,这样就已经完成了具体的dcd成功添加,可以烧录到MIMRT1060-EVK开发板中。

2.2 准备使用SDRAM的APP
  我们同样以上次修改的SDK Led_blinky工程为例,将其中的部分代码放到SDRAM中。从memory的情况可以看到:

4.jpg
图4
SDRAM放到了RAM4中。
Led_blinky.c中添加头:
#include <cr_section_macros.h> /* __TEXT()*/
然后,将我们的systick延时代码放到RAM中,如下:

  1. __RAMFUNC(RAM4) void SysTick_DelayTicks(uint32_t n)
  2. {
  3.     g_systickCounter = n;
  4.     while (g_systickCounter != 0U)
  5.     {
  6.     }
  7. }
复制代码

至此,已经完成了一个简单的使用SDRAM的APP,大家如果感兴趣,可以测试这种方法的初始代码,debug会发现,断点停在SysTick_DelayTicks函数中的地址也是SDRAM的地址。
生成evkmimxrt1060_iled_blinky1_SDRAM_0x60040000.bin备用。
大家也可以在没有修改ota_bootloader的情况下测试这种带SDRAM的工程,会发现led灯不能闪烁。

2.3 ISP UART功能
   默认的已经发布的SDK ota_bootloader并不能直接支持UART功能,需要修改bootloader_config.h,开启UART功能:

#ifndef _DEBUG
#define BL_CONFIG_LPUART(BL_CONFIG_LPUART_1)
#define BL_TARGET_LPUART (1)
另外,通信的时候建议用低波特率,比如19200bps,否则高波特率会出现自动波特率获取的问题,具体查看文章:
或者如果需要使用固定的高波特率,也可以在代码中直接指定波特率,而不是自动获取计算波特率。

三 测试情况

  1. blhost.exe -t 50000 -p COM45,19200 -j -- get-property 1 0

  2. blhost.exe -t 50000 -p COM45,19200 -j -- flash-erase-region 0x60040000 0x6000 9

  3. blhost.exe -t 50000 -p COM45,19200 -j -- write-memory 0x60040000 evkmimxrt1060_iled_blinky1_SDRAM_0x60040000.bin

  4. blhost.exe -t 50000 -p COM45,19200 -j -- read-memory 0x60040000 0x6000 flexspiNorCfg.dat 9
复制代码

5.jpg
图5
下载后,复位,led闪烁,串口115200波特率打印:
hello world + led blinky demo1.

具体修改后的代码,查看附件。
evkmimxrt1060_iled_blinky_SDRAM.zip (713.05 KB, 下载次数: 15)
回复

使用道具 举报

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

本版积分规则

关闭

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

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

GMT+8, 2025-9-2 06:12 , Processed in 0.068098 second(s), 20 queries , MemCache On.

Powered by Discuz! X3.4

Copyright © 2001-2024, Tencent Cloud.

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