Chinaunix首页 | 论坛 | 博客
  • 博客访问: 9396283
  • 博文数量: 1747
  • 博客积分: 12961
  • 博客等级: 上将
  • 技术积分: 20060
  • 用 户 组: 普通用户
  • 注册时间: 2009-01-09 11:25
个人简介

偷得浮生半桶水(半日闲), 好记性不如抄下来(烂笔头). 信息爆炸的时代, 学习是一项持续的工作.

文章分类

全部博文(1747)

文章存档

2024年(23)

2023年(26)

2022年(112)

2021年(217)

2020年(157)

2019年(192)

2018年(81)

2017年(78)

2016年(70)

2015年(52)

2014年(40)

2013年(51)

2012年(85)

2011年(45)

2010年(231)

2009年(287)

分类: 其他平台

2018-05-14 19:07:34


点击(此处)折叠或打开

  1. #!/bin/sh

  2. #首先把BOOT0/Boot1 设置为 1 0, 即使用 STM32的ISP升级模式
  3. #按下板子的reset, 硬复位进入 SYS ISP 模式(BOOTLOADER)

  4. #sudo stm32flash -w F407ZG_New.bin -v -g 0x0 /dev/ttyUSB0
  5. sudo stm32flash -w F407ZG_Old.bin -v -g 0x0 /dev/ttyUSB0

  6. #烧写以及验证完毕后, 自动加载 Flash的程序运行。
  7. #把把BOOT0/Boot1 设置为 0 0, 即使用 STM32的flash模式,即用户程序模式。
  8. #reset按键, 硬复位后自动启动新烧入的程序。



  9. #以下为烧写的日志输出。
  10. #sudo stm32flash -w F407ZG_New.bin -v -g 0x0 /dev/ttyUSB0
  11. #stm32flash 0.5
  12. #
  13. #http://stm32flash.sourceforge.net/
  14. #
  15. #Using Parser : Raw BINARY
  16. #Interface serial_posix: 57600 8E1
  17. #Version : 0x31
  18. #Option 1 : 0x00
  19. #Option 2 : 0x00
  20. #Device ID : 0x0413 (STM32F40xxx/41xxx)
  21. #- RAM : 128KiB (12288b reserved by bootloader)
  22. #- Flash : 1024KiB (size first sector: 1x16384)
  23. #- Option RAM : 16b
  24. #- System RAM : 30KiB
  25. #Write to memory
  26. #Erasing memory
  27. #Wrote and verified address 0x080033f4 (100.00%) Done.
  28. #
  29. #Starting execution at address 0x08000000... done.



在SRAM中调试代码



在每个STM32 的芯片上都有两个管脚BOOT0BOOT1,这两个管脚在芯片复位时电平状态决定了芯片复位后从哪个区域开始执行程序,

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 + 硬复位,引导用户程序.

点击(此处)折叠或打开
  1. echo 419 > /sys/class/gpio/export    #boot1
  2. echo 428 > /sys/class/gpio/export    #boot0
  3. echo 132 > /sys/class/gpio/export    # 硬复位 
  4. echo "low" > /sys/class/gpio/gpio419/direction   
  5. echo "high" > /sys/class/gpio/gpio428/direction  #  boot1=0 boot0=1  bootload启动
  6. echo "low" > /sys/class/gpio/gpio132/direction
  7. usleep 5000
  8. echo "high" > /sys/class/gpio/gpio132/direction  #硬复位

  9. /etc/firmware/stm32flash -w /etc/firmware/cocpu6900.hex -v -g 0x0 /dev/ttySAC2  #固件升级

  10. echo "low" > /sys/class/gpio/gpio428/direction   # boot1=0 boot0=0  flash启动

  11. echo "low" > /sys/class/gpio/gpio132/direction
  12. usleep 5000
  13. 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代码

阅读(6976) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~