Friday, October 24, 2025

stm32 외부 RAM에 변수 배치방법


STM32CubeIDE 기준임.


 먼저 Loader 스크립트를 수정해야함


외부 RAM이 0x90000000에서 시작하고 용량이 32MB라는 가정을 하면,


__EXTRAM_BEGIN = 0x90000000;

__EXTRAM_SIZE = 0x02000000;


__RAM_BEGIN = 0x24000000;

__RAM_SIZE = 0x71C00;

__RAM_NONCACHEABLEBUFFER_SIZE = 0x400;


/* Memories definition */

MEMORY

{

RAM (xrw) : ORIGIN = __RAM_BEGIN, LENGTH = __RAM_SIZE

RAM_NONCACHEABLEBUFFER (xrw) : ORIGIN = __RAM_BEGIN + __RAM_SIZE, LENGTH = __RAM_NONCACHEABLEBUFFER_SIZE


ITCM (xrw) : ORIGIN = 0x00000000, LENGTH = 0x00010000

DTCM (rw) : ORIGIN = 0x20000000, LENGTH = 0x00010000

SRAMAHB (rw) : ORIGIN = 0x30000000, LENGTH = 0x00008000

BKPSRAM (rw) : ORIGIN = 0x38800000, LENGTH = 0x00001000


FLASH (xrw) : ORIGIN = __FLASH_BEGIN, LENGTH = __FLASH_SIZE

EXTRAM (rw) : ORIGIN = __EXTRAM_BEGIN, LENGTH = __EXTRAM_SIZE

/* EXT_FLASH (rx) : ORIGIN = 0x70000000, LENGTH = 8192K */

}


.....


SECTIONS

{


    ... 생략...


/* 외부 램 사용자 섹션 */

.ext_ram_data (NOLOAD) : {

. = ALIGN(4);

*(.ext_ram_data)

. = ALIGN(4);

} > EXTRAM

    ... 생략...

}


처럼 수정한다.


NOLOAD는 매우 중요하다. 이것은 flash에 초기화 값을 사용하지 않겠다는것이다. 따라서

기본값 지정은 불가능함.

내가 사용하는 STM32H7시리즈 칩이 내부 플래시가 워낙 작고, 나는 단지 RAM을 확장할것이

때문에 RAM만 늘리면 되기에 초기값은 사용하지 않은것이다.



그리고 변수를 만들때에는



__attribute__((section(".ext_ram_data"))) uint8_t ext_ram_variable_example1[100];



이런식으로 section을 직접 지정해준다.



Tuesday, October 14, 2025

stm32 external loader에서 qspi사용하는 메모리에서 256바이트만 써지고 나머지가 안써질때

stm32_sfdp_driver.c파일에서

EXTMEM_DRIVER_NOR_SFDP_StatusTypeDef EXTMEM_DRIVER_NOR_SFDP_Write(EXTMEM_DRIVER_NOR_SFDP_ObjectTypeDef *SFDPObject, uint32_t Address, const uint8_t* Data, uint32_t Size)

{

EXTMEM_DRIVER_NOR_SFDP_StatusTypeDef retr;

uint32_t size_write;

uint32_t local_size = Size;

uint32_t local_Address = Address;

uint32_t local_Data = (uint32_t)Data;

uint32_t misalignment = 0u;


SFDPObject->sfpd_private.PageSize = 0x100; // 이거 추가


....

}



오류가 나는 경우는 프로그램 페이지 크기가 제대로 안들어가는거 같다.




Thursday, October 9, 2025

STM32CubeProgrammer error when Erase full chip External Flash.

Version 2.17 is no error

Version 2.20 - error


STM32CubeProgrammer 2.17 is stable.


STM32CubeProgrammer를 위한 External loader에서 Write한것이 첫바이트가 사라질때

STM32CubeMX 최신버전 (6.15)이상에서 External Loader를 만들면 기본적인 기능을 모두 만들어준다.

그런데 QSPI용 Nor flash  메모리 MX25L6433F를 사용하도록 세팅해보니 내가 Write한 내용의 첫바이트가 사라지는 현상이 있었다.


원인을 찾아보니 Flash write,read명령 중에 dummy cycle가 필요한 경우도 있지만 없는 경우도 있음에도 불구하고

dummy cycle이 8로 지정되어있음을 확인했고, 그것을 0으로 변경하니 잘 돌아갔다.


문제의 코드는 이러하다


Muddlewares/ST/STM32_ExtMem_Manager/stm32_sal_xspi.c 

HAL_StatusTypeDef SAL_XSPI_MemoryConfig(SAL_XSPI_ObjectTypeDef *SalXspi, SAL_XSPI_MemParamTypeTypeDef ParametersType, void *ParamVal)

{

HAL_StatusTypeDef retr = HAL_OK;

XSPI_RegularCmdTypeDef s_commandbase = SalXspi->Commandbase;


switch (ParametersType) {

case PARAM_PHY_LINK:{

SalXspi->PhyLink = *((SAL_XSPI_PhysicalLinkTypeDef *)ParamVal);

DEBUG_PARAM_BEGIN(); DEBUG_PARAM_DATA("::PARAM_PHY_LINK::");DEBUG_PARAM_DATA(STR_PHY_LINK(SalXspi->PhyLink));

switch (SalXspi->PhyLink)

{

case PHY_LINK_1S1D1D:

case PHY_LINK_1S2S2S:

case PHY_LINK_1S1S2S:

case PHY_LINK_1S1S1S: {

s_commandbase.InstructionMode = HAL_XSPI_INSTRUCTION_1_LINE;

s_commandbase.InstructionWidth = HAL_XSPI_INSTRUCTION_8_BITS;

s_commandbase.InstructionDTRMode = HAL_XSPI_INSTRUCTION_DTR_DISABLE;

s_commandbase.AddressMode = HAL_XSPI_ADDRESS_1_LINE;

s_commandbase.AddressWidth = HAL_XSPI_ADDRESS_24_BITS;

s_commandbase.AddressDTRMode = HAL_XSPI_ADDRESS_DTR_DISABLE;

s_commandbase.DataMode = HAL_XSPI_DATA_1_LINE;

s_commandbase.DataDTRMode = HAL_XSPI_DATA_DTR_DISABLE;

s_commandbase.DummyCycles = 8; // 0으로 변경해야함

s_commandbase.DQSMode = HAL_XSPI_DQS_DISABLE;

break;

}


이하 생략



위에서 DummyCycles를 0으로 수정하면 잘 돌아간다.




-----------------------------------

Problem : STM32CubeMx generated External loader miss first byte write/read with QSPI Flash memory

Solution : Change DummyCycles to 0