Heap_Size EQU 0x00001000
单片机里有个测试数组往TF卡里写入数据,当大小为300字节的时候,写入40x40x3或者 400X400X3的图片没有问题,可以当 数组大小为600或者更大的时候就会出现问题,为600时,图片会出现问题不是纯色的。如下所示,后面一张是没有问题的。
我将图片转换成16进制数据看了下,主要是有问题图片,数据写入错误了,就是错了两个8位
的数据,下图中前面图是正确的数据,后面图是错误的,193行开头应该是FF00的,现在多出了个 0080不知道这是为什么。192行 一共 3072个字节,不知道有什么关系。。。FATFS是 R0.11 的。我写入6k的 .txt文件,缓存为1K多,数据没有错误,就是图片数据不对。换个TF卡也是一样 。
另外想问下,16G的卡写入时间比4G的卡多挺多的,4GB的卡比128M的小卡写入时间也多1倍,不知道这是为什么。16G/4G都按键 32K格式化。
最后写入的总数据是一样的,我改过STACK HEAD大一些也一样是在这个地方出现错误,不知道为什么,难道是FATFS的问题吗 ?
写入主要代码如下:
[mw_shl_code=c,true]SDIO_TEST_PICTURE_WITH_SIZE 是数组的大小[/mw_shl_code]
[mw_shl_code=c,true]// 给测试图片填充数据
void User_Picture_Process(void)
{
uint16_t Tempi = 0;
static uint16_t Tempj = 0;
for (Tempi=0; Tempi<SDIO_TEST_PICTURE_WITH_SIZE; Tempi += 3)
{
PictureTestBuf[Tempi] = TestColourSet[Tempj][0]; // B
PictureTestBuf[Tempi+1] = TestColourSet[Tempj][1]; // G
PictureTestBuf[Tempi+2] = TestColourSet[Tempj][2]; // R
}
++Tempj;
Tempj %= 10;
}
[/mw_shl_code]
[mw_shl_code=c,true]// TF卡写入图片测试 .bmp格式图片
void Sdio_Store_Picture(uint32_t FileWidth, uint32_t FileHeight)
{
uint16_t i = 0;
uint32_t FileSize = 0; // 数据大小
//uint8_t Temp1[4]={0,0,0,0}; // 填充数组
uint16_t TempTime, TempValue;
/* bmp 文件头 54个字节 */
uint8_t Fileheader[54] =
{
0x42, 0x4d, // 0X4D42 就是字符“BM”
0, 0, 0, 0, // 位图大小,预留
0, 0, 0, 0, // 必须为0
54, 0, 0, 0, // 从文件头开始到实际的图象数据之间的字节的偏移量,这里为54字节
40, 0, 0, 0, // 一般为40
0, 0, 0, 0, // 图象宽度,像素为单位,预留
0, 0, 0, 0, // 图象高度,像素为单位,预留
1, 0, // 位面数,为1
24, 0, // 比特数/像素 常用24、32,也有1、4、8、16. 24表示一个像素占三个字节
0, 0, 0, 0, // 图像压缩类型 0 表示 BI_RGB 没有压缩
0, 0, 0, 0, // 图象大小 字节为单位,用 BI_RGB 时,可设置为 0
0, 0, 0, 0, // 水平分辨率,不用为 0
0, 0, 0, 0, // 垂直分辨率,不用为 0
0, 0, 0, 0, // BMP图像使用的颜色,0 表示使用全部颜色
0, 0, 0, 0 // 重要的颜色数,0 表示所有颜色都重要
};
/* 宽*高 +补充的字节 + 头部信息 注意乘3,如果输入参数有乘则不有乘3 */
FileSize = FileWidth * FileHeight * 3 + FileHeight*(FileWidth%4) + 54;
// FileSize = FileWidth * FileHeight * 4 + 54;
/* 文件大小 4个字节 */
Fileheader[2] = (uint8_t)((FileSize >> 0) & 0x000000ff);
Fileheader[3] = (uint8_t)((FileSize >> 8) & 0x000000ff);
Fileheader[4] = (uint8_t)((FileSize >> 16) & 0x000000ff);
Fileheader[5] = (uint8_t)((FileSize >> 24) & 0x000000ff);
/* 位图宽 4个字节 */
Fileheader[18] = (uint8_t)((FileWidth >> 0) & 0x000000ff);
Fileheader[19] = (uint8_t)((FileWidth >> 8) & 0x000000ff);
Fileheader[20] = (uint8_t)((FileWidth >> 16) & 0x000000ff);
Fileheader[21] = (uint8_t)((FileWidth >> 24) & 0x000000ff);
/* 位图高 4个字节 */
Fileheader[22] = (uint8_t)((FileHeight >> 0) & 0x000000ff);
Fileheader[23] = (uint8_t)((FileHeight >> 8) & 0x000000ff);
Fileheader[24] = (uint8_t)((FileHeight >> 16) & 0x000000ff);
Fileheader[25] = (uint8_t)((FileHeight >> 24) & 0x000000ff);
do
{
// 动态创建文件名
sprintf((char*)FileName,"%s/ST32Pict_%d.bmp", SdioPicturePath, g_NameNum++);
//sprintf((char*)PName,"STM32Picture_%d.bmp", NameNum++);
//if(g_NameNum>50000)
// break;
g_Res = f_open(&g_Filnew,(const TCHAR *)FileName, FA_CREATE_NEW | FA_WRITE);
}while(g_Res != FR_OK);
g_SdioRdWrSize = 0; // 计数前清零
// 写入文件头
User_F_Write(Fileheader, 54);
g_SdioRdWrSize += ByWrCount; // 写入数据的总字节数
// 读取数据,继续写入SD卡里面
// 写的整数次
TempTime = (FileSize-54) / SDIO_TEST_PICTURE_WITH_SIZE;
// 剩下不够1个缓存大小
TempValue = (FileSize-54) % SDIO_TEST_PICTURE_WITH_SIZE;
i = 0;
if (0 == FileWidth%4)
{
while((i < TempTime) && (g_Res==FR_OK))
{
++i;
User_F_Write(PictureTestBuf, SDIO_TEST_PICTURE_WITH_SIZE);
f_sync(&g_Filnew);
g_SdioRdWrSize += ByWrCount;
}
if (TempValue) // 300或者600的缓存用不到这里
{
User_F_Write(PictureTestBuf, TempValue);
g_SdioRdWrSize += ByWrCount;
}
}
else
{
/* 这段代码有错 暂不处理 不是4倍数的宽度.bmp图片
while((i < TempTime) && (g_Res==FR_OK))
{
++i;
User_F_Write(PictureTestBuf, SDIO_TEST_PICTURE_WITH_SIZE);
g_SdioRdWrSize += ByWrCount;
// 宽 不是4的倍数,则补全
User_F_Write(Temp1, FileWidth%4);
g_SdioRdWrSize += ByWrCount;
}
if (TempValue)
{
User_F_Write(PictureTestBuf, TempValue);
g_SdioRdWrSize += ByWrCount;
}
*/
}
User_F_Close();
}
[/mw_shl_code]
[mw_shl_code=c,true]主程序测试调用方法:
for (i=0; i<2; ++i)
{
User_Picture_Process();
Sdio_Store_Picture(40, 40);
}[/mw_shl_code]
SDIO-TX 是用DMA ,RX没有用DMA,尝试搞过都用DMA没有成功,STM32Cube1+STM32CubeMX软件配置只能配置一个方向,因为只有一一个通道,之后双向要自己搞,没有成功,就是DMA等待传输成功一直卡在那里,不知道为什么。。。
不知道论坛有没有人遇到过这问题。。。求帮忙下。。。
附件里是工程代码。