페리펄럴과 레지스터 1

RDS67_kor·2025년 7월 2일

MCU SW Development

목록 보기
5/13
post-thumbnail

MCU가 제공하는 다양한 기능 예시

  • GPIO: 특정 pin에 전압 출력 on/off 제어
    (General Purpose Input Output)
  • ADC: MCU의 특정 pin에 외부에서 발생되어 걸려있는 전압을 측정
  • 각종 통신: Uart, SPI, CAN, I2C 등 센서를 비롯한 각종 외부장치와의 다양한 통신
  • PWM
  • Watchdog
  • DMA
  • Timer
  • Interrupt
  • DAC

Peripheral(페리펄럴): 이런 기능들을 제공하는 하드웨어

  • MCU 내부에 페리펄럴들이 내장됨
  • MCU마다 내부에 들어있는 페리펄럴 종류, 성능, 개수 다를 수 있음
    -> 본인 과제에 맞는 적절한 MCU 선정 필요

ex) GPIO - port
ADC - ADC
통신 - SPI Uart MultiCAN MCMCAN 등
PWM - PWM FRM TIM1 등

다양한 MCU 관련 설명자료를 제조사에서 제공

  • 제공하는 문서 양식, 이름 등이 제조사마다 다름
    (DataSheet, User manual, Reference manual 등)

MCU SW: 이런 페리펄럴들을 적절하게 컨트롤해야 함

  • 메모리에서 값을 읽어 옴
  • 읽어온 값으로 사칙연산 ex) 더하기 빼기 곱하기 나누기
  • 조건문 판단 ex) if else, switch case
  • 반복문 수행 등 ex) for, while
  • 메모리에 값 쓰기

레지스터: 페리펄럴 내부에 있는 작은 메모리

  • 페리펄럴 내부에 여러 개의 레지스터들이 존재
  • 페리펄럴을 컨트롤하는 리모콘 같은 역할
  • 페리펄럴의 현재 상황을 보여주는 계기판 역할

ex) GPIO -> Port 페리펄럴 제공

에어컨은 페리펄럴, 리모콘은 레지스터
리모콘 설명서은 MCU 내부 설명 문서

레지스터도 일종의 메모리
-> 고유한 메모리 주소 값을 가짐
-> CPU가 값을 쓰고 쓸 수 있음

ex) Port 페리펄럴 설명서
레지스터 A(주소: 100번지)
값 1 -> Pin1에 전압 출력
값 2 -> Pin2에 전압 출력
값 4 -> Pin3에 전압 출력

int main(void)
{
	unsigned int* Reg_A = (undesigned int*) 100;
    
    while(1)
    {
    	*Reg_A = 1;
        
        for(int i=0;i<1000;i++)
        	;
        *Reg_A = 2;
        
        for(int i=0;i<1000;i++)
        	;
        
     }
}

ex) MCU 내부 온도가 40도 초과할 경우 LED 불이 켜지는 기능 구현
MCU User manual -> DTS 센서가 현재 온도 측정 값을 만들어냄
-> 측정 결과는 주기적으로 DTSSTAT 레지스터에 쓰임
-> Address: 0xF02401c0

int main(void)
{
	unsigned int* DTSSTAT = (unsigned int*)0xF02401c0;	// DTSSTAT 레지스터 주소
    unsigned int* Reg = (unsigned int*)100;
    float temperature;
    
    while(1)
    {
    	temperature = (*DTSSTAT) / 7.505 - 273.15;	// 설명서 계산공식
        
        if(temperature > 40)
        	*Reg_A = 1;
        else
        	*Reg_A = 0;
    }
}

0개의 댓글