打印
[STM32F1]

FSMC配置问题,希望有经验前辈指点迷津。

[复制链接]
3835|4
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
lhy317409772|  楼主 | 2015-1-21 20:38 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
项目中使用STM32F103Ze的FSMC进行并行通讯,但是建立不起来...
   最近又做实验,发现有如下现象:
由于一直用PCCard建立不起来,于是我尝试使用SRAM,我把相应端口配置了之后,再把FSMC配置成SRAM模式,然后我去测片选CS 写使能NWE 读使能NOE
实验结果为:写的时候 CS拉低 NOE 拉高 NWE 拉低  读的时候 CS拉低 NOE拉低 NWE拉高....表现正常。
但是当我配置回PCCard模式的时候,
实验结果为:写的时候CS拉低 NOE拉高到3.1   NWE竟然也拉高到2.4   读的时候CS拉低 NOE拉高到2.4  NWE拉高到3.1   表明电压不够低已使相应端口进行使能,即读写全部失能,所以无法读写。有意思的是,虽然全部失能,但是当我分别进行读写操作的时候,读写端NWE和NOE的高低端竟然也会进行调换。
因此,我推测可能还是我PCCard的配置没有到位,但是不知道应该如何配置了.....请前辈给写指导。

如下为我的配置代码:
1. 时钟配置
void RCC_HSE_Configuration(void)
{
        RCC_DeInit();                              //  将外设RCC寄存器重设为缺省值   
        RCC_HSEConfig(RCC_HSE_ON);                 //  设置HSE晶振打开
        if(RCC_WaitForHSEStartUp() == SUCCESS)     //  等待HSE起振,SUCCESS:HSE晶振稳定且就绪
        {
                RCC_HCLKConfig(RCC_SYSCLK_Div1);     //  设置AHB时钟(HCLK)RCC_SYSCLK_DIV1:系统时钟1分频 AHB时钟=系统时钟
                RCC_PCLK2Config(RCC_HCLK_Div1);      //  设置高速AHB时钟APB(PCLK2) // RCC_HCLK_Div1:HCLK1分频,APB2时钟=HCLK
                RCC_PCLK1Config(RCC_HCLK_Div2);      //  设置低速AHB时钟APB1(PCLK1) RCC_HCLK_Div2:HCLK2分频,APB1时钟=HCLK/2
                RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9);   //  设置PLL时钟源及倍频系数  8/1*9 = 72MHz
                RCC_PLLCmd(ENABLE);                                     //  使能PLL
                while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET);     //  检查指定的RCC标志位(PLL准备好标志)设置与否
                RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);              //  设置系统时钟(SYSCLK)
                while(RCC_GetSYSCLKSource() != 0x08);                   //  0x08:PLL作为系统时钟
        }
}
2.时钟使能
void RCC_Configuration(void)
{
//        SystemInit();
        RCC_HSE_Configuration();
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB |RCC_APB2Periph_GPIOC | RCC_APB2Periph_GPIOD |  
                                                   RCC_APB2Periph_GPIOE | RCC_APB2Periph_GPIOF | RCC_APB2Periph_GPIOG, ENABLE);
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);     //  端口的复用功能使能打开
        RCC_AHBPeriphClockCmd(RCC_AHBPeriph_FSMC, ENABLE);                 //  FSMC时钟
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);         //  串口1,PC通讯
        RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2, ENABLE);         //  串口2, 预留通讯接口
        RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3, ENABLE);         //  串口3,显示屏通讯
}
3.GPIO配置
// FSMC端口初始化
        /* 数据总线端口IO配置 */
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_14 | GPIO_Pin_15 | GPIO_Pin_0  | GPIO_Pin_1  |
                                      GPIO_Pin_8  | GPIO_Pin_9  | GPIO_Pin_10;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_Init(GPIOD, &GPIO_InitStructure);
       
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7  | GPIO_Pin_8  | GPIO_Pin_9  | GPIO_Pin_10 |
                                      GPIO_Pin_11 | GPIO_Pin_12 | GPIO_Pin_13 |
                                      GPIO_Pin_14 | GPIO_Pin_15;
        GPIO_Init(GPIOE, &GPIO_InitStructure);

        /* 地址总线端口IO配置 */         
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3 | GPIO_Pin_4;
//        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
//        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_Init(GPIOF, &GPIO_InitStructure);

        /* NOE and NWE IO配置 */
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4 | GPIO_Pin_5;
        GPIO_Init(GPIOD, &GPIO_InitStructure);

        /* NCE4_1  IO配置 */   //  测试:NCE_4_2  和  NE_2                                                                       
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10 | GPIO_Pin_11 | GPIO_Pin_9;
        GPIO_Init(GPIOG, &GPIO_InitStructure);       
       
        /* NWAIT 信号配置 */               
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
        GPIO_Init(GPIOD, &GPIO_InitStructure);

        /*FSMC_NIOS16端配置*/
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
        GPIO_Init(GPIOF, &GPIO_InitStructure);
