Toggle navigation
首页
问答
文章
积分商城
专家
专区
更多专区...
文档中心
返回主站
搜索
提问
会员
中心
登录
注册
stm32f417ZG挂载sram(IS61wv102416)的代码 移植到 stm32f429IG...
发布于 2019-02-13 10:59:51 浏览:2019
订阅该版
* 本帖最后由 wangzhenyou 于 2019-2-13 11:10 编辑 * 各位请教一个问题:我之前用过stm32f417挂载 sram (IS61wv102416-10)使用正常,现在新作了一个pcb板使用的是stm32f429 挂载 sram (IS61wv102416-10),最近测试板子的功能时发现 sram 数据读写有问题。 少量数据读写时出错概率较小,频繁的数据读写时 会出错。如: 写入的是 0xa5c3 读回的数据不是0xa5c3 。现在已经将stm32f429的主频调到了168mhz 。 **手里有6块板子其中3块是有这个数据读写出错的。 ** sram初始化函数如下: void SRAM_Init(void) { GPIO_InitTypeDef GPIO_InitStructure; FSMC_NORSRAMInitTypeDef FSMC_NORSRAMInitStructure; FSMC_NORSRAMTimingInitTypeDef readWriteTiming; RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB | RCC_AHB1Periph_GPIOD | RCC_AHB1Periph_GPIOE | RCC_AHB1Periph_GPIOF | RCC_AHB1Periph_GPIOG, ENABLE); //使能PD,PE,PF,PG时钟 RCC_AHB3PeriphClockCmd(RCC_AHB3Periph_FSMC, ENABLE); //使能FSMC时钟 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_15; //PB15 推挽输出,控制背光 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT; //普通输出模式 GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; //推挽输出 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //100MHz GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; //上拉 GPIO_Init(GPIOB, &GPIO_InitStructure); //初始化 //PB15 推挽输出,控制背光 GPIO_InitStructure.GPIO_Pin = (3 << 0) | (3 << 4) | (0XFF << 8); //PD0,1,4,5,8~15 AF OUT GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; //复用输出 GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; //推挽输出 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz; //100MHz GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; //上拉 GPIO_Init(GPIOD, &GPIO_InitStructure); //初始化 GPIO_InitStructure.GPIO_Pin = (3 << 0) | (0X1FF << 7); //PE0,1,7~15,AF OUT GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; //复用输出 GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; //推挽输出 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz; //100MHz GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; //上拉 GPIO_Init(GPIOE, &GPIO_InitStructure); //初始化 GPIO_InitStructure.GPIO_Pin = (0X3F << 0) | (0XF << 12); //PF0~5,12~15 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; //复用输出 GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; //推挽输出 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz; //100MHz GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; //上拉 GPIO_Init(GPIOF, &GPIO_InitStructure); //初始化 GPIO_InitStructure.GPIO_Pin = (0X3F << 0) | GPIO_Pin_10; //PG0~5,10 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; //复用输出 GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; //推挽输出 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz; //100MHz GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; //上拉 GPIO_Init(GPIOG, &GPIO_InitStructure); //初始化 GPIO_PinAFConfig(GPIOD, GPIO_PinSource0, GPIO_AF_FSMC); //PD0,AF12 GPIO_PinAFConfig(GPIOD, GPIO_PinSource1, GPIO_AF_FSMC); //PD1,AF12 GPIO_PinAFConfig(GPIOD, GPIO_PinSource4, GPIO_AF_FSMC); GPIO_PinAFConfig(GPIOD, GPIO_PinSource5, GPIO_AF_FSMC); GPIO_PinAFConfig(GPIOD, GPIO_PinSource8, GPIO_AF_FSMC); GPIO_PinAFConfig(GPIOD, GPIO_PinSource9, GPIO_AF_FSMC); GPIO_PinAFConfig(GPIOD, GPIO_PinSource10, GPIO_AF_FSMC); GPIO_PinAFConfig(GPIOD, GPIO_PinSource11, GPIO_AF_FSMC); GPIO_PinAFConfig(GPIOD, GPIO_PinSource12, GPIO_AF_FSMC); GPIO_PinAFConfig(GPIOD, GPIO_PinSource13, GPIO_AF_FSMC); GPIO_PinAFConfig(GPIOD, GPIO_PinSource14, GPIO_AF_FSMC); GPIO_PinAFConfig(GPIOD, GPIO_PinSource15, GPIO_AF_FSMC); //PD15,AF12 GPIO_PinAFConfig(GPIOE, GPIO_PinSource0, GPIO_AF_FSMC); GPIO_PinAFConfig(GPIOE, GPIO_PinSource1, GPIO_AF_FSMC); GPIO_PinAFConfig(GPIOE, GPIO_PinSource7, GPIO_AF_FSMC); //PE7,AF12 GPIO_PinAFConfig(GPIOE, GPIO_PinSource8, GPIO_AF_FSMC); GPIO_PinAFConfig(GPIOE, GPIO_PinSource9, GPIO_AF_FSMC); GPIO_PinAFConfig(GPIOE, GPIO_PinSource10, GPIO_AF_FSMC); GPIO_PinAFConfig(GPIOE, GPIO_PinSource11, GPIO_AF_FSMC); GPIO_PinAFConfig(GPIOE, GPIO_PinSource12, GPIO_AF_FSMC); GPIO_PinAFConfig(GPIOE, GPIO_PinSource13, GPIO_AF_FSMC); GPIO_PinAFConfig(GPIOE, GPIO_PinSource14, GPIO_AF_FSMC); GPIO_PinAFConfig(GPIOE, GPIO_PinSource15, GPIO_AF_FSMC); //PE15,AF12 GPIO_PinAFConfig(GPIOF, GPIO_PinSource0, GPIO_AF_FSMC); //PF0,AF12 GPIO_PinAFConfig(GPIOF, GPIO_PinSource1, GPIO_AF_FSMC); //PF1,AF12 GPIO_PinAFConfig(GPIOF, GPIO_PinSource2, GPIO_AF_FSMC); //PF2,AF12 GPIO_PinAFConfig(GPIOF, GPIO_PinSource3, GPIO_AF_FSMC); //PF3,AF12 GPIO_PinAFConfig(GPIOF, GPIO_PinSource4, GPIO_AF_FSMC); //PF4,AF12 GPIO_PinAFConfig(GPIOF, GPIO_PinSource5, GPIO_AF_FSMC); //PF5,AF12 GPIO_PinAFConfig(GPIOF, GPIO_PinSource12, GPIO_AF_FSMC); //PF12,AF12 GPIO_PinAFConfig(GPIOF, GPIO_PinSource13, GPIO_AF_FSMC); //PF13,AF12 GPIO_PinAFConfig(GPIOF, GPIO_PinSource14, GPIO_AF_FSMC); //PF14,AF12 GPIO_PinAFConfig(GPIOF, GPIO_PinSource15, GPIO_AF_FSMC); //PF15,AF12 GPIO_PinAFConfig(GPIOG, GPIO_PinSource0, GPIO_AF_FSMC); GPIO_PinAFConfig(GPIOG, GPIO_PinSource1, GPIO_AF_FSMC); GPIO_PinAFConfig(GPIOG, GPIO_PinSource2, GPIO_AF_FSMC); GPIO_PinAFConfig(GPIOG, GPIO_PinSource3, GPIO_AF_FSMC); GPIO_PinAFConfig(GPIOG, GPIO_PinSource4, GPIO_AF_FSMC); GPIO_PinAFConfig(GPIOG, GPIO_PinSource5, GPIO_AF_FSMC); GPIO_PinAFConfig(GPIOG, GPIO_PinSource10, GPIO_AF_FSMC); // readWriteTiming.FSMC_AddressSetupTime = 0x00; //地址建立时间(ADDSET)为1个HCLK 1/36M=27ns ** stm32f417设置参数** // readWriteTiming.FSMC_AddressHoldTime = 0x00; //地址保持时间(ADDHLD)模式A未用到 // readWriteTiming.FSMC_DataSetupTime = 0x08; ////数据保持时间(DATAST)为9个HCLK 6*9=54ns // readWriteTiming.FSMC_BusTurnAroundDuration = 0x00; readWriteTiming.FSMC_AddressSetupTime = 0x05; //地址建立时间(ADDSET) **stm32f429设置参数 ,这个参数尝试设置过 2 3** **1 也无效** readWriteTiming.FSMC_AddressHoldTime = 0x00; //地址保持时间(ADDHLD)模式A未用到 readWriteTiming.FSMC_DataSetupTime = 0x08; ////数据保持时间(DATAST)为9个HCLK 6*9=54ns readWriteTiming.FSMC_BusTurnAroundDuration = 0x02; readWriteTiming.FSMC_CLKDivision = 0x00; readWriteTiming.FSMC_DataLatency = 0x00; readWriteTiming.FSMC_AccessMode = FSMC_AccessMode_A; //模式A FSMC_NORSRAMInitStructure.FSMC_Bank = FSMC_Bank1_NORSRAM3; // 这里我们使用NE3 ,也就对应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; //存储器数据宽度为16bit 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; //存储器写使能 FSMC_NORSRAMInitStructure.FSMC_WaitSignal = FSMC_WaitSignal_Disable; FSMC_NORSRAMInitStructure.FSMC_ExtendedMode = FSMC_ExtendedMode_Disable; //读写使用相同的时序 FSMC_NORSRAMInitStructure.FSMC_WriteBurst = FSMC_WriteBurst_Disable; FSMC_NORSRAMInitStructure.FSMC_ReadWriteTimingStruct = &readWriteTiming; FSMC_NORSRAMInitStructure.FSMC_WriteTimingStruct = &readWriteTiming; //读写同样时序 FSMC_NORSRAMInit(&FSMC_NORSRAMInitStructure); //初始化FSMC配置 FSMC_NORSRAMCmd(FSMC_Bank1_NORSRAM3, ENABLE); // 使能BANK1区域3 } void SRAM_WriteBuffer(uint16_t *pBuffer, uint32_t WriteAddr, uint32_t NumHalfwordToWrite) { for (; NumHalfwordToWrite != 0; NumHalfwordToWrite--) /* while there is data to write */ { /* Transfer data to the memory */ *(uint16_t *)(Bank1_SRAM3_ADDR + WriteAddr) = *pBuffer++; // /* Increment the address*/ WriteAddr += 2; } } /** * @brief Reads a block of data from the FSMC SRAM memory. * @param pBuffer : pointer to the buffer that receives the data read from the * SRAM memory. * @param ReadAddr : SRAM memory internal address to read from. * @param NumHalfwordToRead : number of half-words to read. * @retval None */ void SRAM_ReadBuffer(uint16_t *pBuffer, uint32_t ReadAddr, uint32_t NumHalfwordToRead) { for (; NumHalfwordToRead != 0; NumHalfwordToRead--) /* while there is data to read */ { /* Read a half-word from the memory */ *pBuffer++ = *(__IO uint16_t *)(Bank1_SRAM3_ADDR + ReadAddr); /* Increment the address*/ ReadAddr += 2; } }
查看更多
4
个回答
默认排序
按发布时间排序
aozima
2019-02-13
调网络不抓包,调I2C等时序不上逻辑分析仪,就像电工不用万用表!多用整理的好的文字,比截图更省流量,还能在整理过程中思考。
99.99%是硬件和配置问题,测试程序可以用这个: \examples\test\mem_test.c 焊接检查下,然后时序重新算一下,按板子性能留点裕量。 时序计算参考 [https://www.rt-thread.org/qa/thread-1628-1-1.html](https://www.rt-thread.org/qa/thread-1628-1-1.html)
wangzhenyou
2019-02-13
这家伙很懒,什么也没写!
>99.99%是硬件和配置问题,测试程序可以用这个: \examples\test\mem_test.c > >焊接检查下,然后时序重新算一 ... --- 嗯,时序已经参考这个文档调整过
wangzhenyou
2019-02-13
这家伙很懒,什么也没写!
>99.99%是硬件和配置问题,测试程序可以用这个: \examples\test\mem_test.c > >焊接检查下,然后时序重新算一 ... --- 您好,就是这一版PCB布线mcu 和 sram 距离稍远?会影响么
aozima
2019-02-13
调网络不抓包,调I2C等时序不上逻辑分析仪,就像电工不用万用表!多用整理的好的文字,比截图更省流量,还能在整理过程中思考。
[i=s] 本帖最后由 aozima 于 2019-2-13 16:34 编辑 [/i] 根据线路长度和信号速度(近似光速)自己算下,非DDR对等长要求低些,计算时以最长信号线为准。 简单点说就是:调慢些,调最慢还有问题就说明焊接或器件质量有问题。
撰写答案
登录
注册新账号
关注者
0
被浏览
2k
关于作者
wangzhenyou
这家伙很懒,什么也没写!
提问
1
回答
3
被采纳
0
关注TA
发私信
相关问题
推荐文章
1
RT-Thread应用项目汇总
2
玩转RT-Thread系列教程
3
国产MCU移植系列教程汇总,欢迎查看!
4
机器人操作系统 (ROS2) 和 RT-Thread 通信
5
五分钟玩转RT-Thread新社区
6
【技术三千问】之《玩转ART-Pi》,看这篇就够了!干货汇总
7
关于STM32H7开发板上使用SDIO接口驱动SD卡挂载文件系统的问题总结
8
STM32的“GPU”——DMA2D实例详解
9
RT-Thread隐藏的宝藏之completion
10
【ART-PI】RT-Thread 开启RTC 与 Alarm组件
最新文章
1
GD32F450 片内 flash驱动适配
2
STM32H7R7运行CherryUSB
3
RT-Smart首次线下培训,锁定2024 RT-Thread开发者大会!
4
使用RC522软件包驱动FM1722
5
常量数据类型和表达式陷阱分享
热门标签
RT-Thread Studio
串口
Env
LWIP
SPI
AT
Bootloader
Hardfault
CAN总线
FinSH
ART-Pi
USB
DMA
文件系统
RT-Thread
SCons
RT-Thread Nano
线程
MQTT
STM32
RTC
FAL
rt-smart
ESP8266
I2C_IIC
UART
WIZnet_W5500
ota在线升级
freemodbus
PWM
flash
cubemx
packages_软件包
BSP
潘多拉开发板_Pandora
定时器
ADC
flashDB
GD32
socket
中断
编译报错
Debug
SFUD
rt_mq_消息队列_msg_queue
msh
keil_MDK
ulog
C++_cpp
MicroPython
本月问答贡献
a1012112796
10
个答案
1
次被采纳
踩姑娘的小蘑菇
4
个答案
1
次被采纳
红枫
4
个答案
1
次被采纳
张世争
4
个答案
1
次被采纳
Ryan_CW
4
个答案
1
次被采纳
本月文章贡献
catcatbing
3
篇文章
5
次点赞
YZRD
2
篇文章
5
次点赞
qq1078249029
2
篇文章
2
次点赞
xnosky
2
篇文章
1
次点赞
Woshizhapuren
1
篇文章
5
次点赞
回到
顶部
发布
问题
分享
好友
手机
浏览
扫码手机浏览
投诉
建议
回到
底部