OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 3486|回复: 3

256k*16位sram驱动

[复制链接]

27

主题

101

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1007
金钱
1007
注册时间
2015-7-26
在线时间
108 小时
发表于 2016-4-16 23:44:45 | 显示全部楼层 |阅读模式
5金钱
这是基于原子的sram驱动写的,只不过原子的是512k*16,我的是256k*16;我定义一个数组testsram然后对他循环赋值,发现如果testsram是u16型的话,他循环赋值赋到127时,下一个testsram[128]=128时,会将testsram[0]也变成128,testsram[129]=129时testsram[1]=129,然后循环,就是说以128为一个单位,第二个单位会覆盖第一个单位,第四个单位会覆盖第三个单位,如果testsram是u32型的话,就会发现以64为一个单位,在网上看了一些但是不太明白,例如这个精华帖http://www.openedv.com/posts/list/33759.htm,只定义了一个数组然后sram初始化,然后直接对数组赋值,就是这个赋值过程就出现了问题,是我初始化问题呢?还是我硬件焊接问题? B}4L7)B]IVM`L%7YQILW{GO.png 这是fsmc和sram连接图
#define Bank1_SRAM3_ADDR    ((u32)(0x68000000))                                                                  
void FSMC_SRAM_Init(void)
{       
        FSMC_NORSRAMInitTypeDef  FSMC_NORSRAMInitStructure;
        FSMC_NORSRAMTimingInitTypeDef  readWriteTiming;
        GPIO_InitTypeDef  GPIO_InitStructure;

        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD|RCC_APB2Periph_GPIOE|RCC_APB2Periph_GPIOF|RCC_APB2Periph_GPIOG,ENABLE);
          RCC_AHBPeriphClockCmd(RCC_AHBPeriph_FSMC,ENABLE);

        GPIO_InitStructure.GPIO_Pin = 0xFF33;                                  //PORTD¸′óÃíÆíìêä3ö ¸ßμçÆ½ÎaÑ¡ÖDòy½Å
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;                  //¸′óÃíÆíìêä3ö
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_Init(GPIOD, &GPIO_InitStructure);


        GPIO_InitStructure.GPIO_Pin = 0xFF83;                                  //PORTE¸′óÃíÆíìêä3ö
        GPIO_Init(GPIOE, &GPIO_InitStructure);

        GPIO_InitStructure.GPIO_Pin = 0xF03F;                                  //PORTD¸′óÃíÆíìêä3ö
        GPIO_Init(GPIOF, &GPIO_InitStructure);

        GPIO_InitStructure.GPIO_Pin = 0x043F;                                  //PORTD¸′óÃíÆíìêä3ö
        GPIO_Init(GPIOG, &GPIO_InitStructure);

                                             
        readWriteTiming.FSMC_AddressSetupTime = 10;         //μØÖ·½¨á¢ê±¼ä£¨ADDSET£©Îa1¸öHCLK 1/36M=27ns
    readWriteTiming.FSMC_AddressHoldTime = 10;         //μØÖ·±£3Ö걼䣨ADDHLD£©Ä£ê½AÎ′óÃμ½       
    readWriteTiming.FSMC_DataSetupTime = 2;                 //êy¾Y±£3Ö걼䣨DATAST£©Îa3¸öHCLK 4/72M=55ns(¶ÔEMμÄSRAMD¾Æ¬)         
    readWriteTiming.FSMC_BusTurnAroundDuration = 0x00;
    readWriteTiming.FSMC_CLKDivision = 0x00;
    readWriteTiming.FSMC_DataLatency = 0x00;
    readWriteTiming.FSMC_AccessMode = FSMC_AccessMode_A;         //Ä£ê½A



    FSMC_NORSRAMInitStructure.FSMC_Bank = FSMC_Bank1_NORSRAM3;//  ÕaàïÎòÃÇê1óÃNE3 £¬ò2¾í¶Ôó|BTCR[4],[5]¡£
    FSMC_NORSRAMInitStructure.FSMC_DataAddressMux = FSMC_DataAddressMux_Disable;
    FSMC_NORSRAMInitStructure.FSMC_MemoryType =FSMC_MemoryType_SRAM;// FSMC_MemoryType_SRAM;  //SRAM   
    FSMC_NORSRAMInitStructure.FSMC_MemoryDataWidth = FSMC_MemoryDataWidth_16b;//′æ′¢Æ÷êy¾Y¿í¶èÎa16bit  
    FSMC_NORSRAMInitStructure.FSMC_BurstAccessMode =FSMC_BurstAccessMode_Disable;// FSMC_BurstAccessMode_Disable;
    FSMC_NORSRAMInitStructure.FSMC_WaitSignalPolarity = FSMC_WaitSignalPolarity_Low;
        FSMC_NORSRAMInitStructure.FSMC_AsynchronousWait=FSMC_AsynchronousWait_Disable;
    FSMC_NORSRAMInitStructure.FSMC_WrapMode = FSMC_WrapMode_Disable;   
    FSMC_NORSRAMInitStructure.FSMC_WaitSignalActive = FSMC_WaitSignalActive_BeforeWaitState;  
    FSMC_NORSRAMInitStructure.FSMC_WriteOperation = FSMC_WriteOperation_Enable;        //′æ′¢Æ÷D′ê1Äü
    FSMC_NORSRAMInitStructure.FSMC_WaitSignal = FSMC_WaitSignal_Disable;  
    FSMC_NORSRAMInitStructure.FSMC_ExtendedMode = FSMC_ExtendedMode_Disable; // ¶áD′ê1óÃÏàí¬μÄê±Dò
    FSMC_NORSRAMInitStructure.FSMC_WriteBurst = FSMC_WriteBurst_Disable;  
    FSMC_NORSRAMInitStructure.FSMC_ReadWriteTimingStruct = &readWriteTiming;
    FSMC_NORSRAMInitStructure.FSMC_WriteTimingStruct = &readWriteTiming; //¶áD′í¬Ñùê±Dò

    FSMC_NORSRAMInit(&FSMC_NORSRAMInitStructure);  //3õê¼»ˉFSMCÅäÖÃ

           FSMC_NORSRAMCmd(FSMC_Bank1_NORSRAM3, ENABLE);  // ê1ÄüBANK3                                                                                                  
                                                                                       
}
#define num 200
u16 testsram[num] __attribute__((at(0X68000000)));//2aêÔóÃêy×é

