打印
[S3C2440]

S3C2440 nand flash 启动出问题

[复制链接]
1972|16
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
lr2131|  楼主 | 2014-7-22 14:57 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
自己写的S3C2440程序,运行域和加载域都定义到SRAM中。关闭看门狗,初始化时钟和SDRAM,测试SDRAM通过,LED指示灯正常闪烁,这个程序就记做A程序吧。

然后再写了个另外一个程序,运行域和加载域都定义到SDRAM首地址,初始化串口和nand flash,编写了nand flash最最基本的擦除,编程和读取,也都测试通过了。然后是通过接收串口的数据,写到nand flash的最前面4KB的地方。然后还要从nand flash中读出发回给PC串口,在PC端上做了数据对比,没有问题。其实就是想把A程序生成的bin文件通过PC端的串口发来后烧写到nand flash的前4KB中。这个程序记做B。

A和B程序都通过MDK5.1 + Jlink v8,运行没有问题,但是B把A烧写到nand flash中,断电后重启就是没看到LED闪烁。

我也看了跳线帽的配置,确实是选的nand flash的启动方式,但最后就是没见到A程序起来,到底怎么回事?

相关帖子

沙发
syairkiller| | 2014-7-22 15:01 | 只看该作者

使用特权

评论回复
板凳
jplzl| | 2014-7-23 11:05 | 只看该作者
把A程序的初始化SDRAM操作删除下看看

使用特权

评论回复
地板
lr2131|  楼主 | 2014-7-23 18:23 | 只看该作者
jplzl 发表于 2014-7-23 11:05
把A程序的初始化SDRAM操作删除下看看

问题解决了,不是SDRAM初始化的问题,最后找到的问题是我烧写到nand flash的数据,没注意大小端,换成另一种大小端方式,就行了。
现在每次给板子上电,从nand flash启动,就能跑我写的那个程序,LED闪烁没问题,SDRAM初始化也都好着。

bootloader第一步完成,现在我已经有自己写的烧写nand flash的源代码了。

使用特权

评论回复
5
jplzl| | 2014-7-24 13:32 | 只看该作者
其实我是想说,如果程序已经被下载到SDRAMj里面,再对SDRAM进行初始化时,不会把SDRAM里面的程序给清除掉么、。。。
ARM程序不一直都是小端格式的么。。

使用特权

评论回复
6
lr2131|  楼主 | 2014-7-27 00:11 | 只看该作者
jplzl 发表于 2014-7-24 13:32
其实我是想说,如果程序已经被下载到SDRAMj里面,再对SDRAM进行初始化时,不会把SDRAM里面的程序给清除掉么 ...

我知道你的意思了,A程序初始化了SDRAM,是想让B程序能放到SDRAM中用,因为SRAM太小太小了,但SDRAM那么大,所以我想充分利用SDRAM。

但如你所说,在仿真器加载B程序的时候,会不会影响到SDRAM,就看MDK的debug设置页>JLINK的设置项>
Reset Strategy里面,我设置的是software,PC=0,CPSR=0xD3,all SPSR=0x10
B工程设置好这一项后,就不会再仿真下载程序的时候硬复位CPU,那A工程初始化SDRAM和clock这些寄存器都是没有变化的,SDRAM中有没有变化,我不担心,因为B工程需要用到的位置,会重新覆盖正确的值,不会用的地方变不变也无所谓。其实我也不知道加载B程序的时候,SDRAM中是不是真的有数据会改变,我个人觉得应该不会的。

使用特权

评论回复
7
lr2131|  楼主 | 2014-7-27 00:15 | 只看该作者
jplzl 发表于 2014-7-24 13:32
其实我是想说,如果程序已经被下载到SDRAMj里面,再对SDRAM进行初始化时,不会把SDRAM里面的程序给清除掉么 ...

其实B工程带个初始化脚本,就可以初始化时钟和SDRAM,只是我个人就是想试试用自己的代码来完成这个功能。
我把脚本中初始化寄存器的都注释掉了,不过我最后还是需要用脚本中的一个功能,就是设置PC到对应的位置。不然,代码即使是对的,放到正确的位置,PC不在正确的位置,程序还是没**常跑。

使用特权

评论回复
8
jplzl| | 2014-7-28 09:37 | 只看该作者
lr2131 发表于 2014-7-27 00:11
我知道你的意思了,A程序初始化了SDRAM,是想让B程序能放到SDRAM中用,因为SRAM太小太小了,但SDRAM那么 ...

多谢指点了MDK中debug里的一个设置说明

但这个debug中的设置,只是在加JLINK仿真运行B程序的时候可能有作用,
但实际B程序由A程序从FLASH中调入SDRAM中自由运行时,这里的debug设置应该是不起作用的吧。

使用特权

评论回复
9
arm2009wzm| | 2014-7-28 16:50 | 只看该作者
你这个办法不是很好,你应该把B程序固化到前4K NandFlash中,B程序运行时首先发送数据联系PC,短暂延时后(ms级,和波特率有关)如果没有回应,则从NandFlash中读入A程序后运行,如果有回应则通过SIO口读取*.Bin并固化到NandFlash中,这个办法对于后续的固化比较方便,你也可以把A程序的长度(页数)、定位信息页固化到NandFlash的一个页中,后面读取A程序时就很方便,

