STM32F407-SRAM

SRAM—> 内存
Flash–>硬盘

外置SRAM
在这里插入图片描述可以存储1M数据

地址线:A0-A18;2^18次方;512K个数据块
每个数据块是2字节;
数据线:D0-D15

UB/LB 掩码;低电平有效
UB -》低电平-》数据高字节有效
LB-》低电平 -》数据低字节有效

OE: 读使能;低电平有效
WE:写使能,低电平有效

FSMC-- 扩展外部SRAM

用来管理拓展的存储器外设
驱动静态存储器,只能驱动SRAM,不能驱动SDRAM
驱动动态存储器的外设是FMC,STM32F407不支持,420支持

直接挂在到AHB总线上

STM32F407内存分布:

在这里插入图片描述每一个Bank内部分为4块;这四块通过FSMC的片选区分;FSMC_NE1-4
在这里插入图片描述

硬件连接

在这里插入图片描述
在这里插入图片描述

代码

void MY_FSMC_INIT(void)
{
	FSMC_NORSRAMInitTypeDef FSMC_NORSRAMInitStruct;// 初始化用到的结构体
	FSMC_NORSRAMTimingInitTypeDef FSMC_NORSRAMTimingInitStruct; //时序结构体
	
	//初始化FSMC相关GPIO
	FSMC_GPIO_INIT();

	
	//使能时钟
	RCC_AHB3PeriphClockCmd(RCC_AHB3Periph_FSMC,ENABLE);
	
	//初始化时序结构体
	FSMC_NORSRAMTimingInitStruct.FSMC_AccessMode = FSMC_AccessMode_A; //sram
	FSMC_NORSRAMTimingInitStruct.FSMC_AddressSetupTime = 0; //地址保持时间 (0+1 CLK)
  FSMC_NORSRAMTimingInitStruct.FSMC_DataSetupTime = 8;  //数据保持时间  (8+1 CLK)
	
		//以下时序配置跟异步SRAM无关
	FSMC_NORSRAMTimingInitStruct.FSMC_AddressHoldTime = 0;
	FSMC_NORSRAMTimingInitStruct.FSMC_BusTurnAroundDuration = 0;
	FSMC_NORSRAMTimingInitStruct.FSMC_CLKDivision = 0;
	FSMC_NORSRAMTimingInitStruct.FSMC_DataLatency = 0;	
	//其他参数与异步SRAM无关
  //SRAM 总时间要求最小55ns, 数据保持时间最小25ns
	// 一个clk 时间 1/168微妙 = 0.0059 = 6ns;一个clk约等于6ns
	
	//读写都差不多
	
	
	
	// 初始化FSMC结构体
	FSMC_NORSRAMInitStruct.FSMC_BurstAccessMode = FSMC_BurstAccessMode_Disable ;
	FSMC_NORSRAMInitStruct.FSMC_AsynchronousWait = FSMC_AsynchronousWait_Disable; //异步等待
	FSMC_NORSRAMInitStruct.FSMC_Bank = FSMC_Bank1_NORSRAM3;//bank
	FSMC_NORSRAMInitStruct.FSMC_DataAddressMux = FSMC_DataAddressMux_Disable;//数据线和地址线是否复用
	FSMC_NORSRAMInitStruct.FSMC_ExtendedMode = FSMC_ExtendedMode_Disable;
	FSMC_NORSRAMInitStruct.FSMC_MemoryDataWidth = FSMC_MemoryDataWidth_16b;//数据线宽度
	FSMC_NORSRAMInitStruct.FSMC_MemoryType = FSMC_MemoryType_SRAM;//存储类型; SRAM
	FSMC_NORSRAMInitStruct.FSMC_WriteOperation = FSMC_WriteOperation_Enable;//支持写
	
	FSMC_NORSRAMInitStruct.FSMC_ReadWriteTimingStruct = &FSMC_NORSRAMTimingInitStruct;
	FSMC_NORSRAMInitStruct.FSMC_WriteTimingStruct = &FSMC_NORSRAMTimingInitStruct;
	
		//以下配置SRAM存储器没有用到
	FSMC_NORSRAMInitStruct.FSMC_WaitSignal = FSMC_WaitSignal_Disable  ;
	FSMC_NORSRAMInitStruct.FSMC_WaitSignalActive = FSMC_WaitSignalActive_BeforeWaitState  ;
	FSMC_NORSRAMInitStruct.FSMC_WaitSignalPolarity = FSMC_WaitSignalPolarity_Low ;
	FSMC_NORSRAMInitStruct.FSMC_WrapMode = FSMC_WrapMode_Disable  ;
	FSMC_NORSRAMInitStruct.FSMC_WriteBurst = FSMC_WriteBurst_Disable ;
	
	FSMC_NORSRAMInit(&FSMC_NORSRAMInitStruct);
	
	FSMC_NORSRAMCmd(FSMC_Bank1_NORSRAM3,ENABLE);
	
}
static void FSMC_GPIO_INIT(void)
{
	//1)配置GPIO和串口时钟
	RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOF | RCC_AHB1Periph_GPIOG | RCC_AHB1Periph_GPIOD | RCC_AHB1Periph_GPIOE, ENABLE);//通过AHB1总线使能GPIOF G D E组的时钟


	
	//2) 配置GPIO为复用模式
	GPIO_InitTypeDef Gpio_Value;
	Gpio_Value.GPIO_Mode = GPIO_Mode_AF;//选择的是复用模式
	Gpio_Value.GPIO_OType = GPIO_OType_PP;//选择推挽输出
	Gpio_Value.GPIO_PuPd = GPIO_PuPd_UP;//选择下拉
	Gpio_Value.GPIO_Speed = GPIO_Speed_100MHz;//选择100MHz
	
	Gpio_Value.GPIO_Pin = GPIO_Pin_0 
												| GPIO_Pin_1
												| GPIO_Pin_2
													| GPIO_Pin_3
													| GPIO_Pin_4
													| GPIO_Pin_5
													| GPIO_Pin_12
													| GPIO_Pin_13
													| GPIO_Pin_14
													| GPIO_Pin_15;
	GPIO_Init(GPIOF, &Gpio_Value);//按照上述配置初始化GPIOF组的管脚
	
	Gpio_Value.GPIO_Pin = GPIO_Pin_0 
												| GPIO_Pin_1
												| GPIO_Pin_2
													| GPIO_Pin_3
													| GPIO_Pin_4
													| GPIO_Pin_5
													| GPIO_Pin_10;
	GPIO_Init(GPIOG, &Gpio_Value);//按照上述配置初始化GPIOG组的管脚
	
	Gpio_Value.GPIO_Pin = GPIO_Pin_0 
												| GPIO_Pin_1
												| GPIO_Pin_11
												| GPIO_Pin_12
													| GPIO_Pin_13
													| GPIO_Pin_14
													| GPIO_Pin_15
													| GPIO_Pin_8
													| GPIO_Pin_9
													| GPIO_Pin_10
													| GPIO_Pin_4
													| GPIO_Pin_5;
	GPIO_Init(GPIOD, &Gpio_Value);//按照上述配置初始化GPIOD组的管脚
	
	Gpio_Value.GPIO_Pin = GPIO_Pin_0 
												| GPIO_Pin_1
												| GPIO_Pin_11
												| GPIO_Pin_12
													| GPIO_Pin_13
													| GPIO_Pin_14
													| GPIO_Pin_15
													| GPIO_Pin_8
													| GPIO_Pin_9
													| GPIO_Pin_10
													| GPIO_Pin_7;
	GPIO_Init(GPIOE, &Gpio_Value);//按照上述配置初始化GPIOE组的管脚
	
	
	GPIO_PinAFConfig(GPIOF,GPIO_PinSource0,GPIO_AF_FSMC);
	GPIO_PinAFConfig(GPIOF,GPIO_PinSource1,GPIO_AF_FSMC);
	GPIO_PinAFConfig(GPIOF,GPIO_PinSource2,GPIO_AF_FSMC);
	GPIO_PinAFConfig(GPIOF,GPIO_PinSource3,GPIO_AF_FSMC);
	GPIO_PinAFConfig(GPIOF,GPIO_PinSource4,GPIO_AF_FSMC);
	GPIO_PinAFConfig(GPIOF,GPIO_PinSource5,GPIO_AF_FSMC);
	GPIO_PinAFConfig(GPIOF,GPIO_PinSource12,GPIO_AF_FSMC);
	GPIO_PinAFConfig(GPIOF,GPIO_PinSource13,GPIO_AF_FSMC);
	GPIO_PinAFConfig(GPIOF,GPIO_PinSource14,GPIO_AF_FSMC);
	GPIO_PinAFConfig(GPIOF,GPIO_PinSource15,GPIO_AF_FSMC);
	
	GPIO_PinAFConfig(GPIOG,GPIO_PinSource0,GPIO_AF_FSMC);
	GPIO_PinAFConfig(GPIOG,GPIO_PinSource1,GPIO_AF_FSMC);
	GPIO_PinAFConfig(GPIOG,GPIO_PinSource2,GPIO_AF_FSMC);
	GPIO_PinAFConfig(GPIOG,GPIO_PinSource3,GPIO_AF_FSMC);
	GPIO_PinAFConfig(GPIOG,GPIO_PinSource4,GPIO_AF_FSMC);
	GPIO_PinAFConfig(GPIOG,GPIO_PinSource5,GPIO_AF_FSMC);
	GPIO_PinAFConfig(GPIOG,GPIO_PinSource10,GPIO_AF_FSMC);
	
	GPIO_PinAFConfig(GPIOD,GPIO_PinSource11,GPIO_AF_FSMC);
	GPIO_PinAFConfig(GPIOD,GPIO_PinSource12,GPIO_AF_FSMC);
	GPIO_PinAFConfig(GPIOD,GPIO_PinSource13,GPIO_AF_FSMC);
	GPIO_PinAFConfig(GPIOD,GPIO_PinSource14,GPIO_AF_FSMC);
	GPIO_PinAFConfig(GPIOD,GPIO_PinSource15,GPIO_AF_FSMC);
	GPIO_PinAFConfig(GPIOD,GPIO_PinSource0,GPIO_AF_FSMC);
	GPIO_PinAFConfig(GPIOD,GPIO_PinSource1,GPIO_AF_FSMC);
	GPIO_PinAFConfig(GPIOD,GPIO_PinSource8,GPIO_AF_FSMC);
	GPIO_PinAFConfig(GPIOD,GPIO_PinSource9,GPIO_AF_FSMC);
	GPIO_PinAFConfig(GPIOD,GPIO_PinSource10,GPIO_AF_FSMC);
	GPIO_PinAFConfig(GPIOD,GPIO_PinSource4,GPIO_AF_FSMC);
	GPIO_PinAFConfig(GPIOD,GPIO_PinSource5,GPIO_AF_FSMC);
	
	GPIO_PinAFConfig(GPIOE,GPIO_PinSource7,GPIO_AF_FSMC);
	GPIO_PinAFConfig(GPIOE,GPIO_PinSource8,GPIO_AF_FSMC);
	GPIO_PinAFConfig(GPIOE,GPIO_PinSource9,GPIO_AF_FSMC);
	GPIO_PinAFConfig(GPIOE,GPIO_PinSource10,GPIO_AF_FSMC);
	GPIO_PinAFConfig(GPIOE,GPIO_PinSource11,GPIO_AF_FSMC);
	GPIO_PinAFConfig(GPIOE,GPIO_PinSource12,GPIO_AF_FSMC);
	GPIO_PinAFConfig(GPIOE,GPIO_PinSource13,GPIO_AF_FSMC);
	GPIO_PinAFConfig(GPIOE,GPIO_PinSource14,GPIO_AF_FSMC);
	GPIO_PinAFConfig(GPIOE,GPIO_PinSource15,GPIO_AF_FSMC);
	GPIO_PinAFConfig(GPIOE,GPIO_PinSource1,GPIO_AF_FSMC);
	GPIO_PinAFConfig(GPIOE,GPIO_PinSource0,GPIO_AF_FSMC);
}

