本文章记录开发bootlodar过程中遇到的问题
- 堆栈空间与Flash空间占用
本项目使用F407ZGT6芯片内部 flash =1M=1024kb 内部RAM=192Kb
MDK5项目正确编译后 下方会出现
Program Size: Code=35748 RO-data=628 RW-data=140 ZI-data=26204
Code: 程序所占用的FLASH大小,存储在FLASH.
RO-data: Read-only-data,程序定义的常量,存储在FLASH中。
RW-data:Read-write-data,已经被初始化的变量,存储在SRAM中。
ZI-data:Zero-Init-data,未被初始化的变量,存储在SRAM中。
空间划分前 确认自己的代码需要占用多大的Flash空间 与 RAM
Flash = 35748 + 628 = 36376 ≈ 35Kb
RAM = 140 + 26204 = 26344 ≈ 26Kb
目前分配bootlodar的flash空间为 0x08020000 = 128Kb
在stm32中 堆栈空间被存储在SRAM中 检查一下RAM有没有超过F4的192Kb即可
- 如何检查自己分配的空间是否正确
1.MDK5项目 在编译后 可以选择输出 .map文件
可以看到 绿色箭头指向bootlodar的起始地址0x08000000,最大值为0x08020000
.map文件的最后也会计算出 本项目所需要的空间大小
三、FATFS与U盘
1.FAT32要求簇数不能少于0xfff5个 不能多于0x0FFFFFF5个簇
如果低于0xfff5则只能使用FAT16 多余0x0FFFFFF5个簇则只能使用exFat格式
在使用FAT32时 确定自己清楚知道什么是簇 什么是扇区 什么是块
簇: 簇是进行文件空间分配的最小单位。所以FATFS限制了簇的大小 其实就是限制了你在里面最多允许存储多少个文件
扇区与块:以本项目 W25Q64为例,包含一页256字节,4K(4096 字节)为一个扇区,16个扇区为1块,容量为8M字节,共有128个块,2048 个扇区。
2.U盘OTG协议(On-The-Go)
什么是OTG协议 ,本身USB是一个主从设备通信协议,也就是说主能与从通信,从设备不可与从设备通信,主设备不可与主设备通信,USB_OTG协议实现了2个USB外设在脱离PC(主设备)的情况下可以直接通信。
Stm32仅支持USB2.0协议以下的设备 连接前检查自己U盘的协议版本
详细的配置流程可以借鉴(5条消息) cubemx使用FATFS实现对U盘读取 --- STM32F407_mx_fatfs_init_看电路的程序猿的博客-优快云博客
USB链接状态介绍
现cube生成代码统一变量ID Appli_state记录USB链接状态
APPLICATION_IDLE, APPLICATION_START,APPLICATION_READY,APPLICATION_DISCONNECT
分别代表1.未连接 2.链接但未就绪 3.就绪 4.断开连接
如果程序能够正常在这些状态中切换但是未进入就绪状态
- 检查U盘USB协议版本
- 确认自己的时钟配置正确
- 检查硬件链接 USB接口 Dp对应ttl信号中的D+ Dm对应ttl信号中的D-
四、Flash的读写验证 与 BIn格式的文件生成
J_Flash工具读写内部Flash 验证自己写进去的与生成出来的bin文件相同
1.链接好jlink硬件后 打开JFlash 链接设备
选择后填入起始地址 与 结束地址 读取内容
而后选中读出来的字节 copy出来 打开自己生成的bin格式文件 打开方式如下
然后一定要去逐字节比对 确保每一个bit都是正确的 我这里发现自己每次生成的bin格式文件与使用MDK5下载方式下载进去的内容是不一样的
- Bin格式文件的生成
选择我们熟悉的魔术棒
Fromelf.exe工具被默认安装在 MDK5工具安装目录下 如果没有 重新安装MDK5
注意:
Bin格式的文件是依据axf格式生成出来的,axf格式是每次编译时都会重新生成的,确保这里填入的axf格式路径是每次重新生成出来的axf文件。下面说怎么设置输出编译文件目录!
还是我们熟悉的魔术棒 打开Output选项卡 蓝色箭头点击选择目录 确认后编译生成的.o.axf.art格式的文件都会被生成在匿选择的目录下,确认你下载的bin格式文件是每次重新生成的!
五、bootlodar跳转失败问题排查思路
1.确认自己的跳转函数能够正常跳转
2.确认自己的跳转后的程序 正确的指向了中断向量表
3.确认自己写入FLash的地址 与 内容无误
4.如果以上都无问题 检查是不是自己的bin文件是不是每次依据.axf重新生成的