打印

请教香版,在用FSMC和USART时遇到的古怪的事

[复制链接]
2879|10
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
经常补钙|  楼主 | 2012-8-28 19:52 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
请教香版,我使用的MCU型号是STM32F205VC,最近在用到FSMC控制NAND FLASH的时候遇到一件很奇怪的事情。我们的程序架构里,是要把数据通过串口发送到MCU然后存储到NAND FLASH中。之前使用串行的NOR FLASH时,是没有问题的。但是更换成NAND FLASH后,使用了FSMC,但是之前的方法就出了问题。我是用USART中断接收数据,由于数据是源源不断的,所以在写入到FLASH中的时候还是会接受数据。但是现在在写到FLASH中时,会出现USART溢出中断错误,我开始以为是中断有影响,今天就改成了USART DMA传输。但是问题依旧,数据接收到的依然有错误。做过试验,如果不写NAND FLASH ,那么接受到的数据都是正确的。
请问这是怎么回事呢?
沙发
经常补钙|  楼主 | 2012-8-28 20:09 | 只看该作者
补充一下,我使用9600波特率没有问题,但是用57600的波特率就有问题了!

使用特权

评论回复
板凳
经常补钙|  楼主 | 2012-8-29 15:19 | 只看该作者
自己顶,求教!

使用特权

评论回复
地板
香水城| | 2012-8-29 17:16 | 只看该作者
这个问题比较奇怪

USART如果产生溢出中断,只能是系统来不及响应中断,还是要好好查查这个问题,系统为什么会来不及响应中断。这个问题应该和DMA的问题是一致的,不过DMA的问题更难调试。

而且F2系列的USART DMA应该不会和总线产生冲突。

使用特权

评论回复
5
IJK| | 2012-8-29 18:01 | 只看该作者
可以查一下,是不是对NAND写入需要时间,此时串口发生了溢出。

使用特权

评论回复
6
经常补钙|  楼主 | 2012-8-29 20:16 | 只看该作者
4# 香水城 感谢回复。
通过所做的实验,觉得应该是在用FSMC写NAND FLASH时MCU不能响应总线上其它的事情,甚至包括DMA的传输。而当使用9600波特率的时候却又没有问题,说明大概有500us左右的时间不能响应。我也不清楚为什么在读的时候没有问题,但是写的时候就会有该问题。困扰了几天了。

使用特权

评论回复
7
经常补钙|  楼主 | 2012-8-29 20:17 | 只看该作者
5# IJK
现在就是不清楚是不是写NAND的时候总线不能进行响应。

使用特权

评论回复
8
经常补钙|  楼主 | 2012-8-29 20:19 | 只看该作者
我的FSMC配置在此,请大家看看有没有什么问题,谢谢
#define FSMC_Bank_NAND     FSMC_Bank2_NAND
#define Bank_NAND_ADDR     Bank2_NAND_ADDR
#define Bank2_NAND_ADDR    ((uint32_t)0x70000000)

