STM32f030弄IAP时遇到的问题

bootloard中的跳转和F1(M3内核)的没什么区别

这里的这句话
if((((__IO uint32_t)IAP_ADDR)&0x2FFE0000)==0x20000000)
并不是‘与’“&”操作,而是取出IAP_ADDR的值,判断栈顶地址在这里插入图片描述

特别注意的地方

在bootloard跳转过去的程序需要添加

	memcpy((void*)0x20000000,(void*)IAP_ADDR,0xB4);
	__HAL_SYSCFG_REMAPMEMORY_SRAM();
在M3内核中可以通过操作VTOR寄存器来重映射中断向量表

SCB->VTOR = FLASH_BASE | 0x10000;
/* Vector Table Relocation in Internal FLASH. */

在M0内核中需要

memcpy((void*)0x20000000, (void*)IAP_ADDR, 0xB4);
__HAL_SYSCFG_REMAPMEMORY_SRAM();
其中,0x2000 0000是SRAM的起始地址,这个不需要改动。
而之后的两个参数需要根据实际情况作出修改。IAP_ADDR是应用程序的起址地址,从这里开始的VECTOR_SIZE字节,存放是的应用程序的中断向量表。VECTOR_SIZE是指中断向量表的大小,具体多大可以在startup.s文件里计算得到。以下以startup_stm32f030.s为例作说明:

在这里插入图片描述
我们只需关注其中的一小部分。从__Vectors开始,直到__Vectors_End,每一个DCD都代表一个中断向量(所谓中断向量,说得明白点,其实就是某个中断服务程序的入口地址)。
DCD USART1_IRQHandler ; USART1
 这里的“USART1_IRQHandler"其实就是UART1中断服务程序USART1_IRQHandler这个函数,同时,它也代表这个函数的入口地址。
  以上代码即定义了这样一张表,这张表包括45个元素,每个元素是一个长度为4字节的地址。除了第一个地址是SP(堆栈指针)外,其它的地址都是某个中断服务程序的入口地址。
  那么,回到我们要解决的问题上来,之前memcpy函数中的第三个参数VECTOR_SIZE,针对本例,就应该是45*4=180(0xB4)个字节。
在执行完以上两行代码后,若发生中断,CPU就会去SRAM(即0x2000 0000处)取中断向量了,所以,以0x20000000作为起始地址之后的0xB4个字节就不能被改动了。为了达到这0xB4个字节不被修改的目的,如下方法可以实现。在这里插入图片描述

其他注意事项

BootLoader程序大小不能超过应用程序的起始地址在这里插入图片描述

应用程序的起始地址中要设置和BootLoader中的烧写地址一致在这里插入图片描述

应用程序输出bin文件

在这里插入图片描述
fromelf.exe --bin -o …/lediap.bin ./out/lediap.axf
其中
fromelf.exe为编译后要执行的应用程序
–bin -o为应用程序选项
…/lediap.bin为生成在上一级目录,名字为lediap.bin
./out/lediap.axf为编译输出的文件这个文件要根据自己的工程来找

注意上面的命令不能出现中文或者字符

  • 6
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值