OpenEdv-开源电子网

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

求助原子哥!关于图片显示与USART3移植问题

[复制链接]

4

主题

16

帖子

0

精华

新手上路

积分
40
金钱
40
注册时间
2018-3-25
在线时间
23 小时
发表于 2018-4-14 17:23:03 | 显示全部楼层 |阅读模式
20金钱
本帖最后由 Lanny 于 2018-4-14 19:50 编辑

原子哥,是这样的,我用STM32F103ZET6系统板(非开发板)做了一个项目,需要同时用到图片显示和USART3的功能,其中USART3是作为蓝牙通信用的,但是当我移植了这两部分的代码之后,发现程序运行是有问题的,而我单独使用图片显示代码是没有任何问题的,只是在加了USART3之后开始有问题的[mw_shl_code=c,true]#include "sys.h"
#include "delay.h"
#include "usart.h"
#include "led.h"                           
#include "lcd.h"  
#include "key.h"      
#include "malloc.h"
#include "MMC_SD.h"
#include "w25qxx.h"  
#include "exfuns.h"   
#include "text.h"
#include "rtc.h"
#include "piclib.h"        
#include "string.h"               
#include "math.h"
#include "usart3.h"


//得到path路径下,目标文件的总个数
//path:路径                    
//返回值:总有效文件数
u16 pic_get_tnum(u8 *path)
{         
        u8 res;
        u16 rval=0;
         DIR tdir;                         //临时目录
        FILINFO tfileinfo;        //临时文件信息        
        u8 *fn;                                                                                          
    res=f_opendir(&tdir,(const TCHAR*)path);         //打开目录
          tfileinfo.lfsize=_MAX_LFN*2+1;                                //长文件名最大长度
        tfileinfo.lfname=mymalloc(SRAMIN,tfileinfo.lfsize);//为长文件缓存区分配内存
        if(res==FR_OK&&tfileinfo.lfname!=NULL)
        {
                while(1)//查询总的有效文件数
                {
                res=f_readdir(&tdir,&tfileinfo);                       //读取目录下的一个文件
                if(res!=FR_OK||tfileinfo.fname[0]==0)break;        //错误了/到末尾了,退出                  
                     fn=(u8*)(*tfileinfo.lfname?tfileinfo.lfname:tfileinfo.fname);                        
                        res=f_typetell(fn);        
                        if((res&0XF0)==0X50)//取高四位,看看是不是图片文件        
                        {
                                rval++;//有效文件数增加1
                        }            
                }  
        }
        return rval;
}

