你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

STM32 SRAM 数据地址复用程序问题

[复制链接]
q10083129 提问时间:2018-4-30 15:06 /
本帖最后由 q10083129 于 2018-4-30 15:06 编辑

各位大侠好
             我目前在编写FSMC初始化程序,给STM32F103VCT6外扩4MSRAM.,我在给仿真调试的时候,当我给0x60010001写入数据的时候,0x60110001,0x60210001,0x60310001。。。。0x63F10001,中的地址也会被写入相同的数据,而且我的SRAM只有4M,但keil中能读到0x63000000~0x63FFFFFF以内的数据,而且都是每隔1M内容重复。
下面是我的SRAM初始化程序以及system_stm32f10x.c中的函数和测试程序和电路图。
  1. #include "sram.h"         
  2. #include "usart.h"

  3. #define Bank1_SRAM3_ADDR    ((u32)(0x60000000))               
  4.                                                      
  5. //³õʼ»¯ÍⲿSRAM
  6. void FSMC_SRAM_Init(void)
  7. {        
  8.         FSMC_NORSRAMInitTypeDef  FSMC_NORSRAMInitStructure;
  9.         FSMC_NORSRAMTimingInitTypeDef  readWriteTiming;
  10.         GPIO_InitTypeDef  GPIO_InitStructure;

  11.          RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOD|RCC_APB2Periph_GPIOE,ENABLE);
  12.           RCC_AHBPeriphClockCmd(RCC_AHBPeriph_FSMC,ENABLE);
  13.   
  14.         GPIO_InitStructure.GPIO_Pin = 0xDFB3;                                  //PORTD¸´ÓÃÍÆÍìÊä³ö
  15.          GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;                  //¸´ÓÃÍÆÍìÊä³ö
  16.          GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  17.          GPIO_Init(GPIOD, &GPIO_InitStructure);


  18.         GPIO_InitStructure.GPIO_Pin = 0xFF83;                                  //PORTE¸´ÓÃÍÆÍìÊä³ö
  19.          GPIO_Init(GPIOE, &GPIO_InitStructure);
  20.         
  21.         GPIO_InitStructure.GPIO_Pin = 0x0080;                                  //PORTE¸´ÓÃÍÆÍìÊä³ö
  22.          GPIO_Init(GPIOB, &GPIO_InitStructure);

  23.          readWriteTiming.FSMC_AddressSetupTime = 0x15;
  24.     readWriteTiming.FSMC_AddressHoldTime = 0x15;
  25.     readWriteTiming.FSMC_DataSetupTime = 0x0225;
  26.     readWriteTiming.FSMC_BusTurnAroundDuration = 0x15;
  27.     readWriteTiming.FSMC_CLKDivision = 0x00;
  28.     readWriteTiming.FSMC_DataLatency = 0x00;
  29.     readWriteTiming.FSMC_AccessMode = FSMC_AccessMode_B;         //ģʽA
  30.    

  31.     FSMC_NORSRAMInitStructure.FSMC_Bank = FSMC_Bank1_NORSRAM1;//  ÕâÀïÎÒÃÇʹÓÃNE3 £¬Ò²¾Í¶ÔÓ¦BTCR[4],[5]¡£
  32.     FSMC_NORSRAMInitStructure.FSMC_DataAddressMux = FSMC_DataAddressMux_Enable;
  33.     FSMC_NORSRAMInitStructure.FSMC_MemoryType =FSMC_MemoryType_NOR;// FSMC_MemoryType_SRAM;  //SRAM   
  34.     FSMC_NORSRAMInitStructure.FSMC_MemoryDataWidth = FSMC_MemoryDataWidth_16b;//´æ´¢Æ÷Êý¾Ý¿í¶ÈΪ16bit  
  35.     FSMC_NORSRAMInitStructure.FSMC_BurstAccessMode =FSMC_BurstAccessMode_Disable;// FSMC_BurstAccessMode_Disable;
  36.     FSMC_NORSRAMInitStructure.FSMC_WaitSignalPolarity = FSMC_WaitSignalPolarity_Low;
  37.         FSMC_NORSRAMInitStructure.FSMC_AsynchronousWait=FSMC_AsynchronousWait_Disable;
  38.     FSMC_NORSRAMInitStructure.FSMC_WrapMode = FSMC_WrapMode_Disable;   
  39.     FSMC_NORSRAMInitStructure.FSMC_WaitSignalActive = FSMC_WaitSignalActive_BeforeWaitState;  
  40.     FSMC_NORSRAMInitStructure.FSMC_WriteOperation = FSMC_WriteOperation_Enable;        //´æ´¢Æ÷дʹÄÜ
  41.     FSMC_NORSRAMInitStructure.FSMC_WaitSignal = FSMC_WaitSignal_Disable;  
  42.     FSMC_NORSRAMInitStructure.FSMC_ExtendedMode = FSMC_ExtendedMode_Disable; // ¶ÁдʹÓÃÏàͬµÄʱÐò
  43.     FSMC_NORSRAMInitStructure.FSMC_WriteBurst = FSMC_WriteBurst_Disable;  
  44.     FSMC_NORSRAMInitStructure.FSMC_ReadWriteTimingStruct = &readWriteTiming;
  45.     FSMC_NORSRAMInitStructure.FSMC_WriteTimingStruct = &readWriteTiming; //¶ÁдͬÑùʱÐò

  46.     FSMC_NORSRAMInit(&FSMC_NORSRAMInitStructure);  //³õʼ»¯FSMCÅäÖÃ

  47.            FSMC_NORSRAMCmd(FSMC_Bank1_NORSRAM1, ENABLE);  // ʹÄÜBANK3                                                                                 
  48.                                                                                        
  49. }
  50.                                                                                                                            

  51. void FSMC_SRAM_WriteBuffer(u8* pBuffer,u32 WriteAddr,u32 n)
  52. {
  53.         for(;n!=0;n--)  
  54.         {                                                                                    
  55.                 *(vu8*)(Bank1_SRAM3_ADDR+WriteAddr)=*pBuffer;         
  56.                 WriteAddr+=4;
  57.                 pBuffer++;
  58.         }   
  59. }                                                                                                                                                            

  60. void FSMC_SRAM_ReadBuffer(u8* pBuffer,u32 ReadAddr,u32 n)
  61. {
  62.         for(;n!=0;n--)  
  63.         {                                                                                            
  64.                 *pBuffer++=*(vu8*)(Bank1_SRAM3_ADDR+ReadAddr);   
  65.                 ReadAddr+=2;
  66.         }  
  67. }


  68. void fsmc_sram_test_write(u8 data,u32 addr)
  69. {                           
  70.         FSMC_SRAM_WriteBuffer(&data,addr,1);//дÈë1¸ö×Ö½Ú
  71. }


  72. u8 fsmc_sram_test_read(u32 addr)
  73. {
  74.         u8 data;
  75.         FSMC_SRAM_ReadBuffer(&data,addr,1);
  76.         return data;
  77. }        