此办法无需每次固化B程序。

使用特权

评论回复
10
lr2131|  楼主 | 2014-7-28 21:51 | 只看该作者
arm2009wzm 发表于 2014-7-28 16:50
你这个办法不是很好,你应该把B程序固化到前4K NandFlash中,B程序运行时首先发送数据联系PC,短暂延时后( ...

嗯,我明白你说的。但并不是我不愿意把B固化到nand的前4K,而是4KB实在太小了,我定位给B代码的功能再精简点都可能不够,我现在的能力还不能都写出那么精简的B程序放到前4KB。我以后会把B固化到nand中,但不是前4KB,4KB固化A程序,由A程序来加载和引导B程序。B程序完成bootloader的功能。

使用特权

评论回复
11
lr2131|  楼主 | 2014-7-28 21:57 | 只看该作者
jplzl 发表于 2014-7-28 09:37
多谢指点了MDK中debug里的一个设置说明

但这个debug中的设置,只是在加JLINK仿真运行B程序的时候可能有 ...

这个设置,其实最终是jlink支持出来的,你可以看看jlink在烧写程序时,有个设置项也很像MDK中那个复位的选择设置。

目前我的A程序都只是为了给B一个加载前的环境。是你说的,在仿真运行B时起作用。
但以后我固化了A程序到flash,也会再修改B程序,也固化到nand中,但不在前4KB,由A引导和加载B程序。
这个时候的效果和仿真几乎是一样的。如你所说,这个时候,debug的设置当然也是不起作用的,因为这个工程已经没有仿真器参与了。这也就是我以后自己写的bootloader的原型。

使用特权

评论回复
12
arm2009wzm| | 2014-7-29 09:45 | 只看该作者
你由A程序来加载和引导B程序,那A程序就是Bootloader,而B程序是应用程序。只是你把 SIO 通讯和 NandFlash 放入了应用程序即B程序,这当然也可以。
而要把通讯和Flash操作放入Bootloader即A程序,最好用汇编编写所有操作,代码长度在2k~3k之间,A程序的主要工作就是初始化SDRAM、判断串口通讯固化应用程序、引导已经固化的应用程序。别的操作包括Led灯等等都由应用程序完成。

使用特权

评论回复
13
lr2131|  楼主 | 2014-7-30 11:31 | 只看该作者
arm2009wzm 发表于 2014-7-29 09:45
你由A程序来加载和引导B程序,那A程序就是Bootloader,而B程序是应用程序。只是你把 SIO 通讯和 NandFlash  ...

从支持的烧写方式上来说,如果只是通过串口更新或烧写程序到nand中,4KB也差不多可以了,其他的功能也加进来,4KB也差不多可以。但是我还想支持其他的烧写方式,网络的,USB的,SD卡的那些,4KB就不够了,所以我想把这些高级的方式,还有其他的功能都放到B中。A就只是更新烧写B,引导B。

使用特权

评论回复
14
lr2131|  楼主 | 2014-7-30 11:33 | 只看该作者
arm2009wzm 发表于 2014-7-29 09:45
你由A程序来加载和引导B程序,那A程序就是Bootloader,而B程序是应用程序。只是你把 SIO 通讯和 NandFlash  ...

另外,还要支持nor的,nand的ECC我也没加进来。SD卡上来了后,还需要支持文件系统。网络那块还不知道具体怎么弄,还有MMU,东西真的不少,4KB是在是不够啊。

使用特权

评论回复
15
arm2009wzm| | 2014-7-31 14:52 | 只看该作者
在 Boot1 和应用程序之间加一个 Boot2,Boot1 如上面所说用汇编编写,保证在4096字节之内,Boot2 可以使用C 应用编写,没有长度限制。

Boot1 负责 Boot2 的引导加载执行,Boot2 负责应用程序的引导加载执行,同时可以把你所要求的这些功能放入Boot2,这样每次固化程序时,Boot1 和 Boot2 都无需重新更新,只要重新烧写应用程序即可。
而且Boot1 和 Boot2  独立于应用程序之外,他们的一些功能,比如读写SD卡、USB通讯、串口通讯和你自己的应用程序中的这行模块使用不会有任何的冲突。

当然,使用Boot2 也有一个限制,就是必须在仪器启动的时候判断个模块状态,然后进行应用程序的烧写,当引导加载了应用程序后,这些功能就不存在了。

使用特权

评论回复
16
DST-IC代理| | 2014-8-1 15:07 | 只看该作者
本帖最后由 DST-IC代理 于 2014-8-1 15:14 编辑

优势代理
美国ALLIANCE SRAM/SDRAM/DDR(不改版,不停产,货期短)
韩国ATO NAND/MCP/SPI FLASH (与HYNIX同封装厂,兼容SAMSUNG等)
。。。
欢迎免费索取样品及原厂FAE技术支持!

使用特权

评论回复
17
lr2131|  楼主 | 2014-8-1 19:10 | 只看该作者
你说对了,我就是这么做的,A就相当于boot1,B就相当于boot2

使用特权

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

本版积分规则

11

主题

203

帖子

0

粉丝