STM32/STM8技术论坛
直播中

李伟

6年用户 1425经验值
私信 关注
[问答]

请问一下STM32通过GPRS远程升级该如何编写相关程序?

初步设想是当发送原声升级命令时,终端通过GPRS远程下载程序文件到某个存储芯片上,然后STM32切换模式,装载下载的升级程序文件,重启

回帖(11)

李涛

2018-10-24 18:18:13
可以,比较保险
举报

王刚

2018-10-24 18:18:40
我已经实现了

目标板上有一个FLASH芯片,用于装载新用户程序;目标板每次从BOOT区开始启动,首先检测FLASH中没有新用户程序时,跳转到用户区开始执行用户代码。GPRS服务器端要升级程序时,把新程序分包发送给终端,终端把新程序数据保存到FLASH中,新程序下完后目标板自己复位,然后从BOOT区启动,首先检测FLASH中有新用户程序时,开始读新程序并对用户FLASH区更新。。。更新完新程序后把FLASH中新程序标记清除,然后跳转到用户区执行。升级完毕。
举报

李伟

2018-10-24 18:18:51
我还在摸索。

问一下下载程序的时候分包大小、续传、校验之类的需要注意什么?
举报

李明

2018-10-24 18:19:08

不错 !
不知道 不外挂FLASH 的话能否实现?就是写一段代码在内部FLASH
区,GPRS接收数据定制协议,当接收到某个命令时,将运行该内部FLASH段代码。作用就是 将 从串口接收到的数据 写到FLASH 用户程序区,最后跳到这里执行,当然启动代码要改下,确保系统一复位 ,程序就在这里执行!

不知道这样可行不!
举报

李伟

2018-10-24 18:19:24
可是,          AREA    RESET, DATA, READONLY
                 EXPORT  __Vectors

__Vectors       DCD     __initial_sp              ; Top of Stack
                 DCD     Reset_Handler             ; Reset Handler
                 DCD     NMI_Handler               ; NMI Handler
                 DCD     HardFault_Handler         ; Hard Fault Handler
                 DCD     MemManage_Handler         ; MPU Fault Handler
                 DCD     BusFault_Handler          ; Bus Fault Handler
                 DCD     UsageFault_Handler        ; Usage Fault Handler
                 DCD     0                         ; Reserved
                 DCD     0                         ; Reserved
                 DCD     0                         ; Reserved
                 DCD     0                         ; Reserved
                 DCD     SVC_Handler               ; SVCall Handler
                 DCD     DebugMon_Handler          ; Debug Monitor Handler
                 DCD     0                         ; Reserved
                 DCD     PendSV_Handler            ; PendSV Handler
                 DCD     SysTick_Handler           ; SysTick Handler

                 ; External Interrupts
                 DCD     WWDG_IRQHandler           ; Window Watchdog
                 DCD     PVD_IRQHandler            ; PVD through EXTI Line detect
                 DCD     TAMPER_IRQHandler         ; Tamper
                 DCD     RTC_IRQHandler            ; RTC
                 DCD     FLASH_IRQHandler          ; Flash
                 DCD     RCC_IRQHandler            ; RCC
                 DCD     EXTI0_IRQHandler          ; EXTI Line 0
                 DCD     EXTI1_IRQHandler          ; EXTI Line 1
                 DCD     EXTI2_IRQHandler          ; EXTI Line 2
                 DCD     EXTI3_IRQHandler          ; EXTI Line 3
                 DCD     EXTI4_IRQHandler          ; EXTI Line 4
                 DCD     DMAChannel1_IRQHandler    ; DMA Channel 1
                 DCD     DMAChannel2_IRQHandler    ; DMA Channel 2
                 DCD     DMAChannel3_IRQHandler    ; DMA Channel 3

STM32的中断向量是固化在FLASH的,boot怎么可以知道应用程序的的中断函数地址呢?
1 举报
  • ZDPHPN: 可以在APP main开始使用这个NVIC_SetVectorTable(NVIC_VectTab_FLASH,0x10000);重新定义中断向量,偏移根据APP的起始存放位置自己设好。

贾飞小

2018-10-24 18:19:36
可以用iap方式实现!

mcu,arm,dsp原理都一样的!
举报

张艳

2018-10-24 18:19:45
这个很简单,不难
举报

李伟

2018-10-24 18:19:53
怎么个简单呢?能否具体说下怎么实现,BOOT要放在flash起始地址,APP1和APP2放在高地址,当APP升级后,中断地址都可能改变的,boot的中断向量怎么定位中断函数的地址呢?
举报

王军

2018-10-24 18:20:02
这个内存分块是可以实现的,不需要外部FLASH,不过应用程序大小就只能减半了。APP1,APP2存在不同地址,bootloader启动后先检查APP完整性和各自版本号,选择版本更新和完整的版本运行,中断向量在跳转之前根据运行的APP位置来设置。
至于GPRS传输采用FTP协议比较方便,传输完成后使用CRC32或MD5校验完整性。
举报

张艳

2018-10-24 18:20:12
转个角度看,为什么要支持位置1和2都能运行?

留3块程序位置,一块是默认BOOT,两块分别是位置1(运行区)和位置2(升级暂存区)。
BOOT启动判断位置1和2的APP,位置1校验没通过,位置2通过了,就把2的搬到1处,跳到1运行之。
或者有升级标志且位置2的校验通过,就把2的搬到1处再跳到1运行。
其他情况直接运行位置1。
举报

jinniuxing

2021-2-3 17:12:25
谢谢分享!
举报

更多回帖

发帖
×
20
完善资料,
赚取积分