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 가 문제없이 동작한다.
'Firmware > stm32' 카테고리의 다른 글
STM32 IAP (Ymodem 프로토콜) Bootloader - 2 (0) | 2020.07.02 |
---|---|
STM32 IAP (Ymodem 프로토콜) Bootloader - 1 (1) | 2020.06.29 |
stm32 uart interrupt 멈추는 현상( RXNEIE disable, overrun) (7) | 2020.06.06 |
OV5642_LWIP_RTOS Project -3(최종 구현 및 디버깅) (0) | 2020.05.31 |
OV5642_LWIP_RTOS Project -2(Camera API) (0) | 2020.04.24 |