本帖最后由 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;
loop OINT_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]
|