Boot 程序无法从NandFlash 启动

fcxmxt 2017-02-18 06:50:48
问题描述:
1、ARM芯片使用的是Atmel at91sam9g45 ,片内RAM 64K。
2、BMS为1,芯片将会从内置的 ROM 启动,里面的程序会被执行。
启动程序包含了几个步骤。第一,进行设备的初始化,然后尝试从外部的存储器(NVM)进行启动最后,如果在NVM找不到有效的程序,则会执行一段叫做 SAM-BAR Monitor 的监控程序。
3、NandFlash 连接在EBI0 CS3上。
4、Boot程序内存分布如下,链接地址为0x300000(片内RAM起始地址)
中断向量表存放在 [from 0x300000 to 0x3000FF]
.cstartup代码段存放在[from 0x300100 to 0x3004FF]
.text段存放在[from 0x300500 to 0x3020FF]
.data段,.bass段,以及栈,堆存放在 [from 0x302100 to 0x307FFF]
5、在.cstartup段的开始处,我用汇编写了一个点灯的代码,接着就是设置CPU模式,关闭IRQ,FIQ中断,关闭看门狗,设置CPU时间等操作。
6、通过IAR工具把Boot程序直接下载到片RAM里面,是可以正确被执行的,一上电灯就亮了。
7、通过烧写工具把Boot.bin文件写到了NandFlash开始处,已经验证Boot.bin文件是完全正确地写在NandFlash的开始处的,因为我从NandFlash开始处读Boot.bin文件长度,和Boot.bin对比是一样的。

问题是一上电,板子上的LED灯没有亮。怀疑NandFlash的Boot程序没有被拷贝到片内RAM里面。

这个问题折磨我一周了,一直没有解决,希望大侠指点一下,不胜感激。
...全文
463 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
fcxmxt 2017-02-20
  • 打赏
  • 举报
回复
你好,非常感谢。 1、我的Boot程序放在NandFlash开始处。 2、BMS 为高电平,一上电CPU把 ROM 映射到 0x0地址,应该先是执行了固化在ROM中的代码,之后才去执行Boot程序。 3、今天有了新的发现,发现了一上电PC跳到了Prefetch abort中断,不知道是为什么。 4、验证,我把Prefetch abort中断函数处加了点灯程序,一上电灯亮了。 5、现在我正要找到一上电为什么执行Prefetch abort中断。
ares_gyh 2017-02-20
  • 打赏
  • 举报
回复
映射是在你程序跑起来之后才能映射,你的boot是你的第一个执行代码,所以一定要放在非易失性存储中
fcxmxt 2017-02-20
  • 打赏
  • 举报
回复
你好,非常感谢你能回答我的问题。 1、我看AT91SAM9G45芯片手册的内存分布,片内RAM的地址是0x00300000。 2、REMAP 允许用户把内部 SRAM 映射到 0x0 地址。 我也是新手,有好多地方都不太懂,希望大侠们不吝赐教。
uid123 2017-02-19
  • 打赏
  • 举报
回复
你确定是0x300000这个实地址么??怎么多了一位啊???启动加载地址应该实5位啊??从0x00000到0xFFFFF,其中从0x00000到0x003FF是中断向量表,从0x00400到0x004FF是BOIS数据区,从0x0E2CE到0x0FFFE是中断服务程序,其他的其它的应该就是实内存地址了,就是操作系统交控制权到程序或者服务程序里面了。

21,600

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 驱动开发/核心开发
社区管理员
  • 驱动开发/核心开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