OpenEdv-开源电子网

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

如何在执行完某个功能后返回主界面,求解惑!

[复制链接]

10

主题

24

帖子

0

精华

初级会员

Rank: 2

积分
162
金钱
162
注册时间
2019-7-17
在线时间
28 小时
发表于 2019-9-2 15:46:07 | 显示全部楼层 |阅读模式
1金钱
本人利用UCOS和stemwin做了一个界面,界面中有一个拍照按钮。现在的问题是按下按钮启动拍照功能后,照片拍摄结束后,无法返回主界面,LCD屏上一直显示的是我刚刚拍摄的照片。按下按钮后,程序进入camera_play()这个函数,然后好像就出不去了,我的想法是在camera_play()这个函数结束后,重回绘制主界面,加上这两句GUI_EndDialog(pMsg->hWin, 0);
GUI_CreateDialogBox(_aDialogCreate1, GUI_COUNTOF(_aDialogCreate1),_cbDialog1, WM_HBKWIN, 0, 0);

可是LCD屏依旧卡死了,楼主刚刚入坑,很多地方不太懂,望大神解惑。
微信图片_20190902153837.jpg
下面是我的camera_play()函数具体代码:
void camera_play(void)
{        
        u8 res;
        u8 key;
        u8 sd_ok=1;                                //0,sd卡不正常;1,SD卡正常.
        u8 scale=1;                                //默认是全尺寸缩放
        u8 msgbuf[15];                        //消息缓存区
        u8 *pname;                                //带路径的文件名                                                  
        u8 photo_ok=1;                        //拍照是否完成标志    1:未完成拍照      0:完成拍照
        extern OS_TCB EmwindemoTaskTCB;
        extern OS_ERR err;
       
        NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置系统中断优先级分组2
        delay_init(168);                  //初始化延时函数
        TFTLCD_Init();                        //初始化LCD
        W25QXX_Init();                        //初始化W25Q128
        FSMC_SRAM_Init();                //初始化外部SRAM.
        mem_init(SRAMIN);                //初始化内部内存池
        mem_init(SRAMEX);                //初始化内部内存池  
        mem_init(SRAMCCM);                //初始化CCM内存池
        exfuns_init();                                //为fatfs相关变量申请内存  
        f_mount(fs[0],"0:",1);                 //挂载SD卡  
       
        res=f_mkdir("0:/PHOTO");                //创建PHOTO文件夹
        if(res!=FR_EXIST&&res!=FR_OK)         //发生了错误
        {                    
                Show_Str(200,290,210,16,"SD 卡错误!",16,0);
                delay_ms(200);                                  
                Show_Str(200,290,210,16,"拍照功能将不可用!",16,0);       
        }        
        jpeg_buf0=mymalloc(SRAMIN,jpeg_dma_bufsize*4);        //为jpeg dma接收申请内存       
        jpeg_buf1=mymalloc(SRAMIN,jpeg_dma_bufsize*4);        //为jpeg dma接收申请内存       
        jpeg_data_buf=mymalloc(SRAMEX,300*1024);                //为jpeg文件申请内存(最大300KB)
        pname=mymalloc(SRAMIN,30);//为带路径的文件名分配30个字节的内存         
        while(pname==NULL||!jpeg_buf0||!jpeg_buf1||!jpeg_data_buf)        //内存分配出错
        {            
                Show_Str(200,290,240,16,"内存分配失败!",16,0);
                delay_ms(200);                                  
                LCD_Fill(200,290,240,146,WHITE);//清除显示             
                delay_ms(200);                                  
        }   
        while(OV2640_Init())//初始化OV2640
        {
                Show_Str(200,290,240,16,"OV2640 错误!",16,0);
                delay_ms(200);
                LCD_Fill(200,290,239,206,WHITE);
                delay_ms(200);
        }       
        Show_Str(200,290,200,16,"OV2640 正常",16,0);
        delay_ms(2000);
        OV2640_RGB565_Mode();        //JPEG模式
        My_DCMI_Init();                        //DCMI配置
        DCMI_DMA_Init((u32)&TFTLCD->LCD_RAM,0,1,DMA_MemoryDataSize_HalfWord,DMA_MemoryInc_Disable);//DCMI DMA配置  
        OV2640_OutSize_Set(lcddev.width,lcddev.height);
        DCMI_Start();                         //启动传输
        while(photo_ok==1)
        {
                key=KEY_Scan(0);//不支持连按
                if(key)
                {
                        DCMI_Stop(); //停止显示
                        if(key==WKUP_PRES)
                        {
                                scale=!scale;  
                                if(scale==0)
                                {
                                        OV2640_ImageWin_Set((1600-lcddev.width)/2,(1200-lcddev.height)/2,lcddev.width,lcddev.height);//1:1真实尺寸
                                        OV2640_OutSize_Set(lcddev.width,lcddev.height);
                                        sprintf((char*)msgbuf,"Full Size 1:1");
                                }else
                                {
                                        OV2640_ImageWin_Set(0,0,1600,1200);                                //全尺寸缩放
                                        OV2640_OutSize_Set(lcddev.width,lcddev.height);
                                        sprintf((char*)msgbuf,"Scale");
                                }
                                LCD_ShowString(30,50,210,16,16,msgbuf);//显示提示内容
                                delay_ms(800);        
                        }else if(sd_ok)//SD卡正常才可以拍照
                        {   
                                sw_sdcard_mode();        //切换为SD卡模式
                                if(key==KEY1_PRES)//JPG拍照
                                {
                                        camera_new_pathname(pname,1);//得到文件名       
                                        res=ov2640_jpg_photo(pname);
                                        if(scale==0)
                                        {
                                                OV2640_ImageWin_Set((1600-lcddev.width)/2,(1200-lcddev.height)/2,lcddev.width,lcddev.height);//1:1真实尺寸
                                                OV2640_OutSize_Set(lcddev.width,lcddev.height);
                                        }else
                                        {
                                                OV2640_ImageWin_Set(0,0,1600,1200);        //全尺寸缩放
                                        }
                                        OV2640_OutSize_Set(lcddev.width,lcddev.height);                                        
                                }
                                sw_ov2640_mode();        //切换为OV2640模式
                                if(res)//拍照有误
                                {
                                        Show_Str(30,130,240,16,"写入文件错误!",16,0);                 
                                 }
                                else
                                {
                                        Show_Str(30,130,240,16,"拍照成功!",16,0);
                                        Show_Str(30,150,240,16,"保存为:",16,0);
                                        Show_Str(30+42,150,240,16,pname,16,0);                    
                                        delay_ms(100);
                                        photo_ok=0;
                                }                          
                        }
                       
                }
        }
        sw_sdcard_mode();        //切换为SD卡模式
        delay_ms(200);
        OSTaskSuspend((OS_TCB*     )&EmwindemoTaskTCB,&err);         //挂起emwin_task
        GUI_Init();                          //STemWin初始化
        OSTaskResume((OS_TCB*     )&EmwindemoTaskTCB,&err);         //挂起emwin_task
}       