主函数

#define INER_SRAM_ADDR  0x20001000
#define SRAM_BASE_ADDR  0x68000000

int main(void)
{
	my_usart_init();
	MY_FSMC_INIT();

	printf("\n\n Begin 内部数据 \n\n");
	
	volatile uint8_t *p = (uint8_t *)INER_SRAM_ADDR;
	
	*p = 0x77;
	
	printf("write 0x77\n");
	
	printf("read is 0x%x\n",*p);
	
	
	printf("\n\n Begin SRAM \n\n");

	p = (uint8_t *)SRAM_BASE_ADDR;
	
	*p = 0x77;
	
	printf("write 0x77\n");
	
	printf("addr : 0x%p  read is 0x%x\n",p,*p);
	
	
	
	
	
	while(1)
	{
	
	}
	
	//return 0;
}

attribute 关键字

在Keil中使用此关键字指定变量存储地址

volatile uint8_t testvalue __attribute((at(0x6C000050)));
volatile double testvalue_double __attribute((at(0x6C000080)));

//变量类型 变量名 __attribute((at(指定的变量地址)));
//当地址为外部SRAM空间时
//1.必须为全局变量
//2.变量定义的初始值无效
//3.必须放在FSMC初始化之后才使用

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/521553.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

golang 选择排序

