本帖最后由 jet1999 于 2025-2-6 12:29 编辑
使用STM32H7S7的FMC连接norflash 原理图如下(原理图修改了几次,画的不怎么规整)
原理图
我这里不使用写保护(WP#)以及 VPP我是直接连接VCC,可以查看这个芯片手册进行别VPP的操作。 使用CubeMX(6.13.0)配置外设如下,FMC频率为(200MHz)
注意这里的NOR/PSRAM timing的参数我在MDK中另外设置了
另外 我设置了FMC 中的norflash这块内存不使用 Cache 生成的MDK文件中修改了一些FMC参数 如下
[C] 纯文本查看 复制代码 /* Timing */
Timing.AddressSetupTime = 8;
Timing.AddressHoldTime = 4;
Timing.DataSetupTime = 5;
Timing.BusTurnAroundDuration = 4;
Timing.CLKDivision = 5;
Timing.DataLatency = 5;
Timing.AccessMode = FMC_ACCESS_MODE_A;
最后是测试代码,这个器件在写之前需要进行block解锁,上电默认是锁住的!
[C] 纯文本查看 复制代码 /*选择器件*/
hnor1.CommandSet = (uint16_t)0x0001;
HAL_NOR_WriteOperation_Enable(&hnor1);
/*擦除芯片block*/
HAL_NOR_Erase_Block(&hnor1,0,0x60000000);
/*读取芯片状态*/
NOR_WRITE(0x60000000, 0x0070);
NOR_WRITE(0x60000000, 0x00D0);
/*等待擦除完成*/
status = *((volatile uint16_t *)(0x60000000));
while(!( status & 0x0080 ))
{
status = *((volatile uint16_t *)(0x60000000));
}
/*解锁block并写入数据,此时返回的是norflash状态数据*/
NOR_WRITE(0x60000000, 0x0060);
NOR_WRITE(0x60000000, 0x00D0);
if ( HAL_NOR_Program(&hnor1,(uint32_t *)(0x60000000),&write_data) != HAL_OK)
{
while(1);
}
else
{
read_data = *(__IO uint16_t *)nor_address;
}
Controller_s = HAL_NOR_GetState(&hnor1);
Device_s = HAL_NOR_GetStatus(&hnor1,0x60000000,1000);
/*清除状态读取,此时返回的是norflash内部数据*/
NOR_WRITE(0x60000000, 0x0050);
NOR_WRITE(0x60000000, 0x00D0);
值得注意的是,在这个器件中block的大小不是一致的。
|