-
Notifications
You must be signed in to change notification settings - Fork 0
20260507_CMSIS
해당 Commit은 STM32H723에 들어 있는 ARM Cortex-M7 프로세서와 그 주변 장치 (ITCM/DTCM RAM, SRAM, Flash Memory, USB Controller 등)의 레지스터를 실제 주소 대신 이름 또는 구조체로 편리하게 제어할 수 있게 해주는 CMSIS-Core (ARM) 라이브러리와 CMSIS-Device (ST Microelectronics) 라이브러리를 추가한다.
STM32H723에는 약 140개의 Hardware Interrupt와 Software Interrupt (Exception)가 있는데[1], 이 중에서 54번째 Interrupt (TIM6_DAC)만을 비활성화하는 코드를 짜야 한다고 가정하자.
ARM Cortex-M7에서는 Interrupt가 발생하면 NVIC (Nested Vectored Interrupt Controller)라는 하드웨어 회로가 Interrupt가 발생했을 때 실행할 함수의 주소 (Interrupt Service Routine, Exception Handler)를 ITCM RAM의 0x00000000에 있는 Vector Table에서 찾고 해당 주소를 Program Counter에 넣는데, 특정 인터럽트를 비활성화시키기 위해서는 NVIC의 NVIC_ICERx라는 "Interrupt Clear-Enable" 레지스터[2]에서 그 인터럽트에 해당하는 비트를 켜야 한다.
// NOTE: 0번째부터 31번째 Interrupt까지는 `NVIC_ICER0`에서 담당함
#define NVIC_ICER1 0xE000E184
// NOTE: `NVIC_ICER1`의 22번째 비트를 켜면 54번째 Interrupt를 비활성화할 수 있음
*((volatile uint32_t *) NVIC_ICER1) = (1 << 22);그러나 이런 식으로 레지스터의 주소를 매뉴얼에서 직접 찾아 비트를 켜는 방식은 가독성이 나쁘고, 무엇보다도 주소 계산이나 비트 연산을 잘못해서 버그가 생길 가능성이 높아지므로, ARM에서는 자사 프로세서의 레지스터와 Exception Handler를 더 편하게 접근 및 정의할 수 있게 해주는 CMSIS (Cortex Microcontroller Software Interface Standard)라는 라이브러리를 이용하여 Firmware를 개발하는 것을 권장하고 있다.
// NOTE: 비트 연산 하나도 없이, 단 한 번의 함수 호출로 54번째 Interrupt 비활성화
NVIC_DisableIRQ(TIM6_DAC_IRQn);[1] RM0468, Rev. 3, pp. 731-739.
[2] PM0253, Rev. 5, p. 184.