打印

求助,关于STM32F103ZET6 "Y"FSMC外接SRAM的USB识别问题

[复制链接]
5423|16
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
fysunhaiying|  楼主 | 2012-3-29 11:34 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
最近在使用STM32F103ZET6,版本为“Y”。
使用了USB的虚拟串口功能。
并外扩了RAM型号为IS62WV51216BLL,配置system_stm32f10x.c版本为* @version V3.0.0* @date 04/06/2009

现象描述:
①当使用内部RAM的时候:
USB识别均没有问题。
②当使用外部RAM的时候:
大部分老电脑(DELL520、LENOVO E43、T400 、X200、ThinkStation S20)对于USB的识别没有问题。
当使用新电脑(LENOVO X220、美国购的Samsung NP-QX411L )时候,USB识别随机显示为UNKNOW DEVICE或者分配了端口号,但是有黄色叹号。其中Samsung NP-QX411L 带有两个USB3.0的串口,识别全部没有问题。但是USB2.0串口一样有问题。

在void USB_Istr(void)中
  wIstr = _GetISTR();  // 读USB中断状态寄存器16bit

发现识别无误的时候wIstr的数值为0x0B00
       当识别出现问题的时候数值为0x2B00


个人感觉:
外部RAM的使用是在main函数之前,而且只有12行的寄存器配置,并无库函数形式,在配置好以后并不能对其进行再次处理。
之前听说过FSMC和DMA多主访问的冲突问题。据说在“Y”版本上面已经解决了,我想这个USB识别的问题有没有人遇见过,或者又是另外一个bug呢?!




USB中断状态寄存器(USB_ISTR)

ERR:出错 (Error)
位13
在下列错误发生时硬件会置位此位。
NANS:无应答。主机的应答超时。
CRC:循环冗余校验码错误。数据或令牌分组中的CRC校验出错。
BST:位填充错误。PID,数据或CRC中检测出位填充错误。
FVIO:帧格式错误。收到非标准帧(如EOP出现在错误的时刻,错误的令牌等)。
USB应用程序通常可以忽略这些错误,因为USB模块和主机在发生错误时都会启动重传机制。此位产生的中断可以用于应用程序的开发阶段,可以用来监测USB总线的传输质量,标识用户可能发生的错误(连接线松,环境干扰严重,USB线损坏等)。
此位应用程序可读可写,但只有写0有效,写1无效。

WKUP:唤醒请求 (Wakeup)
位12
当USB模块处于挂起状态时,如果检测到唤醒信号,此位将由硬件置位。此时CTLR寄存器的LP_MODE位将被清零,同时USB_WAKEUP被激活,通知设备的其他部分(如唤醒单元)将开始唤醒过程。
此位应用程序可读可写,但只有写0有效,写1无效。

SUSP:挂起模块请求 (Suspend mode request)
位11
此位在USB线上超过3ms没有信号传输时由硬件置位,用以指示一个来自USB总线的挂起请求。USB复位后硬件立即使能对挂起信号的检测,但在挂起模式下(FSUSP=1)硬件不会再检测挂起信号直到唤醒过程结束。
此位应用程序可读可写,但只有写0有效,写1无效。


RESET:USB复位请求 (USB reset request)
位10
此位在USB模块检测到USB复位信号输入时由硬件置位。此时USB模块将复位内部协议状态机,并在中断使能的情况下触发复位中断来响应复位信号。USB模块的发送和接收部分将被禁止,直到此位被清除。所有的配置寄存器不会被复位,除非应用程序对他们清零。这用来保证在复位后USB传输还可以立即正确执行。但设备的地址和端点寄存器会被USB复位所复位。
此位应用程序可读可写,但只有写0有效,写1无效。
SOF:帧首标志 (Start of frame)
位9
此位在USB模块检测到总线上的SOF分组时由硬件置位,标志一个新的USB帧的开始。中断服务程序可以通过检测SOF事件来完成与主机的1ms同步,并正确读出寄存器在收到SOF分组时的更新内容(此功能在同步传输时非常有意义)。
此位应用程序可读可写,但只有写0有效,写1无效。
ESOF:期望帧首标识位 (Expected start of frame)
位8
此位在USB模块未收到期望的SOF分组时由硬件置位。主机应该每毫秒都发送SOF分组,但如果USB模块没有收到,挂起定时器将触发此中断。如果连续发生3次ESOF中断,也就是连续3次未收到SOF分组,将产生SUSP中断。即使在挂起定时器未被锁定时发生SOF分组丢失,此位也会被置位。
此位应用程序可读可写,但只有写0有效,写1无效。

