STM32 BOOTLOADER跳转到APP搭建实战指南
在做关于IAP的时候我的一次实验,以及对BOOTLOAD跳转到APP的操作。
实现的效果是可以从bootload程序中加载app程序。
实验平台使用的是STM32F103C8T6核心板。
使用的是HAL库,keil开发环境。
下面来看BOOTLOAD的操作吧!打开CUBEMX,选择F103C8T6,配置外部时钟
之后打开一个串口(调试观察),在使能PC13引脚(led)
配置时钟
完成工程配置
完成基础配置之后,接下来是在keil中进行配置了。将下面函数声明一下。
void sys_msr_msp(uint32_t addr)
{
__set_MSP(addr); /* 设置栈顶地址 */
}
使用串口打印描述一下啊BOOTLOAD,并且定义一下函数指针用于接收地址。
标志和主要的跳转操作
对于参数地址的解释
这个地址为什么如此设置,查看这里
关于地址设定(我设定的比较随意,直接将空间一分为二,一半给BOOTLOAD使用,一半给APP使用,具体大小可以根据你所编写的程序计算),这里其实可以看出来(0X8008000)这个值是为什么了,是0x0X8000000+0X8000表示APP的起始地址。
在我这次实验中由于都是用下载器下载,所以选择部分擦除
将bootload下载完成之后,我们可以开始APP的准备了。
APP关于CUBEMX的配置与bootload一致。
代码部分和存储有所区别
首先改好代码下载地址,避免将bootload的程序刷掉。
为了确保中断功能的正常使用,需要修改中断向量表
WRITE_REG(SCB->VTOR, 0x8008000);
接下来就是使用串口打印信息了
编写串口接收中断,验证中断向量表的偏移正确性
uint8_t DATA;
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
HAL_UART_Transmit(&huart1,"1",1,200);
HAL_UART_Receive_IT(&huart1,&DATA,1);
}
代码编译下载,同样选择部分擦除
下载完成,重新启动,连接串口通信。
再通过串口助手发送单个数据,验证是否可以中断
本次实验感谢正点原子,感谢野火,也感谢那些分享的朋友们,希望能帮到各位
作者:Dmatebetter