본문 바로가기

Embedded Engineer

(92)
이진 탐색 알고리즘 순차탐색은 for문을 통해 순차적으로 검색하는 간단한 방식으로 제외한다. 이진탐색 알고리즘을 사용하기 위해서는 다음의 조건을 만족해야만 한다. "배열에 저장된 데이터는 정렬되어 있어야만 한다." 이진 탐색 알고리즘은 정렬 된 데이터가 아니면 적용이 불가능하다. 길이가 8인 배열(array)에 다음과 같이 정렬된 상태로 데이터가 저장되어 있다고 가정하자. 여기서 숫자 1이 저장되어 있는 지 확인하기위해 이진 탐색 알고리즘은 다음과 같다. 1. 탐색 범위에서의 센터 값이 내가 찾고자 하는 값이 맞는 지 확인한다. 2. 찾은 값이 찾고자 하는 값보다 크면 탐색 범위를 왼쪽으로 줄인다. 3. 다시 1번을 반복한다. 4. 값을 찾을 때 까지 1~3을 반복 한다. 또는 last_idx 가 first_idx 보다 작..
STM32 SPI Slave로 Interrupt DMA Transmit/Receive 구현하기 STM32cubeMX : 5.6.1 STM32cubeIDE : 1.3.1 Code Lib Version: STM32Cube_FW_L1_V1.9.0 MCU:STM32L151VET SPI는 양방향 Serial 통신으로 Master or Slave로 동작을 할 수 있다. 이번에 Slave로 구현을 해보자 CubeMX 설정 Mode를 Slave로 설정 Hardware NSS Signal은 Hardware NSS Input Signal로 설정한다. 다음은 DMA 및 Interrupt를 설정한다. DMA란 Direct Memory Acess로 DMA를 OFF 할 경우 MCU에서 SPI통신을 할 때 다 Adminstrate를 해 줘야 하지만 DMA로 연결해 놓을 경우 Hardware 단에서 관리해 하므로 Applic..
STM32 Bootloader 메뉴 FLASH_If_WriteProtectionConfig 문제 cubeMX : 5.6.1 cubeIDE : 1.3.1 Code Lib Version : STM32Cube_FW_F1_V1.8.0 MCU:STM32F103VBTx Enable the write protection 을 실행 시 Lock 이 이상하게 안 걸리는 문제가 있는데 예제가 잘못되어 있다. 우선, 4번을 눌렀을 시 protection 기능이 동작 하는데 예제에 있는 코드를 FlashProtection 함수로 정리 하였다. void FlashProtection(void) { if (Flash_Protection != FLASHIF_PROTECTION_NONE) { /* Disable the write protection */ if (FLASH_If_WriteProtectionConfig(OB_WRPST..
STM32 IAP (Ymodem 프로토콜) Bootloader - 2 cubeMX : 5.6.1 cubeIDE : 1.3.1 Code Lib Version : STM32Cube_FW_F1_V1.8.0 MCU:STM32F103VBTx https://kjt9109.tistory.com/entry/STM32-IAP-Ymodem-%ED%94%84%EB%A1%9C%ED%86%A0%EC%BD%9C-Bootloader-1 의 이어서 작업.. 이전작업에서 Bootloader 코드를 만들었으므로 이번에는 Application 코드를 만들어 본다. 기존의 메모리를 확인해보면 Bootloader 코드는 0x0800 0000에 올라가 있고 Application Code는 0x0800 4000 에 올리기로 했다. Application은 임의의 프로젝트로 만든다 이때 Application은 코드가..
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..