int main(void)
{             
        u16 ts=0;
        delay_init();                     //Ñóê±oˉêy3õê¼»ˉ          
        NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//éèÖÃÖD¶ÏóÅÏè¼¶·Ö×éÎa×é2£o2λÇàÕ¼óÅÏè¼¶£¬2λÏìó|óÅÏè¼¶
        uart_init(9600);                 //′®¿ú3õê¼»ˉÎa115200
        LCD_hard_Init();                                           //3õê¼»ˉLCD   
        POINT_COLOR=RED;                        //éèÖÃ×ÖìåÎaoìé«
        LCD_ShowString(30,50,200,16,16,"WarShip STM32");       
        LCD_ShowString(30,70,200,16,16,"SRAM TEST");       

        POINT_COLOR=BLUE;//éèÖÃ×ÖìåÎaà¶é«  
        FSMC_SRAM_Init();                        //3õê¼»ˉía2¿SRAM
         

   delay_ms(1000);
for(ts=0;ts<120;ts+=1)
        testsram[ts]=ts;
for(ts=120;ts<num;ts+=1)
        testsram[ts]=ts;

}

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

27

主题

101

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1007
金钱
1007
注册时间
2015-7-26
在线时间
108 小时
 楼主| 发表于 2016-4-17 00:38:45 | 显示全部楼层
&#160;sram的一个地址对应stm32两个字节的数据,即一次传输两个字节的数据,那么u16型的数据一次传输过去。
8位则32的A0->sramA0,如果是16位则32的A1->sram的A0,如果是32位则A2->A0,可是我硬件已经确定了,该怎么移位呢,对于定义的数组u16 testsram[num] __attribute__((at(0X68000000)));只有一个for循环赋值,怎么操作呢?
回复

使用道具 举报

27

主题

101

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1007
金钱
1007
注册时间
2015-7-26
在线时间
108 小时
 楼主| 发表于 2016-4-17 00:59:46 | 显示全部楼层
就是原子的外部sram程序,数组只有4096这么大,引脚接发也相同,区别是原子的sram是512K*16,我的是256K*16,相同的程序在debug中战舰板子得到的数组是对的,我的板子数组是错的,针对这个容量大小,还有什么要改的吗?
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2016-4-23 19:50:55 | 显示全部楼层
说明你的地址线有问题
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-16 16:31

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表