OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 7082|回复: 15

F407最小板官方STemWin例程使用外部SRAM白屏

[复制链接]

5

主题

21

帖子

0

精华

初级会员

Rank: 2

积分
104
金钱
104
注册时间
2020-1-22
在线时间
21 小时
发表于 2020-4-15 10:09:01 | 显示全部楼层 |阅读模式
1金钱
F407最小系统板,使用了原子提供的FreeRTOS教程的项目“FreeRTOS实验21-1 FreeRTOS+EMWIN移植实验”,没有改动什么,下载到板上会卡在GUI_Init()白屏,如果在GUIConf.c里改为使用内部RAM,同时把GUI_NUMBYTES改为几十K,则可以正常跑例程。
原子的例程应该是好多人跑过才对,为什么到我这就跑不起来了呢?

最佳答案

查看完整内容[请看2#楼]

原子让我找技术支持,所以我想应该不是示例的问题,于是我换了一块板,例程可以跑了。 我调试发现这块板的外部内存初始化和清零后也存在不为0的单元,而内存管理是看内存表有没有连续为0的内存块,所以申请的外部内存越大,失败几率就越大。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

5

主题

21

帖子

0

精华

初级会员

Rank: 2

积分
104
金钱
104
注册时间
2020-1-22
在线时间
21 小时
 楼主| 发表于 2020-4-15 10:09:02 | 显示全部楼层
xiaodongenter 发表于 2020-4-18 12:01
没有啊,没有思路了

原子让我找技术支持,所以我想应该不是示例的问题,于是我换了一块板,例程可以跑了。
我调试发现这块板的外部内存初始化和清零后也存在不为0的单元,而内存管理是看内存表有没有连续为0的内存块,所以申请的外部内存越大,失败几率就越大。
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165309
金钱
165309
注册时间
2010-12-1
在线时间
2108 小时
发表于 2020-4-16 01:11:44 | 显示全部楼层
帮顶
回复

使用道具 举报

5

主题

21

帖子

0

精华

初级会员

Rank: 2

积分
104
金钱
104
注册时间
2020-1-22
在线时间
21 小时
 楼主| 发表于 2020-4-16 07:23:31 | 显示全部楼层
有可能是硬件问题吗?还是keil版本的问题?
我用的keil版本是5.29, DFP版本是2.14
回复

使用道具 举报

5

主题

21

帖子

0

精华

初级会员

Rank: 2

积分
104
金钱
104
注册时间
2020-1-22
在线时间
21 小时
 楼主| 发表于 2020-4-16 07:26:23 | 显示全部楼层
我在调试的时候发现,使用内部ram时,GUI_Init()里aMemory可以分配到地址,使用外部sram时,aMemory的地址是0x00000000。
是不是使用外部sram时,没有获取到地址?
回复

使用道具 举报

5

主题

21

帖子

0

精华

初级会员

Rank: 2

积分
104
金钱
104
注册时间
2020-1-22
在线时间
21 小时
 楼主| 发表于 2020-4-16 09:17:51 | 显示全部楼层
发现是内存管理驱动的问题,在外部sram只能申请160k以内的空间,申请170k就会失败。
但即使在外部sram申请成功了160k的空间,跑例程的时候也是随机黑屏、白屏、卡死。
回复

使用道具 举报

1

主题

38

帖子

0

精华

初级会员

Rank: 2

积分
185
金钱
185
注册时间
2019-5-5
在线时间
47 小时
发表于 2020-4-16 15:02:39 来自手机 | 显示全部楼层
我也是407最小系统,外部ram白屏,内部可以用,但是容易死机。把demo里边的任务只留第一个跑了一天也没死机。话说配套资料的代码跑不同有点。。。
回复

使用道具 举报

5

主题

21

帖子

0

精华

初级会员

Rank: 2

积分
104
金钱
104
注册时间
2020-1-22
在线时间
21 小时
 楼主| 发表于 2020-4-16 15:42:27 | 显示全部楼层
xiaodongenter 发表于 2020-4-16 15:02
我也是407最小系统,外部ram白屏,内部可以用,但是容易死机。把demo里边的任务只留第一个跑了一天也没死机 ...

有没有找到解决办法?

看来不是我一个人遇到这个问题,原子能提供下支持不?
回复

使用道具 举报

1

主题

38

帖子

0

精华

初级会员

Rank: 2

积分
185
金钱
185
注册时间
2019-5-5
在线时间
47 小时
发表于 2020-4-18 12:01:10 来自手机 | 显示全部楼层
没有啊,没有思路了
回复

使用道具 举报

2

主题

11

帖子

0

精华

初级会员

Rank: 2

积分
72
金钱
72
注册时间
2019-11-5
在线时间
41 小时
发表于 2020-4-22 13:31:17 | 显示全部楼层
楼主解决了吗?我也遇到这样的问题,使用内部RAM,同时把GUI_NUMBYTES改为几十K,则可以正常跑例程。用外部RAM就不行
回复

使用道具 举报

5

主题

21

帖子

0

精华

初级会员

Rank: 2

积分
104
金钱
104
注册时间
2020-1-22
在线时间
21 小时
 楼主| 发表于 2020-4-22 17:34:16 | 显示全部楼层
mrdxyj 发表于 2020-4-22 13:31
楼主解决了吗?我也遇到这样的问题,使用内部RAM,同时把GUI_NUMBYTES改为几十K,则可以正常跑例程。用外部 ...

我换了一块板来跑就没事,所以申请换货了。
回复

使用道具 举报

5

主题

21

帖子

0

精华

初级会员

Rank: 2

积分
104
金钱
104
注册时间
2020-1-22
在线时间
21 小时
 楼主| 发表于 2020-5-14 14:28:11 | 显示全部楼层
clcclc 发表于 2020-4-22 17:34
我换了一块板来跑就没事,所以申请换货了。

后来发现,换一块板是可以跑了,但是跑到treeview的时候会花屏卡死。
找了客服,他们能重现这个问题,说是等他们分析,不过到现在也没有结果
回复

使用道具 举报

0

主题

8

帖子

0

精华

初级会员

Rank: 2

积分
54
金钱
54
注册时间
2021-7-29
在线时间
30 小时
发表于 2021-7-29 19:02:14 | 显示全部楼层
我把SRAM初始化的代码换成这个就好了(来自一位大神的代码)


GPIO_InitTypeDef GPIO_InitStructure;
        FSMC_NORSRAMInitTypeDef FSMC_NORSRAMInitStructure;
        FSMC_NORSRAMTimingInitTypeDef FSMC_ReadWriteTimingStructure;
       
        RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOD|RCC_AHB1Periph_GPIOE|RCC_AHB1Periph_GPIOF|RCC_AHB1Periph_GPIOG,ENABLE); //使能PD,PE,PF,PG时钟
       
        GPIO_InitStructure.GPIO_Pin =( GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_8|GPIO_Pin_9|GPIO_Pin_10 \
                                                                                                                                |GPIO_Pin_11|GPIO_Pin_12|GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15); //PD0,1,4,5,8,9,10,11,12,13,14,15
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; //复用模式
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz; //100M时钟
        GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;  //推完模式
        GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; //上拉
        GPIO_Init(GPIOD,&GPIO_InitStructure);
       
        GPIO_InitStructure.GPIO_Pin = (GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_7|GPIO_Pin_8|GPIO_Pin_9|GPIO_Pin_10|GPIO_Pin_11 \
                                                                                                                                |GPIO_Pin_12|GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15); //PE0,1,7,8,9,10,11,12,13,14,15
        GPIO_Init(GPIOE,&GPIO_InitStructure);
       
        GPIO_InitStructure.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); //PF0,1,2,3,4,5,12,13,14,15
        GPIO_Init(GPIOF,&GPIO_InitStructure);
       
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_10 ; //PG0,1,2,3,4,5,10
        GPIO_Init(GPIOG,&GPIO_InitStructure);
       
        //GPIOD复用配置
        GPIO_PinAFConfig(GPIOD,GPIO_PinSource0,GPIO_AF_FSMC);  //PD0
        GPIO_PinAFConfig(GPIOD,GPIO_PinSource1,GPIO_AF_FSMC);  //PD1
        GPIO_PinAFConfig(GPIOD,GPIO_PinSource4,GPIO_AF_FSMC);  //PD4
        GPIO_PinAFConfig(GPIOD,GPIO_PinSource5,GPIO_AF_FSMC);  //PD5
        GPIO_PinAFConfig(GPIOD,GPIO_PinSource8,GPIO_AF_FSMC);  //PD8
        GPIO_PinAFConfig(GPIOD,GPIO_PinSource9,GPIO_AF_FSMC);  //PD9
        GPIO_PinAFConfig(GPIOD,GPIO_PinSource10,GPIO_AF_FSMC); //PD10
        GPIO_PinAFConfig(GPIOD,GPIO_PinSource11,GPIO_AF_FSMC); //PD11
        GPIO_PinAFConfig(GPIOD,GPIO_PinSource12,GPIO_AF_FSMC); //PD12
        GPIO_PinAFConfig(GPIOD,GPIO_PinSource13,GPIO_AF_FSMC); //PD13
        GPIO_PinAFConfig(GPIOD,GPIO_PinSource14,GPIO_AF_FSMC); //PD14
        GPIO_PinAFConfig(GPIOD,GPIO_PinSource15,GPIO_AF_FSMC); //PD15
       
        //GPIOE复用配置
        GPIO_PinAFConfig(GPIOE,GPIO_PinSource0,GPIO_AF_FSMC);  //PE0
        GPIO_PinAFConfig(GPIOE,GPIO_PinSource1,GPIO_AF_FSMC);  //PE1
        GPIO_PinAFConfig(GPIOE,GPIO_PinSource7,GPIO_AF_FSMC);  //PE7
        GPIO_PinAFConfig(GPIOE,GPIO_PinSource8,GPIO_AF_FSMC);  //PE8
        GPIO_PinAFConfig(GPIOE,GPIO_PinSource9,GPIO_AF_FSMC);  //PE9
        GPIO_PinAFConfig(GPIOE,GPIO_PinSource10,GPIO_AF_FSMC); //PE10
        GPIO_PinAFConfig(GPIOE,GPIO_PinSource11,GPIO_AF_FSMC); //PE11
        GPIO_PinAFConfig(GPIOE,GPIO_PinSource12,GPIO_AF_FSMC); //PE12
        GPIO_PinAFConfig(GPIOE,GPIO_PinSource13,GPIO_AF_FSMC); //PE13
        GPIO_PinAFConfig(GPIOE,GPIO_PinSource14,GPIO_AF_FSMC); //PE14
        GPIO_PinAFConfig(GPIOE,GPIO_PinSource15,GPIO_AF_FSMC); //PE15
       
        //GPIOF复用配置
        GPIO_PinAFConfig(GPIOF,GPIO_PinSource0,GPIO_AF_FSMC);  //PF0
        GPIO_PinAFConfig(GPIOF,GPIO_PinSource1,GPIO_AF_FSMC);  //PF1
        GPIO_PinAFConfig(GPIOF,GPIO_PinSource2,GPIO_AF_FSMC);  //PF2
        GPIO_PinAFConfig(GPIOF,GPIO_PinSource3,GPIO_AF_FSMC);  //PF3
        GPIO_PinAFConfig(GPIOF,GPIO_PinSource4,GPIO_AF_FSMC);  //PF4
        GPIO_PinAFConfig(GPIOF,GPIO_PinSource5,GPIO_AF_FSMC);  //PF5
        GPIO_PinAFConfig(GPIOF,GPIO_PinSource12,GPIO_AF_FSMC); //PF12
        GPIO_PinAFConfig(GPIOF,GPIO_PinSource13,GPIO_AF_FSMC); //PF13
        GPIO_PinAFConfig(GPIOF,GPIO_PinSource14,GPIO_AF_FSMC); //PF14
        GPIO_PinAFConfig(GPIOF,GPIO_PinSource15,GPIO_AF_FSMC); //PF15
       
        //GPIOG复用配置
        GPIO_PinAFConfig(GPIOG,GPIO_PinSource0,GPIO_AF_FSMC);  //PG0
        GPIO_PinAFConfig(GPIOG,GPIO_PinSource1,GPIO_AF_FSMC);  //PG1
        GPIO_PinAFConfig(GPIOG,GPIO_PinSource2,GPIO_AF_FSMC);  //PG2
        GPIO_PinAFConfig(GPIOG,GPIO_PinSource3,GPIO_AF_FSMC);  //PG3
        GPIO_PinAFConfig(GPIOG,GPIO_PinSource4,GPIO_AF_FSMC);  //PG4
        GPIO_PinAFConfig(GPIOG,GPIO_PinSource5,GPIO_AF_FSMC);  //PG5
        GPIO_PinAFConfig(GPIOG,GPIO_PinSource10,GPIO_AF_FSMC); //PG10
       
        FSMC_ReadWriteTimingStructure.FSMC_AddressSetupTime = 0X00; //地址建立时间0个HCLK 0ns
        FSMC_ReadWriteTimingStructure.FSMC_AddressHoldTime = 0x00;  //地址保持时间,模式A未用到
        FSMC_ReadWriteTimingStructure.FSMC_DataSetupTime = 0x09;    //数据保持时间,9个HCLK,6*9=54ns
        FSMC_ReadWriteTimingStructure.FSMC_BusTurnAroundDuration = 0x00;
        FSMC_ReadWriteTimingStructure.FSMC_CLKDivision = 0x00;
        FSMC_ReadWriteTimingStructure.FSMC_DataLatency = 0x00;
        FSMC_ReadWriteTimingStructure.FSMC_AccessMode = FSMC_AccessMode_A; //模式A
       
        FSMC_NORSRAMInitStructure.FSMC_Bank = FSMC_Bank1_NORSRAM3;  //NOR/SRAM的Bank3
        FSMC_NORSRAMInitStructure.FSMC_DataAddressMux = FSMC_DataAddressMux_Disable; //数据和地址线不复用
        FSMC_NORSRAMInitStructure.FSMC_MemoryType = FSMC_MemoryType_SRAM; //SRAM存储模式
        FSMC_NORSRAMInitStructure.FSMC_MemoryDataWidth = FSMC_MemoryDataWidth_16b; //16位数据宽度
        FSMC_NORSRAMInitStructure.FSMC_BurstAccessMode = FSMC_BurstAccessMode_Disable; //FLASH使用的,SRAM未使用
        FSMC_NORSRAMInitStructure.FSMC_AsynchronousWait = FSMC_AsynchronousWait_Disable; //是否使能同步传输模式下的等待信号,此处未用到
        FSMC_NORSRAMInitStructure.FSMC_WaitSignalPolarity = FSMC_WaitSignalPolarity_Low; //等待信号的极性,仅在突发模式访问下有用
        FSMC_NORSRAMInitStructure.FSMC_WrapMode = FSMC_WrapMode_Disable;  //是否使能环路突发模式,此处未用到
        FSMC_NORSRAMInitStructure.FSMC_WaitSignalActive = FSMC_WaitSignalActive_BeforeWaitState; //存储器是在等待周期之前的一个时钟周期还是等待周期期间使能NWAIT
        FSMC_NORSRAMInitStructure.FSMC_WriteOperation = FSMC_WriteOperation_Enable; //存储器写使能
        FSMC_NORSRAMInitStructure.FSMC_WaitSignal = FSMC_WaitSignal_Disable;   //等待使能位,此处未用到
        FSMC_NORSRAMInitStructure.FSMC_ExtendedMode = FSMC_ExtendedMode_Disable; //读写使用相同的时序
        FSMC_NORSRAMInitStructure.FSMC_WriteBurst = FSMC_WriteBurst_Disable;  //异步传输期间的等待信号
        FSMC_NORSRAMInitStructure.FSMC_ReadWriteTimingStruct = &FSMC_ReadWriteTimingStructure;
        FSMC_NORSRAMInitStructure.FSMC_WriteTimingStruct = &FSMC_ReadWriteTimingStructure;
        FSMC_NORSRAMInit(&FSMC_NORSRAMInitStructure);  //FSMC_SRAM初始化
       
        FSMC_NORSRAMCmd(FSMC_Bank1_NORSRAM3,ENABLE);  //使能NOR/SRAM功能       