函数为:void SystemInit_ExtMemCtl(void)
{
/*!< FSMC Bank1 NOR/SRAM3 is used for the STM3210E-EVAL, if another Bank is
  required, then adjust the Register Addresses */
  /*!< Enable FSMC clock */
  RCC->AHBENR = 0x00000114;
  
  /*!< Enable GPIOD, GPIOE, GPIOF and GPIOG clocks */  
  RCC->APB2ENR = 0x0000FFFF;//01E0;    //NE1=PD7 NOE=PD4 NWE=PD5 NBL0=PE0 NBL1=PE1
  
/* ---------------  SRAM Data lines, NOE and NWE configuration ---------------*/
/*----------------  SRAM Address lines configuration -------------------------*/
/*----------------  NOE and NWE configuration --------------------------------*/  
/*----------------  NE3 configuration ----------------------------------------*/
/*----------------  NBL0, NBL1 configuration ---------------------------------*/
  
  GPIOD->CRL =0xB4BB44BB;
  GPIOD->CRH =0xBBBBBBBB;
  GPIOE->CRL =0xBBBBBBBB;
  GPIOE->CRH =0xBBBBBBBB;
  GPIOF->CRL =0x44BBBBBB;
  GPIOF->CRH =0xBBBB4444;
  GPIOG->CRL =0x44BBBBBB;
  GPIOG->CRH =0x4BB44444;
   
/*----------------  FSMC Configuration ---------------------------------------*/  
/*----------------  Enable FSMC Bank1_SRAM Bank ------------------------------*/
  
  FSMC_Bank1->BTCR[4] = 0x00000000;//0x00001011;
  FSMC_Bank1->BTCR[5] = 0x00000004;//0x00000200;
}
沙发
fysunhaiying|  楼主 | 2012-3-29 11:38 | 只看该作者
USB的固件库,开始的时候用的1.0的,之后也换过最新版3.3的。同样出现过此问题!!
程序的主框架是1.0的,串口部分用的3.0的

使用特权

评论回复
板凳
香水城| | 2012-3-29 11:41 | 只看该作者
关键问题是你怎么使用外部RAM的,什么放在了外部RAM,什么放在了内部RAM?但是LZ没有说。

使用特权

评论回复
地板
fysunhaiying|  楼主 | 2012-3-29 13:09 | 只看该作者
3# 香水城
当然是全部使用外部RAM了,在keil里面内部的IRAM1没勾选,肯定是没有用内部的啊!!

还请香版主不吝赐教啊,纠结好久了这个问题!!在下先谢谢了

<li> MDK-ARM
    - in Project->Options for Target window, select 'RAM1'and enter 0x60000000
      as start address with size of 0x100000 (IRAM1 must be un-checked)
    - uncomment "#define DATA_IN_ExtSRAM " in the "system_stm32f10x.c" file

我就是用的这种方式啊

事实证明,如果IRAM1和RAM1都勾选的话,还是运行在RAM1的。因为已经在main之前的启动文件里面配置使用外部RAM了。

使用特权

评论回复
5
香水城| | 2012-3-29 14:35 | 只看该作者
STM32访问内部RAM比访问外部RAM要快很多,从你的现象看,新电脑有问题但旧电脑没问题,按照新电脑比旧电脑快来分析,因为你用外部RAM时STM32响应肯定变慢,所以初步判断是系统速度问题。

建议把全局变量和堆栈放到内部RAM,尤其是需要快速响应的程序。

使用特权

评论回复
6
fysunhaiying|  楼主 | 2012-3-29 14:44 | 只看该作者
5# 香水城

但是在新电脑上
x220是没有usb3.0的
但是Samsung NP-QX411L 是有USB3.0的 而且识别没有问题    usb2.0却不行
USB3.0总是要比2.0的快吧

