안녕하세요? 오늘은 자꾸만 까먹어서 기록해 놓은 STM32CubeIDE에서 에서 가장 많이 사용되는 printf 함수의 uart(usart) 구현 방법을 알아보겠습니다. 코드 먼저 보도록 하겠습니다. #include printf가 사용된 곳에 위의 를 include 해줍니다. 그리고 실제 STM32CubeIDE에서 사용가능하도록 _write 함수를 구현해 주면 끝납니다. int _write(int file, char *ptr, int len) { HAL_UART_Transmit(&hlpuart1, (uint8_t *)ptr, len, HAL_MAX_DELAY); return len; } 추가로 printf에서 float 형태의 인자를 받기위해서는 아래와 같은 설정을 해주어야 합니다. 다만 주의할 점은 s..
흔히 고민되는 것이 Window watchdog 과 Indepedent watchdog 중에 어느것을 써야할지에 대한 고민입니다. 두가지 모두 Application 동작중에 오류로 인해 Core가 hang 걸렸을 때 System에 Reset을 걸어주는데 유용하게 사용됩니다. 제가 생각하는 Window watchdog 은 아래와 같은 조건에서 사용되는 것이 좋습니다. 이것 이외에는 Window watchdog, Indepedent watchdog 무엇을 사용해도 괜찮습니다. Window watchdog 사용예 Application이 정밀한 스케줄로 동작되며 지정된 시간에 watchdog을 refresh(kick dog)을 못 시킬 경우 Reset을 하는 용도 Low-power mode에서는 Watchdog..
Strategy 패턴은 아주 단순하며 디자인 패턴 중에 가장 유용한 패턴입니다. 사용법은 아주 간단하며 interface를 만들고 원하는 곳에서 Concrete 코드를 치환해서 사용하면 됩니다. 적절한 예제일지는 모르지만, 특정한 상황에서 uart를 spi로 변경하는 드라이버 예제를 보도록 하겠습니다. 먼저 interface를 구현해보도록 하겠습니다. /* driver.h */ typedef struct { bool (*open)(void); bool (*close)(void); bool (*read)(uint32_t addr, uint8_t *value); bool (*write)(uint32_t addr, uint8_t *value, uint32_t len); }driver_t; open, clo..
ST Edge AI 스위트, ST 하드웨어·임베디드 AI 관련 툴 활용 솔루션 개발 지원 AWS 등 기존 AI 에코시스템 활용·소프트웨어 툴·평가·개발 키트 통합 예정 ST마이크로일렉트로닉스(이하 ST)가 ST의 하드웨어(범용 및 오토모티브 마이크로컨트롤러와 마이크로프로세서, 스마트 센서)와 임베디드 AI 최적화용 관련 툴을 최대한 활용해 고객이 AI 솔루션을 손쉽게 개발할 수 있도록 하는 ST Edge AI 스위트를 제공한다. ST는 Edge AI로 기업의 제품 혁신을 지원하는 포괄적 에코시스템을 제공한다고 7일 밝혔다. ST 하드웨어와 함께 무료로 사용하는 통합 소프트웨어 툴 세트인 ST Edge AI 스위트(ST Edge AI Suite)를 발표함에 따라 고객은 한 단계 더 나아가 인공 지능을 탑재..
RTOS를 사용하지 않는 베어메탈 Firmware에서는 각각의 기능 프로세스의 처리 시간을 적당히 잘 분배 해야 합니다. 처리 시간이 긴 프로세스는 여러개로 쪼개야 하며, 특히 인터럽트 발생시 인터럽트 인터럽트 루틴에 긴 처리시간을 요구하는(지연이 발생하는)코드를 넣으면 절대 안됩니다. 더욱이 애매한 처리 시간을 요구하는 코드를 넣는 경우는 더욱 위험합니다. 왜냐하면 불규칙적으로 에러를 발생되며 디버깅을 위해 많은 시간이 소요될 수도 있습니다. 인터럽트 서비스 루틴에서는 입력된 데이터를 적당한 자료구조에 적재해놓던가, 특정 플래그를 set하는 수준 혹은 메시지 큐에 쌓는 수준의 처리가 가장 좋습니다. 만약 전체 시스템이 1초단위로 어떠한 처리가 끝나야 한다면, 각각의 프로세스들이 최대 처리되는 시간의 합..
RTOS를 사용하지 않는 베어메탈 Firmware의 프로그램 절차는 무한루프와 인터럽트로 이루어져 있습니다. 이번장에서는 무한루프의 구조를 어떻게 바꾸며 보다 효율적이고 좀 더 그럴듯하게 만들 수 있는지 알아보겠습니다. 우선 우리가 알고 있는 기본적인 while 무한루프입니다. /* main.c */ void main(void) { while(1) { process1(); process2(); switch(key) { case button1: break; case button2: break; case button3: break; default: break; ... } } } 위의 코드는 간단해보이지만 실제적으로는 훨씬 더 복잡해 질 가능성이 있습니다. 만약 설정(#ifdef)에 따른 process 유무가..
Polling Conversion에서 유의해야 할 Overrun을 없애는 방법은 무엇일까요? Overrun 제거 그것은 바로 AUTODLY를 Set하는 방법입니다. 아래 그림을 참조하도록 하겠습니다. AUTDLY=1로 설정 한 후 Conversion을 보면 CH1 Conversion 이후 ADC_DR에서 Read하기 전까지는 다음 Channel CH2를 Conversion 하지 않는 것을 볼 수 있는데요, 이러한 이유로 Overrun이 발생하지 않게됩니다. CubeMX 설정 지난 포스트에 이어서 CubeMX의 설정을 알아보겠습니다. 핀설정은 생략하고 Configruation 부분만 발췌하였습니다. 중요한 것은 우리는 여러채널을 한번에 Conversion 하기 위해서 Scan Conversion Mode을..
ADC 변환에는 크게 3가지로 구분 할 수 있습니다. 각각의 장단점은 아래와 같이 간단하게 말할 수 있습니다. 변환방법 장점 단점 Interrupt - 변환시간 절약 - 소프트웨어 트리거 사용가능 - 하드웨어 트리거 사용가능 - 잦은 인터럽트 유발 - 인터럽트 처리가 늦으면 Overrun 발생 Polling - 직관적인 사용성 - 소프트웨어 트리거 사용가능 - 변환시간 및 프로세싱 예측가능 - 프로세서 점유율이 높아짐 - 변환완료 처리가 늦어지면 Overrun 발생 - 하드웨어 트리거 사용이 어려움 DMA - 변환시간 절약 - 하드웨어 트리거 사용가능 - 설정의 복잡함 - 변환완료 프로세스를 잘 처리하지 않으면 Overrun 발생 어플리케이션에 맞는 변환방법을 선택하면 사용성은 물론 최상의 성능을 구현할..