学习笔记~ // Author sunwenbo // 2024/4/6 21:49 package mainimport "fmt"/* 选择排序基本介绍选择式排序也属于内部排序法,是从预排序的数据中按指定的规则选出某一元素,经过和其他元素重整,再依原则交换位置后达到…

轻量的 WebHook 工具:歪脖虎克

本篇文章聊聊轻量的网络钩子(WebHook)工具:歪脖虎克。 写在前面 这是一篇迟到很久的文章,在 21 年和 22 年的时候,我分享过两篇关于轻量的计划任务工具 Cronicle 的文章:《轻量的定时任务工具 Cronicle&a…

Linux(Ubuntu)中创建【samba】服务,用于和Windows系统之间共享文件

目录 1.先介绍一下什么是Samba 2.安装,配置服务 安装 配置(smb.conf) 配置用户 3.出现的问题(Failed to add entry for user XXXX) 4.创建文件夹 5.windows访问 1.先介绍一下什么是Samba Samba是一个开源的软…

2024.4.3-[作业记录]-day08-CSS 盒子模型(溢出显示、伪元素)

个人主页:学习前端的小z 个人专栏:HTML5和CSS3悦读 本专栏旨在分享记录每日学习的前端知识和学习笔记的归纳总结,欢迎大家在评论区交流讨论! 文章目录 作业 2024.4.3-学习笔记css溢出显示单行文本溢出显示省略号多行文本溢出显示省…

