硬汉嵌入式论坛

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

[emWin] 求助:请教emWin 重新初始化 进入硬件中断的问题

[复制链接]

1

主题

5

回帖

1

积分

新手上路

积分
1
发表于 2017-10-11 17:30:54 | 显示全部楼层 |阅读模式
描述:[blockquote]
STM32-V6开发板,429+freeRTOS+emwin
功能:使用emwin显示一个图形界面,30秒无按键熄屏(关闭SDRAM,LTDC,GUI),再次按键后重新初始化SDRAM,LTDC,GUI[/blockquote]
问题:[blockquote]
emWin第一次初始化后, 可以显示正常的界面,运行正常。
之后熄屏再开启LCD时在GUI_Init函数中进入BUS硬件中断[/blockquote]
反初始化时顺序:[blockquote]
GUI_Exit();
LCD_DeInit(); //LTDC
SDRAM_DeInit();[/blockquote]
重新初始时顺序:
[blockquote]SDRAM_Init();[/blockquote][blockquote]LCD_Init(); //LTDC[/blockquote][blockquote]GUI_Init();  //第二次执行时进入硬件中断[/blockquote]
[blockquote]


问题定位在EMWIN,方式不对?我该如何处理?

[/blockquote] QQ五笔截图未命名111.png
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115765
QQ
发表于 2017-10-11 17:58:02 | 显示全部楼层
息屏绝不可以关闭SDRAM,因为这个里面是显示屏的内容,而且SDRAM是需要定时刷新的,否则数据会丢失。 最好关闭下LCD的背光就可以了,LCD背光最耗电。
回复

使用道具 举报

1

主题

5

回帖

1

积分

新手上路

积分
1
 楼主| 发表于 2017-10-11 20:01:27 | 显示全部楼层

回 eric2013 的帖子

eric2013:
息屏绝不可以关闭SDRAM,因为这个里面是显示屏的内容,而且SDRAM是需要定时刷新的,否则数据会丢失。 最好关闭下LCD的背光就可以了,LCD背光最耗电。
嗯,关闭SDRAM和LCD是出于RF辐射,而不仅仅是耗电。
考虑到SDRAM是显存,所以在重新初始化时LCD、SDRAM、GUI都进行重新初始化,但是重新GUI_Init出问题,还不知如何觖决
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115765
QQ
发表于 2017-10-12 01:53:32 | 显示全部楼层

回 wx-as 的帖子

wx-as:嗯,关闭SDRAM和LCD是出于RF辐射,而不仅仅是耗电。
考虑到SDRAM是显存,所以在重新初始化时LCD、SDRAM、GUI都进行重新初始化,但是重新GUI_Init出问题,还不知如何觖决 (2017-10-11 20:01)
还有这种顾虑,的确是第一次了解,SDRAM影响应该很小的,LCD倒是有必要关闭下。

一个一个测试,可以先不关闭外设,重新初始化GUI,是否可以通过,然后排查下是那个硬件问题。

另外这些外设都有xxxxDeInit函数。

比如FMC的FMC_NORSRAMDeInit,放在你的驱动代码里面第一个就调用。
回复

使用道具 举报

32

主题

187

回帖

283

积分

高级会员

积分
283
发表于 2017-10-12 09:02:53 | 显示全部楼层
hard fault是可以通过寄存器找到执行哪段代码后出错的
回复

使用道具 举报

1

主题

5

回帖

1

积分

新手上路

积分
1
 楼主| 发表于 2017-10-12 11:15:37 | 显示全部楼层

回 eric2013 的帖子

eric2013:还有这种顾虑,的确是第一次了解,SDRAM影响应该很小的,LCD倒是有必要关闭下。

一个一个测试,可以先不关闭外设,重新初始化GUI,是否可以通过,然后排查下是那个硬件问题。

....... (2017-10-12 01:53) 
认证机构测试证明SDRAM在工作时辐射很大的

试过了不行,SDRAM,LCD都不重新初始化,仅GUI重新初始化就会出现总线异常,问题主要在emWin的重新初始化上面。因为没有找到GUI的DeInit()函数。我这边仅是使用了一个GUI_Exit(),再调用GUI_Init(),然后就出问题了,硬件中断发生在GUI_Init函数里面,汇编下的位置: 0x0801403C, BLX r2
回复

使用道具 举报

1

主题

5

回帖

1

积分

新手上路

积分
1
 楼主| 发表于 2017-10-12 11:19:38 | 显示全部楼层

回 loliko 的帖子

loliko:hard fault是可以通过寄存器找到执行哪段代码后出错的 (2017-10-12 09:02) 
嗯,定位如1楼图片如示:硬件中断发生在GUI_Init函数里面,汇编下的位置: 0x0801403C, BLX r2
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115765
QQ
发表于 2017-10-12 12:05:51 | 显示全部楼层

回 wx-as 的帖子

wx-as:

认证机构测试证明SDRAM在工作时辐射很大的

试过了不行,SDRAM,LCD都不重新初始化,仅GUI重新初始化就会出现总线异常,问题主要在emWin的重新初始化上面。因为没有找到GUI的DeInit()函数。我这边仅是使用了一个GUI_Exit(),再调用GUI_Init(),然后就出问题了,硬件中断发生在GUI_Init函数里面,汇编下的位置: 0x0801403C, BLX r2