4.FSMC配置
void FSMC_Configuration(void)
{
        FSMC_PCCARDInitTypeDef FSMC_PCCARDInitStructure;
        FSMC_NAND_PCCARDTimingInitTypeDef p;

//  FSMC 时间配置
        p.FSMC_SetupTime = 0x0f;
        p.FSMC_WaitSetupTime = 0x0f;
        p.FSMC_HoldSetupTime = 0x0f;
        p.FSMC_HiZSetupTime = 0x0f;

//  FSMC工作参数配置
        FSMC_PCCARDInitStructure.FSMC_Waitfeature = FSMC_Waitfeature_Enable;       //  等待功能使能
        FSMC_PCCARDInitStructure.FSMC_TCLRSetupTime = 0x10;                                               //  CLE(命令锁存使能)到RE的延迟
        FSMC_PCCARDInitStructure.FSMC_TARSetupTime = 0x10;                                                    //  ALE(地址锁存使能)到RE的延迟
    FSMC_PCCARDInitStructure.FSMC_CommonSpaceTimingStruct = &p;                               //  指令空间时间
        FSMC_PCCARDInitStructure.FSMC_AttributeSpaceTimingStruct = &p;                       //  属性空间时间
        FSMC_PCCARDInitStructure.FSMC_IOSpaceTimingStruct = &p;                                       //  IO空间时间          

        FSMC_PCCARDInit(&FSMC_PCCARDInitStructure);                                //  PCCARD Init     函数内部定义为了16为数据宽度
        FSMC_PCCARDCmd(ENABLE);                                                    //  enable PCCARD model         PCR4[2] = 1
}


另外还有我们的硬件接线如下:
16位PC卡
FSMC信号名称  输入/输出   功能
A[10:0]        输出     地址总线
NIOS16         输入     I/O空间的数据传输宽度(仅适合16位传输)
NIORD          输出     I/O空间的输出使能
NIOWR          输出     I/O空间的写使能
NREG           输出     指示操作是在通用或属性空间的寄存器信号
D[15:0]        入/出    双向数据总线
NCE4_1         输出     片选1
NCE4_2         输出     片选2(指示操作是16位还是8位)
NOE            输出     输出使能
NWE            输出     写使能
NWAIT          输入     进入FSMC的PC卡等待信号(存储器信号为IORDY)
INTR           输入     进入FSMC的PC卡中断信号(仅适合可以产生中断的PC卡)
CD             输入     PC卡存在的检测信号

以上是用户手册要求的16PCCard的链接要求,而我们实际中使用了A[4:1] NIOS16 D[15:0] NCE4_1 NOE NWE NWAIT  其他端子均没有使用......

希望大神参看一下程序,给写指导意见,非常感谢...
沙发
jweiok| | 2015-1-21 22:20 | 只看该作者

友情帮顶。以后可能也要用。

使用特权

评论回复
板凳
lhy317409772|  楼主 | 2015-1-22 09:43 | 只看该作者
敢问路在何方!???:dizzy:

使用特权

评论回复
地板
zying3264| | 2016-4-19 10:38 | 只看该作者
我没看到你在配置里面将FSMC的时钟打开,也没有看到GPIO管脚的时钟打开的语句,你再检查检查

使用特权

评论回复
5
zying3264| | 2016-4-19 10:42 | 只看该作者
哦,在RCC里设置打开了,不过PD6作为信号,应该设置为上拉模式,还有 p.FSMC_SetupTime = 0x0f;
         p.FSMC_WaitSetupTime = 0x0f;
         p.FSMC_HoldSetupTime = 0x0f;
         p.FSMC_HiZSetupTime = 0x0f;
这几个数值是你经过计算的还是随便填写的,似乎没必要这么大,个人意见仅供参考,我用的是407的FSMC的模式,跟你的代码还是有很多 不同

使用特权

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

本版积分规则

2

主题

12

帖子

0

粉丝