测试STM32F101VC中,fsmc地址/数据复用问题

[复制链接]
7911|18
 楼主| mytempid 发表于 2008-9-22 10:25 | 显示全部楼层 |阅读模式
请教各位同学:
uart5初始化代码如下:
    // Enable USART2, USART3, USART4, USART5 clocks
    RCC_APB1PeriphClockCmd (RCC_APB1Periph_USART2 |
                    RCC_APB1Periph_USART3 |
            RCC_APB1Periph_UART4 |                         RCC_APB1Periph_UART5,
            ENABLE);

// Configure UART5 Tx (PC.12) as alternate function push-pull
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12;
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
        GPIO_Init (GPIOC, &GPIO_InitStructure);
        // Configure UART5 Rx (PD.02) as input floating
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
        GPIO_Init (GPIOD, &GPIO_InitStructure);
        // Configure UART5 mode
        USART_Init (UART5, &USART_InitStructure);
        USART_ClockInit (UART5, &USART_ClockInitStruct);
        // Enable the UART5
        USART_Cmd (UART5, ENABLE);

目前在uart5串口上输出数据不正确,即输出后测量pin80没有波形。
usart1~usart3和uart4测试正常,初始化代码是类似的。

另,STM32f101VC的低16位地址是和数据线复用的,目前读写控制线波形正常,高8位地址输出正常,但NADV信号一直维持高电平不变,是否下面的代码有错:
 // Enable DMA and FSMC clocks
 RCC_AHBPeriphClockCmd (RCC_AHBPeriph_DMA1 | 
                        RCC_AHBPeriph_DMA2 |           
                        RCC_AHBPeriph_FSMC, 
                        ENABLE);

    // NADV configuration
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7;        // NADV
    GPIO_Init (GPIOB, &GPIO_InitStructure);

    //-- FSMC 时序配置 ------------------------------------------------------
    FSMC_ReadWriteTimingStruct.FSMC_AddressSetupTime = 15;
    FSMC_ReadWriteTimingStruct.FSMC_AddressHoldTime = 15;
    FSMC_ReadWriteTimingStruct.FSMC_DataSetupTime = 15;
    FSMC_ReadWriteTimingStruct.FSMC_BusTurnAroundDuration = 15;
    FSMC_ReadWriteTimingStruct.FSMC_CLKDivision = 15;
    FSMC_ReadWriteTimingStruct.FSMC_DataLatency = 15;
    FSMC_ReadWriteTimingStruct.FSMC_AccessMode = FSMC_AccessMode_B;

    FSMC_NORSRAMInitStructure.FSMC_Bank = FSMC_Bank1_NORSRAM1;
    FSMC_NORSRAMInitStructure.FSMC_DataAddressMux = FSMC_DataAddressMux_Enable;
    FSMC_NORSRAMInitStructure.FSMC_MemoryType = FSMC_MemoryType_SRAM;
    FSMC_NORSRAMInitStructure.FSMC_MemoryDataWidth = FSMC_MemoryDataWidth_16b;
    FSMC_NORSRAMInitStructure.FSMC_BurstAccessMode = FSMC_BurstAccessMode_Disable;
    FSMC_NORSRAMInitStructure.FSMC_WaitSignalPolarity = FSMC_WaitSignalPolarity_Low;
    FSMC_NORSRAMInitStructure.FSMC_WrapMode = FSMC_WrapMode_Disable;
    FSMC_NORSRAMInitStructure.FSMC_WaitSignalActive = FSMC_WaitSignalActive_BeforeWaitState;
    FSMC_NORSRAMInitStructure.FSMC_WriteOperation = FSMC_WriteOperation_Enable;
    FSMC_NORSRAMInitStructure.FSMC_WaitSignal = FSMC_WaitSignal_Disable;
    FSMC_NORSRAMInitStructure.FSMC_ExtendedMode = FSMC_ExtendedMode_Disable;
    FSMC_NORSRAMInitStructure.FSMC_AsyncWait = FSMC_AsyncWait_Disable;
    FSMC_NORSRAMInitStructure.FSMC_WriteBurst = FSMC_WriteBurst_Disable;
    FSMC_NORSRAMInitStructure.FSMC_ReadWriteTimingStruct = &FSMC_ReadWriteTimingStruct;
    FSMC_NORSRAMInitStructure.FSMC_WriteTimingStruct = &FSMC_ReadWriteTimingStruct;

    FSMC_NORSRAMInit (&FSMC_NORSRAMInitStructure); 

    // Enable FSMC Bank1_SRAM Bank
    FSMC_NORSRAMCmd (FSMC_Bank1_NORSRAM1, ENABLE);  


zyjmlz 发表于 2008-9-23 12:57 | 显示全部楼层
 楼主| mytempid 发表于 2008-9-23 14:12 | 显示全部楼层

谢谢 ST_ARM ,uart5我稍后测试。

