硬汉嵌入式论坛

 找回密码
 立即注册
查看: 799|回复: 4
收起左侧

[SRAM] FMC访问SRAM有问题,AC6转成GCC,同样的配置

[复制链接]

25

主题

233

回帖

308

积分

高级会员

积分
308
QQ
发表于 2024-11-27 20:04:33 | 显示全部楼层 |阅读模式
驱动一个和 SRAM 类似时序的芯片,同样的 FMC 配置,AC6 下没有问题,同一个工程转成 GCC 后(修改了链接器脚本和少量其他软件 port ),读写那个芯片的数据就出问题了。

其他外设都是没问题的,UART、RMII、CAN 等。

配置 MPU 部分如下(与 AC6 一致)
[C] 纯文本查看 复制代码
    /* 配置FMC 片选3 TNT4882的支持*/
    MPU_InitStruct.Enable           = MPU_REGION_ENABLE;
    MPU_InitStruct.BaseAddress      = 0x68000000;
    MPU_InitStruct.Size             = MPU_REGION_SIZE_256B;
    MPU_InitStruct.AccessPermission = MPU_REGION_FULL_ACCESS;
    MPU_InitStruct.IsBufferable     = MPU_ACCESS_NOT_BUFFERABLE;
    MPU_InitStruct.IsCacheable      = MPU_ACCESS_NOT_CACHEABLE; // 此外设需配置为无cache,否则会重复片选和读写使能
    MPU_InitStruct.IsShareable      = MPU_ACCESS_SHAREABLE;
    MPU_InitStruct.Number           = MPU_REGION_NUMBER4;
    MPU_InitStruct.TypeExtField     = MPU_TEX_LEVEL0;
    MPU_InitStruct.SubRegionDisable = 0x00;
    MPU_InitStruct.DisableExec      = MPU_INSTRUCTION_ACCESS_ENABLE;




配置 FMC 部分如下(与 AC6 一致)
[C] 纯文本查看 复制代码
    hsram1.Instance = FMC_NORSRAM_DEVICE;
    hsram1.Extended = FMC_NORSRAM_EXTENDED_DEVICE;
    /* hsram1.Init */
    hsram1.Init.NSBank             = FMC_NORSRAM_BANK3;
    hsram1.Init.DataAddressMux     = FMC_DATA_ADDRESS_MUX_DISABLE;
    hsram1.Init.MemoryType         = FMC_MEMORY_TYPE_SRAM;
    hsram1.Init.MemoryDataWidth    = FMC_NORSRAM_MEM_BUS_WIDTH_8;
    hsram1.Init.BurstAccessMode    = FMC_BURST_ACCESS_MODE_DISABLE;
    hsram1.Init.WaitSignalPolarity = FMC_WAIT_SIGNAL_POLARITY_LOW;
    hsram1.Init.WaitSignalActive   = FMC_WAIT_TIMING_BEFORE_WS;
    hsram1.Init.WriteOperation     = FMC_WRITE_OPERATION_ENABLE;
    hsram1.Init.WaitSignal         = FMC_WAIT_SIGNAL_DISABLE;
    hsram1.Init.ExtendedMode       = FMC_EXTENDED_MODE_ENABLE;
    hsram1.Init.AsynchronousWait   = FMC_ASYNCHRONOUS_WAIT_DISABLE;
    hsram1.Init.WriteBurst         = FMC_WRITE_BURST_DISABLE;
    hsram1.Init.ContinuousClock    = FMC_CONTINUOUS_CLOCK_SYNC_ONLY;
    hsram1.Init.WriteFifo          = FMC_WRITE_FIFO_ENABLE;
    hsram1.Init.PageSize           = FMC_PAGE_SIZE_NONE;
    /* Timing */
    Timing.AddressSetupTime      = 10;
    Timing.AddressHoldTime       = 6;  //6
    Timing.DataSetupTime         = 18; //18
    Timing.BusTurnAroundDuration = 6;
    Timing.CLKDivision           = 16;
    Timing.DataLatency           = 17;
    Timing.AccessMode            = FMC_ACCESS_MODE_D;
    /* ExtTiming */
    ExtTiming.AddressSetupTime      = 10;
    ExtTiming.AddressHoldTime       = 15;
    ExtTiming.DataSetupTime         = 16; //16
    ExtTiming.BusTurnAroundDuration = 6;  //6
    ExtTiming.CLKDivision           = 16;
    ExtTiming.DataLatency           = 17;
    ExtTiming.AccessMode            = FMC_ACCESS_MODE_A;


FMC 外设时钟是 200M ,RCC_FMCCLKSOURCE_D1HCLK  ,收发段的时钟数都是计算好的,AC6 下一直稳定没有问题。
测试是读 0x68000000 部分的 16 个 8bit 数据,原有的 AC6 工程很稳定每次读取都一致。如下是 AC6 编译出的工程进行读取。
企业微信截图_17326990702813.png
使用GCC编出来的工程则每次会有少许变化,但第一个字节几乎是不变的(或者极少)。如下是 GCC 编译出的工程进行读取。
企业微信截图_17326982231571.png
个人怀疑是时钟时序和 AC6 不一样了。
很奇怪呀,搞不定辣(引脚很难焊,实在没办法只有焊出来对比了)


回复

使用道具 举报

25

主题

233

回帖

308

积分

高级会员

积分
308
QQ
 楼主| 发表于 2024-11-27 21:39:13 | 显示全部楼层
新发现,GCC 下,写是没有问题,读只有第一次正常
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
117546
QQ
发表于 2024-11-28 09:00:26 | 显示全部楼层
可以考虑调整下GCC的优化等级试试。

另外AC6下批量读写校验测试也通过了吧
回复

使用道具 举报

25

主题

233

回帖

308

积分

高级会员

积分
308
QQ
 楼主| 发表于 2024-11-28 13:33:46 | 显示全部楼层
eric2013 发表于 2024-11-28 09:00
可以考虑调整下GCC的优化等级试试。

另外AC6下批量读写校验测试也通过了吧

解决了解决了,和之前的问题一样,因为用了带 module 管理器的内核,tx_thread_schedule.s 的 MPU 接管这部分需要修改,其实之前已经改过了,但是 GNU 和 AC6 调的是不同的 .h 文件,需要恢复的 MPU 配置部分的宏定义忘了修改。

FMC_SRAN的奇怪现象,任务内和任务外查询同一地址,地址信号不一致 - STM32H7 - 硬汉嵌入式论坛 - Powered by Discuz!
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
117546
QQ
发表于 2024-11-29 08:00:24 | 显示全部楼层
yono 发表于 2024-11-28 13:33
解决了解决了,和之前的问题一样,因为用了带 module 管理器的内核,tx_thread_schedule.s 的 MPU 接管这 ...

好的,谢谢告知最终原因
回复

使用道具 举报

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

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2025-8-14 02:39 , Processed in 0.054099 second(s), 27 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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