一般情况下开机如果第一次写数据成功连续写半天都不会卡死,但是也会出现长时间写数据卡死的情况,只是比较少见
经常出现的情况就是 初始化完毕第一次写数据成功 但是在rtc中断里写入一个u8 buff[120]的数据时经常第一次就卡死了
而且连续写成功和失败的几率 几乎各占一半吧
我用JTAG硬件仿真 程序死掉以后 总是停在
void HardFault_Handler(void)
{
/* Go to infinite loop when Hard Fault exception occurs */
while (1)
{
}
}
这里 不知道怎么回事???
[mw_shl_code=c,true] //**********************************************sd¿¨Ïà¹ØµÄÅäÖÃ***************************************
POINT_COLOR=RED;
my_mem_init(SRAMIN); //³õʼ»¯ÄÚ²¿ÄÚ´æ³Ø
printf("ÄÚ´æ³Ø³õʼ»¯Íê±Ï
");
while(SD_Init())//¼ì²â²»µ½SD¿¨
{
static int a=0;
LCD_ShowString(30,150,200,16,16,"SD Card Error!");
delay_ms(500);
LCD_ShowString(30,150,200,16,16,"Please Check! ");
delay_ms(500);
printf(" ûÓмì²âµ½sd¿¨Çë²åÈësd¿¨
");
a++;
if(a>=10)
{
printf("ûÓмì²âµ½sd¿¨Çë²åÈësd¿¨
");
SDcardFlage=pullOutSDcard;
break;
}
}
if(SDcardFlage==insertedSDcard)
{
show_sdcard_info(); //´òÓ¡SD¿¨Ïà¹ØÐÅÏ¢
POINT_COLOR=BLUE; //ÉèÖÃ×ÖÌåΪÀ¶É«
//¼ì²âSD¿¨³É¹¦
LCD_ShowString(30,150,200,16,16,"SD Card OK ");
LCD_ShowString(30,170,200,16,16,"SD Card Size: MB");
LCD_ShowNum(30+13*8,170,SDCardInfo.CardCapacity>>20,5,16);//ÏÔʾSD¿¨ÈÝÁ¿
}
exfuns_init(); //ΪfatfsÏà¹Ø±äÁ¿ÉêÇëÄÚ´æ
printf("ÉêÇëfatfsÄÚ´æÍê±Ï
");
if(SDcardFlage==insertedSDcard)
{
res=f_mount(fs[0],"0:",1); //¹ÒÔØSD¿¨
printf("sd_return %d
",res);
printf("¹ÒÔØsd¿¨Íê±Ï
");
}
LCD_Fill(30,150,240,150+16,BLACK); //Çå³ýÏÔʾ
if(SDcardFlage==insertedSDcard)
{
while(exf_getfree("0",&total,&free)) //µÃµ½SD¿¨µÄ×ÜÈÝÁ¿ºÍÊ£ÓàÈÝÁ¿
{
LCD_ShowString(30,150,200,16,16,"SD Card Fatfs Error!");
delay_ms(200);
LCD_Fill(30,150,240,150+16,BLACK); //Çå³ýÏÔʾ
delay_ms(200);
}
POINT_COLOR=BLUE;//ÉèÖÃ×ÖÌåΪÀ¶É«
LCD_ShowString(30,150,200,16,16,"FATFS OK!");
LCD_ShowString(30,170,200,16,16,"SD Total Size: MB");
LCD_ShowString(30,190,200,16,16,"SD Free Size: MB");
LCD_ShowNum(30+8*14,170,total>>10,5,16); //ÏÔʾSD¿¨×ÜÈÝÁ¿ MB
LCD_ShowNum(30+8*14,190,free>>10,5,16); //ÏÔʾSD¿¨Ê£ÓàÈÝÁ¿ MB
}
//**********************************************sd¿¨Ïà¹ØµÄÅäÖÃ***************************************
[/mw_shl_code]
[mw_shl_code=applescript,true]//***********************************ÔÚsd¿¨´´½¨Îļþ**********************************
if(SDcardFlage==insertedSDcard)
{
RTC_Get();//¸üÐÂʱ¼ä
printf("´´½¨Îļþʱ¼ä:%04d-%02d-%02d %02d:%02d
",calendar.w_year,calendar.w_month,
calendar.w_date,calendar.hour,calendar.min);//´òÓ¡´´½¨ÎļþµÄʱ¼ä
sprintf((char*)f_namebuf,"0:/%04d%02d%02d%02d%02d.txt",calendar.w_year,calendar.w_month,
calendar.w_date,calendar.hour,calendar.min); //½«Ê±¼äµÄÕûÐÍÊý¾Ýת»¯³É×Ö·û´®²¢±£´æµ½Êý×éÖÐ
printf("ÎļþÃû³Æ:");
printf((char*)f_namebuf);//´òÓ¡³ö´´½¨ÎļþµÄÃû³Æ
printf("
");
res=f_open (&fil,(char*)f_namebuf, FA_CREATE_ALWAYS|FA_WRITE);//ÒÔʱ¼äÃüÃûÎļþ²¢´´½¨ÎļþÒÔдÈëģʽ´ò¿ª
res=f_puts((char *)f_namebuf,&fil);//ÔÚÎļþÀïдÈëʱ¼äµÄ×Ö·û´®
res=f_close(&fil);//¹Ø±ÕÎļþ
SDcardFlage=insertedSDcard;//±ê־λ¸ºÖµ±íʾÒѾ­²åÈësd¿¨
//printf("The number 'num' is %d and the string 'str' is %s.
" , 115, str);
}
else
{
printf("ûÓмì²âµ½sd¿¨²»´´½¨Îļþ
");
SDcardFlage=pullOutSDcard;//±ê־λ¸ºÖµ±íʾÒѾ­°Î³ösd¿¨
}
//***********************************ÔÚsd¿¨´´½¨Îļþ**********************************[/mw_shl_code]
以上是初始化代码
以下是rtc每隔两分钟写入的代码
[mw_shl_code=applescript,true] if(RTCtimeContTemp>=120)//Ô­Öµ120
{
u8 i;
RTCtimeContTemp=0;
//Ïòsd¿¨Ð´ÈëѹÁ¦ÇúÏßÊý×é´æµÄÊý
if(SDcardFlage==insertedSDcard)//Èç¹û²åÈësd¿¨
{
FIL fil;
u8 res;
res=f_open(&fil,(char*)f_namebuf,FA_WRITE);//ÒÑдµÄ·½Ê½´ò¿ªÎļþ
res=f_lseek(&fil,fil.fsize);//Òƶ¯ÎļþÖ¸Õëµ½ÎļþÊý¾ÝµÄβ²¿
printf("´ò¿ªÎļþÖ¸ÕëºóÒÆ
");
for(i=0;i<120;i++)
{
//printf("%d
",i);
sprintf((char*)f_TXbuff,"%03d ",save_temp_perSec);//½«Êý×éÀï±£´æµÄѹÁ¦±äÁ¿×ª»¯³É×Ö·û´®²¢±£´æÔÚÊý×éÖÐ
res=f_puts((char*)f_TXbuff,&fil);//¾­ÊýдÈëµ½sd¿¨µÄtxtÎļþÖÐ
}
res=f_close(&fil);//¹Ø±Õ±£´æÎļþ
printf("Íê³ÉtxtÎļþдÈë
");
}
else printf("ûÓÐsd¿¨²»Ð´Îļþ
");
}[/mw_shl_code]
定义到全局变量,看看是不是堆栈太小了导致的
从新发一遍
[mw_shl_code=c,true] //**********************************************sd卡相关的配置***************************************
POINT_COLOR=RED;
my_mem_init(SRAMIN); //初始化内部内存池
printf("内存池初始化完毕 ");
while(SD_Init())//检测不到SD卡
{
static int a=0;
LCD_ShowString(30,150,200,16,16,"SD Card Error!");
delay_ms(500);
LCD_ShowString(30,150,200,16,16,"Please Check! ");
delay_ms(500);
printf(" 没有检测到sd卡请插入sd卡 ");
a++;
if(a>=10)
{
printf("没有检测到sd卡请插入sd卡 ");
SDcardFlage=pullOutSDcard;
break;
}
}
if(SDcardFlage==insertedSDcard)
{
show_sdcard_info(); //打印SD卡相关信息
POINT_COLOR=BLUE; //设置字体为蓝 {MOD}
//检测SD卡成功
LCD_ShowString(30,150,200,16,16,"SD Card OK ");
LCD_ShowString(30,170,200,16,16,"SD Card Size: MB");
LCD_ShowNum(30+13*8,170,SDCardInfo.CardCapacity>>20,5,16);//显示SD卡容量
}
exfuns_init(); //为fatfs相关变量申请内存
printf("申请fatfs内存完毕 ");
if(SDcardFlage==insertedSDcard)
{
res=f_mount(fs[0],"0:",1); //挂载SD卡
printf("sd_return %d ",res);
printf("挂载sd卡完毕 ");
}
// res=f_mount(fs[1],"1:",1); //挂载FLASH.
// printf("flash_return %d ",res);
// printf("test4 ");
// if(res==0X0D)//FLASH磁盘,FAT文件系统错误,重新格式化FLASH
// {
// LCD_ShowString(30,150,200,16,16,"Flash Disk Formatting..."); //格式化FLASH
// res=f_mkfs("1:",1,4096);//格式化FLASH,1,盘符;1,不需要引导区,8个扇区为1个簇
// if(res==0)
// {
// f_setlabel((const TCHAR *)"1:ALIENTEK"); //设置Flash磁盘的名字为:ALIENTEK
// LCD_ShowString(30,150,200,16,16,"Flash Disk Format Finish"); //格式化完成
// }else LCD_ShowString(30,150,200,16,16,"Flash Disk Format Error "); //格式化失败
// delay_ms(1000);
// }
LCD_Fill(30,150,240,150+16,BLACK); //清除显示
if(SDcardFlage==insertedSDcard)
{
while(exf_getfree("0",&total,&free)) //得到SD卡的总容量和剩余容量
{
LCD_ShowString(30,150,200,16,16,"SD Card Fatfs Error!");
delay_ms(200);
LCD_Fill(30,150,240,150+16,BLACK); //清除显示
delay_ms(200);
}
POINT_COLOR=BLUE;//设置字体为蓝 {MOD}
LCD_ShowString(30,150,200,16,16,"FATFS OK!");
LCD_ShowString(30,170,200,16,16,"SD Total Size: MB");
LCD_ShowString(30,190,200,16,16,"SD Free Size: MB");
LCD_ShowNum(30+8*14,170,total>>10,5,16); //显示SD卡总容量 MB
LCD_ShowNum(30+8*14,190,free>>10,5,16); //显示SD卡剩余容量 MB
}
//**********************************************sd卡相关的配置***************************************
//***********************************在sd卡创建文件**********************************
if(SDcardFlage==insertedSDcard)
{
RTC_Get();//更新时间
printf("创建文件时间:%04d-%02d-%02d %02d:%02d ",calendar.w_year,calendar.w_month,
calendar.w_date,calendar.hour,calendar.min);//打印创建文件的时间
sprintf((char*)f_namebuf,"0:/%04d%02d%02d%02d%02d.txt",calendar.w_year,calendar.w_month,
calendar.w_date,calendar.hour,calendar.min); //将时间的整型数据转化成字符串并保存到数组中
printf("文件名称:");
printf((char*)f_namebuf);//打印出创建文件的名称
printf(" ");
res=f_open (&fil,(char*)f_namebuf, FA_CREATE_ALWAYS|FA_WRITE);//以时间命名文件并创建文件以写入模式打开
res=f_puts((char *)f_namebuf,&fil);//在文件里写入时间的字符串
res=f_close(&fil);//关闭文件
SDcardFlage=insertedSDcard;//标志位负值表示已经插入sd卡
//printf("The number 'num' is %d and the string 'str' is %s. " , 115, str);
}
else
{
printf("没有检测到sd卡不创建文件 ");
SDcardFlage=pullOutSDcard;//标志位负值表示已经拔出sd卡
}
//***********************************在sd卡创建文件**********************************[/mw_shl_code]
以上是初始化的代码
以下是rtc每两分钟写入的buf[120]大小的代码
[mw_shl_code=c,true] if(RTCtimeContTemp>=120)//原值120
{
u8 i;
RTCtimeContTemp=0;
//向sd卡写入压力曲线数组存的数
if(SDcardFlage==insertedSDcard)//如果插入sd卡
{
FIL fil;
u8 res;
res=f_open(&fil,(char*)f_namebuf,FA_WRITE);//已写的方式打开文件
res=f_lseek(&fil,fil.fsize);//移动文件指针到文件数据的尾部
printf("打开文件指针后移 ");
for(i=0;i<120;i++)
{
//printf("%d ",i);
sprintf((char*)f_TXbuff,"%03d ",save_temp_perSec);//将数组里保存的压力变量转化成字符串并保存在数组中
res=f_puts((char*)f_TXbuff,&fil);//经数写入到sd卡的txt文件中
}
res=f_close(&fil);//关闭保存文件
printf("完成txt文件写入 ");
}
else printf("没有sd卡不写文件 ");
}[/mw_shl_code]
调试时发现程序最终死在了
[mw_shl_code=c,true]void HardFault_Handler(void)
{
/* Go to infinite loop when Hard Fault exception occurs */
while (1)
{
}
}[/mw_shl_code]
咋回事呀原子哥
@正点原子
1, 单步调试,就知道如何进入这里的了。
2, 自己测试下。
一周热门 更多>