|
硬件环境:STM32F429
软件环境:Keil环境 AC6
实现思路:学习一下BootLoader程序的实现过程(根据韦东山老师的视频例程,移植到F429上),BootLoader程序存放在Flash起始地址为0x08000000的地址空间上,APP程序存放在0x08040000(通过修改程序的散列文件.sct文件设定程序的链接地址为0x20008000),要求Bootloader程序上电后将0x0804000地址上的所有程序段复制到RAM上进而跳转。
遇到的问题:bootloader程序和APP程序外设均只有串口打印程序和LED引脚控制,当前发现boot程序能够正常调用app程序,但是串口打印数据不完全就卡死了,使用在硬汉哥论坛上面的方法和bibili上视频的方法,保证有一个干净的环境进行跳转(失能外设和中断),也没成功调用APP
以下均使用反汇编文件观察程序的链接地址
测试过程1.将APP程序不做任何搬运,直接烧录(设定存储地址和链接地址均在flash-0x08000000上,默认程序RAM和ROM布局映射)APP程序测试正常。
测试过程二:设定APP程序的链接地址为0x20008000(将APP的程序段分配到于BootLoader使用的全局变量之后的RAM空间0x20000000之后),使用BootLoader程序调用APP,并且使能Boot外设
2.1设定APP程序的链接地址0x20008000,使用mkimage工具拼接有用的头部bin信息到app_with_header.bin,通过stm32CubePro程序烧录app_with_header.bin程序到Flash地址0x08040000上
2.2 boot程序调用APP程序,调用一半卡死。
2.2.1 程序调用逻辑
2.2.2 boot前部分执行正常,程序搬运正常
2.2.3 进入APP,程序后使用快捷键在汇编窗口单步调试,在app的串口打印函数位置卡死
测试过程三: 将bootloader程序中外设调用部分代码关闭/关闭中断(Boot程序始终使用默认的RAM和ROM布局),卡死
|
|