#!/bin/sh
#首先把BOOT0/Boot1 设置为 1 0, 即使用 STM32的ISP升级模式
#按下板子的reset, 硬复位进入 SYS ISP 模式(BOOTLOADER)
#sudo stm32flash -w F407ZG_New.bin -v -g 0x0 /dev/ttyUSB0
sudo stm32flash -w F407ZG_Old.bin -v -g 0x0 /dev/ttyUSB0
#烧写以及验证完毕后, 自动加载 Flash的程序运行。
#把把BOOT0/Boot1 设置为 0 0, 即使用 STM32的flash模式,即用户程序模式。
#reset按键, 硬复位后自动启动新烧入的程序。
#以下为烧写的日志输出。
#sudo stm32flash -w F407ZG_New.bin -v -g 0x0 /dev/ttyUSB0
#stm32flash 0.5
#
#http://stm32flash.sourceforge.net/
#
#Using Parser : Raw BINARY
#Interface serial_posix: 57600 8E1
#Version : 0x31
#Option 1 : 0x00
#Option 2 : 0x00
#Device ID : 0x0413 (STM32F40xxx/41xxx)
#- RAM : 128KiB (12288b reserved by bootloader)
#- Flash : 1024KiB (size first sector: 1x16384)
#- Option RAM : 16b
#- System RAM : 30KiB
#Write to memory
#Erasing memory
#Wrote and verified address 0x080033f4 (100.00%) Done.
#
#Starting execution at address 0x08000000... done.
在SRAM中调试代码
在每个STM32 的芯片上都有两个管脚BOOT0和BOOT1,这两个管脚在芯片复位时电平状态决定了芯片复位后从哪个区域开始执行程序,
BOOT1=X BOOT0=0 从用户闪存(flash)启动,这时正常模式 较多情况下使用这种模式
BOOT1=1 BOOT0=1 从内置SRAM(内存)启动,这种模式可以用于调试
BOOT1=0 BOOT0=1 从系统存储器启动, 即Bootloader. 此为ISP升级方式, The boot loader is located in system memory. It is used to reprogram the Flash memory by using USART1 (PA9/PA10), USART3 (PC10/PC11 or PB10/PB11), CAN2 (PB5/PB13), USB OTG FS in Device mode (PA11/PA12) through DFU (device firmware upgrade).
(https://blog.csdn.net/nicekwell/article/details/79093780) 包含 ISP的官方代码以及解析.
如果使用升级, 建议使用STM32内部的bootloader方式, 实现bootload 和 UserApplication之间相互自由切换.
其中需要使用 stm32flash, 有源码. 一般运行在 linux 主机上.
在STM32复位后, 根据BOOTx的组合关系, 确定是启动UserApp还是Bootloader.
BOOT1=0 BOOT0=1被设置, 然后引发一个硬复位操作. 然后通过 stm32flash 下载代码到flash.
然后通过 BOOT1=X BOOT0=0 + 硬复位,引导用户程序.
echo 419 > /sys/class/gpio/export #boot1
echo 428 > /sys/class/gpio/export #boot0
echo 132 > /sys/class/gpio/export # 硬复位
echo 'low' > /sys/class/gpio/gpio419/direction
echo 'high' > /sys/class/gpio/gpio428/direction # boot1=0 boot0=1 bootload启动
echo 'low' > /sys/class/gpio/gpio132/direction
usleep 5000
echo 'high' > /sys/class/gpio/gpio132/direction #硬复位
/etc/firmware/stm32flash -w /etc/firmware/cocpu6900.hex -v -g 0x0 /dev/ttySAC2 #固件升级
echo 'low' > /sys/class/gpio/gpio428/direction # boot1=0 boot0=0 flash启动
echo 'low' > /sys/class/gpio/gpio132/direction
usleep 5000
echo 'high' > /sys/class/gpio/gpio132/direction #硬复位
第二种: 自己编写bootloader 进行升级, 亦可直接用 stm32官方提供的 IAP (in Application Programming)代码.
例如:
0800,0000 - 0800,8000 这个扇区的8个页的16K 引导区
0800,8000 - 0800,BFFF 作为UserApp区
0800,C000 - 0800,DFFF 作为升级备份区
0800,E000 - 0800,FFFF 作为参数存储区.
升级流程为:
1. UserApp区代码通过串口或者USB口和Host交互(可以为YModem或者其他协议), 把升级的Hex文件存储到 升级备份区. 并在升级备份区的头部做好标记, 说明是已更新标记以及数据页的大小. 然后复位.
2. 复位后, 引导区代码开始执行, 引导区检查升级备份区的头部, 如果有更新标记, 则把升级备份区的内容拷贝写入到UserApp区, 然后跳转到 UserApp区开始执行代码.
3. 引导区也要实现YModem等在UserApp区中实现的升级代码
关于STM32的IAP与APP互相跳转
https://www.cnblogs.com/smulngy/p/5700283.html
实现在Norflash上各个区域代码之间的跳转
STM32 IAP+Ymodem功能实现(参考官方代码)
https://www.cnblogs.com/memorypro/p/8166213.html
建议升级方式,还是使用 BOOT0/1+stm32flash的升级方式, 稳定可靠并节省Flash空间,尤其在代码量比较大的情况下, 或者使用 官方的 IAP代码
上一篇:使用 sw4stm32 作为IDE 开发 stm32 程序
下一篇:stm32——ucos的中断使用
推荐阅读最新更新时间:2024-11-12 10:57
设计资源 培训 开发板 精华推荐
- 基于esp32的retro_go开源掌机
- DER-814 - 45 W USB PD 3.0,采用 3.3 V-21 V PPS 电源,使用 InnoSwitch3-Pro 和 VIA Labs VP302 控制器
- 小汐 -> STM32 Mega Mini
- DIY-Perks,USB麦克风,线路部分[暂未验证]
- 用于 ATX 电源的 310W、5V、12V AC 到 DC 多输出电源
- ADR423 超精密、低噪声、3V XFET 输出电压基准的典型应用
- LTC3838IUHF-1 4.5V 至 38V 输入、1.2V/15A 和 1.5V/15A 双路输出、350kHz、DCR 检测、降压转换器的典型应用电路
- LTM8052AIV 的典型应用,用于调节 Peltier 器件的正负电压和电流
- DC1562B-K,LTC6994-1 演示板,100ms,下降沿,从触发下降沿延迟
- IP5306移动电源方案