2024-10-15 01:52 AM - last edited on 2024-10-16 12:42 AM by Andrew Neil
Originally posted as a reply in this old thread:
How did you solve it in the end? I also encountered this problem
Solved! Go to Solution.
2024-10-16 12:49 AM
@AlfRome wrote:
This mode wakes up in LPTIM interrupt, and after waking up, SystemClock_Config() is called again
Did you read the Solution in the other thread?
He said that SystemClock_Config() was not sufficient - he also had to call PeriphCommonClock_Config() after exiting the sleep mode:
2024-10-15 01:53 AM
Isn't the HAL library I am using only SystemClock_Cnfig() for configuring clocks?
2024-10-15 02:24 AM - edited 2024-10-15 02:26 AM
@AlfRomeo wrote:How did you solve it in the end?
He described it in his post immediately before yours - the one marked as The Solution:
@AlfRomeo wrote:Isn't the HAL library I am using only SystemClock_Cnfig() for configuring clocks?
We have no idea what you are using!
Probably best if you start a new thread of your own, and provide a full description of your system (code, schematics, your problem symptoms, what debugging you've done so far, etc) there:
You can always provide a link back to this thread for reference, if required.
2024-10-15 05:32 PM
#define _SD_POW_ON HAL_GPIO_WritePin(GPIOB, SD_EN_Pin, GPIO_PIN_RESET)
#define _SD_POW_OFF HAL_GPIO_WritePin(GPIOB, SD_EN_Pin, GPIO_PIN_SET)
#define _delSD(en) \
do \
{ \
f_mount(NULL, "0:", (en & 1)); \
closeSD(); \
sdInfo.busy = _IDLE; \
} while (0)
int main(void)
{
HAL_Init();
SystemClock_Config();
MX_GPIO_Init();
MX_LPTIM1_Init();
MX_USART3_UART_Init();
MX_RTC_Init();
MX_SPI1_Init();
MX_SDMMC1_SD_Init();
MX_FATFS_Init();
_VDP_ON;
_SD_POW_ON; // SD POWER OPEN
HAL_Delay(100);
fm25v_init(); // FM25V Init
// fm25v_SafeInit();
scanSD(); // Get SD card capacity
closeSD();//close SD
__HAL_RTC_WAKEUPTIMER_ENABLE_IT(&hrtc, RTC_IT_WUT);
while (1)
{
sd_test();
EnterStop2ModeLPTIM();
}
}
void sd_test(void)
{
openSD();
FRESULT ret;
FIL *sdFile = NULL;
BYTE *buffer = NULL;
UINT bytesWritten = 0;
sdFile = (FIL *)malloc_mem(sizeof(FIL));
if (sdFile == NULL)
{
return;
}
BYTE writeBuffer[] = "\r\n\r\nhello world!\r\nasdfgdsagdfasgdsa\r\n";
ret = f_mount(&SDFatFS, "0:", 0);
if (ret != FR_OK && ret != FR_NO_FILESYSTEM)
{
printf("f_mount error! ret: %d\r\n", ret);
free_mem(sdFile);
return;
}
else if (ret == FR_NO_FILESYSTEM)
{
printf("FATFS file system not detected, perform formatting...\r\n");
ret = f_mkfs("0:", 0, 4096, buffer, _MAX_SS);
if (ret == FR_OK)
{
printf("Format successful!\r\n");
f_mount(NULL, "0:", 0);
ret = f_mount(&SDFatFS, "0:", 0);
}
else
{
printf("Format failed!\r\n");
free_mem(sdFile);
return;
}
}
else
{
printf("f_mount success!\r\n");
}
printf("\r\n ========== write test ==========\r\n");
ret = f_open(sdFile, "hello.txt", FA_CREATE_ALWAYS | FA_WRITE);
if (ret == FR_OK)
{
printf("open file sucess!\r\n");
ret = f_write(sdFile, writeBuffer, sizeof(writeBuffer), &bytesWritten);
if (ret == FR_OK)
{
printf("write \"%s\" success!\r\nwrite len:%d\r\n", writeBuffer, bytesWritten);
f_close(sdFile);
_delSD(0);
}
else
{
printf("write error! ret:%d \r\n", ret);
f_close(sdFile);
free_mem(sdFile);
return;
}
}
else
{
printf("ret = %d\r\n", ret);
printf("open file error!\r\n");
f_close(sdFile);
free_mem(sdFile);
return;
}
free_mem(sdFile);
}
void closeSD(void)
{
// sdSdmmcIO();
HAL_SD_MspDeInit(&hsd1);
_SD_POW_OFF;
// sdSta = STA_NOINIT;
}
void openSD(void)
{
// sdSdmmcInit();
HAL_SD_MspInit(&hsd1);
// BSP_SD_Init();
_SD_POW_ON;
}
void EnterStop2ModeLPTIM(void)
{
// printf("Start to enter Stop2 mode\r\n");
__HAL_RCC_PWR_CLK_ENABLE();
HAL_RCCEx_WakeUpStopCLKConfig(RCC_STOP_WAKEUPCLOCK_MSI);
HAL_LPTIM_MspInit(&hlptim1);
HAL_LPTIM_TimeOut_Start_IT(&hlptim1, 65535, 65535);
HAL_SuspendTick();
HAL_DBGMCU_EnableDBGStopMode();
__HAL_RCC_PWR_CLK_ENABLE();
HAL_PWREx_EnterSTOP2Mode(PWR_STOPENTRY_WFI);
}
void ExitStop2ModeLPTIM(void)
{
HAL_LPTIM_MspDeInit(&hlptim1);
SystemClock_Config();
HAL_ResumeTick();
SCB->SCR &= ~SCB_SCR_SLEEPONEXIT_Msk;
// printf("In the EXTI to wake up!\r\n");
}
void HAL_LPTIM_CompareMatchCallback(LPTIM_HandleTypeDef *hlptim)
{
ExitStop2ModeLPTIM();
}
This is my code, which is generated by cubemx using STM32L431 code. The logic of the code is to first call the openSD() function in while (1), reconfigure the IO port of SDMMC, and then turn on the power supply of the SD card. After the SD card is successfully written, it will call _delSD (0); SDMMC will be enabled inside, and SD card power will be turned off, then enter STOP2 mode. This mode wakes up in LPTIM interrupt, and after waking up, SystemClock_Cnfig() is called again; Then my question is why FR-DISK-ERR (1) is returned in f_open?
2024-10-16 12:49 AM
@AlfRome wrote:
This mode wakes up in LPTIM interrupt, and after waking up, SystemClock_Config() is called again
Did you read the Solution in the other thread?
He said that SystemClock_Config() was not sufficient - he also had to call PeriphCommonClock_Config() after exiting the sleep mode:
2024-10-16 01:04 AM
There is no PeriphCommonClock_Config() function in CUBEMX
2024-10-16 01:11 AM
Then you'll have to write one yourself.
As noted in the other thread:
"the sdmmc runs on a clock that doesnt get started by SystemClock_Config()"
You should be able to verify whether that is actually what's happening in your case.
Find out where that clock does get started in your code.
Make sure that also happens after you exit STOP2.