[Cortex-M3] 1. Cortex-M3의 기본 구조와 GPIO

2019. 8. 19. 13:22개발 관련 학습정리/ARM(cortex-m3) Register 분석

반응형

 

cortex-m3의 구조와 입출력 레지스터를 다루어 보자.

cortex-m3의 아키텍처

 

 

 

대표적인 특징을 나열하자면,

1. Data bit, address bit는 1clk당 32bit전달

2. Core, Flash, sram은 bus로 연결

3. Core는 thread단위로 제어가능

4. Amba bus(bus matrix)는 master/slave모드로 구성되어 있고 (AHB, APB1…2) bridge로 나눔

5. RCC (Reset Clock Control)이 클록 제공

6. APB2 – gpio, adc / APB1 - I2C, USART, SPI가 포함되어있다.

7. DMA(Direct Memory Access) – flash에서 가져오는 정보를 따로 처리

등이 있다.

 

 

 

 

 

 

이제 cortex-m3의 아키텍처를 이해하였으면, 그에 대한 레지스터 구조를 알아보자.

cortex-m3의 레지스터 주소는 24비트의 base와 8비트의 offset으로 이루어져 있다.

빨간색 - base 파란색 - offset

 

 

 

 

그럼 본격적으로 gpio에 관련된 레지스터에 대해 알아보자.

 

 

 

 

 

 

1. RCC_APB2ENR

reserved는 비어있다고 생각하면된다.

 

 

bit-14 (USART1EN) : USART통신에 필요한 클락을 활성화 시킵니다.

bit-12 (SPI1EN) : SPI통신에 필요한 클락을 활성화 시킵니다.

bit-11 (TMI1EN) : TIMER1에 필요한 클락을 활성화 시킵니다.

bit-10...9 (ADC1...2) : ADC에 필요한 클락을 활성화 시킵니다.

bit-6...2 (IOPXEN) : PORTX에 필요한 클락을 활성화 시킵니다.

bit-0 (AFIOEN) : Alternate function에 필요한 클락을 활성화 시킵니다.

 

 

 

 

 

 

 

2. GPIOx_CRL

하나의 아웃풋당 4개의 비트가 있다.


CNFx 

input일때 -

00 : analog input

01 : floating input

10 : pull-up/pull-down

11: x

 

output일때 - 

00 : push-pull

01 : open-drain

10 : alternate push-pull

11: alternate open-drain


MODEx

00 : input

01 : output - 10MHz

10 : output - 2MHz

11: output - 50MHz


 

 

 

 

 

 

 

 

3. GPIOx_ODR

0~15비트를 제외한 비트는 사용하지않는다.

 

0~15비트를 이용하여 포트 16개를 출력하는데 사용하는 레지스터이다.

 

 

 

 

 

 

 

 

순서는 클럭 활성화 - GPIO 세팅 - GPIO 입출력 순이다.

이제 예제코드를 통해 알아보도록 하자.

 

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);
        
    }
}

 

ARM으로 배우는 임베디드 리눅스 시스템:CPU에서 안드로이드까지 총망라, 한빛미디어
반응형