void FSMC_NAND_Init(void)
  {
          /*********************端口配置Nand Flash********************/
        /*  pinD10 为CLE输入信号, pinD12为ALE输入信号  */
        /*  pinD13 为WP输入信号, pinD4 为RE输入信号   */
        /*  pinD5 为WE输入信号, pinD6 为R/B输入信号   */
        /*  pinD0 pinD1 pinD14 pinD15 对应i/o                  */
        /*  pinE7 pinE8 pinE9 pinE10                                 */
        /*******************************************************/
//   GPIO_InitTypeDef GPIO_InitStructure;
FSMC_NANDInitTypeDef FSMC_NANDInitStructure;
FSMC_NAND_PCCARDTimingInitTypeDef  p;
   
//    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD | RCC_APB2Periph_GPIOE |
//                          RCC_APB2Periph_GPIOF | RCC_APB2Periph_GPIOG, ENABLE);   
         
        RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOD | RCC_AHB1Periph_GPIOE, ENABLE);          //开GPIOD GPIOE时钟
  /*-- GPIO Configuration ------------------------------------------------------*/
  /* CLE, ALE, D0->D3, NOE, NWE and NCE2  NAND pin configuration  */
     
        
        GPIO_PinAFConfig(GPIOD, GPIO_PinSource0, GPIO_AF_FSMC);
        GPIO_PinAFConfig(GPIOD, GPIO_PinSource1, GPIO_AF_FSMC);
        GPIO_PinAFConfig(GPIOD, GPIO_PinSource4, GPIO_AF_FSMC);
        GPIO_PinAFConfig(GPIOD, GPIO_PinSource5, GPIO_AF_FSMC);
        GPIO_PinAFConfig(GPIOD, GPIO_PinSource6, GPIO_AF_FSMC);
        
        GPIO_PinAFConfig(GPIOD, GPIO_PinSource7, GPIO_AF_FSMC);
        GPIO_PinAFConfig(GPIOD, GPIO_PinSource11, GPIO_AF_FSMC);
        GPIO_PinAFConfig(GPIOD, GPIO_PinSource12, GPIO_AF_FSMC);
        
        GPIO_PinAFConfig(GPIOD, GPIO_PinSource14, GPIO_AF_FSMC);
        GPIO_PinAFConfig(GPIOD, GPIO_PinSource15, GPIO_AF_FSMC);
        
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
        GPIO_Init(GPIOD,&GPIO_InitStructure);

    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
        GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
        GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
        GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_11 | GPIO_Pin_12 | GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7 |
                                   GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_14 | GPIO_Pin_15 ;                                                                                                   
   
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
    GPIO_Init(GPIOD, &GPIO_InitStructure);

    GPIO_PinAFConfig(GPIOE, GPIO_PinSource7  , GPIO_AF_FSMC);
        GPIO_PinAFConfig(GPIOE, GPIO_PinSource8  , GPIO_AF_FSMC);
        GPIO_PinAFConfig(GPIOE, GPIO_PinSource9  , GPIO_AF_FSMC);
        GPIO_PinAFConfig(GPIOE, GPIO_PinSource10 , GPIO_AF_FSMC);

  /* D4->D7 NAND pin configuration  */
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7 | GPIO_Pin_8 | GPIO_Pin_9 | GPIO_Pin_10;
  
    GPIO_Init(GPIOE, &GPIO_InitStructure);
  
    p.FSMC_SetupTime = 2;//8;//0x1;                       //建立时间
    p.FSMC_WaitSetupTime = 6;//15;//0x3;                 //等待时间
    p.FSMC_HoldSetupTime = 4;//16;//0x2;                //保持时间
    p.FSMC_HiZSetupTime = 2;//0x1;                //高阻建立时间

    FSMC_NANDInitStructure.FSMC_Bank = FSMC_Bank2_NAND;                    //使用FSMC BANK2
    FSMC_NANDInitStructure.FSMC_Waitfeature = FSMC_Waitfeature_Enable;      //使能FSMC的等待功能     
    FSMC_NANDInitStructure.FSMC_MemoryDataWidth = FSMC_MemoryDataWidth_8b;   //NAND Flash的数据宽度为8位
    FSMC_NANDInitStructure.FSMC_ECC = FSMC_ECC_Enable;                      //使能ECC特性
    FSMC_NANDInitStructure.FSMC_ECCPageSize = FSMC_ECCPageSize_2048Bytes;    //ECC页大2048
    FSMC_NANDInitStructure.FSMC_TCLRSetupTime = 0x00;
    FSMC_NANDInitStructure.FSMC_TARSetupTime = 0x00;
    FSMC_NANDInitStructure.FSMC_CommonSpaceTimingStruct = &p;
    FSMC_NANDInitStructure.FSMC_AttributeSpaceTimingStruct = &p;
  
    FSMC_NANDInit(&FSMC_NANDInitStructure);  
     /*使能FSMC BANK2 */
    FSMC_NANDCmd(FSMC_Bank2_NAND, ENABLE);        

                GPIO_ResetBits(GPIOD,GPIO_Pin_13);
                GPIO_SetBits  (GPIOD,GPIO_Pin_13);        
  }

使用特权

评论回复
9
figo20042005| | 2012-8-29 22:37 | 只看该作者
应该是你写NAND FLASH时间比较之前NOR FLASH慢,所以在写的同时相应不了串口中断,可以FSMC传数据快点,写NAND FLASH的数量和时间看能不能控制下。

使用特权

评论回复
10
IJK| | 2012-8-30 10:26 | 只看该作者
5# IJK
现在就是不清楚是不是写NAND的时候总线不能进行响应。
经常补钙 发表于 2012-8-29 20:17


印象里有这么回事。问题在于,FSMC的 R/B[也可能是其它类似功能的引脚,这点记得不是很清楚]如果用硬件方式,在等待状态时,有人说总线会被锁住。

LZ可以查找帖子,确认一下这个问题。
当然,这个问题有解决办法,就是FSMC的 R/B不用硬件方式,改为软件方式[作为普通IO,用查询或者中断方式]即可。

使用特权

评论回复
11
香水城| | 2012-8-30 13:58 | 只看该作者
LZ可以试试上面说的,把R/B改成软件方式试试

使用特权

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

本版积分规则

2

主题

40

帖子

1

粉丝