전체 글23 13. [STM32] Interrupt-Register 이번장에서는 인터럽트에 관련된 레지스터에 관해 살펴보자.순서는 인터럽트가 초기화 되는 순서대로 볼 것이다.이 순서는 MX_GPIO_Init()함수에서 각 핀별로 호출되는 HAL_GPIO_Init()함수와 HAL_NVIC_SetPriority(), HAL_NVIC_EnableIRQ()에 구현된 순서이다. HAL_GPIO_Init()에서 사용되는 레지스터의 경우 '1. 레지스터 초기화(GPIO설정)'에서 나머지는 '2. Control 레지스터 초기화'에서 설명한다. 1. 레지스터 초기화(GPIO 설정)인터럽트 초기화 설정은 CubeMX의 설정 따라 MX_GPIO_Init()에서 설정되고 각 핀별로 HAL_GPIO_Init()을 통해 초기화 된다.HAL_GPIO_Init()함수의 GPIO설정 부분은 GPIO .. 2024. 9. 26. 12. [STM32] Interrupt 개요 인터럽트란 사전전 의미 그대로 방해하는 행위를 말한다.즉, MCU가 일을 계속 하고 있는 도중 어떤 이벤트가 발생해서 MCU에게 잠시 실행을 중지하고 이것부터 우선적으로 처리하도록 하는 방식이 인터럽트이다.이 인터럽트에는 ARM에서 정해놓은 중요 인터럽트 이외에도 사용자가 직접 정의해서 사용할 수 있는 인터럽트도 있다.Hello World나 Entry Point등의 이전 장들에서도 언급을 했었는데 이번장에서 자세히 알아보도록 하자.이전 장들 특히 Entry Point에서 언급한 Interrupt Vector Table등의 내용들과 병행해서 보는게 이해가 빠를 수 있다. 본 블로그는 STM32를 소프트웨어 엔지니어 관점에서 바라본 블로그입니다. 따라서 회로등의 전자공학 관련 내용은.. 2024. 9. 26. 2. [전자일반] Open-Collector / Open-Drain Open-Collector를 이해 하기 위해서는 우선 내부에 사용되는 BJT(Bipolar Junction Transistor)의 동작 방식을 이해해야 한다.그림과 같이 BJT의 경우 베이스쪽에 걸리는 전압에 따라 컬렉터에서 이미터 쪽으로 전류가 흐르게도 흐르지 않게도 할 수 있다. 여기서 베이스쪽을 MCU의 Output에 연결하고 콜렉터쪽을 MCU외부 GPIO핀으로, 그리고 이미터쪽을 GND에 연결한 구조가 Open-Collector이다.BJT대신 MOSFET소자를 사용한게 Open-Drain이고 이 둘은 소자의 차이이외에 동작방식은 동일하다. 위의 그림에서 Signal쪽이 MCU의 출력쪽이고 MCU는 이 출력을 통해 콜렉터에서 이미터쪽으로 흐르는 전류를 제어할 수 있다. 하지만 이 상태로는 MCU외부.. 2024. 9. 24. 11. [STM32] SWV/ITM 을 사용한 디버깅 CubeIDE의 디버깅 기능을 사용하면 실시간으로 특정 변수의 값을 관찰할 수 있다. 하지만 이 방법은 코드 한줄한줄 단계별로 실행해야 하므로 변화되는 연속적인 값을 봐야 하는등 시간적 값의 변화 관찰에는 적합하지 않다.이런 상황에서는 보통 UART를 이용해 값을 전송해서 확인하는 방법을 사용 할 수 있는데 이번장에서는 UART를 사용하지 않고 CubeIDE의 출력창에 printf를 사용해 문자열을 그대로 표시하는 방법을 설명하고자 한다. 1. 설정SWV(Serial Wire Viewer)/ITM(Instrumentaion Trace Macrocell) 은 위에 기술한대로 printf등의 문자열 출력 함수로 CubeIDE의 콘솔화면에 문자를 표시하는 기능이다.단, 이 기능은 ARM Cortex-M3/M4.. 2024. 9. 23. 10. [STM32] GPIO예제(feat. Open Drain) 이번장에서는 GPIO의 단순 bit I/O기능을 이용한 실습을 해보자.LED를 켜고 끄는 예제인데 단순히 껐다, 켰다하는건 이전장에서 많이 해봤으므로 여기서는 여러개의 LED를 배열해 좌우로 왔다갔다 하도록 만들것이다.이때 출력 방식은 앞의 장에서는 설명하지 않았던 Open Drain방식을 사용한다. 본 블로그는 STM32를 소프트웨어 엔지니어 관점에서 바라본 블로그입니다. 따라서 회로등의 전자공학 관련 내용은 사실과 다를 수 있습니다. 본 블로그에서 사용된 MCU 및 개발보드는 다음과 같습니다. NUCLEO-F429ZI (STM32F429ZIT LQFP144) NUCLEO-F439ZI (STM32F439ZIT LQFP144) .. 2024. 9. 23. 9. [STM32] Bit-banding 이전 장에서 살펴본 바와 같이 GPIO를 제어할때 HAL Library를 사용하거나 레지스터를 직접 엑세스 해서 제어 할 수 있었다. 하지만 HAL Library내부로 들어가면 어차피 레지스터를 엑세스하는게 전부이므로 사실 둘다 동일한 방법이라고 볼 수 있다.HAL Library 내부를 살펴볼때 확인했겠지만 각 레지스터는 대부분 비트단위로 제어를 해야 하는데 우리가 엑세스할 때는 uint32_t를 사용해 4바이트 단위로 엑세스를 해야하기 때문에 각종 Mask와 비트 연산자들을 사용해야 한다. 이 장에서 소개할 Bit-banding은 이런 접근을 좀더 편하게 할 수 있도록 해주는 방법이다. 즉 각 레지스터 하나의 비트를 남는 메모리에 4바이트 단위로 할당해서 각 비트를 엑세스 할 수 있도록 해주는 방식이다.. 2024. 9. 10. 8. [STM32] GPIO - Peripheral Register 2 앞장에서 HAL Library의 소스를 통해 GPIO의 레지스터를 살펴보았다.이번장에서는 앞에서 살펴보지 않은 GPIO초기화 관련 내용들을 살펴보자. 본 블로그는 STM32를 소프트웨어 엔지니어 관점에서 바라본 블로그입니다. 따라서 회로등의 전자공학 관련 내용은 사실과 다를 수 있습니다. 본 블로그에서 사용된 MCU 및 개발보드는 다음과 같습니다. NUCLEO-F429ZI (STM32F429ZIT LQFP144) NUCLEO-F439ZI (STM32F439ZIT LQFP144) " data-ke-type="html">HTML 삽입미리보기할 수 없는 소스 1. GPIO 초기화 함수GPIO의 초기화 함수는 main함수에서 .. 2024. 8. 13. 7. [STM32] GPIO - Peripheral Register 1 이번 시간에는 앞에서 만든 GPIOTest 프로젝트에서 사용된 HAL Library 의 소스를 살펴볼 것이다.사실 소스를 보면 대부분의 루틴은 Peripheral Register를 엑세스하는 일이다. 따라서 이번장에서는 HAL Library의 내부 코딩을 살펴보는 것이지만 실제로는 GPIO의 레지스터의 구성을 알아보는 것이다.단순히 라이브러리로 제공되는 함수만 기계적으로 쓸게 아니라 내부가 어떻게 구성되어 있는지 보는것도 의미가 있을 것이다. 다행히 대부분의 소스는 우리가 확인할 수 있다. 본 블로그는 STM32를 소프트웨어 엔지니어 관점에서 바라본 블로그입니다. 따라서 회로등의 전자공학 관련 내용은 사실과 다를 수 있습니다. 본 블로그에서 사용된 MCU 및 개발보드는 다음.. 2024. 7. 26. 이전 1 2 3 다음