SRAM_BASE_ADDR和SRAM_BASE不同

野火STM32学习到FSMC这一章icon-default.png?t=N7T8https://www.bilibili.com/video/BV1yW411Y7Gw/?p=73&spm_id_from=pageDriver&vd_source=e8b31c4be409c20eaa210afb7c204494,老师讲到了读写扩展SRAM的内容,然后视频里老师演示串口输出时,发现没有预期的效果。然后分析到是没有调用SRAM_Init()函数,且函数里没有使能FSMC时钟。但是我却发现我的能输出写到SRAM的内存的值

一顿纳闷,没有调用SRAM_Init()函数,怎么会起作用了呢,查看代码发现,我给指针赋值的时候用的是SRAM_BASE

	p = (uint8_t *)SRAM_BASE;
	*p = 0xAB;
	printf("\r\n 读出的数据为0x%x", *p);
	
	uint16_t *p16;
	p16 = (uint16_t *) (SRAM_BASE + 10);
	*p16 = 0xcdef;
	printf("\r\n 读出的数据为0x%x", *p16);
	
	float* pf;
	pf = (float *) (SRAM_BASE + 20);
	*pf = 12.34;
	
	printf("\r\n 读出的数据为%f", *pf);

而实际上应该用SRAM_BASE_ADDR

#define SRAM_BASE             ((uint32_t)0x20000000) /*!< SRAM base address in the alias region */

SRAM_BASE_ADDR是

#define SRAM_BASE_ADDR (0x68000000)

SRAM_BASE代表应该的是芯片内部的SRAM起始地址,SRAM_BASE_ADDR是我们通过FSMC扩展的外部SRAM的地址,

图中左侧的是 Cortex-M3 内核的存储空间分配,右侧是 STM32 FSMC 外设的地址映射。可以看
到FSMC 的NOR/PSRAM/SRAM/NAND FLASH 以及PC 卡的地址都在ExternalRAM 地址空间内。
正是因为存在这样的地址映射,使得访问 FSMC 控制的存储器时,就跟访问 STM32 的片上外设
寄存器一样 (片上外设的地址映射即图中左侧的“Peripheral”区域)。
FSMC 把整个 External RAM 存储区域分成了 4 个 Bank 区域,并分配了地址范围及适用的存储器
类型,如NOR 及SRAM 存储器只能使用Bank1 的地址。在每个Bank 的内部又分成了4 个小块,
每个小块有相应的控制引脚用于连接片选信号,如 FSMC_NE[4:1] 信号线可用于选择 BANK1 内
部的4 小块地址区域,见图Bank1 内部的小块地址分配 ,当STM32 访问0x68000000-0x6BFFFFFF
地址空间时,会访问到Bank1 的第3 小块区域,相应的FSMC_NE3 信号线会输出控制信号。

当我保持不调用SRAM_Init()函数时,main函数做下列修改,

输出结果是:

也就是*p输出不来,因为改成SRAM_BASE_ADDR后,就代表扩展的SRAM了,未初始化是不可能读写成功的。

开启FSMC时钟:

然后再调用SRAM_Init();

就能正常输出了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值