本帖最后由 小恩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空间
- .ivt : AT(ivt_begin)
- {
- . = 0x0000 ;
- KEEP(* (.boot_hdr.ivt)) /* ivt section */
- . = 0x0020 ;
- KEEP(* (.boot_hdr.boot_data)) /* boot section */
- . = 0x0030 ;
- KEEP(*(.boot_hdr.dcd_data))
- __boot_hdr_end__ = ABSOLUTE(.) ;
- . = 0x1000 ;
-
- } > m_ivt
复制代码
图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 到目前为止,已经完成了dcd在ota_bootloader中的添加,编译代码,生成image,可以通过对比查看:
图3 DCD的入口地址正确,DCD的数据也正确,这样就已经完成了具体的dcd成功添加,可以烧录到MIMRT1060-EVK开发板中。
2.2 准备使用SDRAM的APP 我们同样以上次修改的SDK Led_blinky工程为例,将其中的部分代码放到SDRAM中。从memory的情况可以看到:
图4 SDRAM放到了RAM4中。 Led_blinky.c中添加头: #include <cr_section_macros.h> /* __TEXT()*/ 然后,将我们的systick延时代码放到RAM中,如下:
- __RAMFUNC(RAM4) void SysTick_DelayTicks(uint32_t n)
- {
- g_systickCounter = n;
- while (g_systickCounter != 0U)
- {
- }
- }
复制代码
至此,已经完成了一个简单的使用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,否则高波特率会出现自动波特率获取的问题,具体查看文章: 或者如果需要使用固定的高波特率,也可以在代码中直接指定波特率,而不是自动获取计算波特率。
三 测试情况
- blhost.exe -t 50000 -p COM45,19200 -j -- get-property 1 0
- blhost.exe -t 50000 -p COM45,19200 -j -- flash-erase-region 0x60040000 0x6000 9
- blhost.exe -t 50000 -p COM45,19200 -j -- write-memory 0x60040000 evkmimxrt1060_iled_blinky1_SDRAM_0x60040000.bin
- blhost.exe -t 50000 -p COM45,19200 -j -- read-memory 0x60040000 0x6000 flexspiNorCfg.dat 9
复制代码图5 下载后,复位,led闪烁,串口115200波特率打印: hello world + led blinky demo1.
具体修改后的代码,查看附件。 |