인성 좋은 인성이

ARM - Cortex-M3, 아키덱쳐와 Register제어 본문

IT공부/ARM

ARM - Cortex-M3, 아키덱쳐와 Register제어

전인성 2019. 8. 19. 19:09

 ARM은 모든 것이 address로 접근하여서 값을 설정해 주어야 한다. 따라서 ARM을 다루기 위해서는 CPU 아키텍쳐와 address구성에 대해서 이해하여야 한다.

 

Cortex-M3를 포함한 STM32의 구조

Cortex-M3를 포함한 STM32의 구조

 구조를 좀 자세하게 살펴보면 Bus matrix라는것이 구성원(?)들을 이어주는 모습이 보인다. Bus는 CPU에서 중요한 부분을 차지하며 크게 두가지로 나눠볼 수 있는데 data bus와 address bus가 있다. 

 

 bus matrix가 다 묶여있다보니 bus를 통해서 데이타가 움직일 때 다른 데이타가 움직일 수 없다. 그래서 CPU는 일에 우선순위를 측정하여서 일을 진행한다. 

 

 STM32 CPU에서 BUS가 한 클럭당 전달하는 데이터의 비트 수는 32bit이다.

 

 

 

 Cortex-M3는 연산을 위해 존재하는 칩이다. 실제 데이터는 메모리에 저장이 된다. 또한 Register제어를 위한 주소도 메모리에 저장된다. 아래 사진은 메모리 맵을 보여준다

Memory map

 메모리 맵을 보면 SRAM, Peripherals 등이 어떤부분에 얼마나 차지하고 있는지 알 수있다.

 

 그 중에서 Peripherals 부분을 보면 Peripherals에게 할당되어 있는 주소를 확인 할 수 있다.

이 주소를 사용하여서 Peripherals를 제어할 수 있다.

 

 

 

 저 많은 Peripherals 중에서 Port A를 보자, Port A의 주소값은 0x4001 0800을 시작주소로 가지고 있다.

저 주소를 크게 두가지로 Base와 Offset으로 나눌 수 있다. 

 

 Port A로 예를 들면 0x4001 08까지를 Base, 나머지 00을 Offset이라고 볼 수 있다.

 

 Base와 Offset에 조합에 따라서 내가 제어할 레지스터가 결정된다.

 

 

 

 이해를 돕기위해서 high/low를 주는 예제코드를 보자.

int main (void) {

	*(volatile unsigned int*)0x40021018 = 0x08; //RCC_APB2ENR - PORTB enable
    
	*(volatile unsigned int*)0x40010C00 = 0x33000; //GPIOB_CRL - PORTB3,4 enable
    
    for(;;) {
    
		*(volatile unsigned int*)0x40010c0c |= 0x10; // PORTB 4pin output
        
		Delay(100000);
        
		*(volatile unsigned int*)0x40010c0c &= ~(0x10); // PORTB 4pin reset
        
		*(volatile unsigned int*)0x40010c0c |= 0x08; //PORTB 3pin output
        
		Delay(100000);
        
		*(volatile unsigned int*)0x40010c0c |= 0x10;
        
		Delay(100000);
        
		*(volatile unsigned int*)0x40010c0c &= ~(0x10);
        
		*(volatile unsigned int*)0x40010c0c &= ~(0x08); //PORTB 3pin reset
        
		Delay(100000);
        
    }
}

 

 우선 코드가 작동되는 순서는

 먼저 RCC(클럭을 발생시킴)를 세팅하고, CRL을 통하여 어떤 포트를 사용할 것인지 세팅해야 한다.

 

 나머지는 레퍼런스를 참고하여 확인하길 바란다

 

 추가로 같이보면 좋을 블로그를 링크한다 - https://hoban123.tistory.com/57?category=849655