最近在使用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;
} |