OpenEdv-开源电子网

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

stm32f103zet6向sd卡中连续写入数据卡死 求解

[复制链接]

11

主题

42

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
214
金钱
214
注册时间
2016-7-19
在线时间
43 小时
发表于 2016-9-27 21:02:02 | 显示全部楼层 |阅读模式
1金钱
一般情况下开机如果第一次写数据成功连续写半天都不会卡死,但是也会出现长时间写数据卡死的情况,只是比较少见
经常出现的情况就是 初始化完毕第一次写数据成功 但是在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("ÄÚ´æ³Ø³õʼ»¯Íê±Ï\r\n");
          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¿¨\r\n");
                        a++;
                        if(a>=10)
                        {
                                printf("ûÓмì²âµ½sd¿¨Çë²åÈësd¿¨\r\n");
                                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ÄÚ´æÍê±Ï \r\n");
                if(SDcardFlage==insertedSDcard)
                {
                        res=f_mount(fs[0],"0:",1);                                         //¹ÒÔØSD¿¨
                        printf("sd_return  %d \r\n",res);
                        printf("¹ÒÔØsd¿¨Íê±Ï\r\n");
                }
                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\r\n",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("\r\n");
                        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. \n" , 115, str);
                }
                else
                {
                        printf("ûÓмì²âµ½sd¿¨²»´´½¨Îļþ\r\n");
                        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("´ò¿ªÎļþÖ¸ÕëºóÒÆ\r\n");
                                for(i=0;i<120;i++)
                                {
                                        //printf("%d\r\n",i);
                                        sprintf((char*)f_TXbuff,"%03d ",save_temp_perSec);//&frac12;&laquo;&Ecirc;&yacute;×é&Agrave;&iuml;±&pound;&acute;&aelig;&micro;&Auml;&Ntilde;&sup1;&Aacute;&brvbar;±&auml;&Aacute;&iquest;×&ordf;&raquo;&macr;&sup3;&Eacute;×&Ouml;·&ucirc;&acute;&reg;&sup2;&cent;±&pound;&acute;&aelig;&Ocirc;&Uacute;&Ecirc;&yacute;×é&Ouml;&ETH;
                                        res=f_puts((char*)f_TXbuff,&fil);//&frac34;&shy;&Ecirc;&yacute;&ETH;&acute;&Egrave;&euml;&micro;&frac12;sd&iquest;¨&micro;&Auml;txt&Icirc;&Auml;&frac14;&thorn;&Ouml;&ETH;
                                }
                                res=f_close(&fil);//&sup1;&Oslash;±&Otilde;±&pound;&acute;&aelig;&Icirc;&Auml;&frac14;&thorn;
                                printf("&Iacute;ê&sup3;&Eacute;txt&Icirc;&Auml;&frac14;&thorn;&ETH;&acute;&Egrave;&euml;\r\n");
                        }
                        else printf("&Atilde;&raquo;&Oacute;&ETH;sd&iquest;¨&sup2;&raquo;&ETH;&acute;&Icirc;&Auml;&frac14;&thorn;\r\n");
                }[/mw_shl_code]

最佳答案

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

FIL fil; 定义到全局变量,看看是不是堆栈太小了导致的
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165524
金钱
165524
注册时间
2010-12-1
在线时间
2116 小时
发表于 2016-9-27 21:02:03 | 显示全部楼层
FIL fil;
定义到全局变量,看看是不是堆栈太小了导致的
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

11

主题

42

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
214
金钱
214
注册时间
2016-7-19
在线时间
43 小时
 楼主| 发表于 2016-9-27 21:12:20 | 显示全部楼层
不好意思  居然发现代码中文字符发出来是这样的