回复

使用道具 举报

0

主题

2

帖子

0

精华

初级会员

Rank: 2

积分
54
金钱
54
注册时间
2020-5-26
在线时间
15 小时
发表于 2021-7-29 21:46:53 | 显示全部楼层
xyx0610 发表于 2021-7-29 19:02
我把SRAM初始化的代码换成这个就好了(来自一位大神的代码)

还是死机
回复

使用道具 举报

0

主题

2

帖子

0

精华

初级会员

Rank: 2

积分
54
金钱
54
注册时间
2020-5-26
在线时间
15 小时
发表于 2021-7-29 21:47:29 | 显示全部楼层
xyx0610 发表于 2021-7-29 19:02
我把SRAM初始化的代码换成这个就好了(来自一位大神的代码)

能发你源码看看吗
回复

使用道具 举报

1

主题

2

帖子

0

精华

新手上路

积分
35
金钱
35
注册时间
2021-9-2
在线时间
9 小时
发表于 2021-12-2 12:40:47 | 显示全部楼层
GUIDRV_Template.c   中,最上方
//定义LCD的命令和数据位.
u32 UCGUI_LCD_CMD  = 0X6C001FFE; //A12为1,STM32会右移1位
u32 UCGUI_LCD_DATA = 0X6C002000; //A12为0,STM32会右移1位
这两个要根据自己板子的硬件修改
详情看基础教程里TFT的章节
回复

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-11-22 11:51

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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