MCU的OTA升级(未完-持续更新)

1.术语

ISP :  In-System Programming

在系统编程,是一种通过MCU(微控制器单元)上的内置引导程序(BootLoader)来实现对芯片内部存储器(如Flash)进行编程的技术。

华大目前对应的ISP

IAP:In-Application Programming 

在应用编程,是用户通过自己的程序更新程序固件的技术 ,如OTA升级、串口升级。

DFU: Device Firmware Upgrade

是一种 通过usb 设备驱动更新固件的技术

2. OTA方案

                      512K、 8k一个扇区 共64个扇区

BOOTLOADER_A

APP_A

OTA FIRMWARE

CONFIG

OTA SIGN

16K

232K

248K

8k

8k

OTA SIGN  内容

OTA SIGN

起始位置

长度

内容

B0-B7

8

固定字符串ABUP

B8-B11

4

SIGN

ABUP_OTA_SIGN_A 、

ABUP_OTA_SIGN_READY_B、

B11-B15

4

 保留

boot:查看OTA SIGN标志 运行APP_A 或从APP_B

app:app运行起来,如果当前是B区,且运行OK,保存APP_B 否则 运行APP_A 进行回滚

2.1 流程图

3. OTA方案中遇到的问题

3.1 怎么区分固件是 带boot或不带boot

const uint8_t device_name[16] __attribute__((section(".ARM.__at_0x00000FF0"))) = "BOOT_DEVICE";
可以使用此方法加固定标志位,在第1个4K收到时即可知道是否是带boot

3.2 boot引导A区或B区启动不起来

修改jump_to_app函数,增加    SCB->VTOR = 0 | start_addr;

boot时VTOR 为0------>A区时VTOR为4000 

boot时VTOR 为0------>B区时 VTOR为42000

void jump_to_app(uint32_t start_addr)
{

    /* Check if valid stack address (RAM address) then jump to user application */
    if(((*(__IO uint32_t*)start_addr + 4)&0x1FFF8000)==0x1FFF8000)
    {
        Abup_Delay(500);
        __disable_irq();
        /* Jump to user application */
        JumpAddress = *(volatile uint32_t*) (start_addr + 4);
        Jump_To_Application = (pFunction) JumpAddress;
        /* Initialize user application's Stack Pointer */
        __set_MSP(*(volatile uint32_t*) start_addr);
        SCB->VTOR = 0 | start_addr;

        Jump_To_Application();
        /* do nothing */
        while(1);
    }
    else
    {   /* Otherwise, do nothing */
        while(1)
        {
            TRACE("Jump fail ...\r\n");
            Abup_Delay(1000);
        }
    }

}

3.3引导到B区特别慢问题,但A区特别快

APP关闭 ICG ,统一 在boot添加  0x400

3.4 SEGGER打印接收数据不完整问题

关于使用J-Link RTT 打印日志内容不全问题的解决方法_rtt打印延时-优快云博客

3.5 电脑模拟ota数据发送,但是经常接收不到问题(报ORE、FE帧错误)

经仿真测试发现:

经常会卡死在rt_assert_handler 断言 rt_err_t rt_thread_resume(rt_thread_t thread)中

怀疑是内存不够导致

3.7 按照malloc 4k 左右空间 作为保存ota数据,一次性写入rom,但是申请的指针ota_controll,会被清零

使用ota_controll= (struct OTA_CONTROLL_ST *)rt_malloc(sizeof(struct OTA_CONTROLL_ST))

在实际工程应用中,我们时常会遇到为解决某个老产品的BUG,需要在工程现场更新设备的FPGA代码,或者参加电信测试时需要现场升级设备FPGA程序以便于调试。公司现阶段所用的Altera FPGA程序代码一般存放于芯片配套的FLASH存储器中,而常见的对印制板上FLASH编程有几种方法,原始的方法是使用编程器,这种方法需要要将芯片取下,十分不便,或者通过JTAG接口连接到PC机上,但需要专用下载软件(一般由芯片生产厂商提供)。在测试现场或调测机房现场,要找到FPGA的专用下载线是比较困难的,且Altera FPGA的专用下载软件并不是每个PC设备上都有的。有时仅为了更新一个FPGA的程序就需要研发或客服人员亲自到现场去烧写程序,这既不便捷,也使得设备维护成本大大增加。  经过可行性与成本的考虑,我们找到一种既方便实用又低成本的方法来实现FPGA程序的在线现升级。即在MCU中(单片机或ARM均可)用软件来模拟XModem协议,将程序文件传输到FPGA的FLASH中。这种方法使用WINDOWS自带的超级终端软件来传送文件,无需安装专用软件,硬件支持仅需要一根通用串口线,只要在目标板MCU上增加一段实现XModem协议传输的代码,就可以方便的实现FPGA程序下载了。这种特点不仅方便了客服人员,也给研发和生产人员在现场调试和软件升级、修改中带来极大方便。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值