还需请教,在keil中怎么把全局变量和堆栈手动放到内部RAM中呢?
我用外部RAM的原因,就是因为有几个特别大的数组,是当做数据库一类来用的。
十分的感谢:'( :'(

使用特权

评论回复
7
香水城| | 2012-3-29 14:51 | 只看该作者
5# 香水城

但是在新电脑上
x220是没有usb3.0的
但是Samsung NP-QX411L 是有USB3.0的 而且识别没有问题    usb2.0却不行
USB3.0总是要比2.0的快吧

还需请教,在keil中怎么把全局变量和堆栈手动放到内部RAM中呢?
...
fysunhaiying 发表于 2012-3-29 14:44


这里说的快慢不是传输速度,而是响应速度,与USB 2.0还是3.0没有关系,与电脑里的调度策略有关。

怎么手动分配RAM,你可以搜索一下论坛,有过很多讨论。

使用特权

评论回复
8
fysunhaiying|  楼主 | 2012-3-29 15:01 | 只看该作者
7# 香水城

可我用的是同一台电脑啊,响应速度怎么会有区别呢?
只不过插的usb口不一样而已?
我是结贴呢?还是怎么办?

不过,仍然感谢香版主。当初用FSMC的时候就看的你的帖子

使用特权

评论回复
9
香水城| | 2012-3-29 15:18 | 只看该作者
7# 香水城

可我用的是同一台电脑啊,响应速度怎么会有区别呢?
只不过插的usb口不一样而已?
我是结贴呢?还是怎么办?

不过,仍然感谢香版主。当初用FSMC的时候就看的你的帖子 ...
fysunhaiying 发表于 2012-3-29 15:01


同一台电脑的不同USB口,在PC内部完全可能不一样,响应速度不一样也不奇怪。

使用特权

评论回复
10
Simon21ic| | 2012-3-29 15:19 | 只看该作者
本帖最后由 Simon21ic 于 2012-3-29 15:20 编辑

在我自己的usb库中碰到过这个问题,后来解决了,原因就是和延迟有关。
记得以前发过帖子说ST的USB库的一些问题,说过还有其他问题,其中就有出现枚举失败的情况,并且和主机USB的控制器相关,不过无法确认和LZ的问题一样。

使用特权

评论回复
11
fysunhaiying|  楼主 | 2012-3-29 15:46 | 只看该作者
9# 香水城
恩 十分的感谢
等我把问题解决了
再过来结贴吧

使用特权

评论回复
12
fysunhaiying|  楼主 | 2012-3-29 15:47 | 只看该作者
10# Simon21ic

恩 非常感谢你的支持
这两天抓紧时间试一下

使用特权

评论回复
13
Simon21ic| | 2012-3-29 16:12 | 只看该作者
等结果
注意一点,虽然问题可能和延迟有关,但解决方法不一定非要是减少延迟

使用特权

评论回复
14
fysunhaiying|  楼主 | 2012-3-30 11:51 | 只看该作者
9# 香水城
听了香版主的指点,突然来了灵感

将程序还放在片内RAM

然后将几个用作数据库的数组用__at(address)的方式定义到外部RAM

解决问题

但对于外RAM中  USB识别的问题 还是困惑

我看了ST的勘误手册  

原来那段DMA冲突的地址 就是我用的外部RAM地址0x6000 0000

我在想 是不是底层的USB驱动和这个有关系呢!!

使用特权

评论回复
15
fysunhaiying|  楼主 | 2012-3-30 12:23 | 只看该作者
下面是ST的官方回复,在此谢谢大家的帮助

OnlineSupport Request 29-MAR-12  
Dear User,
Please find here below latest information concerning the request R1213123357056144

Dear Mr Hiking Sun,

The answer really depends on how do you allocate the external RAM.

From what you described, it sounds that the USB device responses slowly when it works with new version system which suppose be faster. This is align with the following fact.

In general, STM32 accesses to internal SRAM is much faster versus access to external SRAM. It is recommend to put the all the global variables and stack in the internal SRAM for time critical application.

Thanks

使用特权

评论回复
16
fysunhaiying|  楼主 | 2012-3-30 12:24 | 只看该作者
13# Simon21ic

问题解决了,没有调整时间的问题
而是绕过去了

14楼就是结果了

十分感谢你的建议和帮助

使用特权

评论回复
17
Simon21ic| | 2012-3-30 18:44 | 只看该作者
呵呵,那我知道是什么问题了,只是绕过去,不过通过修改ST的库是可以解决的。
原来说ST的USB库的BUG的时候没说这个,没想到还真有人会碰到问题。

使用特权

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

本版积分规则

0

主题

10

帖子

1

粉丝