中级会员
 
- 积分
- 441
- 金钱
- 441
- 注册时间
- 2014-8-11
- 在线时间
- 84 小时
|
50金钱
本帖最后由 战舰水手 于 2021-7-13 14:19 编辑
外部SRAM引脚驱动
上图为外部SRAM引脚驱动图,地址线A0-A18是对应连接(正点原子例程不是对应连接)
主控芯片:stm32f407ZGT6
HAL库版本: version V1.4.2 @date 10-November-2015(正点原子STM32F429的提供的HAL库版本)
- //SRAM驱动
- void SRAM_Init(void)
- {
- GPIO_InitTypeDef GPIO_Initure;
- FSMC_NORSRAM_TimingTypeDef FSMC_ReadWriteTim;
-
- XmRamInit(); //XMRAM 20191024
- delay_us(100);
-
- __HAL_RCC_FSMC_CLK_ENABLE();//使能时钟
- __HAL_RCC_GPIOD_CLK_ENABLE();
- __HAL_RCC_GPIOE_CLK_ENABLE();
- __HAL_RCC_GPIOF_CLK_ENABLE();
- __HAL_RCC_GPIOG_CLK_ENABLE();
-
- //引脚配置
- //PD0,1,4,5,8~15
- GPIO_Initure.Pin=GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_4|GPIO_PIN_5|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_Initure.Mode=GPIO_MODE_AF_PP;
- GPIO_Initure.Pull==GPIO_PULLUP;
- GPIO_Initure.Speed=GPIO_SPEED_HIGH;
- GPIO_Initure.Alternate=GPIO_AF12_FSMC; //复用为FSMC
- HAL_GPIO_Init(GPIOD,&GPIO_Initure);
-
- //PE0,1,7~15
- GPIO_Initure.Pin=GPIO_PIN_0|GPIO_PIN_1|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;
- HAL_GPIO_Init(GPIOE,&GPIO_Initure);
-
- //PF0~5,12~15
- GPIO_Initure.Pin=GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3|GPIO_PIN_4|\
- GPIO_PIN_5|GPIO_PIN_12|<font color="Red">GPIO_PIN_13</font>|GPIO_PIN_14|GPIO_PIN_15;
- HAL_GPIO_Init(GPIOF,&GPIO_Initure);
-
- //PG0~5,10
- GPIO_Initure.Pin=GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3|GPIO_PIN_4|GPIO_PIN_5|GPIO_PIN_10;
- HAL_GPIO_Init(GPIOG,&GPIO_Initure);
-
- //HAL_GPIO_WritePin(GPIOG,GPIO_PIN_10,GPIO_PIN_SET);
-
- SRAM_Handler.Instance=FSMC_NORSRAM_DEVICE;
- SRAM_Handler.Extended=FSMC_NORSRAM_EXTENDED_DEVICE;
-
- SRAM_Handler.Init.NSBank=FSMC_NORSRA;
- SRAM_Handler.Init.DataAddressMux=FSMC_DATA_ADDRESS_MUX_DISABLE;
- SRAM_Handler.Init.MemoryType=FSMC_MEMORY_TYPE_SRAM; //SRAM
- SRAM_Handler.Init.MemoryDataWidth=FSMC_NORSRAM_MEM_BUS_WIDTH_16;//16位
- SRAM_Handler.Init.BurstAccessMode=FSMC_BURST_ACCESS_MODE_DISABLE;
- SRAM_Handler.Init.WaitSignalPolarity=FSMC_WAIT_SIGNAL_POLARITY_LOW;
- SRAM_Handler.Init.WrapMode = FSMC_WRAP_MODE_DISABLE;
- SRAM_Handler.Init.WaitSignalActive=FSMC_WAIT_TIMING_BEFORE_WS;
- SRAM_Handler.Init.WriteOperation=FSMC_WRITE_OPERATION_ENABLE;
- SRAM_Handler.Init.WaitSignal=FSMC_WAIT_SIGNAL_DISABLE;
- SRAM_Handler.Init.ExtendedMode=FSMC_EXTENDED_MODE_DISABLE;
- SRAM_Handler.Init.AsynchronousWait=FSMC_ASYNCHRONOUS_WAIT_DISABLE;
- SRAM_Handler.Init.WriteBurst=FSMC_WRITE_BURS;
- //SRAM_Handler.Init.ContinuousClock=FSMC_CONTINUOUS_CLOCK_SYNC_ASYNC;<font color="Red">//我用的HAL库版本不支持该参数,所以注释掉了</font>
-
- //FMC
- FSMC_ReadWriteTim.AddressSetupTime=0x00;
- FSMC_ReadWriteTim.AddressHoldTime=0x00;
- FSMC_ReadWriteTim.DataSetupTime=0x08; //数据保持时间
- FSMC_ReadWriteTim.BusTurnAroundDuration=0X00;
- FSMC_ReadWriteTim.CLKDivision=0x00;
- FSMC_ReadWriteTim.DataLatency=0x00;
- FSMC_ReadWriteTim.AccessMode=FSMC_ACCESS_MODE_A;
- HAL_SRAM_Init(&SRAM_Handler,&FSMC_ReadWriteTim,&FSMC_ReadWriteTim);
- }
- void FSMC_SRAM_WriteBuffer(u8 *pBuffer,u32 WriteAddr,u32 n)
- {
- for(;n!=0;n--)
- {
- *(vu8*)(Bank1_SRAM3_ADDR+WriteAddr)=*pBuffer;
- WriteAddr++;
- pBuffer++;
- }
- }
- void FSMC_SRAM_ReadBuffer(u8 *pBuffer,u32 ReadAddr,u32 n)
- {
- for(;n!=0;n--)
- {
- *pBuffer++=*(vu8*)(Bank1_SRAM3_ADDR+ReadAddr);
- ReadAddr++;
- }
- }
复制代码
测试
check_buf=(u8*)mymalloc(SRAMIN,200);//申请内部内存,申请到的内存首地址为0x680EFF20
data_buf=(u8*)mymalloc(SRAMEX,200);//申请外部内存
for(temp=0;temp<200;temp++)//向data_buf写入200个字节
{
data_buf[temp]=temp;
}
FSMC_SRAM_ReadBuffer(check_buf,(u32)data_buf-Bank1_SRAM3_ADDR,200);//读出外部内存对应地址的50个数据
单步调试跟踪data_buf
外部内存数据调试
for循环内向外部内存地址0x680EFF20开始写入0x00 0x01 0x02.....,单步调试发现往0x680EFF20写入0x00时0x680EFFA0也会写入0x00,往0x680EFF21写入0x01时0x680EFFA1也会写入0x01...,
也就是一个数据会往两个地址写。
这两个首地址的关系:0x680EFFA0-0x680EFF20=0x80(1000 0000B)
这时候我怀疑是地址线有问题(因为数据写入的值是对的,调用FSMC_SRAM_ReadBuffer发现读出的数据也是对的)
之后我把FSMC中对地址线A7(PF13,1000 0000B(A7:A0)两个首地址(0x680EFFA0、0x680EFF20)的差值正好对应)的初始化屏蔽了,发现结果与调试结果一致,说明主控芯片对外部SRAM地址A7的控制出现了异常
我测量了下物理连接没啥问题,走线和其它地址线都是平行走线
我跑了下ALIENTEK 探索者 STM32F407 开发板的外部SRAM实验发现结果也是一样的
是不是这个国产存储芯片XM8A51216不良(从正点原子淘宝买的)
另外FSMC初始化中 XmRamInit()是直接白嫖原子的
期间我还怀疑是读写时序有点问题,于是在FSMC初始化中我将 FSMC_ReadWriteTim.DataSetupTime参数设置成0x06 0x08 0x0a,发现都是一样的,但是设置的值过大或过小就不行了
整体来看外部SRAM是可以工作的,申请内存,地址分配,数据写入和读出都可以,只是一个数据会往两个地址写
有人遇到过这样的问题 ?
|
|