硬汉嵌入式论坛

 找回密码
 立即注册
查看: 970|回复: 7
收起左侧

[STM32H7] 請問有辦法把外部SDRam定義在keil sct裡又不干擾DMA2D 的0xC0000000位址嗎?

[复制链接]

6

主题

17

回帖

35

积分

新手上路

积分
35
发表于 2022-5-12 16:39:50 | 显示全部楼层 |阅读模式
本帖最后由 acer1204 于 2022-5-12 17:19 编辑

各位前輩您好
目前用FMC+SDRam+LDTC控制RGB TFT。(0xC0000000)
最近有很多陣列要放小icon想要先加載至SDRam。
在sct上面加入 來自動配置定址可以正常工作
RW_IRAM5 0xC0000000 UNINIT 0x02000000  {
*(.RAM_SDRAM)
}
__attribute__((section (".RAM_SDRAM"),zero_init))  static uint16_t LCD_BUFFER[480][800];
__attribute__((section (".RAM_SDRAM"),zero_init))  static uint16_t LCD_BUFFER1[480*800];

目前可以正常用外部SDRAM了
不過當我使用DMA2D 定址位址也是0xC0000000,會互相干擾。

另外我將一些像是lvgl的變數用程這種方式宣告,程序咝姓#荓VGL並不會顯示任何東西。
但是單純將SDRAM當作顯示buffer倒是正常。
有什麼要注意的地方嗎?
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106978
QQ
发表于 2022-5-12 17:29:50 | 显示全部楼层
手动指定地址还是有点麻烦。
使用GUI时,推荐分配了LCD显存后,剩下的空间全部交给GUI的动态内存管理即可,这样就可以方便的申请空间加载ICON使用了,现在我们使用GUIX和emWin都是这么玩的。
回复

使用道具 举报

6

主题

17

回帖

35

积分

新手上路

积分
35
 楼主| 发表于 2022-5-12 17:39:26 | 显示全部楼层
eric2013 发表于 2022-5-12 17:29
手动指定地址还是有点麻烦。
使用GUI时,推荐分配了LCD显存后,剩下的空间全部交给GUI的动态内存管理即可 ...

您好
目前我GUI是用LVGL
想說看不能能把它宣告的物件都放入SDRAM
還有FATFS的宣告變數都一併用SDRAM處理
請問這個有辦法嗎?
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106978
QQ
发表于 2022-5-12 17:49:02 | 显示全部楼层
acer1204 发表于 2022-5-12 17:39
您好
目前我GUI是用LVGL
想說看不能能把它宣告的物件都放入SDRAM

一样的,也可以用GUI的动态内存一起管理。特别是你读取个大图片背景什么的,就可以一次性全部读取出来到SDRAM了。
回复

使用道具 举报

0

主题

216

回帖

216

积分

高级会员

积分
216
发表于 2022-5-13 10:15:32 | 显示全部楼层
;RW_SDRAM1 0xC0000000 UNINIT 0x200000
;{
;        .ANY (DMAD)
;}       
RW_SDRAM1 0xC0200000 UNINIT 0x200000
{
        .ANY (GUIBUF)
}
RW_SDRAM2 0xC0400000 UNINIT 0x00C00000  {
        .ANY (GUIMEM)
}
;RW_SDRAM2 0xC1000000 UNINIT 0x01000000  {
;        .ANY (HEAP)
;}

类似这样的,可以把SDRAM分隔成多块,每个区域可以分别指定用途。
固定使用的空间可以不指定。
回复

使用道具 举报

6

主题

17

回帖

35

积分

新手上路

积分
35
 楼主| 发表于 2022-5-16 16:01:48 | 显示全部楼层
本帖最后由 acer1204 于 2022-5-16 17:30 编辑
regbbs 发表于 2022-5-13 10:15
;RW_SDRAM1 0xC0000000 UNINIT 0x200000
;{
;        .ANY (DMAD)

您好我發現我用
LIGN_32BYTES(__attribute__((section(".RAM_SDRAM"))) static uint32_t adc1data[1000];
發現最高的2byte與最低的2bye是顛倒的,請問這是正常的嗎?
例如
65536他會是  0x0000 0001
65537他會是  0x0001 0001
是我程序少了什麼,還是用SDram會有這樣的問題?
回复

使用道具 举报

6

主题

17

回帖

35

积分

新手上路

积分
35
 楼主| 发表于 2022-5-16 16:16:26 | 显示全部楼层
regbbs 发表于 2022-5-13 10:15
;RW_SDRAM1 0xC0000000 UNINIT 0x200000
;{
;        .ANY (DMAD)

您好
再請教一下
我用外部SDRAM可以正常配置了
胸告成uint_16或uint_32能正常存取整數
可以宣告成float的話,存進去的數值讀出來都會變得很詭異
回复

使用道具 举报

6

主题

17

回帖

35

积分

新手上路

积分
35
 楼主| 发表于 2022-5-16 16:44:22 | 显示全部楼层
regbbs 发表于 2022-5-13 10:15
;RW_SDRAM1 0xC0000000 UNINIT 0x200000
;{
;        .ANY (DMAD)

您好我發現我用
LIGN_32BYTES(__attribute__((section(".RAM_SDRAM"))) static uint32_t adc1data[1000];
發現最高的2byte與最低的2bye是顛倒的,請問這是正常的嗎?
例如
65536他會是  0x0000 0001
65537他會是  0x0001 0001
是我程序少了什麼,還是用SDram會有這樣的問題?
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-5-12 17:04 , Processed in 0.182286 second(s), 25 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表