Study/임베디드시스템및실험

[Exercise 03] 두 LED 동시에 깜빡이기

ansui 2023. 10. 17. 13:37

Exercise 03_두 LED 동시에 깜빡이기

 


< Exercise 03 >

> Exercise objective

P1.0 LED 는 빨간색 LED 가 켜졌다가 꺼지면서 깜빡이도록 설계한다. P2.0 LED 는 빨간색 , 초록색, 파란색 LED 가 차례대로 켜졌다가 꺼지면서 깜빡이도록 설계한다. 즉, P1.0 에서는 빨간색 , P2.0 에서는 빨간색 , 초록색, 파란색의 차례로 두 LED가 동시에 깜빡이도록 설계하는 것이 이 프로젝트의 목표이다.

 

> 코드

#include "msp.h"

void main(void)
{ // 4개의 포인터 변수로 GPIO 포트 p1, p2의 dir, out 레지스터 주소를 선언
  volatile unsigned char *gpio_p1dir, *gpio_p1out, *gpio_p2dir, *gpio_p2out;
  int i;

  // GPIO 포트 p1의 dir, out 레지스터 주소를 설정
  *gpio_p1dir = (unsigned char *)(0x40004C04);
  *gpio_p1out = (unsigned char *)(0x40004C02);
  
  *gpio_p1dir = 0x01; // Red LED dir 설정
  
  // GPIO 포트 p2의 dir, out 레지스터 주소를 설정
  *gpio_p2dir = (unsigned char *)(0x40004C05)
  *gpio_p2out = (unsigned char *)(0x40004C03)

  while(1){
    *gpio_p2dir = 0x01; // Red LED dir 설정
    *gpio_p1out = 0x01; // Red LED on
    *gpio_p2out = 0x01; // Red LED on
    for(i=0; i<100000; i++);

    *gpio_p1out = 0x00; // LED off
    *gpio_p2out = 0x00; // LED off
    for(i=0; i<100000; i++);

    *gpio_p2dir = 0x02; // Green LED dir 설정
    *gpio_p1out = 0x01; // Red LED on
    *gpio_p2out = 0x02; // Green LED on
    for(i=0; i<100000; i++);

    *gpio_p1out = 0x00; // LED off
    *gpio_p2out = 0x00; // LED off
    for(i=0; i<100000; i++);

    *gpio_p2dir = 0x04; // Blue LED dir 설정
    *gpio_p1out = 0x01; // Red LED on
    *gpio_p2out = 0x04; // Blue LED on
    for(i=0; i<100000; i++);

    *gpio_p1out = 0x00; // LED off
    *gpio_p2out = 0x00; // LED off
    for(i=0; i<100000; i++);
  }
}

*volatile 키워드

: 컴파일러에게 해당 변수의 값을 최적화하지 않도록 지시한다.

GPIO 핀은 하드웨어와 직접 상호 작용하므로 값이 언제든지 변경될 수 있으므로 volatile 키워드가 필요하다.


자료는 이화여자대학교 윤명국 교수님의 임베디드시스템및실험 강의에서 가져온 것입니다.