【Android】图解View的工作流程原理

文章目录 入口DecorView如何加载到Window中MeasureSpec MeasureView的测量ViewGroup的测量 LayoutView的layout() Draw1、绘制背景3、绘制View内容4、绘制子View6、绘制装饰 入口 DecorView如何加载到Window中 MeasureSpec 该类是View的内部类,封装View的规格尺寸…

C++资源重复释放问题

这不是自己释放了2次&#xff1b; 可能是类互相引用&#xff0c;有类似现象释放资源时引起&#xff1b;还不太了解&#xff1b; 类对象作为函数参数也会引起&#xff1b; 下面是一个简单示例&#xff1b; #include <iostream> #include <string.h> #include &l…

Spark-Scala语言实战(14)

在之前的文章中&#xff0c;我们学习了如何在spark中使用键值对中的fullOuterJoin&#xff0c;zip&#xff0c;combineByKey三种方法。想了解的朋友可以查看这篇文章。同时&#xff0c;希望我的文章能帮助到你&#xff0c;如果觉得我的文章写的不错&#xff0c;请留下你宝贵的点…

最优算法100例之36-扑克牌顺子

专栏主页:计算机专业基础知识总结(适用于期末复习考研刷题求职面试)系列文章https://blog.csdn.net/seeker1994/category_12585732.html 题目描述 LL今天心情特别好,因为他去买了一副扑克牌,发现里面居然有2个大王,2个小王(一副牌原本是54张^_^)...他随机从中抽出了…

软考113-上午题-【计算机网络】-IPv6、无线网络、Windows命令

一、IPv6 IPv6 具有长达 128 位的地址空间&#xff0c;可以彻底解决 IPv4 地址不足的问题。由于 IPv4 地址是32 位二进制&#xff0c;所能表示的IP 地址个数为 2^32 4 294 967 29640 亿&#xff0c;因而在因特网上约有 40亿个P 地址。 由 32 位的IPv4 升级至 128 位的IPv6&am…

FaaF:利用事实作为评估RAG的函数方法