复制代码
下面这个是system_stm32f10x.c中的函数
  1. void SystemInit_ExtMemCtl(void)
  2. {
  3. /*!< FSMC Bank1 NOR/SRAM3 is used for the STM3210E-EVAL, if another Bank is
  4.   required, then adjust the Register Addresses */

  5.   /* Enable FSMC clock */
  6.   RCC->AHBENR = 0x00000114;

  7.   /* Enable GPIOD, GPIOE, GPIOF and GPIOG clocks */  
  8.   RCC->APB2ENR = 0x000001E0;
  9.   
  10. /* ---------------  SRAM Data lines, NOE and NWE configuration ---------------*/
  11. /*----------------  SRAM Address lines configuration -------------------------*/
  12. /*----------------  NOE and NWE configuration --------------------------------*/  
  13. /*----------------  NE3 configuration ----------------------------------------*/
  14. /*----------------  NBL0, NBL1 configuration ---------------------------------*/
  15.   
  16.   GPIOD->CRL = 0xB4BB44BB;  
  17.   GPIOD->CRH = 0xBB4BBBBB;

  18.   GPIOE->CRL = 0xB44444BB;  
  19.   GPIOE->CRH = 0xBBBBBBBB;

  20. //  GPIOF->CRL = 0x44BBBBBB;  
  21. //  GPIOF->CRH = 0xBBBB4444;

  22. //  GPIOG->CRL = 0x44BBBBBB;  
  23. //  GPIOG->CRH = 0x44444B44;
  24.    
  25. /*----------------  FSMC Configuration ---------------------------------------*/  
  26. /*----------------  Enable FSMC Bank1_SRAM Bank ------------------------------*/
  27.   
  28.         
  29.   FSMC_Bank1->BTCR[0] = 0x00001011;
  30.   FSMC_Bank1->BTCR[1] = 0x00000200;
  31.         
  32.         
  33. //        FSMC_Bank1->BTCR[2]  = 0x00001011;
  34. //  FSMC_Bank1->BTCR[3]  = 0x00000201;
  35. //  FSMC_Bank1E->BWTR[2] = 0x0FFFFFFF;
  36.         
  37. //        FSMC_Bank1->BTCR[4] = 0x00001011;
  38. //  FSMC_Bank1->BTCR[5] = 0x00000200;
  39. }
复制代码
下面是测试程序
        FSMC_SRAM_WriteBuffer(&temp,0x00010001,2);
有哪位大大能指点一下迷津,谢谢。

捕获.JPG
收藏 评论2 发布时间:2018-4-30 15:06

举报

2个回答
q10083129 回答时间:2018-4-30 15:06:50
谢谢各位大侠
七哥 回答时间:2018-5-1 00:12:58
本帖最后由 toofree 于 2018-5-1 00:38 编辑

这个主要得看STM32F103VCT6有多少根地址线,并且你用了多少根地址线。
超过的,它无法区分是低地址,还是高地址。
从你的现象看,说明你的FSMC_A19到FSMC_A23没有接。
从原理图看,的确没有接。

GPIO_InitStructure.GPIO_Pin = 0xDFB3;        //2、3、6、13没管,13对FSMC_A18
GPIO_Init(GPIOD, &GPIO_InitStructure);

GPIO_InitStructure.GPIO_Pin = 0xFF83;        //2、3、4、5、6没管,对应FSMC_A19到A23
GPIO_Init(GPIOE, &GPIO_InitStructure);


但是这样,也是不对呀,从你的配置代码中看到FSMC_A18也没有配。而你实际用了的是A0到A17条地址线,16位数据,一共占用内存地址是512KB呀,也就是0x80000。你说的以1MB为间隔数据重复,这个有点讲不通,如果属实的话,应该是以512KB为单位重复呀。请看一下你的 0x60010001 + 0x80000*N地地址数据。

评分

参与人数 1蝴蝶豆 +4 收起 理由
zero99 + 4

查看全部评分

所属标签

相似问题

关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版