stm32 uclinux遇到的问题,ST官方发布的an3012包中的“kernel_boot_loader.hex”有源
最近自己画了一块板子,配制是:AM29LV641D NOR flash 8M Byte
IS61LV51216 SRAM1M Byte
外部存储器的地址线和片选信号线都是按官方电路图接的,只是用的nor flash型号不同,自己移植了官方提供的例程后支持了自己板子上的AM29LV641D的8M flash,可以正常下载而且能将程序放到外部的flash和SRAM中运行?我按官方uclinux on stm32文档步骤操作,将镜像下载到外部NOR flash中但uclinux起动不了,一条打印信息都没有。我对uclinux内核起动的汇编文件单独调试,STM32 CPU ID检测能通过,但是平台检测就不通过了 这段汇编如下:
/*
* Lookup machine architecture in the linker-build list of architectures.
* Note that we can't use the absolute addresses for the __arch_info
* lists since we aren't running with the MMU on (and therefore, we are
* not in the correct address space).We have to calculate the offset.
*
*r1 = machine architecture number
* Returns:
*r3, r4, r6 corrupted
*r5 = mach_info pointer in physical address space
*/
__lookup_machine_type:
adr r3, 3b
ldmia r3, {r4, r5, r6}
sub r3, r3, r4 @ get offset between virt&phys
add r5, r5, r3 @ convert virt addresses to
add r6, r6, r3 @ physical address space
1: ldr r3, @ get machine type
teq r3, r1 @ matches loader number?(我屏蔽了这句之后,一会儿就发生硬异常了)
beq 2f @ found
add r5, r5, #SIZEOF_MACHINE_DESC @ next machine_desc
cmp r5, r6
blo 1b
mov r5, #0 @ unknown machine 我的板子执行了这句
2: mov pc, lr
ENDPROC(__lookup_machine_type)
r5=0了之后就跳到了 __error_a/* __error_a是一个死循环 */
我想可能是flash型号不同缘故,所以想看ST官方发布的uclinux on stm32的an3012包中的“kernel_boot_loader.hex”的源码,看看它是怎么引导内核的,但“kernel_boot_loader.hex”的源码找不到地方下载。我有个想法就是移植uboot,ST发布的uclinux方案是在NOR flash上运行的内核不需要自解压也不需要拷贝到内存当中运行,这样不是不省去了很多麻烦。不知可不可行。有没有人做过呢?这是我QQ 461207084。
http://cache.amobbs.com/bbs_upload782111/files_35/ourdev_607546FNYF2J.JPG
支持自己的板子上的NOR flash下载,并且可以在NOR中运行程序,但不能起动uclinux (原文件名:sdf.JPG)
http://cache.amobbs.com/bbs_upload782111/files_35/ourdev_607547LG5B5J.JPG
下载官方的kernel_boot_loader.hex或Tiny_kernel_boot_loader.hex的官方开发板上的flash (原文件名:guan.JPG)
http://cache.amobbs.com/bbs_upload782111/files_35/ourdev_607548D60ZMT.JPG
keil中也制作了自己板子flash算法,可正常下载运行程序。 (原文件名:k.JPG)
这是ST官方发布的uclinux开发包,但在我的板子上运行不起来ourdev_607549Z0NA4G.rar(文件大小:2.82M) (原文件名:an3012.rar) 上面那段汇编是uclinux内核起动代码,是对开发板平台检测部份,在打了ST发布的补丁后的uclinux源码包中\uClinux-dist\linux-2.6.x\arch\arm\kernel\目录下的head-common.S和head-nommu.S下可以找到 关注。以后也想上uclinux。
顺便问一下1MB的RAM,在跑UCLINUX后能剩下多少?
STM32能再扩RAM到2MB以上么? 强帖留名 同关注 回复二楼,STM32能再扩RAM到2MB以上么?
STM32 cortex m3内核采用哈佛结构的ARMv7体系结构,主频72M,可以超频到128M(运行UCOS测试过,很稳定,S3C44b0才66MHZ),且片外有丰富的外设,这些都是一般ARM7不能比的,但不支持SDRAM是它最大的缺点。
STM32的FSMC总线每个Bank地址线是A共26位,数据线是16位,就是说每个bank最多可以外扩128M Byte的RAM,只是没有那么大的SRAM芯片而己,现在1M的SRAM就要80元,512K的只要十几元。
想外扩2M RAM以上有两种方法:
1.可以用74系列数字芯片3-8线译码器将8片512K 的SRAM级连成4M就行。
2.当前SDRAM比较便宜,32M Byte也就20块钱不到。可以用CPLD+SDRAM转换SDRAM接口,使FSMC总线支持SDRAM。
目前我的板子上就是采用这种方法FSMC+CPLD+SDRAM。板子上SDRAM是32M Byte的,FSMC可以通过CPLD正常读写SDRAM,当前测试uclinux最小系统起动,没有用上SDRAM而己,准备成功后再将32M加上去给uclinux用,到时就可以为所欲为了,呵呵。现在uclinux最小系统都起动不了郁闷当中……
http://cache.amobbs.com/bbs_upload782111/files_35/ourdev_607639I6H5T9.JPG
板子上用的CPLD是144脚的EPM570 (原文件名:cpld.JPG) 回复【2楼】wu0232
-----------------------------------------------------------------------
1.可以用74系列数字芯片3-8线译码器将8片512K 的SRAM级连成4M就行。
2.当前SDRAM比较便宜,32M Byte也就20块钱不到。可以用CPLD+SDRAM转换SDRAM接口,使FSMC总线支持SDRAM。 谢谢兄弟这么详细的讲解。
原来兄弟是用CPLD+SDRAM
那用2MB以上的PSRAM行不行?貌似接口和SRAM一样的。 另外,突然想起,CPLD+SDRAM,其实和有种“单片机显卡”类似,也是CPLD+SDRAM ? 回复【7楼】wu0232
谢谢兄弟这么详细的讲解。
原来兄弟是用cpld+sdram
那用2mb以上的psram行不行?貌似接口和sram一样的。
-----------------------------------------------------------------------
PSRAM内部结构和SDRAM相似,芯片接口和SRAM相似,但容量和速度都比不上SDRAM,不管用什么RAM都要对FSMC总线进行相应的初始化才行。这都要找到kernel boot loader.hex的源码才行。除非你用ST官网开发板上的相同型号的器件。 官方的kernel_boot_loader源码没有公开,
可以自己写一个,或者用M29W128系列NOR FLASH 回复【10楼】xi_liang
官方的kernel_boot_loader源码没有公开,
可以自己写一个,或者用m29w128系列nor flash
-----------------------------------------------------------------------
众所周知 boot loader把执行权交给linux时通过CPU寄存器给linux传递了参数,你知道ST官网的kernel_boot_loader传了什么给内核么?
我在\linux-2.6.x\arch\arm\tools下找到了机器码,
stm3210e_eval ARCH_STM3210E_EVAL STM3210E_EVAL 2189
通过自己在Keil下写的一个假的boot loader把机器码给它传过去,结果平台检测通过,但串口还是没有打印信息,且运行不到1秒钟出现总线访问异常。 stm32 on uclinux今天刚刚调出来了,uclinux可以在外部NOR flash起动。之前系统一直起动不了是因为我板子上用了CPLD,我板子上FSMC总线是通过了CPLD才访问外部存储器的,ST官方开发板对FSMC总线初始化只用了A,而我考虑到以后的扩展,把A也都用进去了,所以A这几根多余的信号线导致CPLD内部逻辑误动作,使FSMC总线访问外部存储器错误,这样一来,实际上SRAM一直都没用上,导致系统起动不了。我之前测试外部SRAM时也是把所有的FSMC地址线都都初始化了,那样当然可以正常访问SRAM啦,所以问题一直没发现,现在我屏蔽掉A这几根多余信号线,系统正常起动了。
可以不用和官方同型号的NOR flash,不过要自己做flash烧写工具,把自己写的代码下载芯片里对NOR flash进行烧写后,还要再把ST官方的boot loader下到芯片里去引导linux内核,好麻烦啊,没有uboot爽。
http://cache.amobbs.com/bbs_upload782111/files_35/ourdev_608134OGJ4OP.JPG
uclinux在外部NOR flash中运行,只能试用几个简单的命令。 (原文件名:现象.JPG) 恭喜啊。
1MB的SRAM,能剩下多少? 回复【13楼】wu0232
-----------------------------------------------------------------------
platform Initialisation finished jumping to kernel.
Linux version 2.6.26-uc0 (stm32@localhost.localdomain) (gcc version 4.3.3 (Sourcery G++ Lite 2009q1-163) ) #1 Wed Sep 2 09:58:32 UTC 2009
CPU: ARMv7-M Processor revision 1 (ARMv?(11)M)
Machine: STM3210E-EVAL
SRAM Config: bank @ 0x68000000 (size: 1024KB) - bank @ 0x20000000 (size: 64KB).
Built 1 zonelists in Zone order, mobility grouping off.Total pages: 254
Kernel command line: noinitrd root=mtd1 ro rootfstype=jffs2 init=/linuxrc console=ttyS0
PID hash table entries: 16 (order: 4, 64 bytes)
console enabled
Dentry cache hash table entries: 1024 (order: 0, 4096 bytes)
Inode-cache hash table entries: 1024 (order: 0, 4096 bytes)
Memory: 1MB 0MB = 1MB total
Memory: 980KB available (436K code, 55K data, 8K init)//内存共980K可用,代码436K,数据55K,8K用于初始化
Mount-cache hash table entries: 512
JFFS2 version 2.2. 漏 2001-2006 Red Hat, Inc.
simple-gpio: now handling 16 GPIOs: 0 - 15
ttyS0 at MMIO 0x40013800 (irq = 37) is a STM32 USART1 Port
Probed and found the STM3210E-EVAL NOR flash chip
Creating 4 MTD partitions on "M29W128F NOR FLASH":
0x00000000-0x00100000 : "Kernel raw data"
0x00100000-0x00160000 : "rootfs"
0x00160000-0x00190000 : "rawdata"
0x00190000-0x001c0000 : "cramfs_partition"
rtc-stm3210e_eval rtc-stm3210e_eval.0: rtc core: registered rtc-stm3210e_eval as rtc0
rtc-stm3210e_eval rtc-stm3210e_eval.0: setting system clock to 1970-01-01 00:30:58 UTC (1858)
VFS: Mounted root (jffs2 filesystem) readonly.
Freeing init memory: 8K //初始化完又释放8K
Mounting proc fs
Mounting sysfs
[H[JWelcome to
____ __
/__| ||_|
_ _| || | _ ___ _ _ _ _
| | | | || || |_ \| | | |\ \/ /
| |_| | |__| || | | | | |_| |/ \
| ___ \____|_||_|_| |_|\____|\_/\_/
| |
|_|
For further information check:
http://www.uclinux.org/
http://www.st.com/stm32
/ # 不是很明白LINUX,多问问
可用内存还有980KB?不会这么多吧? 436K code,uclinux是在sram里运行的吗?
能否配置使用XIP的? mark https://my.st.com/public/STe2ecommunities/mcu/Lists/ARM%20CortexM3%20STM32/Flat.aspx?RootFolder=%2Fpublic%2FSTe2ecommunities%2Fmcu%2FLists%2FARM%20CortexM3%20STM32%2FStm32%20Uclinux%20bootloader&FolderCTID=0x01200200770978C69A1141439FE559EB459D758000626BE2B829C32145B9EB5739142DC17E¤tviews=740#{54F2BE06-5BA9-4619-B40F-DB0B14C2ABE6}
https://my.st.com/public/STe2ecommunities/mcu/Lists/ARM%20CortexM3%20STM32/Flat.aspx?RootFolder=%2Fpublic%2FSTe2ecommunities%2Fmcu%2FLists%2FARM%20CortexM3%20STM32%2FSource%20code%20for%20the%20uCLinux%20bootloaders&FolderCTID=0x01200200770978C69A1141439FE559EB459D758000626BE2B829C32145B9EB5739142DC17E¤tviews=184 1M 的SRAM好贵啊。。。
! 1M 的SRAM好贵啊。。。 mark “kernel_boot_loader.hex”虽然ST官方没有开源,但可以自己写出来。 顶!楼主自己写出来了吗?楼主这个板子已经验证成功了吗?
用cpld来扩sdram! 请问cpld和stm32,sdram的接线图是怎么样的!。
现在这样运行系统怎么样》? 呵呵,纯属玩具,没有任何实际用途
如果要支持sdram,楼主锁说的cpld+sdram,首先用cpld实现一个稳定的sdram controller不是那么简单的,如果要用商业的,花10K以上的美金估计是少不了的。如果自己做,你除非是高手,否则如何保证自己开发的sdram controller的可靠性稳定性?
另外,楼主只知到stm32是72MHZ的,什么armv7架构,比44b0主频高,架构好。但却不知道stm32的72mhz并没有吹的那么快,据说stm32 72mhz还不如TI lm3s 50mhz跑的快(网上有人评测过,可信度如何我不知道,但有这一说);另一个关键的是很多arm7虽然主频低,但他有cache,我不记得44b0是否有cache,估计是有的,有cache和没cache对性能的影响是数量级的。我测过2440跑400mhz时候,不开cache其sdram访存性能比mcf52259 80mhz的mcu慢几倍。所以不要说stm32+sdram怎么怎么快,我可以相当肯定,不会快的,肯定慢!
如果真要上uclinux,与其费这么大力气做个可靠性性能都全无保障的玩具,不如直接上2440之类的,成本也不会比这个做法高,但可靠性,性能则会远强于楼主这种玩法 回复【27楼】bluehacker
呵呵,纯属玩具,没有任何实际用途
如果要支持sdram,楼主锁说的cpld+sdram,首先用cpld实现一个稳定的sdram controller不是那么简单的,如果要用商业的,花10k以上的美金估计是少不了的。如果自己做,你除非是高手,否则如何保证自己开发的sdram controller的可靠性稳定性?
另外,楼主只知到stm32是72mhz的,什么armv7架构,比44b0主频高,架构好。但却不知道stm32的72mhz并没有吹的那么快,据说stm32 72mhz还不如ti lm3s 50mhz跑的快(网上有人评测过,可信度如何我不知道,但有这一说);另一个关键的是很多arm7虽然主频低,但他有cache,我不记得44b0是否有cache,估计是有的,有cache和没cache对性能的影响是数量级的。我测过2440跑400mhz时候,不开cache其sdram访存性能比mcf5......
-----------------------------------------------------------------------
你说的很不错我就是搞的玩的,没什么实用性,我只是时间多,无聊而已,CPLD主要控制SDRAM自刷新,并将SDRAM接口转换成Intel8086的CPU接口,接口时序中间插入了等待信号,这样一来虽然不是标准的SRAM接口,但STM32的FSMC总线支持等待信号,只要给STM32的FSMC相应配制,STM32却能正常的访问SDRAM,你说的很不错由于没有cache,速度确实没有SRAM快,不过你要知道,FSMC支持突发访问,SDRAM也有突发模式,这样速度也没有你想象的那么慢。 顶一下“玩”的
严重支持 :P mark! 楼主的cpld接sdram是怎么接的?能把那部分图开源吗? kernel_boot_loader.hex 源码早就写出来了,好长时间没看帖子,没想到这么多人关注并深爱着stm32,感动中......
http://cache.amobbs.com/bbs_upload782111/files_46/ourdev_686641KRRWJ2.JPG
自制的cortex m3 bootloader (原文件名:涂改bootloader.JPG)
http://cache.amobbs.com/bbs_upload782111/files_46/ourdev_686642E1AAGM.JPG
起动uclinux (原文件名:stm32_uclinux.JPG) 呵呵!顶!这个kernel_boot_loader.hex是u-boot的移植吗? 一直尝试去搞Linux。。。不过一直都觉得很麻烦。。。 这样的高手不得不顶啊
留个记号,也许以后会有用。 楼主很强啊,玩cpld比较麻烦 支持你的 longonly120 发表于 2010-12-28 14:23 static/image/common/back.gif
回复二楼,STM32能再扩RAM到2MB以上么?
STM32 cortex m3内核采用哈佛结构的ARMv7体系结构,主频72M,可以 ...
努力啊,期待中...... LZ可以发个教程了,STM32F4上应该跑得快很多。 就stmf1的fsmc速度,代码内存都挂上面,那真的是一夜回到解放前了,实际速度上10dmips就烧高香了。。。。
页:
[1]