int main(void)
{                                   
                  
        u8 t,res,key,reclen;
        u8 scan_flag;                //扫码标志位
        DIR picdir;                         //图片目录
        u16 totpicnum;                 //图片文件总数
        FILINFO picfileinfo;//文件信息
        u8 *pname;                        //带路径的文件名
        u16 *picindextbl;        //图片索引表
        u16 curindex;                //图片当前索引
        u16 temp;
        u8 *fn;                           //长文件名
         
  NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);// 设置中断优先级分组2
        delay_init();                     //延时函数初始化         
        uart_init(115200);                 //串口初始化为9600
        LED_Init();                                  //初始化与LED连接的硬件接口
        LCD_Init();                                   //初始化LCD        
         KEY_Init();                                //按键初始化  
        W25QXX_Init();                                //初始化W25Q16
        RTC_Init();                                  //RTC初始化
  my_mem_init(SRAMIN);                //初始化内部内存池
  exfuns_init();                                //为fatfs相关变量申请内存  
         f_mount(fs[0],"0:",1);                 //挂载SD卡
         f_mount(fs[1],"1:",1);                 //挂载FLASH.         
        font_init();
        usart3_init(9600);        //初始化串口3为:9600,波特率.
        BACK_COLOR=BLACK;
        loopOINT_COLOR=WHITE;        
  Show_Str(10,0,200,16,"    -  -     ",16,1);        
  Show_Str(160,0,200,16,"  :  :  ",16,1);
        POINT_COLOR=CYAN;      
        Show_Str(90,50,200,16,"智能门禁",16,1);        
        POINT_COLOR=WHITE;   
        Show_Str(0,220,200,16,"当前门的状态:",16,1);
        
        if(scan_flag==0)                                        //初始界面
        {
        
                while(f_opendir(&picdir,"0:/PICTURE"))//打开图片文件夹
                {            
                        Show_Str(30,170,240,16,"ICTURE文件夹错误!",16,0);
                        delay_ms(200);                                 
                        LCD_Fill(30,170,240,186,WHITE);//清除显示            
                        delay_ms(200);                                 
                }  
                totpicnum=pic_get_tnum("0:/PICTURE"); //得到总有效文件数
                while(totpicnum==NULL)//图片文件为0               
                {            
                        Show_Str(30,170,240,16,"没有图片文件!",16,0);
                        delay_ms(200);                                 
                        LCD_Fill(30,170,240,186,WHITE);//清除显示            
                        delay_ms(200);                                 
                }        
               
                picfileinfo.lfsize=_MAX_LFN*2+1;                                                //长文件名最大长度
                picfileinfo.lfname=mymalloc(SRAMIN,picfileinfo.lfsize);        //为长文件缓存区分配内存
                pname=mymalloc(SRAMIN,picfileinfo.lfsize);                                //为带路径的文件名分配内存
                picindextbl=mymalloc(SRAMIN,2*totpicnum);                                //申请2*totpicnum个字节的内存,用于存放图片索引
                while(picfileinfo.lfname==NULL||pname==NULL||picindextbl==NULL)//内存分配出错
                {            
                        Show_Str(30,170,240,16,"内存分配失败!",16,0);
                        delay_ms(200);                                 
                        LCD_Fill(30,170,240,186,WHITE);//清除显示            
                        delay_ms(200);                                 
                }         
               
                //记录索引
                        res=f_opendir(&picdir,"0:/PICTURE"); //打开目录
                if(res==FR_OK)
                {
                        curindex=0;//当前索引为0
                        while(1)//全部查询一遍
                        {
                                temp=picdir.index;                                                                //记录当前index
                                                res=f_readdir(&picdir,&picfileinfo);                       //读取目录下的一个文件
                                                if(res!=FR_OK||picfileinfo.fname[0]==0)break;        //错误了/到末尾了,退出                  
                                        fn=(u8*)(*picfileinfo.lfname?picfileinfo.lfname:picfileinfo.fname);                        
                                res=f_typetell(fn);        
                                if((res&0XF0)==0X50)//取高四位,看看是不是图片文件        
                                {
                                        picindextbl[curindex]=temp;//记录索引
                                        curindex++;
                                }            
                        }
                }
               
                piclib_init();                                                                                //初始化画图                     
                curindex=0;                                                                                        //从0开始显示
        }
        
        if(scan_flag==1)                                        //输入账号、密码界面
        {
                Show_Str(50,120,200,16,"账号:",16,1);
                Show_Str(50,140,200,16,"密码:",16,1);
                LCD_Fill(95,120,160,136,WHITE);
                LCD_Fill(95,140,160,156,WHITE);
        }
                USART3_RX_STA=0;
        while(1)
        {
                if(t!=calendar.sec)
                {
                        t=calendar.sec;
                        LCD_ShowNum(10,0,calendar.w_year,4,16);                                                                          
                        LCD_ShowNum(50,0,calendar.w_month,2,16);                                                                          
                        LCD_ShowNum(74,0,calendar.w_date,2,16);         
                        switch(calendar.week)
                        {
                                case 0:
                                        Show_Str(100,0,200,16,"周日",16,1);                                             
                                        break;
                                case 1:
                                        Show_Str(100,0,200,16,"周一",16,1);                                             
                                        break;
                                case 2:
                                        Show_Str(100,0,200,16,"周二",16,1);                                             
                                        break;
                                case 3:
                                        Show_Str(100,0,200,16,"周三",16,1);                                             
                                        break;
                                case 4:
                                        Show_Str(100,0,200,16,"周四",16,1);                                             
                                        break;
                                case 5:
                                        Show_Str(100,0,200,16,"周五",16,1);                                             
                                        break;
                                case 6:
                                        Show_Str(100,0,200,16,"周六",16,1);                                             
                                        break;  
                        }
                        LCD_ShowNum(160,0,calendar.hour,2,16);                                                                          
                        LCD_ShowNum(184,0,calendar.min,2,16);                                                                          
                        LCD_ShowNum(208,0,calendar.sec,2,16);
                        LED0=!LED0;
                }
                delay_ms(10);
               
                if(scan_flag==0)
                {
                        if(BODY==1)                                //检测到有人在门口
                        {
                                res=f_opendir(&picdir,(const TCHAR*)"0:/PICTURE");         //打开目录
                                while(res==FR_OK)//打开成功
                                {
                                        dir_sdi(&picdir,picindextbl[curindex]);                        //改变当前目录索引           
                                        res=f_readdir(&picdir,&picfileinfo);                       //读取目录下的一个文件
                                        if(res!=FR_OK||picfileinfo.fname[0]==0)break;        //错误了/到末尾了,退出
                                        fn=(u8*)(*picfileinfo.lfname?picfileinfo.lfname:picfileinfo.fname);                        
                                        strcpy((char*)pname,"0:/PICTURE/");                                //复制路径(目录)
                                        strcat((char*)pname,(const char*)fn);                          //将文件名接在后面
                                        LCD_Clear(BLACK);
                                        ai_load_picfile(pname,0,0,lcddev.width,lcddev.height,1);//显示二维码
                                        POINT_COLOR=GREEN;
                                        Show_Str(90,5,200,16,"欢迎回家",16,1);        
                                        while(1)
                                        {
                                                if(BODY==0)                                        //如果人离开了
                                                {
                                                        LCD_Clear(BLACK);
                                                        goto loop;
                                                }
                                                key=KEY_Scan(0);                //扫描按键
                                                if(key==KEY1_PRES)
                                                {
                                                        scan_flag=1;                        //成功扫码通过
                                                        LCD_Clear(BLACK);
                                                        goto loop;
                                                }
                                        }
                                }
                        }
                }
               
                if(scan_flag==1)
                {
                        /*if(USART3_RX_STA&0X8000)                        //接收到一次数据了
                        {
                                reclen=USART3_RX_STA&0X7FFF;        //得到数据长度
                                USART3_RX_BUF[reclen]=0;                 //加入结束符
                                LCD_ShowString(95,120,209,119,16,USART3_RX_BUF);//显示接收到的数据
                                USART3_RX_STA=0;         
                        }*/                                                
                }
        }
        myfree(SRAMIN,picfileinfo.lfname);        //释放内存                           
        myfree(SRAMIN,pname);                                //释放内存                           
        myfree(SRAMIN,picindextbl);                        //释放内存                  
}[/mw_shl_code]

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