原文地址&#xff1a;faaf-facts-as-a-function-for-evaluating-rag 2024 年 4 月 5 日 在某些情况下&#xff0c;我们使用其他语言模型来验证RAG的输出结果&#xff0c;但这种方法并未能有效识别出数据生成过程中的错误和缺失。 论文解析 挑战 评估的可靠性和效率&#xff…

PyTorch之计算模型推理时间

一、参考资料 如何测试模型的推理速度 Pytorch 测试模型的推理速度 二、计算PyTorch模型推理时间 1. 计算CPU推理时间 import torch import torchvision import time import tqdm from torchsummary import summarydef calcCPUTime():model torchvision.models.resnet18()…

数据字典

文章目录 一、需求分析二、表设计&#xff08;两张表&#xff09;三、功能实现3.1 数据字典功能3.1.1 列表功能3.1.2 新增数据字典3.1.3 编辑数据字典 3.2 数据字典明细3.2.1 列表功能3.2.2 新增字典明细3.2.3 编辑字典明细 3.3 客户管理功能3.3.1 列表功能3.3.2 新增用户3.3.3…

页表基本原理

页表概念 CPU并不是直接访问物理内存地址&#xff0c;而是通过虚拟地址空间来间接访问物理内存地址&#xff1b;虚拟地址空间是操作系统为每个正在执行的进程分配一个逻辑地址&#xff1b;比如在32位系统(处理器和内存地址总线都是32位)&#xff0c;范围是0~(4G-1)&#xff1b…

docker基础学习指令

文章目录 [toc] docker基础常用指令一、docker 基础命令二、docker 镜像命令1. docker images2. docker search3. docker pull4. docker system df5. docker rmi1. Commit 命令 三、 docker 容器命令1. docker run2. docker logs3. docker top4. docker inspect5. docker cp6. …

CSS-语法、选择器

&#x1f4da;详见 W3scholl&#xff0c;本篇只做快速思维索引。 概述 CSS 是一种描述 HTML 文档样式的语言。 有三种插入样式表的方法&#xff1a; 外部 CSS内部 CSS行内 CSS &#x1f4c5; 外部 CSS 外部样式表存储在.css文件中。HTML 页面必须在 head 部分的<link&g…

Apache Log4j2 Jndi RCE CVE-2021-44228漏洞原理讲解

Apache Log4j2 Jndi RCE CVE-2021-44228漏洞原理讲解 一、什么是Log4j2二、环境搭建三、简单使用Log4j2四、JDNI和RMI4.1、启动一个RMI服务端4.2、启动一个RMI客户端4.3、ldap 五、漏洞复现六、Python批量检测 参考视频&#xff1a;https://www.bilibili.com/video/BV1mZ4y1D7K…

深入浅出 -- 系统架构之Keepalived搭建双机热备

Keepalived重启脚本双机热备搭建 ①首先创建一个对应的目录并下载keepalived安装包&#xff08;提取码:s6aq&#xff09;到Linux中并解压&#xff1a; [rootlocalhost]# mkdir /soft/keepalived && cd /soft/keepalived [rootlocalhost]# wget https://www.keepalived.…

MYSQL 锁机制 与 MVCC多版本并发

MYSQL锁机制与优化以及MVCC底层原理 锁分类 乐观锁&#xff0c;悲观锁 从性能上分为乐观锁&#xff08;版本对比,版本一致就更新&#xff0c;不一致就不更新或CAS机制&#xff09;和悲观锁&#xff08;锁住资源等待&#xff09;&#xff0c;乐观锁适合读比较多的场景&#x…

无监督学习简介

无监督学习简介 一、定义和核心概念 无监督学习的定义 无监督学习是机器学习的一个关键分支&#xff0c;它涉及到从未标注数据中学习和提取信息。不同于其他学习类型&#xff0c;无监督学习的数据集没有提供任何显式的输出标签或结果。因此&#xff0c;这种学习方法的主要任务…

运放知识点总结

目录 一、运放基础知识 (operational amplifier) 1.由来 2.用途 3.符号 4.内部结构​编辑 5.虚短虚断 二、同相放大电路 &#xff08;Non-inverting Amplifier&#xff09; 三、反相放大电路 (Inverting Amplifier) 四、差分放大电路 (Difference Amplifier) 五、加法…