从新发一遍
[mw_shl_code=c,true]         //**********************************************sd卡相关的配置***************************************
          POINT_COLOR=RED;
          my_mem_init(SRAMIN);                //初始化内部内存池
          printf("内存池初始化完毕\r\n");
          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卡\r\n");
                        a++;
                        if(a>=10)
                        {
                                printf("没有检测到sd卡请插入sd卡\r\n");
                                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内存完毕 \r\n");
                if(SDcardFlage==insertedSDcard)
                {
                        res=f_mount(fs[0],"0:",1);                                         //挂载SD卡
                        printf("sd_return  %d \r\n",res);
                        printf("挂载sd卡完毕\r\n");
                }
         
//                res=f_mount(fs[1],"1:",1);                                 //挂载FLASH.       
//                printf("flash_return %d\r\n",res);
//                printf("test4 \r\n");
//                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;//设置字体为蓝色          
                        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\r\n",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("\r\n");
                        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. \n" , 115, str);
                }
                else
                {
                        printf("没有检测到sd卡不创建文件\r\n");
                        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("打开文件指针后移\r\n");
                                for(i=0;i<120;i++)
                                {
                                        //printf("%d\r\n",i);
                                        sprintf((char*)f_TXbuff,"%03d ",save_temp_perSec);//将数组里保存的压力变量转化成字符串并保存在数组中
                                        res=f_puts((char*)f_TXbuff,&fil);//经数写入到sd卡的txt文件中
                                }
                                res=f_close(&fil);//关闭保存文件
                                printf("完成txt文件写入\r\n");
                        }
                        else printf("没有sd卡不写文件\r\n");
                }[/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]
咋回事呀原子哥

@正点原子
回复

使用道具 举报

11

主题

42

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
214
金钱
214
注册时间
2016-7-19
在线时间
43 小时
 楼主| 发表于 2016-9-29 14:15:28 | 显示全部楼层
正点原子 发表于 2016-9-28 21:40
FIL fil;
定义到全局变量,看看是不是堆栈太小了导致的

原子哥    按照你的方法改了改   感觉连续写入还没死过呢    但是还需要再测试一段时间
还有  刚刚按复位键发现程序死在了以下这个地方(我初始化过程都没执行完呢怎么可能正在写入数据呢按说不应该死呀)
[mw_shl_code=c,true]//检查卡是否正在执行写操作
//pstatus:当前状态.
//返回值:错误代码
SD_Error IsCardProgramming(u8 *pstatus)
{
        vu32 respR1 = 0, status = 0;


        SDIO_CmdInitStructure.SDIO_Argument = (uint32_t) RCA << 16; //卡相对地址参数
        SDIO_CmdInitStructure.SDIO_CmdIndex = SD_CMD_SEND_STATUS;//发送CMD13        
        SDIO_CmdInitStructure.SDIO_Response = SDIO_Response_Short;
        SDIO_CmdInitStructure.SDIO_Wait = SDIO_Wait_No;
        SDIO_CmdInitStructure.SDIO_CPSM = SDIO_CPSM_Enable;
        SDIO_SendCommand(&SDIO_CmdInitStructure);       

        status=SDIO->STA;
       
        while(!(status&((1<<0)|(1<<6)|(1<<2))))status=SDIO->STA;//等待操作完成          程序会死在这里!!!!!!!!
       
        if(SDIO_GetFlagStatus(SDIO_FLAG_CCRCFAIL) != RESET)                        //CRC检测失败
        {  
                SDIO_ClearFlag(SDIO_FLAG_CCRCFAIL);        //清除错误标记
                return SD_CMD_CRC_FAIL;
        }
        if(SDIO_GetFlagStatus(SDIO_FLAG_CTIMEOUT) != RESET)                        //命令超时
        {
                SDIO_ClearFlag(SDIO_FLAG_CTIMEOUT);                        //清除错误标记
                return SD_CMD_RSP_TIMEOUT;
        }
        if(SDIO->RESPCMD!=SD_CMD_SEND_STATUS)return SD_ILLEGAL_CMD;
       
        SDIO_ClearFlag(SDIO_STATIC_FLAGS);//清除所有标记
       
        respR1=SDIO->RESP1;
       
        *pstatus=(u8)((respR1>>9)&0x0000000F);
        return SD_OK;
}[/mw_shl_code]


还有原子哥   sd卡写120个数据占的时间长呢还是我打开关闭一次文件的时间长!!!!!!!!?????
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165524
金钱
165524
注册时间
2010-12-1
在线时间
2116 小时
发表于 2016-9-29 20:05:21 | 显示全部楼层
Loyslf_璞野 发表于 2016-9-29 14:15
原子哥    按照你的方法改了改   感觉连续写入还没死过呢    但是还需要再测试一段时间
还有  刚刚按复 ...

1, 单步调试,就知道如何进入这里的了。
2, 自己测试下。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

8

主题

28

帖子

0

精华

初级会员

Rank: 2

积分
107
金钱
107
注册时间
2016-3-1
在线时间
23 小时
发表于 2017-1-7 21:09:23 | 显示全部楼层
楼主能分享下代码吗372827096@qq.com,谢谢
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-5-29 07:41

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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