- 인터럽트
: 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모드, 채널 우선순위
|
V
*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 매뉴얼 참고 바랍니다.
'개발 > 임베디드' 카테고리의 다른 글
RTOS 3 - ECB (0) | 2021.05.12 |
---|---|
RTOS 2 - uC/OS 실시간 커널 구조 (0) | 2021.05.12 |
RTOS 1 - 개요 (0) | 2021.05.12 |
ARM Cortex M3 프로그래밍2 - 카운터, 타이머 (0) | 2021.05.12 |
ARM Cortex M3 프로그래밍1 - 기본 팁, GPIO, UART 제어 (0) | 2021.05.12 |