打印
[STM32F1]

STM32F103_外部RAM用作运存

[复制链接]
楼主: 一点点0321
手机看帖
扫描二维码
随时随地手机跟帖
21
一点点0321|  楼主 | 2023-11-21 15:05 | 只看该作者 |只看大图 回帖奖励 |倒序浏览
六、变量定位定义

对于一个使用单片机内部 RAM 的访问相当容易,基本上定义变量是不需要思考其定位问题的,当把外部 SRAM 考虑进来时,则需要考虑内部及外部的问题;比如,如何让一个变量定位在内部或者外部 RAM;定位于内部是如何访问,定位于外部时又如何访问。这里说的是一个变量,或者一个数组的定位问题,当涉及到一个文件或者多个文件其内部所有变量的定位问题就复杂得多了。变量定位定义的一般方法(使用__attribute__)。

使用特权

评论回复
22
一点点0321|  楼主 | 2023-11-21 15:06 | 只看该作者
一般的定义方法如下图:

使用特权

评论回复
23
一点点0321|  楼主 | 2023-11-21 15:06 | 只看该作者
定义了 3 数组(属于公共变量),现在检查下对应的 map 文件如下图所示:

使用特权

评论回复
24
一点点0321|  楼主 | 2023-11-21 15:06 | 只看该作者
如上图的 2998 行 3012 行 3013 行可见与上面定义的位置是对应的,所以这样实现了变量定义的定位功能;当内部 RAM 不足时或者有意定义一个变量定位到外部 RAM 中就可以采用这种方法(使用外部 RAM 有前提条件这里就不说了)。

使用特权

评论回复
25
一点点0321|  楼主 | 2023-11-21 15:07 | 只看该作者
批量定义变量到外部 SRAM

如何实现批量的变量定义到外部 RAM 呢?除了批量地使用__attribute__定义变量,还是有更快捷的方法的。

使用特权

评论回复
26
一点点0321|  楼主 | 2023-11-21 15:07 | 只看该作者
配置外部 SRAM 可用起始地址及大小—如下图:

使用特权

评论回复
27
一点点0321|  楼主 | 2023-11-21 15:07 | 只看该作者
如上图 所示,最左最右边的小方框不要打勾…千万不要打勾,开始地址及大小必须如实填写(Size 的值可以小于但绝对不能大于实际外置芯片值),开始地址安装原理图连线确定其值。

使用特权

评论回复
28
一点点0321|  楼主 | 2023-11-21 15:07 | 只看该作者
定义一个文件内的所有变量于外部SRAM

首先定一个小目标:确定你要一个所有变量需要定位于外部 SRAM 的文件,接着按照下图来配置(这里让 main.c 这个文件,让里面定义的所有变量均定位于外部SRAM 中)在工程窗口选择 main.c 点鼠标右键如下图:

使用特权

评论回复
29
一点点0321|  楼主 | 2023-11-21 15:07 | 只看该作者
菜单选择第一行"Options for File 'main.c' "之后显示如下图:

使用特权

评论回复
30
一点点0321|  楼主 | 2023-11-21 15:08 | 只看该作者
如上图我们仅需关注"Memory Assignment"组,Code/Const 定义代码及 const 的定位,Zero Initialized Data 及 Other Data 是变量的定位,此处我们关心的仅数据(变量)部分的定位。定位设置如下图:

使用特权

评论回复
31
一点点0321|  楼主 | 2023-11-21 15:08 | 只看该作者
至此,main.c 文件内部的所有变量均已定位到外部 SRAM 中(前提是没忘记点 OK 按钮),到这里应该会发现一个问题如图 7 每一项都有一个<default>选项;在 keil 的工程里每个文件的变量安排都会有一个默认选项,当这里选择<default>时则会启用如图3 所示的默认选项,可以看到图 4 那里,说到千万不要打勾的那里。打勾的话那里就变成了第一默认选项,那么图 7 的配置就多余了。这个是可以验证的。那么再回头验证一下图 7 的配置是否实现了将 main.c 文件中的变量定位到外部 SRAM…..同样查看MAP 文件验证一下。首先在 main.c 中定义变量如下图:

使用特权

评论回复
32
一点点0321|  楼主 | 2023-11-21 15:08 | 只看该作者
如上图所示定义了一个结构体实例,两个 16 的数组,对应 map 文件如下图:

使用特权

评论回复
33
一点点0321|  楼主 | 2023-11-21 15:08 | 只看该作者
如上图所示, 3009 行 3010 行使用__attribute__定义占用了外部 SRAM的部分地址,《main.c》文件中并没有使用__attribute__来定义变量,其定位也处于外部 SRAM 中,其数组的大小定义与 map

文件是一致的,在此证明经过配置之后,在 main.c 文件中定义的变量均会被定位到外部 SRAM 中。

使用特权

评论回复
34
一点点0321|  楼主 | 2023-11-21 15:08 | 只看该作者
再验证 GraphicsDac_t 的大小。printf(" GraphicsDac_t size=%d \r\n",sizeof(GraphicsDac_t));

图 10(可见 printf 的大小与 map 的大小是一致的)

使用特权

评论回复
35
一点点0321|  楼主 | 2023-11-21 15:09 | 只看该作者
、将变量定义到内部SRAM

参考图 3,将内部 SRAM 的《default》打勾,之后将图 7 的下两个选项配置为《default》即可,这样实现一个文件其变量定位的切换。多个外部 SRAM 芯片时适当参考配置。

使用特权

评论回复
36
一点点0321|  楼主 | 2023-11-21 15:09 | 只看该作者
十、定位到外部 SRAM的变量的访问方法

方法一、一般访问外部 SRAM 的方法

首先使用 SRAM_Init();之后使用下面两个函数读写外部 SRAM:

SRAM_ReadBuffer(uint16_t* pBuffer, uint32_t ReadAddr, uint32_t NumHalfwordToRead)

SRAM_WriteBuffer(uint16_t* pBuffer, uint32_t WriteAddr, uint32_t NumHalfwordToWrite)

使用特权

评论回复
37
一点点0321|  楼主 | 2023-11-21 15:09 | 只看该作者
方法二、编译器

如第 3 节变量定位定义方法,变量的访问就由编译器自己搞定了(关于这一点还没有实际硬件验证---这里仅是理所当然的推测,至于还要使用方法一是不可思议的),变量的读写就和内部变量一样操作。

使用特权

评论回复
38
一点点0321|  楼主 | 2023-11-21 15:09 | 只看该作者
备注:文件内部函数内部的变量被定义在堆栈里,同时说明上面所说的定位到外部 SRAM 的变量均为全局变量,其文件内的局部变量还是在堆栈里(此处为我的推测,没经过验证)。

使用特权

评论回复
39
EmmaTT| | 2024-4-8 15:03 | 只看该作者
外部RAM该如何使用啊

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则