4

主题

16

帖子

0

精华

新手上路

积分
40
金钱
40
注册时间
2018-3-25
在线时间
23 小时
 楼主| 发表于 2018-4-14 17:26:54 | 显示全部楼层
其中的变量BODY是一个IO口的电平状态,如代码所示,如果我把注释掉的那几行代码取消注释,图片就显示不出来了,在线仿真之后发现它是直接跳过图片显示部分的,我 实在想不出来是什么原因了,求原子哥给予解答,万分感谢!
回复

使用道具 举报

4

主题

16

帖子

0

精华

新手上路

积分
40
金钱
40
注册时间
2018-3-25
在线时间
23 小时
 楼主| 发表于 2018-4-14 18:47:08 | 显示全部楼层
有其他知道原因的大神可以解答一下吗,谢谢
回复

使用道具 举报

4

主题

16

帖子

0

精华

新手上路

积分
40
金钱
40
注册时间
2018-3-25
在线时间
23 小时
 楼主| 发表于 2018-4-14 22:18:55 | 显示全部楼层
没有人吗
回复

使用道具 举报

4

主题

16

帖子

0

精华

新手上路

积分
40
金钱
40
注册时间
2018-3-25
在线时间
23 小时
 楼主| 发表于 2018-4-15 09:24:10 | 显示全部楼层
原子哥在吗@正点原子
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165536
金钱
165536
注册时间
2010-12-1
在线时间
2117 小时
发表于 2018-4-16 01:25:20 | 显示全部楼层
仿真跟踪找问题
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-8 19:27

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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