打印

多任务环境下STM32的FSMC总线上多个外设不能同时访问

[复制链接]
10995|23
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
tsx1983|  楼主 | 2009-12-24 10:42 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
STM32的外部总线上挂了一个MD9000A+一个SRAM。跑ucos+lwip.
不使用外部SRAM。所有的都OK,程序非常稳定.
但是只要把系统的堆空间放到外部SRAM,LWIP的TCP连接立刻就无法连接成功了。
那把堆空间放在片内,把LWIP的源文件的的变量全都分配到外部SRAM。情况 一样。
只有把所有的变量都放到片内才能正常运行。
不知道这是FSMC的问题,还是编译器的问题.编译器用的MDK3.50
有人会说是外部SRAM没有初始化好.那我手动申请一段内存到外部SRAM
unsigned char TestBuf[1000] __at(0x68000000).然后再程序中使用
没有任何问题.
有人遇到过吗?
沙发
香水城| | 2009-12-24 10:50 | 只看该作者
如果是手动申请一段内存到外部SRAM,然后再程序中使用没有任何问题,那么估计问题与编译器相关的可能性比较大,当然还要仔细研究你手动申请外部SRAM时,是如何在程序中使用的?使用编译器时又是如何使用的?是否为同一个变量同一个地址?

使用特权

评论回复
板凳
tsx1983|  楼主 | 2009-12-24 11:39 | 只看该作者
使用手动申请的内存是这样使用的。
unsigned char TestBuf[1000] __at(0x68000000).
len=recv(client_socket,(void *)TestBuf,sizeof(TestBuf),0);
if(len>0)
  send_len=send(client_socket,TestBuf,len,0);
就是把TCP收到得数据放在TestBuf里,然后再发送出去

使用特权

评论回复
地板
tsx1983|  楼主 | 2009-12-24 11:49 | 只看该作者
使用编译器分配是这样使用的.
右键点击Project Workspace里里源码文件,选择Option for Group或Option for Flie打开一个对话框
然后在Memory Assignment选项里将Zero Initialized Data选择为RAM1[0x68000000-0x680FFFFF]
这样既把整个gropu中的文件或某个文件的ZI段分配到了外部SRAM里。
发现这样问题来了,把Lwip的所有文件的ZI段分配到外部SRAM,连接不上了。选择默认的分配则好使
选择把ucos的源代码的ZI段分配到外部SRAM,程序直接HardFault

使用特权

评论回复
5
tsx1983|  楼主 | 2009-12-24 11:56 | 只看该作者
另外由于LWIP要使用内存池,这个内存池只能放在内部SRAM就没问题,放到片外就无法连接成功.
我在想是不是当内存池放在外部SRAM的时SRAM中的数据不能直接往DM9000A送,两个之间有冲突。
百思不得其解。还是FSMC上各个外设同时交叉访问会破坏彼此之间的数据?

使用特权

评论回复
6
tsx1983|  楼主 | 2009-12-24 12:12 | 只看该作者
我程序里有一段内存直接映射到LCD的屏幕上,平时屏幕要更新图像时,先操作这段内存,然后再发送到屏幕上。
发现把这段内存放到片外SRAM时,屏幕显示不正常,花屏。就是点阵不是自己想要的,有些该亮的点没有亮,不该亮的又亮了。把DM9000A的网线拔掉则恢复正常,插上则乱了。
把这段内存放到片内时,则不管有没有插上网线都是正常的。
难道访问外部SRAM时,DM9000A在中断程序里读取数据会破坏之前的地址信息,导致这种现象出现?
如果真是这样那就无语了。我四个外设可都是在不同的片选线上啊

使用特权

评论回复
7
香水城| | 2009-12-24 12:26 | 只看该作者
STM32的FSMC有一个BUG,即不能有多个总线的主设备同时访问FSMC上的存储器。比如但DMA控制器访问外部SRAM时,CPU就不能操作外部SRAM中的变量;2个DMA控制器也不能同时操作外部SRAM。不知道你的问题是否与这个BUG有关?如果你没有使用DMA控制器,则不受此BUG影响。

另外,外部SRAM的访问速度比内部SRAM的速度慢,也许你的屏幕显示不正常与此相关。

使用特权

评论回复
8
tsx1983|  楼主 | 2009-12-24 13:40 | 只看该作者
我有串口用到了DMA,但是都是访问内部SRAM。所以跟这个没有关系。
另外敢肯定不是速度的问题。因为不使用操作系统,只使用外部SRAM和LCD裸奔。
把LCD缓冲开的到外部SRAM,也是没有问题的。
我这里强调的是多任务环境下。

使用特权

评论回复
9
511| | 2009-12-25 15:40 | 只看该作者
,,,

使用特权

评论回复
10
gf86530430| | 2009-12-28 09:55 | 只看该作者
强烈关注!希望楼主解决后将解决方法公布!
谢谢

使用特权

评论回复
11
tsx1983|  楼主 | 2010-2-13 21:34 | 只看该作者
自己的手误,一时头脑发热,为方便布线,将SRAM的数据线打乱了,高8位和低8位交错布线了,导致了这么严重的后果

使用特权

评论回复
12
wangkj| | 2010-2-13 22:32 | 只看该作者
按道理来讲,应该没事的。

使用特权

评论回复
13
司徒老鹰| | 2010-2-15 22:59 | 只看该作者
关注中……

使用特权

评论回复
14
gpfrank| | 2010-2-24 23:45 | 只看该作者
SRAM的数据线交错不应当有问题吧!关注中。马上就要用STM32的FMSC的功能了。一样也是扩展以太网和SRAM。

使用特权

评论回复
15
xwj| | 2010-2-25 00:25 | 只看该作者
7楼说的确实是个很严重的问题,总线仲裁没有做好。

使用特权

评论回复
16
again_gyf| | 2010-2-25 08:54 | 只看该作者
SRAM数据线在你最窄访问字节来交错是没问题的,如最小按一字节那么D0-D7之间任意交换

使用特权

评论回复
17
again_gyf| | 2010-2-25 08:55 | 只看该作者
ST这个FSMC BUG不知道什么时候修正,现在弄得我不能开DMA

使用特权

评论回复
18
gpfrank| | 2010-2-25 09:19 | 只看该作者
16楼
的没有看明白。您的意思是如果我最小访问的是BYTE,那么D0~D7之间交错无问题,那么如果我接的是16位的SRAM, D0~D7,D8~D15之间是不能交错的对吗?

使用特权

评论回复
19
again_gyf| | 2010-2-25 09:35 | 只看该作者
D0-D7之间,D8-D15之间可以任意交错

使用特权

评论回复
20
again_gyf| | 2010-2-25 09:37 | 只看该作者
按2BYTE则D0-D15之间任意交错

使用特权

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

本版积分规则

25

主题

160

帖子

0

粉丝