-
#!/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区中实现的升级代码
https://www.cnblogs.com/smulngy/p/5700283.html
实现在Norflash上各个区域代码之间的跳转
https://www.cnblogs.com/memorypro/p/8166213.html
建议升级方式,还是使用 BOOT0/1+stm32flash的升级方式, 稳定可靠并节省Flash空间,尤其在代码量比较大的情况下, 或者使用 官方的 IAP代码
阅读(6976) | 评论(0) | 转发(0) |