最佳答案

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

今天突然间调试成功了,其实问题出在函数里对内存池的初始化上, W25QXX_Init(); //初始化W25Q128 FSMC_SRAM_Init(); //初始化外部SRAM. mem_init(SRAMIN); //初始化内部内存池 mem_init(SRAMEX); //初始化内部内存池 mem_init(SRAMCCM); //初始化CCM内存池 这几个函数初始化删掉之后,再对程序 ...
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

10

主题

24

帖子

0

精华

初级会员

Rank: 2

积分
162
金钱
162
注册时间
2019-7-17
在线时间
28 小时
 楼主| 发表于 2019-9-2 15:46:08 | 显示全部楼层
今天突然间调试成功了,其实问题出在函数里对内存池的初始化上,
W25QXX_Init();                        //初始化W25Q128
        FSMC_SRAM_Init();                //初始化外部SRAM.
        mem_init(SRAMIN);                //初始化内部内存池
        mem_init(SRAMEX);                //初始化内部内存池  
        mem_init(SRAMCCM);                //初始化CCM内存池
这几个函数初始化删掉之后,再对程序中申请的变量的 动态内存进行释放就OK了,只能怪学的太急,好多基础东西都不是特别清楚,还是要继续学习呀。
回复

使用道具 举报

8

主题

185

帖子

0

精华

新手上路

积分
47
金钱
47
注册时间
2019-7-15
在线时间
47 小时
发表于 2019-9-7 19:38:43 | 显示全部楼层
帮楼主顶顶,非常棒!!!
回复

使用道具 举报

10

主题

24

帖子

0

精华

初级会员

Rank: 2

积分
162
金钱
162
注册时间
2019-7-17
在线时间
28 小时
 楼主| 发表于 2019-9-22 20:46:17 | 显示全部楼层
自顶一下!!!!!
回复

使用道具 举报

10

主题

24

帖子

0

精华

初级会员

Rank: 2

积分
162
金钱
162
注册时间
2019-7-17
在线时间
28 小时
 楼主| 发表于 2019-9-23 09:30:51 | 显示全部楼层
在线调试,发现这个camera_play()函数没有问题,程序是在GUI_EndDialog(pMsg->hWin, 0);这里跑飞的。
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

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

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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