打印
[STM32F1]

STM32F103VC改变闪存起始地址后,程序无法启动,请大神指教

[复制链接]
3156|20
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
程序将flash起始地址改为0x8001000,烧录程序到stm32f103vc中,上电时BOOT0置1 BOOT1置0,程序无法启动,是什么问题?请大神支招

QQ截图20161209140013.png (33.33 KB )

将IROM1起始地址改为0x8001000

将IROM1起始地址改为0x8001000

QQ截图20161209140035.png (27.41 KB )

QQ截图20161209140035.png
评分
参与人数 1威望 +1 收起 理由
橡树 + 1 请问,你的问题解决了吗?期望分享下
沙发
wenunit| | 2016-12-9 15:29 | 只看该作者
向量表要移动到相同位置..

使用特权

评论回复
板凳
闲森lxl|  楼主 | 2016-12-9 15:33 | 只看该作者
wenunit 发表于 2016-12-9 15:29
向量表要移动到相同位置..

在main()中第一行写NVIC_SetVectorTable(NVIC_VectTab_FLASH,0x2000);还是没有作用,
是在MDK中哪个地址设置吗?

使用特权

评论回复
地板
huangcunxiake| | 2016-12-9 15:59 | 只看该作者
那就别改变,按默认的搞。

使用特权

评论回复
5
闲森lxl|  楼主 | 2016-12-9 16:08 | 只看该作者
huangcunxiake 发表于 2016-12-9 15:59
那就别改变,按默认的搞。

我要做一个Bootloader, APP程序要写到0x8001000后面的

使用特权

评论回复
6
yjmwxwx| | 2016-12-9 18:31 | 只看该作者
本帖最后由 yjmwxwx 于 2016-12-9 18:33 编辑

看看0xE000ED08里面是0x8001000吗?

使用特权

评论回复
7
whtwhtw| | 2016-12-9 23:00 | 只看该作者
boot0还是要置0

使用特权

评论回复
8
skygz| | 2016-12-9 23:22 | 只看该作者
到 库文件里改才生效...貌似是system_stm32f10x.c

使用特权

评论回复
9
quop_mike| | 2016-12-10 00:16 | 只看该作者
如果有生成bin文件的话
用二进制查看器查看bin文件的第1-4(还是5-8,记不清了)字节的值,这个值代表的是起始地址
看一下这个地址和你设置的一不一致
如果不一致则说明可能工程有问题

非常诡异,年初的时候写bootloader也是被折腾的不行
用keil5环境,app怎么也启动不了
后来仔细试了下发现工程模板用战舰的就不行,用野火的模板就一点问题都没有

使用特权

评论回复
10
pener| | 2016-12-10 08:48 | 只看该作者
NVIC_SetVectorTable(NVIC_VectTab_FLASH,0x2000);  这偏移地址应该是0x1000吧

使用特权

评论回复
11
meishideni| | 2016-12-11 11:39 | 只看该作者

那就别改变,按默认的搞

使用特权

评论回复
12
戈卫东| | 2016-12-11 11:42 | 只看该作者
不管你怎么改,上电后的向量地址是0。
重映射要从这里开始。

使用特权

评论回复
13
闲森lxl|  楼主 | 2016-12-12 08:45 | 只看该作者
pener 发表于 2016-12-10 08:48
NVIC_SetVectorTable(NVIC_VectTab_FLASH,0x2000);  这偏移地址应该是0x1000吧

是0x1000,关键是仿真的时候一开始就进不去mian(),从而就无法设置偏移地址
NVIC_SetVectorTable(NVIC_VectTab_FLASH,0x1000);

使用特权

评论回复
14
pener| | 2016-12-12 10:51 | 只看该作者
bootloader里有没有跳转到0x8001000

使用特权

评论回复
15
xmshao| | 2016-12-12 11:11 | 只看该作者
闲森lxl 发表于 2016-12-12 08:45
是0x1000,关键是仿真的时候一开始就进不去mian(),从而就无法设置偏移地址
NVIC_SetVectorTable(NVIC_Ve ...

你 boot0 要设置为0 才能进你的程序。

另外,你可以在system_stm32f10x.c 里的SystemInit ( )内修改中断矢量表起始地址。

使用特权

评论回复
16
huangcunxiake| | 2016-12-12 12:45 | 只看该作者
要确认不能占用了其他的内存。

使用特权

评论回复
17
闲森lxl|  楼主 | 2016-12-12 13:46 | 只看该作者
quop_mike 发表于 2016-12-10 00:16
如果有生成bin文件的话
用二进制查看器查看bin文件的第1-4(还是5-8,记不清了)字节的值,这个值代表的是 ...

能不能先改变成0x8001000,直接把APP烧录到板子里面,不通过bootloader引导?
现在很多种方法APP都跑不起来

使用特权

评论回复
18
闲森lxl|  楼主 | 2016-12-12 13:48 | 只看该作者
戈卫东 发表于 2016-12-11 11:42
不管你怎么改,上电后的向量地址是0。
重映射要从这里开始。

那就是没法直接从0x8001000启动程序运行的咯?

使用特权

评论回复
19
cuyebiren| | 2016-12-12 16:02 | 只看该作者
闲森lxl 发表于 2016-12-12 13:48
那就是没法直接从0x8001000启动程序运行的咯?

确实不能在 0x8001000 启动程序!只能在 0x0000000 启动程序,而 0x8001000 不能 映射 0x0000000 0x8000000 可以 映射 0x0000000
具体见下图参考手册上的说明:




下图是 F4 参考手册上的存储器映射表,F1 的没有这个表:

使用特权

评论回复
20
闲森lxl|  楼主 | 2016-12-12 19:44 | 只看该作者
quop_mike 发表于 2016-12-10 00:16
如果有生成bin文件的话
用二进制查看器查看bin文件的第1-4(还是5-8,记不清了)字节的值,这个值代表的是 ...

用二进制查看器发现,第1-4是0x2008690,第5-8是0x0800A6B9
我把bootloader程序中的起始地址改为0x0800A6B9后,Ymodem给Bootloader数据一直卡着不动,应该是bootloader数据无法写入闪存

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

2

主题

13

帖子

0

粉丝