打印

请教stm32f207下的rom启动跳转到ram启动

[复制链接]
3771|7
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
jackxn|  楼主 | 2013-5-24 09:57 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
大家好,首先简单介绍下我的工作,我的硬件平台是STM32F207ZGT,软件使用eCos系统。
我要实现的功能:
1. 固件程序在flash中运行(Rom启动方式 ),它相当于一个小型的bootloader(类似于redboot)。
2. 固件程序可以接收应用程序(RAM启动方式),并将其存储在片外Ram中。
3. 完成应用程序的下载及存储,马上跳转到RAM中执行新的应用程序。

目前存在的问题:
1. 在redboot模式下,可以直接把应用程序load 到Ram中,然后输入命令 go 0x64008011,新的应用程序就开始执行了。
2. 我的固件程序可以自动接收应用程序,然后存储在Ram中,但是没办法跳转到Ram中。(应用程序在redboot模式下测试过,没有任何问题,存储的地址也是正确的) 我使用的代码如下,不能成功跳转。

HAL_DISABLE_INTERRUPTS(oldints);                 //屏蔽中断
__asm__ volatile("ldr        sp,=0x64800000" );  //设置堆栈指针
(*(void (*)(void))(0x64008011))();                    //跳转PC指针

网上有关于STM32的IAP相关代码,但那个是针对flash跳转到flash的,我这个是从flash跳转到ram,不能称作是IAP,纯粹用于调试目的,掉电后应用程序不保存。只有固件程序是保存在flash中的。不知道我是否说清楚了,请大家帮帮忙,谢谢!
沙发
IJK| | 2013-5-24 10:10 | 只看该作者
LZ的想法应该不难实现,我觉得就差1点:把中断向量表指向RAM,即通过
  // Set the Vector Table base address at 0x20000000
  NVIC_SetVectorTable(NVIC_VectTab_RAM, 0x0);

使用特权

评论回复
板凳
jackxn|  楼主 | 2013-5-24 10:28 | 只看该作者
IJK 发表于 2013-5-24 10:10
LZ的想法应该不难实现,我觉得就差1点:把中断向量表指向RAM,即通过
  // Set the Vector Table base addr ...

感谢您的回复,我查了下,eCos源码下并没有NVIC_SetVectorTable以及NVIC_VectTab_RAM的定义,我需要查一下eCos下是如何定义的

使用特权

评论回复
地板
jiangrf| | 2013-5-24 11:27 | 只看该作者
可以试试直接调用redboot的do_go(int argc, char *argv[])函数,应该是do_go(1, "0x64008011")吧

使用特权

评论回复
5
jackxn|  楼主 | 2013-5-24 11:31 | 只看该作者
jiangrf 发表于 2013-5-24 11:27
可以试试直接调用redboot的do_go(int argc, char *argv[])函数,应该是do_go(1, "0x64008011")吧 ...

也是一个思路,可以试试把这个函数加进去,呵呵,谢谢您的回复

使用特权

评论回复
6
airwill| | 2013-5-24 15:22 | 只看该作者
1. 编译的程序的地址要符合 SRAM 的地址.
2. 把中断向量表指向 RAM 正确的地址.
3. 必要的外设初始化, 清理一下现场.
4. 设置 SP 指针, 跳到 RAM 的入口.

使用特权

评论回复
7
jackxn|  楼主 | 2013-5-24 15:59 | 只看该作者
airwill 发表于 2013-5-24 15:22
1. 编译的程序的地址要符合 SRAM 的地址.
2. 把中断向量表指向 RAM 正确的地址.
3. 必要的外设初始化, 清理 ...

感谢您的回复!我有如下疑问
1. RAM启动方式中.ldi文件配置为 SECTION_rom_vectors 从0x64008000开始,我把固件接收的应用程序直接存储在0x64008000地址开始。SECTION_sram从0x20000400开始,这个不知道应该如何设置。
2. eCos下的中断向量表如何设置,是否是指到0x64008004地址?
3. rom启动方式的固件本身已经完成了外设初始化(都在hal_reset_vsr()函数中),我没有修改启动代码
4. 您是说将SP指针赋值0x64008000吗,自己读取MSP的值,还是直接把SP赋值RAM栈顶地址0x64800000
再次感谢!

使用特权

评论回复
8
z87843785| | 2015-7-22 16:05 | 只看该作者
小弟也在将eCos往stm32上移植,学习学习

使用特权

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

本版积分规则

个人签名:STC16F2407

16

主题

136

帖子

0

粉丝