OpenEdv-开源电子网

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

STM32F407+FATFS0.09 连续创建写入文件,程序随机卡死进入HardFault_Handler,求助

[复制链接]

1

主题

5

帖子

0

精华

新手入门

积分
19
金钱
19
注册时间
2016-10-12
在线时间
6 小时
发表于 2016-10-12 15:23:44 | 显示全部楼层 |阅读模式
3金钱
        while(1)
        {
                sprintf(FilePath, "0:voltage current data/%d.HEX", j_main++);
               
                if(j_main>100)
                        break;
               
                retry_main = 0;
                do
                {
                        res = f_open(&fsrc, (const TCHAR *)FilePath, FA_WRITE | FA_CREATE_ALWAYS);                //′′½¨DÂÎļt
                        HAL_UART_Transmit(&UartHandle1, (uint8_t *)&res, 1, 1000);
                        if(res == FR_EXIST) break;
                        retry_main++;
                }while(res && retry_main<5);
               
               
                /*********************************êy&#190;YD′è&#235;&#206;&#196;&#188;t************************/
                retry_main = 0;
                do
                {
                        res = f_write(&fsrc, (const void *)ADValue_String, 500, &bw);                //êy&#190;YD′è&#235;&#206;&#196;&#188;t
                        HAL_UART_Transmit(&UartHandle1, (uint8_t *)&res, 1, 1000);
                        retry_main++;
                }while(res && retry_main<10);
               
                if((retry_main == 10) && res) {}                                                                //D′è&#235;2ù×÷&#206;′íê3é
                /*********************************************************************/
               
                retry_main = 0;
                do
                {
                        res = f_close(&fsrc);
                        HAL_UART_Transmit(&UartHandle1, (uint8_t *)&res, 1, 1000);
                        retry_main++;
                }while(res && retry_main<5);
               
                BSP_LED_Toggle(LED0);
               
                HAL_Delay(1000);
        }
打开文件,写入文件,关闭文件都能成功,但就是写几个文件程序就跑飞了,写入的文件数目也不定,有时几个,最多八十多个
我用的是32GB的SD卡,SPI方式
谢谢各位大神指点


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

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165309
金钱
165309
注册时间
2010-12-1
在线时间
2108 小时
发表于 2016-10-12 21:00:50 | 显示全部楼层
加入printf,打印关键数据,辅助分析。
回复

使用道具 举报

1

主题

5

帖子

0

精华

新手入门

积分
19
金钱
19
注册时间
2016-10-12
在线时间
6 小时
 楼主| 发表于 2016-10-12 23:11:24 | 显示全部楼层
正点原子 发表于 2016-10-12 21:00
加入printf,打印关键数据,辅助分析。

我用的串口发送在调试 打开写入关闭文件都会发送操作完成 也就是00
这个发着发着就没了 程序就卡死了
回复

使用道具 举报

1

主题

5

帖子

0

精华

新手入门

积分
19
金钱
19
注册时间
2016-10-12
在线时间
6 小时
 楼主| 发表于 2016-10-13 11:49:08 | 显示全部楼层
正点原子 发表于 2016-10-12 21:00
加入printf,打印关键数据,辅助分析。

原子哥求助啊,我的程序进入硬中断之前都是跑了一大片的MOVS R0,R0
这是为什么
回复

使用道具 举报

1

主题

5

帖子

0

精华

新手入门

积分
19
金钱
19
注册时间
2016-10-12
在线时间
6 小时
 楼主| 发表于 2016-10-13 16:35:47 | 显示全部楼层
我发现不加文件系统 直接连续写入扇区 写500个扇区 程序也会进入一大片MOVS R0,R0然后进入硬中断
下面是我的SD卡写入函数 大家帮我看一下有问题吗

uint8_t SD_WriteSingleBlock(uint32_t sector, uint8_t *data)
{
        uint8_t r1;
        uint16_t i_wsc, retry=0;

        retry = 0;
        do
        {
                r1 = SD_SendCommand(CMD24, sector, 0x00);
                retry++;
        }while((r1 != 0x00) && (retry<200));
        //跳出循环后,检查原因:初始化成功?or 重试超时?
        if(retry == 200)
        {
                return SDCommandTimeOut;   //超时返回SDCommandTimeOut
        }
       
        //开始准备数据传输
        RESET_SDCS();
        //先放1个空数据,等待SD卡准备好
        SPI_SD_ReadWriteByte(0xff);
        SPI_SD_ReadWriteByte(0xff);
        SPI_SD_ReadWriteByte(0xff);
        //放起始令牌0xFE
        SPI_SD_WriteByte(0xFE);

        //放一个sector的数据
        HAL_SPI_Transmit(&SpiHandle1, (uint8_t *)data, (uint16_t )512, 5000);
       
        //发2个Byte的dummy CRC
        SPI_SD_ReadWriteByte(0xff);
        SPI_SD_ReadWriteByte(0xff);
       
        //等待SD卡应答
        r1 = SPI_SD_ReadWriteByte(0xff);
        if((r1&0x1F)!=0x05)
        {
                SET_SDCS();
                return SD_ERR1;
        }
       
        //等待操作完成
        retry = 0;
        while(!(r1 = SPI_SD_ReadWriteByte(0xff)))
        {
                retry++;
                //HAL_UART_Transmit(&UartHandle1, (uint8_t*)(&r1), 1, (uint32_t )5000);
                if(retry>0xFFFE)        //如果长时间写入没有完成,报错退出
                {
                        SET_SDCS();
                        return SD_ERR2;             //写入超时返回1
                }
        }
        //写入完成,片选置1
        SET_SDCS();
        SPI_SD_ReadWriteByte(0xff);
  return 0;
}
回复

使用道具 举报

1

主题

5

帖子

0

精华

新手入门

积分
19
金钱
19
注册时间
2016-10-12
在线时间
6 小时
 楼主| 发表于 2016-10-13 21:41:33 | 显示全部楼层
正点原子 发表于 2016-10-12 21:00
加入printf,打印关键数据,辅助分析。

我现在修改了底层的写入读取函数 不加文件系统时可以正常连续写入
但是连续写文件时,总是程序卡在f_close处 具体原因不知 大概是卡在move_window函数
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165309
金钱
165309
注册时间
2010-12-1
在线时间
2108 小时
发表于 2016-10-14 19:58:55 | 显示全部楼层
shaya 发表于 2016-10-13 21:41
我现在修改了底层的写入读取函数 不加文件系统时可以正常连续写入
但是连续写文件时,总是程序卡在f_clo ...

有我们开发板么
在我们开发板上试试
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2024-11-22 16:45

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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