본문 바로가기

개발/임베디드

ARM Cortex M3 프로그래밍3 - 인터럽트, NVIC, DMA

반응형

- 인터럽트

: Fetch-Decode-Excute 방식대로 수행하는 것이 지속 불가능한 예외를 처리

: 인터럽트 체크는 파이프라인 각 단계 직후마다 수행

: M3는 Exception Vector를 이용하여 HW적으로 예외 번호에 해당하는 예외 처리

: Vectoring: 예외 처리로 뛰는 과정. 즉, 저장된 예외처리 주소(Handler Addr.)를 HW적으로 보냄

: 모든 인터럽트는 CPU 외부에서 발생. 저전력 상태의 CPU 깨움

 

- NVIC

: Nested Vectored Interrupt Controller

: M3에선 NVIC 전용 함수들이 CMSIS로 제공됨

: 외부 GPIO를 그룹화하여 해당 번호마다 외부 인터럽트 소스로 사용

 

- 인터럽트 우선순위

: Nesting: 수행 중인 인터럽트보다 높은 우선순위의 인터럽트 요청 시, 기존 인터럽트는 일시정지하고 요청된 인터럽트부터 수행 

- 지나친 Nesting은 시스템 스택에 악영향! 해결책?

-> 우선 순위를 정수부와 소수부로 나눔 

-> 정수부 우선순위가 높을 때만 선점(Nesting)

-> 정수부 우선순위가 같거나 낮을 때는 보관(Pending)

: Pending: 수행 중인 인터럽트보다 낮은 우선 순위의 인터럽트 요청 시, 기존 인터럽트 완료 후에 요청된 인터럽트 수행

 

- DMA

: CPU는 내부 동작중에 외부 메모리 버스를 사용하지 않는데, 이 시간동안 DMA가 버스를 사용

: 수행절차?

- [0] CPU가 DMA 작업 설정

- [1] DMA가 CPU에게 메모리 버스 제어권을 요구 (Bus Request)

- [2] CPU가 DMA에 버스 제어권 양보 (Bus Ack)

- [3] DMA가 버스를 이용하여 1 UNIT만큼 전송시킴

- [4] 전송시킨 후 CPU에 제어권 반납

- [5] [1]~[4] 반복, 즉 DMA는 1 UNIT만 전송시키고 다시 버스 제어권 요청 반복

: M3에서는 DMA마다 1~5채널이 있어서, 채널 우선순위에 따라 Arbiter가 제어함

:* Source장치: 시작 주소, UNIT크기, 주소 모드(증가,고정)

|

V

     DMA: Mem to Mem인지 Mem to Peripheral인지, 전송 횟수(COUNT) , Circular모드, 채널 우선순위

|

*Destination장치: Source와 동일

: 주소 증가모드?

- 증가모드: 소스, 목적지가 동일한 크기로 데이터 전송 (Mem to Mem)

- 고정모드: 소스, 목적지가 주소를 고정시켜서 데이터 전송 (Mem to Peri)

메모리-> UART로 100B 데이터 전송하려면?

메모리(증가모드) -> UART(고정모드)로 1 UNIT을 100번(COUNT) 전송!

>이처럼, DMA가 동일한 주소에서 데이터를 R/W하는 경우 증가모드 설정해야함.

>소스와 목적지의 주소모드에 따라 FIX(고정), INC(증가)로 설정

: ->CCRx: 각 채널에 대해 DMA 동작을 위한 기본 설정

: ->CNDTRx: 각 채널의 전송 횟수 설정(16bit이므로 최대 65535)

: ->CMARx: 각 채널의 Mem 주소 저장

: ->CPARx: 각 채널의 Peri 주소 저장

: ->ISR: 각 채널에 대한 상태 flag 확인

: ->IFCR: 각 상태 flag를 clear (=1)

 

 

 

 

 

 

https://developer.arm.com/ip-products/processors/cortex-m/cortex-m3

 

본 게시글은 개인 공부용으로 작성하여 내용의 퀄리티가 부족할 수 있습니다. 

상세한 회로도나 스펙을 보시려면 arm 매뉴얼 참고 바랍니다.

반응형