FSMC问题答复:
我把MemoryType改为NOR,如下:
FSMC_NORSRAMInitStructure.FSMC_MemoryType = FSMC_MemoryType_NOR;

此时NADV信号正常,低16位地址输出正常。
为什么FSMC_MemoryType_SRAM不行呢?我的外设是SRAM。

另外发现问题:100pin的STM32F101VC的FSMC接口实际输出的地址线A23-A0是理论值的右移1位。例如我要求写端口0x60ff0010,实际驱动输出的地址线是0x607f8008。是否是FSMC端口16bit宽度的原因?

请问各位同学有无出现这个现象?

 楼主| mytempid 发表于 2008-9-23 14:34 | 显示全部楼层

抱歉:)

uart5正常,程序没有问题,tx输出外挂的MAX202坏了,把输出信号挂死了,一直是‘1’电平,tx只能在‘1’上面驱动出一些小毛刺,
所以一开始没注意,惭愧
香水城 发表于 2008-9-23 15:18 | 显示全部楼层

FSMC端口宽度可以设置的

 楼主| mytempid 发表于 2008-9-23 16:06 | 显示全部楼层

香主,

 FSMC端口宽度是可以设置的,
我想了解的是FSMC的地址线为何与程序中设定相差1bit
香水城 发表于 2008-9-23 16:28 | 显示全部楼层

因为你把FSMC端口宽度设置为16

 楼主| mytempid 发表于 2008-9-23 20:35 | 显示全部楼层

多谢两位版主

FSMC memory_type设置为SRAM时无法驱动出NADV问题,还请两位版主确认一下,是ST设计就是如此,还是其它问题。
香水城 发表于 2008-9-23 21:22 | 显示全部楼层

如果选择SRAM表示你使用的是非总线复用模式,片选应该是NEx

非总线复用模式没有NADV信号,请参考STM32技术参考手册(第5版)的364页中的表70。

请仔细描述你使用的是什么存储器,是否使用STM32的地址/数据总线复用模式。
 楼主| mytempid 发表于 2008-9-24 08:34 | 显示全部楼层

香主,

我使用的是16bit宽的SRAM,FSMC已经设置为地址/数据总线复用模式。

目前的现象是memorytype设置为SRAM时复用模式不正常,memorytype设置为NOR后复用模式正常。此时读写外部SRAM全部正常。

从字面上看memorytype为NOR应该是针对NORFLASH,memorytype为SRAM是针对SRAM。我的理解是复用模式应该是在NOR和SRAM类型下都可以的,但实际不是。
香水城 发表于 2008-9-24 09:49 | 显示全部楼层

请把FSMC初始化部分的程序贴出来,还有你的线路图

否则很难搞清楚你的配置,也就无法讨论。
 楼主| mytempid 发表于 2008-9-24 10:08 | 显示全部楼层

1楼有FSMC的初始化代码

lut1lut 发表于 2008-9-24 17:07 | 显示全部楼层

我来回答你地址移位的问题

配置成16位宽度后,FSMC内部的地址作了处理,使得逻辑上的A1输出到外部引脚A0;逻辑上的A2输出到外部引脚的A1,以此类推。而逻辑上的A0根本就不出现了。因为既然配置成16位宽度,所以A0都是0,不变咯。ST的stm32,str9都是这样的。

另外建议楼主修改你帖子的题目,现在已经严重偏题了。
 楼主| mytempid 发表于 2008-9-25 17:46 | 显示全部楼层

to lut1lut

修改题目了
thanks
香水城 发表于 2008-9-25 18:16 | 显示全部楼层

回11楼:FSMC设置为地址/数据总线复用模式时应使用NOR类型

请看STM32技术参考手册(第5版)的384页表88,这是复用模式下寄存器的设置,它要求存储器类型MTYP只能是NOR。
lut1lut 发表于 2008-9-26 11:27 | 显示全部楼层

100pin的还是可以接sram,

但是类型要配置成NOR了?
 楼主| mytempid 发表于 2008-9-27 08:18 | 显示全部楼层

是的

目前我的测试是这样的
yulitao 发表于 2008-9-27 09:28 | 显示全部楼层

FSMC 地址和数据复用

请看STM32技术参考手册(第5版)的392页最下面

Bit 1 MUXEN: Address/data multiplexing enable bit.
   When this bit is set, the address and data values are multiplexed on the databus, valid only with NOR Flash memory:
   0: Address/Data nonmultiplexed
   1: Address/Data multiplexed on databus (default after reset)
Swd21ic 发表于 2008-9-28 23:14 | 显示全部楼层

re

FSMC只有16bit的数据总线..

比如RAM不够用..我要外扩SRAM的话..那么我有一部分变量的访问不是很慢了吗..
32位的数据话应该要寻址2次才能ok吧.. 
9261就有d0-d31..可以接2片..组成32bit..

最近在评估STM32.主要在FSMc这块..
您需要登录后才可以回帖 登录 | 注册

本版积分规则

28

主题

388

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部