STM32第十八课(FSMC,SRAM,HAL)

XM8A51216 的 A[0:18]并不是按顺序连接 STM32F4 的 FMSC_A[0:18],不过这并不影响我们正常使用外部 SRAM,因为地址具有唯一性。
这样设计的好处,就是可以方便我们的 PCB 布线。
使用 FSMC 的 BANK1 的sector3 来控制 XM8A51216,
因为 XM8A51216 的读写时间基本一致,所以,我们设置读写相同的时序来访问 FSMC。

++++++++++++++++++++++++++++++++++++++
使能 FSMC 时钟,并配置 FSMC 相关的 IO 及其时钟使能。
使用 FSMC,当然首先得开启其时钟。
使能 FSMC 时钟的方法为:

__HAL_RCC_FSMC_CLK_ENABLE();

配置 IO 口为复用输出的关键行代码为:

GPIO_Initure.Mode=GPIO_MODE_AF_PP; //推挽复用
GPIO_Initure.Alternate=GPIO_AF12_FSMC; //复用为 FSMC

设置 FSMC BANK1 区域 3 的相关寄存器。
使用模式 A、16 位宽,读写共用一个时序寄存器。 这个是通过调用函数 HAL_SRAM_Init 来实现的,函数原型为:

HAL_StatusTypeDef HAL_SRAM_Init(SRAM_HandleTypeDef *hsram,
FMC_NORSRAM_TimingTypeDef *Timing, FMC_NORSRAM_TimingTypeDef *ExtTiming)

使用的是 BANK1 的区域 3,所以 HADDR[27:26]=10,故外部内存的首地址为0X68000000。

+++++++++++++++++++++++++++++++++++++
FSMC 固 件 库 文 件 stm32f4xx_fsmc.c 和stm32f4xx_fsmc.h 文件。

+++++++++++++++++++++++++++++++++++++
实战,
在cubemx中,配置sram。
选择bank1的第二个chip,
选择NE3,
设置addr 为 19bits,
设置datawidth为16bits,
设置wait 为disable,
选择byte enable,

设置write operation为enable,
设置extended 为 disable,
设置addr setup为 2个Hclk,
设置data setup为 3个Hck,
设置bus turn around 为 0个Hclk.

++++++++++++++++++++++++++++++++++++
需要编写自建实用库,

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++;
	}
}

++++++++++++++++++++++++++++++++
在main中添加任务代码

		u32 testsram[2048] __attribute__((at(0X68000000)));//测试用数组
		sram_temp_wr = 0xabcd;
        FSMC_SRAM_WriteBuffer((u8*)&sram_temp_wr, (u32)0x00000004,2);
        FSMC_SRAM_ReadBuffer((u8*)&sram_temp_rd, (u32)0x00000004,2);
        LCD_ShowxNum(130,200,sram_temp_wr,6,32,0);
        LCD_ShowxNum(130,240,sram_temp_rd,6,32,0);
		
		LCD_ShowxNum(130,280,testsram[1],16,32,0);

这里,使用了一个GUN C的扩展特性,就是
attribute-at,

__attribute__((at(0X68000000)))

编译时,为变量或者数组指定分配的基地址。
在这里,我们为数组指定基地址,明确表示,
当我们对该数组读写时,读写操作发生在base 为 0x68000000的地址段,
也就是说,是位于SRAM之中。

+++++++++++++++++++++++++++++++

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在使用STM32 HAL库时打开FSMC的函数是`HAL_SRAM_Init()`,该函数用于初始化SRAM、PSRAM和NOR Flash存储器。在函数中,需要配置FSMC的时序、数据宽度、读写模式等参数,并且需要指定所要初始化的存储器类型。例如,如果要初始化NOR Flash存储器,则需要将FSMC_BANK1_NORSRAM1作为参数传递给函数。以下是一个示例代码片段: ```c /* 使能FSMC时钟 */ __HAL_RCC_FSMC_CLK_ENABLE(); /* 初始化FSMC */ FSMC_NORSRAM_TimingTypeDef Timing; FSMC_NORSRAM_InitTypeDef Init; Init.NSBank = FSMC_NORSRAM_BANK1; Init.DataAddressMux = FSMC_DATA_ADDRESS_MUX_DISABLE; Init.MemoryType = FSMC_MEMORY_TYPE_NOR; Init.MemoryDataWidth = FSMC_NORSRAM_MEM_BUS_WIDTH_16; Init.BurstAccessMode = FSMC_BURST_ACCESS_MODE_DISABLE; Init.WaitSignalPolarity = FSMC_WAIT_SIGNAL_POLARITY_LOW; Init.WaitSignalActive = FSMC_WAIT_TIMING_BEFORE_WS; Init.WriteOperation = FSMC_WRITE_OPERATION_ENABLE; Init.WaitSignal = FSMC_WAIT_SIGNAL_ENABLE; Init.ExtendedMode = FSMC_EXTENDED_MODE_DISABLE; Init.AsynchronousWait = FSMC_ASYNCHRONOUS_WAIT_DISABLE; Init.WriteBurst = FSMC_WRITE_BURST_DISABLE; Init.ContinuousClock = FSMC_CONTINUOUS_CLOCK_SYNC_ONLY; Timing.AddressSetupTime = 0xF; Timing.AddressHoldTime = 0xF; Timing.DataSetupTime = 0xFF; Timing.BusTurnAroundDuration = 0xF; Timing.CLKDivision = 0xF; Timing.DataLatency = 0xF; Timing.AccessMode = FSMC_ACCESS_MODE_A; HAL_SRAM_Init(&hsram1, &Init, &Timing); ``` 在上面的示例代码中,`__HAL_RCC_FSMC_CLK_ENABLE()`函数用于使能FSMC时钟,然后通过配置`FSMC_NORSRAM_TimingTypeDef`和`FSMC_NORSRAM_InitTypeDef`结构体中的参数来初始化FSMC。最后,调用`HAL_SRAM_Init()`函数来初始化SRAM、PSRAM或NOR Flash存储器。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值