본문 바로가기

Firmware/stm32

FSMC HAL_SRAM_Write_16b Bug 문제

cubeMX : 5.6.1
cubeIDE : 1.3.1

Code Lib Version : STM32Cube_FW_F1_V1.8.0

 

ili9341 LCD를 FSMC 를 통해 구현 하던 중 제대로 동작하지 않아 디버깅 해보니

 

 HAL_SRAM_Write_16b 함수 문제로 인해 동작되지 않는 걸로 밝혀졌다.

 

HAL_SRAM_Write_16b

HAL_StatusTypeDef HAL_SRAM_Write_16b(SRAM_HandleTypeDef * hsram, uint32_t * pAddress, uint16_t * pSrcBuffer, uint32_t BufferSize)
{
  uint32_t size;
  __IO uint32_t *psramaddress = pAddress;    // ->uint32_t 이므로 데이터 크기는 32bit가 되어 문제가 발생함
  uint16_t *psrcbuff = pSrcBuffer;
  uint8_t limit;

/*Write last 16-bits if size is not 32-bits multiple */
if (limit != 0U)
{
  *psramaddress = ((uint32_t)(*psrcbuff) & 0x0000FFFFU) | ((*psramaddress) & 0xFFFF0000U); 
  	  //FSMC Data Bus는 16bit 이므로 데이터 32bit 쓰기 위해 WR Pin이 2번 움직이게 된다.
}

 함수 내부를 살펴 보면 데이터를 Write를 하기 위해 uint32_t *psramaddress를 선언하고

이 Address가 나타내는 버퍼에 값을 쓰는 형식으로 되어있다.

문제는 버퍼크기가 uint32_t 인게 문제다.

 

FSMC Data bus는 16bit 인데 32bit 크기 값을 써야 하므로 WR Pin이 2번 움직여 처음 썼던 Data는 묻히게 된다.

 

위 문제를 해결하기 위해 HAL_SRAM_Write_16b 함수를 다음과 같이 변경한다.

 

__IO uint32_t *psramaddress = pAddress;

 

->__IO uint16_t*psramaddress = pAddress;

 

 

변경 후 Test를 해보면 LCD 가 문제없이 동작한다.