|
软硬件:请教stm32h750VBT6+freertos+lwip+fatfs ; stm32cubemx-V6.12.0 + STM32Cube_FW_H7_V1.11.2 配置工程; Keil MDK ;开启cache;
问题:使用了sdmmc2接口TF卡,3.3V; 目前可以读取TF卡本身的容量等信息,可以读取卡上的txt文件内容;
只有写txt文件不行,一运行就死在写函数f_write(),带板仿真f_write() 函数,单步执行能返回,返回后居然跑到f_mount()函数中去了,???这是什么情况?
然后串口(lpuart)打印信息也挂了,f_open()函数之后的串口打印会死掉,打印不全;
调了两天了,头大~~~,
=======fatfs测试代码=============
uint8_t retSD ;//SEC_RAM_D1; /* Return value for SD */
char SDPath[4]; /* SD logical drive path */
FATFS SDFatFS ; /* File system object for SD logical drive */
FIL SDFile ; /* File object for SD */
UINT fnum ;
ALIGN_32BYTES (char WriteBuffer[128] SEC_RAM_D1);
ALIGN_32BYTES (char ReadBuffer[128] SEC_RAM_D1);
void fatfs_test()
{
memcpy(WriteBuffer,"This is a write test.",sizeof("This is a write test."));
memset(ReadBuffer,0,sizeof(ReadBuffer));
retSD = f_mount(&SDFatFS,(TCHAR const*)SDPath,1);
//retSD = f_mount(&SDFatFS,"0:",1);
kprintf2("\nmount1=%d ", retSD);
if(FR_OK==retSD){
//printf_sdcard_info(); //test OK
//retSD = f_open(&SDFile, "test1.txt", FA_WRITE |FA_READ );//FA_OPEN_APPEND);// read test ok
retSD = f_open(&SDFile, "test2.txt", FA_CREATE_ALWAYS |FA_WRITE );//write test
if ( retSD == FR_OK )
{
kprintf2("\nopenOK "); //串口打印出问题了,上面f_open()执行后,这里只能打印1、2个字符;说明f_open()可以执行但中间出来什么问题,影响了lpuart打印信息;
//retSD = f_write(&SDFile, WriteBuffer, sizeof(WriteBuffer), &fnum);
retSD = f_write(&SDFile, WriteBuffer, 20, &fnum); //全速执行会死在里面,单步可执行出来,但会跳到上面的f_mount()函数中,诡异。
kprintf2("\nWrite=%d,%d", retSD,fnum);
//retSD = f_read(&SDFile, ReadBuffer, 32, &fnum); //OK
//kprintf2("\nread=%d,%d:%s", retSD,fnum,ReadBuffer); //这里因为f_open()的影响,实际上时打印不出来的,通过仿真看到ReadBuffer中的32个字符都正确;
f_close(&SDFile);
kprintf2("\nWrite=%d,%d", retSD,fnum);
retSD = f_mount(NULL,(TCHAR const*)SDPath,1);
kprintf2("\nmount2=%d ", retSD);
}else
{
f_close(&SDFile);
kprintf2("Failed to open=%d ",retSD);
}
}
}
void StartDefaultTask(void const * argument)
{
/* init code for LWIP */
kprintf2("\nDefaultTask...");
MX_LWIP_Init();
/* USER CODE BEGIN StartDefaultTask */
/* Infinite loop */
fatfs_test();
for(;;)
{
osDelay(1);
}
}
=======end of fatfs测试代码=============
========MPU:============
MPU_InitStruct.Enable = MPU_REGION_ENABLE;
MPU_InitStruct.Number = MPU_REGION_NUMBER3;
MPU_InitStruct.BaseAddress = 0x24000000;
MPU_InitStruct.Size = MPU_REGION_SIZE_512KB;
MPU_InitStruct.SubRegionDisable = 0x0;
MPU_InitStruct.TypeExtField = MPU_TEX_LEVEL1;
MPU_InitStruct.AccessPermission = MPU_REGION_FULL_ACCESS;
MPU_InitStruct.DisableExec = MPU_INSTRUCTION_ACCESS_ENABLE;
MPU_InitStruct.IsShareable = MPU_ACCESS_NOT_SHAREABLE;
MPU_InitStruct.IsCacheable = MPU_ACCESS_NOT_CACHEABLE;
MPU_InitStruct.IsBufferable = MPU_ACCESS_NOT_BUFFERABLE;
HAL_MPU_ConfigRegion(&MPU_InitStruct);
=======end of MPU===============
说明:
1、stm32H750vbt6中的sdmmc1与sdmmc2是不同的,sdmmc1的DMA是MDMA可以在cubemx中设置的,sdmmc2的DMA是IDMA全傻瓜用户无法干预,cubemx中无设置; 详见用户手册55.2节或者page2400/3319;
2、freertos开启后,fatfs中Advanced settings中“Use dma template”会强制enable;
3、freertos中 configTOTAL_HEAP_SIZE ((size_t)(32768+8192));
4、s启动文件中:
Stack_Size EQU 0x4000
Heap_Size EQU 0x2000
===================================
请站长与路过的大神们看看,指点迷津,多谢!!!
PS: 这个项目中cubmx先配置其它紧要外设,最后sdmmc1引脚冲突,剩下sdmmc2了就用了; 事先没了解两个口的差异,想当然以为完全一样;今天试了一下,先配置sdmmc1,其它9个uart,eth,QSPI也能配通,如果实在调不通,只能改板用sdmmc1了。
多谢!!!
|
|