以这个例子V6-500_STemWin实验_RTOS方式移植模板(含MDK和IAR)为例子,不需要GUI_Exit,直接重新初始化即可。我这里测试没问题。其它的你自己再搞搞。
  1. /*
  2. *********************************************************************************************************
  3. *    函 数 名: MainTask
  4. *    功能说明: GUI主函数
  5. *    形    参: 无
  6. *    返 回 值: 无
  7. *********************************************************************************************************
  8. */
  9. void MainTask(void)
  10. {
  11.    
  12.     //////////////////第1次//////////////////////
  13.     GUI_Init();
  14.     WM_MULTIBUF_Enable(1);
  15.     GUI_CURSOR_Show();
  16.     CreateFramewin();
  17.     GUI_Delay(2000);
  18.    
  19.     ////////////////////第2次////////////////////
  20.     GUI_Init();
  21.     WM_MULTIBUF_Enable(1);   
  22.     GUI_CURSOR_Show();
  23.     CreateFramewin();
  24.     GUI_Delay(2000);
  25.     /////////////////////第3次///////////////////   
  26.     GUI_Init();
  27.     WM_MULTIBUF_Enable(1);   
  28.     GUI_CURSOR_Show();
  29.     CreateFramewin();
  30.     while(1)
  31.     {
  32.         GUI_Delay(500);
  33.     }
  34. }
复制代码
回复

使用道具 举报

6

主题

231

回帖

249

积分

高级会员

积分
249
发表于 2017-10-12 15:52:21 | 显示全部楼层
他这个问题应该不难解决,主要是emwin没有源代码。
必须搞清楚emwin的数据放置在什么地方。
只有两种可能原因,一种是emwin退出的时候没有完整清理内存的信息;第二种是有部分数据在SDRAM中,重新开启SDRAM后没有初始化那部分SDRAM区域。
回复

使用道具 举报

1

主题

5

回帖

1

积分

新手上路

积分
1
 楼主| 发表于 2017-10-12 16:03:45 | 显示全部楼层

回 eric2013 的帖子

eric2013:


以这个例子V6-500_STemWin实验_RTOS方式移植模板(含MDK和IAR)为例子,不需要GUI_Exit,直接重新初始化即可。我这里测试没问题。其它的你自己再搞搞。

.......
不行,之前就试过了,直接GUI_Iint的结果是不进入硬件异常但初始化后GUI不工作,你写的这个例子的画面应该是第一个初始化建立的WIN,无法说明后面的语句正常工作吧

如下测试代码,在第二次GUI_Init时,GUI就不工作了,背景颜色不会改变:
  1.         //------------------------------------------ 初始化 1
  2.         GUI_Init();
  3.         WM_MULTIBUF_Enable(1);
  4.         GUI_SetBkColor(GUIRGB(0,250,0));
  5.         GUI_Clear();                                //清屏
  6.         GUI_Delay(100);
  7.         __nop();
  8.         
  9.         //------------------------------------------ 初始化 2
  10.         GUI_Init();
  11.         WM_MULTIBUF_Enable(1);
  12.         GUI_SetBkColor(GUIRGB(250,0,0));
  13.         GUI_Clear();                                //清屏
  14.         GUI_Delay(100);
  15.         __nop();
复制代码
回复

使用道具 举报

1

主题

5

回帖

1

积分

新手上路

积分
1
 楼主| 发表于 2017-10-12 16:13:09 | 显示全部楼层

回 novice 的帖子

novice:
他这个问题应该不难解决,主要是emwin没有源代码。
必须搞清楚emwin的数据放置在什么地方。
只有两种可能原因,一种是emwin退出的时候没有完整清理内存的信息;第二种是有部分数据在SDRAM中,重新开启SDRAM后没有初始化那部分SDRAM区域。

SDRAM不动它也有问题。
每次初始化,内存都重新指定
void GUI_X_Config(void) :

/*  Assign memory to emWin */
    GUI_ALLOC_AssignMemory(aMemory, GUI_NUMBYTES);//为存储管理系统分配一个存储块
    GUI_ALLOC_SetAvBlockSize(GUI_BLOCKSIZE);//设置存储快的平均尺寸,该区越大,可用的存储快数量越少

现在的问题很明显是emWin不知如何正确的重新初始化,当然有一种可行的方式是让MainTask的系统任务重启(没去试)。
手册中只提到
GUI_Exit() //描述:从存储器清除 emWin 内部数据,以便可以进一步调用 GUI_Init()。
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115765
QQ
发表于 2017-10-12 16:43:02 | 显示全部楼层

回 wx-as 的帖子

wx-as:不行,之前就试过了,直接GUI_Iint的结果是不进入硬件异常但初始化后GUI不工作,你写的这个例子的画面应该是第一个初始化建立的WIN,无法说明后面的语句正常工作吧

如下测试代码,在第二次GUI_Init时,GUI就不工作了,背景颜色不会改变:
      & .. (2017-10-12 16:03) 
你用的是V6板子么,是的话,没问题的,我这里三次创建可以看到是三次刷新过程的,肯定是第三次啊,不放心的话,显示三个不同的界面就好了,你这个问题就讨论这么多吧,剩下你自己再搞搞。
回复

使用道具 举报

6

主题

231

回帖

249

积分

高级会员

积分
249
发表于 2017-10-12 21:18:55 | 显示全部楼层
429有没有D-CACHE的?如果有,它的D-CACHE能不能映射到SDRAM范围?如果能,尝试禁止高速缓冲再重新打开试试。
回复

使用道具 举报

1

主题

11

回帖

61

积分

初级会员

积分
61
发表于 2018-3-9 11:26:50 | 显示全部楼层
eric2013 发表于 2017-10-12 12:05
以这个例子V6-500_STemWin实验_RTOS方式移植模板(含MDK和IAR)为例子,不需要GUI_Exit,直接重新初始化 ...

确实在运行中 直接反复调用GUI_Init不行(大概几千次测试就会死机),
解决这一问题是在 GUI_Init时关闭中断
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-5-16 18:13 , Processed in 0.302424 second(s), 27 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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