본문 바로가기

Firmware

(38)
STM32 IAP (Ymodem 프로토콜) Bootloader - 1 cubeMX : 5.6.1 cubeIDE : 1.3.1 Code Lib Version : STM32Cube_FW_F1_V1.8.0 MCU:STM32F103VBTx stm32 bootloader를 만들어 보자. bootloader에 사용할 Ymodem은 teraterm 프로그램에서 사용할 수 있으며 teraterm과 연결하기 위해 uart를 설정해준다. 다음으로 bootloader를 코딩하기 위해선 먼저 사용하는 Flash Memory가 크기가 몇인지, 어디에다 Bootloader 코드를 올리고 어떤 Flash Memory 주소에 Application을 올리지 확인해야한다. 우선 STM32F103VBTx의 메모리 주소를 확인. STM32F103의 FLASH Memory는 0x0800 0000 ~ 0x080..
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 이므로 데이터 ..
stm32 uart interrupt 멈추는 현상( RXNEIE disable, overrun) UART RX Interrupt를 받기 위한 코드는 다음과 같다 int main(void) { /* USER CODE BEGIN 1 */ /* USER CODE END 1 */ /* MCU Configuration--------------------------------------------------------*/ /* Reset of all peripherals, Initializes the Flash interface and the Systick. */ HAL_Init(); /* USER CODE BEGIN Init */ /* USER CODE END Init */ /* Configure the system clock */ SystemClock_Config(); /* USER CODE BEGIN S..
OV5642_LWIP_RTOS Project -3(최종 구현 및 디버깅) 문제점 1. 메모리 Hardfault_Handler Netconn으로 데이터 전송 중 불특정하게 뻗는 현상이 이 있는데 이 문제는 십중팔구 메모리 fault 문제이다. 위 문제를 해결하기 위해 Netconn Heap size를 5640 -> 11680Bytes로 증가하여 문제를 해결하였다. 2. Task Scheldule 중 Hardfault_Handler 돌리는 중에 Context Switching 중 Hardfault 가 발생 하였다. 디버깅 해본 결과 TCP_Task가 Blocked 이 되면서 Default_Task가 계속 실행되지만 다른 코드 실행 없이 바로 osDelay를 호출해보면 얼마 못가 Hardfault가 발생한다. 이 문제를 해결하기 위해 조치로 다음과 같이 코드를 수정하였다. void..
OV5642_LWIP_RTOS Project -2(Camera API) 실제 카메라 사진을 찍기 위한 API를 구현 Arducam에서 제공하는 예제소스를 참고하여 구현하였다. 카메라 및 LWIP 초기화 void StartDefaultTask(void *argument) { /* init code for LWIP */ MX_LWIP_Init(); /* USER CODE BEGIN StartDefaultTask */ set_format(JPEG); initCAM(); set_bit(0x03,0x02); clear_fifo_flag(); write_reg(0x01,0x00); //VSYNC Active HIGH OV5642_set_JPEG_size(OV5642_1600x1200); TcpTaskHandle = osThreadNew(Tcp_Task, NULL, &TcpTask_at..
OV5642_LWIP_RTOS Project -2(Camera Interface 구현 ) Project에 사용 된 OV5642 는 DCMI or MIPI Interface가 아닌 SPI, I2C ineterface를 통해 사진데이터를 출력한다. https://www.devicemart.co.kr/goods/view?no=1383721 (https://www.arducam.com/downloads/shields/ArduCAM_Camera_Shield_Software_Application_Note.pdf) 먼저 카메라의 SPI 하기 위한 Timing Diagram이다. 코드 구현 uint8_t bus_write (int address, int value) { GPIOC->BSRR = CS_Pin BSRR = CS_Pin; return 1; } void write_reg (uint8_t addr,..
OV5642_LWIP_RTOS Project -1(Netconn_write 호출 시 문제) Protject 진행 중 Netconn_write 호출 시 다른 Task가 unknown이 되어버리는 현상이 발생하였다. 문제가 발생 전 화면 netconn_write 호출 후 Task 깨지는 화면 디버깅 결과 이 문제는 netconn_write 문제라기 보다 tcp초기화를 하지 않은 상태에서 netconn api를 호출하여 발생하는 문제로 보인다.(애초에 netconn_bind에서 ERR_OK를 Return하면 안되는거 아닌가?) 저 상태에서 몇번 ContextSwitching 하다가 CameraTask 까지 깨진다. 앞서 언급한 대로 tcp 초기화 진행 후 TCP_Task를 만들어주면 또는 세마포어나 뮤텍스를 활용하여 TCP초기화 전에 netconn api를 건들 지 못하도록 하면 된다 여기서는 ma..
OV5642_LWIP_RTOS Project -1(osThreadSetPriority 문제) Project 진행 중 osThreadSetPriority 함수 실행에 문제가 발생했다. 위 함수의 문제는 ThreadSetPriority(defaultTaskHandle,osPriorityNone)에서 2번 째 인자 값이 0(osPriorityNone) 일 때 우선 순위가 변경 되지 않는다. 즉 Task의 우선순위를 변경 할려면 IDLE Task의 우선순위보다 커야하며 (Priority>0) 같게 하였을 경우 우선순위가 변경 되지 않고 이전 priority를 유지한다. netconn_accept 함수에서는 Client가 Connect 할 때 까지 Task는 Block 상태가 된다. netconn_write (struct netconn *conn , void *data , u16_t len , u8_t ..