STM32SD SD.write() doesn't work in the loop?

Post here first, or if you can't find a relevant section!
User avatar
fpiSTM
Posts: 1762
Joined: Wed Dec 11, 2019 7:11 pm
Answers: 92
Location: Le Mans
Contact:

Re: STM32SD SD.write() doesn't work in the loop?

Post by fpiSTM »

Yes SDMMC1 has a global interrupt...
In your example (from cubeMx) the SDMMC is not checked. We simply do not use it and use sequential way.
Do not try to override the configuration, the library is here to abstract all HALL stuff.

Anyway in your case, try to remove all codes from your timer ISR, I don't know what you made inside but if you keep too much time in, I guess it could break the SD write. If it works then this mean you spent too much time in isr. In that case you can try to disable interrupt during the Write.
Bambo
Posts: 75
Joined: Wed Jan 15, 2020 8:36 pm

Re: STM32SD SD.write() doesn't work in the loop?

Post by Bambo »

fpiSTM wrote: Wed Feb 03, 2021 1:56 pm Yes SDMMC1 has a global interrupt...
In your example (from cubeMx) the SDMMC is not checked. We simply do not use it and use sequential way.
Do not try to override the configuration, the library is here to abstract all HALL stuff.

Anyway in your case, try to remove all codes from your timer ISR, I don't know what you made inside but if you keep too much time in, I guess it could break the SD write. If it works then this mean you spent too much time in isr. In that case you can try to disable interrupt during the Write.
Ok thanks, i've removed all code from the ISR callback but it doesn't work. So its definitely not spending too much time in the ISR.

It only works if lower the TIM2 clock speed from 16KHz down to 1Khz
Bambo
Posts: 75
Joined: Wed Jan 15, 2020 8:36 pm

Re: STM32SD SD.write() doesn't work in the loop?

Post by Bambo »

I guess that the TIM2 timer and SDMMC timer are conflicting with each other for clock resources maybe?
User avatar
fpiSTM
Posts: 1762
Joined: Wed Dec 11, 2019 7:11 pm
Answers: 92
Location: Le Mans
Contact:

Re: STM32SD SD.write() doesn't work in the loop?

Post by fpiSTM »

SDMMC timer ?
If clock are well configured I don't see anything which can conflict. This simply feed the IP.
Bambo
Posts: 75
Joined: Wed Jan 15, 2020 8:36 pm

Re: STM32SD SD.write() doesn't work in the loop?

Post by Bambo »

fpiSTM wrote: Wed Feb 03, 2021 2:58 pm SDMMC timer ?
If clock are well configured I don't see anything which can conflict. This simply feed the IP.
Yeah it must be something to do with the clock configuration, i'm not sure why, here's my clock setup anyway:

Code: Select all

#pragma once

extern "C" void SystemClock_Config(void) {
    RCC_OscInitTypeDef RCC_OscInitStruct = {};
    RCC_ClkInitTypeDef RCC_ClkInitStruct = {};
    RCC_PeriphCLKInitTypeDef PeriphClkInit = { 0 };

    /* Configure LSE Drive Capability */
    HAL_PWR_EnableBkUpAccess();
    __HAL_RCC_LSEDRIVE_CONFIG(RCC_LSEDRIVE_LOW);
    /* Initializes the CPU, AHB and APB busses clocks */
    RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_LSE | RCC_OSCILLATORTYPE_MSI;
    RCC_OscInitStruct.LSEState = RCC_LSE_ON;
    RCC_OscInitStruct.MSIState = RCC_MSI_ON;
    RCC_OscInitStruct.MSICalibrationValue = 0;
    RCC_OscInitStruct.MSIClockRange = RCC_MSIRANGE_6;
    RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
    RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_MSI;
    RCC_OscInitStruct.PLL.PLLM = 1;
    RCC_OscInitStruct.PLL.PLLN = 40;
    RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV7;
    RCC_OscInitStruct.PLL.PLLQ = RCC_PLLQ_DIV2;
    RCC_OscInitStruct.PLL.PLLR = RCC_PLLR_DIV2;
    if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK) {
        Error_Handler();
    }
    /* Initializes the CPU, AHB and APB busses clocks */
    RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK | RCC_CLOCKTYPE_SYSCLK
        | RCC_CLOCKTYPE_PCLK1 | RCC_CLOCKTYPE_PCLK2;
    RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
    RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
    RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1;
    RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;

    if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_4) != HAL_OK) {
        Error_Handler();
    }

    PeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_SDMMC1;
    PeriphClkInit.Sdmmc1ClockSelection = RCC_SDMMC1CLKSOURCE_PLLSAI1;
    PeriphClkInit.PLLSAI1.PLLSAI1Source = RCC_PLLSOURCE_MSI;
    PeriphClkInit.PLLSAI1.PLLSAI1M = 1;
    PeriphClkInit.PLLSAI1.PLLSAI1N = 16;
    PeriphClkInit.PLLSAI1.PLLSAI1P = RCC_PLLP_DIV17;
    PeriphClkInit.PLLSAI1.PLLSAI1Q = RCC_PLLQ_DIV8;
    PeriphClkInit.PLLSAI1.PLLSAI1R = RCC_PLLR_DIV2;
    PeriphClkInit.PLLSAI1.PLLSAI1ClockOut = RCC_PLLSAI1_SAI1CLK | RCC_PLLSAI1_ADC1CLK | RCC_PLLSAI1_48M2CLK;
    if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInit) != HAL_OK) {
        Error_Handler();
    }


    /* Configure the main internal regulator output voltage */
    if (HAL_PWREx_ControlVoltageScaling(PWR_REGULATOR_VOLTAGE_SCALE1) != HAL_OK) {
        Error_Handler();
    }

    /* Enable MSI Auto calibration */
    HAL_RCCEx_EnableMSIPLLMode();


}
User avatar
fpiSTM
Posts: 1762
Joined: Wed Dec 11, 2019 7:11 pm
Answers: 92
Location: Le Mans
Contact:

Re: STM32SD SD.write() doesn't work in the loop?

Post by fpiSTM »

Well, currently, I've no time to investigate on this.
I have to work on STM32SD in the coming month, I will investigate that during this slot. Anyway, based on all the last subjects around the SD, I think there is a wrong use of the core/library and also not have all info.
Bambo
Posts: 75
Joined: Wed Jan 15, 2020 8:36 pm

Re: STM32SD SD.write() doesn't work in the loop?

Post by Bambo »

fpiSTM wrote: Wed Feb 03, 2021 4:05 pm Well, currently, I've no time to investigate on this.
I have to work on STM32SD in the coming month, I will investigate that during this slot. Anyway, based on all the last subjects around the SD, I think there is a wrong use of the core/library and also not have all info.
Ok thank you fpiSTM :)
Post Reply

Return to “General discussion”