硬汉嵌入式论坛

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

[STM32H7] 请教硬汉哥ARM与FPGA使用FMC通讯问题

[复制链接]

1

主题

2

回帖

5

积分

新手上路

积分
5
发表于 2025-5-14 11:21:14 | 显示全部楼层 |阅读模式
最近在做一个ARM与FPGA通讯的项目,使用ARM的FMC(SRAM方式)与FPGA收发数据,遇到一个问题:用#define ADDR 0x6000001B 定义的地址,使用FMC间接读ADDE地址数据时,读出的数据一直是0;但直接用FMC读地址数据时读出的FPGA数据正常,已试着修改C语法、加入MPU配置,禁止cache着手,问题现象仍存在,请教硬汉哥有什么好的解决方法?谢谢
1.问题描述:

/* FMC地址 */
#define  WRITE_FPGA(Addr,Data)                *((volatile  unsigned short int *)(0x60000000 + (Addr<< 1))) = Data
#define  READ_FPGA(Addr)                                *((volatile  unsigned short int *)(0x60000000 + (Addr << 1)))

#define RD_LCD_COMMAND                                         READ_FPGA(27)

2.问题现象:
中断100us读一次FMC数据。
使用"Data=READ_FPGA(RD_LCD_COMMAND)"这样读FMC(FPGA)数据时,一直是0.
使用"Data=READ_FPGA(27)"这样读FMC(FPGA)数据时,数据正常.
请教大神, 这个跟FMC什么有关呢?

3.代码:

void FMC_SRAM_Init(void)
{
    FMC_NORSRAM_TimingTypeDef Timing = {0};

    HsRam1.Instance = FMC_NORSRAM_DEVICE;
    HsRam1.Extended = FMC_NORSRAM_EXTENDED_DEVICE;
    HsRam1.Init.NSBank = FMC_NORSRAM_BANK1;                                                        //使用NE1
    HsRam1.Init.DataAddressMux = FMC_DATA_ADDRESS_MUX_DISABLE;                //地址/数据线不复用
    HsRam1.Init.MemoryType = FMC_MEMORY_TYPE_SRAM;                                        //SRAM
    HsRam1.Init.MemoryDataWidth = FMC_NORSRAM_MEM_BUS_WIDTH_16;         //位数据宽度
    HsRam1.Init.BurstAccessMode = FMC_BURST_ACCESS_MODE_DISABLE;        //是否使能突发访问,仅对同步突发存储器有效,此处未用到
    HsRam1.Init.WaitSignalPolarity = FMC_WAIT_SIGNAL_POLARITY_LOW;        //等待信号的极性,仅在突发模式访问下有用
    HsRam1.Init.WaitSignalActive = FMC_WAIT_TIMING_BEFORE_WS;                //存储器是在等待周期之前的一个时钟周期还是等待周期期间使能NWAIT
    HsRam1.Init.WriteOperation = FMC_WRITE_OPERATION_ENABLE;                //存储器写使能
    HsRam1.Init.WaitSignal = FMC_WAIT_SIGNAL_DISABLE;                                //等待使能位,此处未用到
    HsRam1.Init.ExtendedMode = FMC_EXTENDED_MODE_DISABLE;                        //读写使用不同的时序
    HsRam1.Init.AsynchronousWait = FMC_ASYNCHRONOUS_WAIT_DISABLE;        //是否使能同步传输模式下的等待信号,此处未用到
    HsRam1.Init.WriteBurst = FMC_WRITE_BURST_DISABLE;                                //禁止突发写
    HsRam1.Init.ContinuousClock = FMC_CONTINUOUS_CLOCK_SYNC_ASYNC;
    HsRam1.Init.WriteFifo = FMC_WRITE_FIFO_ENABLE;
    HsRam1.Init.PageSize = FMC_PAGE_SIZE_NONE;

    /* FSMC初始化 */
    Timing.AddressSetupTime = 15;
    Timing.AddressHoldTime = 15;
    Timing.DataSetupTime = 15;
    Timing.BusTurnAroundDuration = 15;
    Timing.CLKDivision = 16;
    Timing.DataLatency = 17;
    Timing.AccessMode = FMC_ACCESS_MODE_A;

    if (HAL_SRAM_Init(&HsRam1, &Timing, NULL) != HAL_OK)
    {
        Error_Handler( );
    }
}


void mpu_memory_protection(void)
{
mpu_set_protection( 0x60000000,                 /* 基地址 */

                        MPU_REGION_SIZE_64MB,       /* 长度 */
                        MPU_REGION_NUMBER1, 0,      /* NUMER5,允许指令访问 */
                        MPU_REGION_FULL_ACCESS,     /* 全访问 */
                        MPU_ACCESS_SHAREABLE,   /* 禁止共用 */
                        MPU_ACCESS_NOT_CACHEABLE,   /* 禁止cache */
                        MPU_ACCESS_BUFFERABLE); /* 禁止缓冲 */

}
回复

使用道具 举报

4

主题

147

回帖

159

积分

初级会员

积分
159
发表于 2025-5-14 13:21:17 | 显示全部楼层
"Data=READ_FPGA(RD_LCD_COMMAND)"这句话本来就有问题吧,地址里面套地址
回复

使用道具 举报

1

主题

2

回帖

5

积分

新手上路

积分
5
 楼主| 发表于 2025-5-14 14:24:20 | 显示全部楼层
zl1215 发表于 2025-5-14 13:21
"Data=READ_FPGA(RD_LCD_COMMAND)"这句话本来就有问题吧,地址里面套地址

我也刚发现了,准备试一试,谢谢了。
回复

使用道具 举报

2

主题

6

回帖

12

积分

新手上路

积分
12
发表于 2025-5-14 14:31:37 | 显示全部楼层
READ_FPGA(RD_LCD_COMMAND)是读取 {0x60000000 + ((0x60000000 + (27<< 1)) 所在地址的unsigned short int类型的值) << 1)} 的地址的unsigned short int类型的值
READ_FPGA(27) 是读取 {0x60000000 + (0x60000000 + (27<< 1)} 的地址的unsigned short int类型的值
两者当然不同。如果 (0x60000000 + (27<< 1)) 所在地址的unsigned short int类型的值 就是 27,那么读到的数据两者相等,否则不同。

Data=READ_FPGA(27) 和 Data=RD_LCD_COMMAND 才是等价的
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
116197
QQ
发表于 2025-5-14 15:07:17 | 显示全部楼层
最重要的一点,必须配置这个地址范围的mpu cache属性为strongly order或者device模式
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-6-10 05:00 , Processed in 0.280474 second(s), 25 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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