Tutorial #7: 소프트웨어 작성 방법 및 보드 반영

기운찬곰·2025년 10월 14일

회로 및 PCB 설계

목록 보기
7/9
post-thumbnail

📕 Tutorial #7: How to Write Software And Program Your Board - Step by Step 영상을 참고하여 정리 및 실습한 글입니다. - 참고


MPLAB 설치

보드에 프로그래밍하는 방법에 대해 알아봅니다. 이를 위해서는 MPLAB이라는 소프트웨어가 필요합니다. 다운로드하고 설치를 진행하세요. IDE 설치 하시고요. 영상보고 쉽게 따라할 수 있으니 간단한 소개만 합니다.

설치시에 8bit MCUs 만 선택하도록 합니다. 모든것을 활성화할 수 있지만, 우리는 지금 8비트 마이크로컨트롤러만 필요하니까요. 모두 다 설치하면 용량도 많이 듭니다.

이어서 컴파일러도 필요합니다. XC8 Compiler가 필요합니다.

설치가 끝나면 아래와 같은 메인 화면이 나옵니다.

MCC (MPLAB Code Configurator)

MCC는 Microchip의 PIC/AVR 마이크로컨트롤러 개발 시 핀 배치, 주변장치(UART, SPI, I2C 등), 클럭 설정 등을 GUI로 클릭만 하면 자동으로 초기화 코드를 생성해주는 그래픽 코드 생성 도구입니다.

MCC는 MCC Melody, MCC Classic, MPLAB Harmony의 세 가지 콘텐츠 유형으로 구성됩니다. 임베디드 소프트웨어 개발을 위한 애플리케이션 라이브러리와 시스템 및 주변 장치 드라이버를 제공합니다.

설치하려고 봤더니 이미 설치가 되어있네요? 만약 설치가 안되어있다면 MPLAB을 열고 도구 > 플러그인에서 사용가능한 플러그인을 보면 목록에서 코드 구성기를 찾을 수 있습니다.

이렇게 설치를 한 다음에, MCC 시작할 때 MCC Melody, MCC Classic, MPLAB Harmony의 세 가지 콘텐츠 유형 중 선택해서 사용하면 됩니다. 추천하는 건 Melody 인 거 같긴 한데, 자료 찾기가 어렵고, 나사가 좀 빠져있는 느낌이 듭니다.

튜토리얼 영상에서는 Classic 모드를 사용하고 있으므로 Classic 모드를 이용하는게 정신 건강에 좋을 수도 있습니다. (전 몰랐습니다...ㅠ)


Installing PickKit 4

디버거와 디버거용 PickKit을 가져와서 컴퓨터 USB에 연결합니다. 디버거가 올바르게 설치되면 장치에서 디버거를 볼 수 있을겁니다. PC 연결하면 알아서 설치되는거 같습니다. 새 프로젝트 생성 시 제대로 뜨는지 확인해볼 수 있습니다.

저는 "MPLAB® PICkit™ 5 In-Circuit Debugger"(이전 버전 4) 구매를 하는건 좀 비싸다고 생각해서 대안으로 PG164100 (MPLAB SNAP DEBUGGER)를 구입해서 사용해보려 합니다.

디바이스마트에서 해외직구(대행)으로 18000원 정도에 구매 가능합니다.

데이터 시트를 살펴보니 핀 맵은 동일한거 같습니다. 따라서 PICkit 연결하는 것처럼 연결해서 사용하면 됩니다.


Starting a new project

새 프로젝트에서 마이크로칩 임베디드 > 애플리케이션 프로젝트 선택.

다음으로 여기서 사용할 마이크로컨트롤러 입력. 툴은 Snap 디버거 선택합니다.

Supported Debug Header는 그냥 None을 선택합니다.

다음으로 컴파일러를 선택합니다. 우리가 설치한 XC8를 선택하면 됩니다.

마지막으로 프로젝트명, 프로젝트 위치를 선택하면 끝입니다. 여기서는 Tiny-Simple이라고 했습니다.

이렇게 프로젝트 생성 후 설정(Options) > 빌드 도구에서 컴파일러가 제대로 선택되었는지 확인합니다.

디버거 설정도 확인해봅니다. 프로젝트 > 오른쪽 마우스 > Properties. 그러면 디버거(Snap)에 대한 정보를 볼 수 있습니다. 역시 제대로 설정이 되었습니다.


Starting with Code Configurator

Tools > Embedded 에서 Code Configurator를 열도록 합니다. (좀 걸립니다)

코드 구성기를 사용하고 MCC 또는 MPLAB 코드 구성기가 로드되면 가장 먼저 해야할 일은 올바른 패키지를 설정하는 겁니다. SSOP20을 선택하십쇼. 이제 마이크로컨트롤러 핀들을 볼 수 있습니다. STM32CubeMX랑 비슷한 거 같네요.

아래를 보면 핀들이 어떤 주변장치에 어떻게 할당되었는지 볼 수 있습니다. (지금은 이미 좀 만져놓은 상태라서 초기랑 다름)

주의. Pin Package View를 닫았더니 다시 여는 법을 못찾겠네요. (MCC 다시 껏다 켜면 나오긴 합니다)

참고로 내 화면과 튜토리얼 영상 화면 구성이 좀 다른거 같은데 MCC Melody 버전이랑 MCC Classic 버전 차이라고 보면 됩니다.

처음에 시작할 때 MCC 확인해보니까 이런게 뜨는데요. 기본적으로 Melody를 권장하나봅니다.

Classic를 선택하려고하면 이렇게 뜹니다. 더 이상 지원되지 않는다고 경고하는 문구네요.

무시하고 클래식으로 진행하면 이렇게 뜹니다. 아하~ 튜토리얼 영상이랑 동일하게 뜨네요. 처음부터 이걸 했으면 정신 건강에 좋았을 뻔 했네요. (ㅠㅠ)

MCC 를 사용하는 이유

왜 MCC 코드 구성기를 사용할까요? 🤔

꼭 쓸 필요는 없어요. 대신 데이터시트를 열고 사용하고 싶은 주변 장치를 기반으로특정 레지스터를 찾아 설정해야 합니다. 그런 다음 이러한 레지스터의 각 비트의 기능이 무엇인지 읽고 이를 설정합니다. 이런 식으로 해야 한다면 많은 노력이 필요할 수 있습니다. 엄청난 시간이 걸릴 수도 있어요.

때로는 올바르게 설정했는지, 잘못 설정했는지 측정하기가 매우 어려울 때가 있습니다. 때로는 설정이 제대로 작동하지 않고 그 이유를 알 수 없는 경우도 있습니다. 그 이유는 마이크로컨트롤러 레지스터의 어딘가에 비트 하나를 설정하는 것을 잊었기 때문입니다. 마이크로컨트롤러 레지스터를 올바르게 설정하려면 며칠, 심지어 몇 주가 걸릴 수 있습니다.

이 MCC 구성기를 사용하면 훨씬 간단해질 겁니다. 기본적으로 여기에는 몇 가지 형태와 기능이 있는데, 애플리케이션에 필요한 것에 따라 이러한 기능을 선택하고 형태를 설정하면 MCC가 레지스터에 대한 올바른 값이 무엇인지, 무엇을 설정해야 하는지 자동으로 계산합니다.

또한 몇 가지 기본 기능을 생성하는데 이는 코드에서 아주 간단하게 호출하여 사용할 수 있습니다. 따라서 매우 기본적이고 낮은 수준의 함수를 작성하는 데 드는 시간도 절약할 수 있습니다.


Clock Control 설정

우리가 가장 먼저 설정할 것은 시스템 > 시스템 모듈 > 내부 발진기 입니다. (Melody 버전은 Clock Control 이란 이름에서 설정).

우리는 외부 발진기가 없으므로 내부 발진기를 사용하고 싶습니다. 테스트를 위해 마이크로컨트롤러를 가능한 가장 높은 주파수로 실행하고 싶습니다. 그럼 PLL을 활성화하겠습니다. 활성화하면 내부 클럭 주파수 8MHz에 4를 곱할 수 있습니다. 따라서 시스템 클럭은 32MHz가 됩니다.

또한, 워치독이 비활성화되어 있음을 주목하세요. 이것을 그대로 두고 저전압 프로그래밍 모드를 활성화합니다. 이는 디버거 설정에서 설정한 내용과 일치합니다. (여기서는 안보이네요)

PLL 활성화란?

PLL은 Phase-Locked Loop의 약자로, 위상 고정 루프 또는 위상 동기 회로라고 불립니다. 입력 신호와 출력신호에서 되먹임된 신호와의 위상차를 이용해 출력신호를 제어하는 시스템을 말합니다. 입력된 신호에 맞추어 출력 신호의 주파수 조절이 목적입니다.

기준 주파수를 통해서 주기적 신호의 위상을 원하는 대로, 흔들리지 않는 정확한 주파수로 고정시켜 주는 위상 고정 루프 회로입니다. 즉, 일정한 주파수로 유지시켜 주는 회로라고 생각하면 되겠습니다. (그렇게 되면 x2, x4 이런식으로 할 수 있는거군요?)

실제 기능은 다음과 같습니다. 주파수 변환, 제어 할 수 있는 용도로 쓰입니다.

입력과 출력의 주파수 차이는 결국 주파수 디바이더 N에 따라 달라집니다. N의 배수에 따라, 출력신호의 주파수는 입력신호의 주파수의 N배가 됩니다. 대부분의 PLL에서 입력에 비해 출력의 주파수가 높게 발진합니다.

참고. wikipedia > 위상동기회로


Implementing PWM output

회로도를 열어서 마이크로컨트롤러가 무엇을 하고 싶은지 봅시다. RGB LED를 제어하고 싶네요. 그러기 위해서는 RC3, RC5, RC6 핀에 대해 PWM 기능을 활성화하고 싶습니다.

데이터시트를 열어서 핀과 기능에 대한 표를 보고 싶습니다. RC3, RC5, RC6 핀에 어떤 모듈을 사용해야 하는지 보고 싶네요. CCP2, CCP1, CCP4 를 사용하면 됩니다.

우리는 CCP, ECCP에 관심이 있습니다. 이는 LED를 제어하는 데 사용하는 핀에 PWM 기능을 제공할 수 있는 모듈입니다. ECCP1을 클릭하고 PWM 모드를 사용 설정합니다. 근데 ECCP1 모듈을 사용하려면 타이머를 설정해야 하는 군요.

CCP, ECCP

PIC 같은 마이크로컨트롤러를 다룰 때 자주 보이는 게 바로 CCP와 ECCP 모듈인데요. CCP (Capture / Compare / PWM) 라는 뜻입니다.

  • Capture (캡처): 외부 입력 신호(핀에 들어오는 펄스)의 타이밍을 “Timer” 값으로 캡처합니다.
  • Compare (비교): Timer 값과 미리 지정한 값이 같아지면 이벤트를 발생시킵니다.
  • PWM (Pulse Width Modulation, 펄스폭 변조): 일정한 주기의 신호에서 듀티 사이클(켜져 있는 비율)을 조절해 신호 출력.

ECCP는 말 그대로 확장(Enhanced)된 CCP예요. CCP의 모든 기능을 지원하면서, 추가 기능들이 들어가 있습니다. 더 이상 설명은 생략하겠습니다.

Timer와 CCP는 서로 연관이 되어있는데요. 타이머 (Timer)는 시간을 세는 카운터입니다. 클럭이 들어오면 0 → 1 → 2 → … 계속 증가하다가 오버플로우 되면 다시 0으로 돌아갑니다. Timer1, Timer2... 이런식으로 여러 개가 있고, 각각 특성이 다릅니다. CCP 자체는 시간이 흐른다는 개념이 없습니다. 시간 기준이 필요하기 때문에, 반드시 "Timer"와 연결해서 동작합니다.

결국에는 CCP는 Timer가 없으면 아무 것도 못하고, Timer는 CCP가 없으면 그냥 똑딱거리기만 합니다. 둘이 합쳐져야 신호 캡처, 정밀한 비교 이벤트, PWM 출력 같은 응용이 가능합니다.

참고로 CCP, ECCP 용어는 PIC 계열 MCU에서만 사용되는거 같습니다. 다른 MCU(예: STM32, AVR, ESP32 등)에서는 같은 기능을 하지만 이름이 다르거나 통합되어 있습니다. Timer 안에 "캡처/비교/PWM" 기능이 기본 포함되어 있는 경우가 많습니다.

Timer 설정

프로젝트 리소스> Drivers 에도 Timer 라는게 있는데 ECCP가 기본적으로 Timer2를 제안하는 거 같습니다. 설정해보도록 하죠.

Prescaler을 1:64로 설정하고, 주기를 320μs로 설정하고 싶습니다. 이는 예를 들어 어떤 종류의 LED를 사용하는지, 또는 프로젝트에서 어떤 종류의 주파수를 사용할 수 있는지에 따라 달라질 수 있습니다. 확실하지 않다면 여기에 입력한 것과 같은 숫자를 입력하면 됩니다.

🤔 Prescaler 이란 무엇인가요?

Timer가 동작할 때 입력되는 클럭 주파수를 분주(나눠줌)하는 장치예요. 예를 들어, MCU 내부 클럭이 4MHz라면, Timer에 그대로 공급하면 너무 빨리 오버플로우가 발생해요. 그래서 Prescaler을 걸어서 클럭을 느리게 만들어줍니다.

1:64 는 "입력 클럭을 64로 나눈다"는 뜻입니다. 즉, 64번 클럭이 들어올 때마다 Timer가 1 증가한다는 의미입니다. 예를 들어, MCU Instruction Clock = 1 MHz (즉, 주기 1 μs), Prescaler = 1:64 이라면 Timer 카운터 증가 주기 = 64 μs인거죠.


위 경우를 생각해볼까요? 내부 클럭 주파수 8MHz, PLL 활성화, x4 적용되므로 시스템 클럭 32MHz 인 경우 Prescaler 1:64를 적용하면 어떻게 될까요?

  • 내부 오실레이터: 8 MHz
  • PLL ×4 → Fosc = 32 MHz
  • PIC 계열 Timer2 입력은 보통 Fosc/4 이므로 8 MHz가 Timer2에 들어갑니다.

Timer2 카운트 주파수 = 8 MHz ÷ 64 = 125 kHz
Timer2 카운트 1개 주기 = 1 / 125 kHz = 8 µs

아, 그래서 위에서 Timer Period > Requested Period 를 보면 범위가 8μs ~ 2.048ms 로 나와있는 이유가 이거네요. 최소 주기 PR2=0 → 8 µs, 최대 주기 PR2=255 → 256×8μs=2.048ms 인 거죠. 만약 내부 클럭을 8MHz가 아니라 16MHz로 하면 해당 범위 값도 바뀝니다.

원하는 주기 T = 320 µs가 위 범위(8 µs ~ 2.048 ms) 안에 있으므로 Timer2로 직접 설정 가능합니다. 이때, 필요한 PR2 값은 39입니다.

PR2는 Timer2의 Period Register (주기 레지스터)입니다. 즉, Timer2가 언제 다시 0으로 리셋될지를 정하는 값이에요. PR2 값이 클수록 PWM 주기가 길어지고, 작을수록 짧아집니다.


🤔 320 µs 보다 빠르거나 느리면 어떻게 될까요?

  • 320 µs보다 빠른 경우 (예: 100 µs, 50 µs 등). 주파수가 높아짐. LED가 사람이 보는 눈에는 더 "부드러운 밝기"로 보입니다. 모터인 경우라면 더 매끄럽게 회전합니다. 단점은 주파수가 너무 높아지면 MCU 연산 부담 증가. 드라이버/부하 회로의 스위칭 손실이 커집니다.
  • 320 µs보다 느린 경우 (예: 1 ms, 10 ms 등). 주파수가 낮아짐. LED가 "깜빡임"이 보입니다. 사람 눈은 보통 200 Hz 이상이면 깜빡임을 못느끼긴 합니다. 모터는 토크 리플(덜컹거림)이 생길 수 있음. 대신 MCU 부담은 줄어들고, 스위칭 손실도 줄어듭니다.

그래서 일반적으로 LED 제어는 수 kHz 이상 (예: 1~10 kHz), 모터 제어는 더 높게 (10 kHz 이상, 보통 20 kHz) 로 맞춥니다. 우리는 T = 320 µs 이므로 주파수는 3.125kHz 가 됩니다. LED 제어로는 적당하네요.


🤔 타이머/카운터와 PWM 관계

타이머/카운터와 PWM은 매우 밀접한 관계가 있습니다. 실제로 PWM은 타이머/카운터를 기반으로 동작합니다. 타이머/카운터가 하드웨어적으로 PWM 파형을 생성하는 엔진 역할을 합니다.

시스템 클록 → 분주기 → 타이머/카운터 → 비교기 → PWM 출력
                                    ↑
                                비교값(OCR)

동작 과정은 다음과 같습니다.

  1. 타이머 카운트: 0부터 최대값(TOP)까지 계속 카운트
  2. 비교 동작: 현재 카운트 값과 설정된 비교값(OCR) 비교
  3. 출력 제어: 카운트 < 비교값 → HIGH 출력 // 카운트 ≥ 비교값 → LOW 출력

PWM (CCP/ECCP 설정)

이제 다시 돌아가서 기본 듀티 사이클이 50% 설정하고요. 네 완벽합니다. ECCP2도 설정합니다. CCP4도 설정합니다.

🤔 Duty Cycle 이란?

PWM 신호는 “켜짐(High)”과 “꺼짐(Low)”을 일정 주기로 반복하는 파형이에요.

즉, 얼마나 오랫동안 High 상태로 유지되는가를 백분율로 표현한 값입니다. 앞에서 PWM 주기를 320µs 로 설정했고, Duty = 50% 이라면, → High = 160 µs, Low = 160 µs 이 반복된다는 의미죠.

50% 설정한 이유는 가장 직관적인 기준값이라서 그렇습니다. 파형이 절반은 켜지고, 절반은 꺼지니까 설명하기 쉽습니다. LED 제어에서 50%라면 LED가 “중간 밝기”로 보이게 됩니다.

🤔 CCPR Value가 79인 의미는?

CCPRx는 CCP 모듈에서 쓰는 "16비트 레지스터" (x는 모듈 번호, 예: CCPR1, CCPR2 …)를 말합니다. PR2이 PWM 주기 결정를 결정한다면 CCPR은 PWM 듀티(High 시간)을 결정하는 거에요. 듀티 싸이클 50%라면 → 주기 카운트의 절반에서 High → Low로 바뀌어야 합니다. 39 / 2 ≈ 19.5 → 약 19가 맞습니다.

하지만 실제 계산은 PWM 분해능에 4를 곱해서 PR2 = 39 → (39+1) × 4 = 160 단계, 따라서 듀티 싸이클은 0~159 단계로 표현 가능하고요. 따라서 50%로 설정하면 80, MCC 변환 floor(0.50 × 160) - 1 = 79 로 표시하게 됩니다. (음... 그런가보다 하고 넘어가겠습니다)

중요한 것은 LED 밝기를 조정한다고 했을 때, 우리는 CCPR 0~159 값으로 조정하면 된다는 거죠. 0% 밝기 (꺼짐) = 0, 100% 밝기 (최대) = 159, 50% 밝기 = 79 입니다.

핀 할당 맞는지 확인

그런 다음 컨트롤러의 핀 할당이 올바른지 다시 한번 확인합니다.

예를 들어, CCP4는 RC6핀 (8번핀)에 할당되어 있습니다. 회로도를 보면 LED G(녹색) 밝기를 제어하고 있네요.

나머지 핀도 확인해보죠. ECCP1은 RC5핀 (5번핀)에 할당되어 있습니다. 파란색 LED의 밝기를 제어합니다. ECCP2는 RC3핀 (7번핀)에 할당되어 있습니다. 빨간색 LED의 밝기를 제어합니다.

이러한 출력 중 일부는 실제로 다른 핀에 할당될 수 있습니다. 예를 들어 ECCP2 모듈의 PWM 출력도 핀 번호 2 또는 RA5핀에 있을 수 있습니다. 확인을 잘 해줘야겠죠?

그리고 핀 설정을 확인할 때 시스템 > 핀 모듈을 클릭하여 여기의 설정을 살펴보세요. 때로는 풀업 저항을 활성화하거나 일부 출력을 오픈 드레인으로 설정하고 싶을 수도 있습니다. 이 표에서 할 수 있는 일은 아날로그의 체크를 해제하는 것입니다. 표준 출력이 될 테니까요.

🤔 아날로그 체크를 해제한다는게 뭘까요?

PIC 마이크로컨트롤러에서 핀은 "디지털 기능" 또는 "아날로그 기능" 으로 동작할 수 있습니다. 기본적으로 일부 핀은 ADC 입력(아날로그 입력) 으로도 사용할 수 있게 설계되어 있습니다. 하지만 PWM, GPIO 출력 등 디지털 기능으로 쓰려면 아날로그 기능을 꺼야 합니다.

Delay 추가하기

우리의 간단한 예에 사용할 수 있는 매우 유용한 것이 하나 더 있습니다. Foundation Services를 클릭하고 Delay를 추가합니다. LED가 켜지거나 꺼지는 시간을 매우 간단하게 설정할 수 있습니다.

자, 이제 코드 Generate를 해봅시다. 버튼을 클릭하세요. 프로젝트로 돌아가면 몇 개의 파일이 있는 것을 볼 수 있습니다. 이 모든 것은 MCC에서 자동으로 생성되었습니다.


코드 작성

main.c 파일은 우리가 소프트웨어를 작성할 파일이고, 나머지는 우리가 사용하는 주변장치에 대한 레지스터를 설정한 파일입니다. 이는 주변 장치를 사용하는 데 도움이 되는 파일이며, 사용할 수 있는 몇 가지 간단한 함수가 있습니다. 또한 delay 기능도 보이네요.

우리의 첫번째 프로그램은 먼저 RGB LED를 모두 100%로 설정합니다. 그러면 흰색이 나옵니다. 그리고 1초간 기다린 후 듀티 사이클을 0%로 변경합니다. 즉 LED를 끄겠다는 의미입니다. 그리고 다시 1초를 기다린 후 이를 반복합니다.

우리가 필요하는 것은 LED의 듀티 사이클을 변경하는 기능과 지연 기능입니다. 지연 함수를 사용하는 방법은 매우 간단합니다. delay.h 파일을 열어보세요.

/**
*  @ingroup delay
*  @brief Delays the execution of the program for a certain number of milliseconds
*  @param[in] milliseconds - Number of milliseconds to delay
*  @return None.
*/
void DELAY_milliseconds(uint16_t milliseconds);

/**
*  @ingroup delay
*  @brief Delays the execution of the program for a certain number of microseconds
*  @param[in] microseconds - Number of microseconds to delay
*  @return None.
*/
void DELAY_microseconds(uint16_t microseconds);

DELAY_milliseconds(1000); 을 사용하면 1초 지연되겠다는 걸 알 수 있습니다.

LED의 듀티 사이클을 변경하는 기능은 PWM 폴더에서 eccp1.h 파일을 한번 열어서 확인해보겠습니다.

 /**
 * @ingroup pwm1
 * @brief Initializes the ECCP1 module. This is called only once before calling other ECCP1 APIs.
 * @param None.
 * @return None.
 */
void ECCP1_Initialize(void);

/**
 * @ingroup pwm1
 * @brief Loads the 16-bit duty cycle value.
 * @pre ECCP1_Initialize() is already called.
 * @param dutyValue - 16-bit duty cycle value
 * @return None.
 */
void ECCP1_LoadDutyValue(uint16_t dutyValue);

ECCP1_LoadDutyValue 함수를 사용하면 되겠군요. ECCP1_Initialize에 대해서는 걱정하지 마세요. 이 함수는 초기화 과정에서 자동으로 포함되므로 직접 실행할 필요가 없습니다. (main.c에서 SYSTEM_Initialize 함수가 먼저 실행되는게 있네요)

최종적으로는 아래와 같은 코드를 작성했습니다.

#include "mcc_generated_files/system/system.h"
#include "mcc_generated_files/timer/delay.h"
/*
    Main application
*/

int main(void)
{
    SYSTEM_Initialize();

    uint16_t dutycycle;
    
    while(1)
    {
        // set duty cycle for RGB LEDs to 100%
        dutycycle = 160;
        CCP4_LoadDutyValue(dutycycle);
        ECCP1_LoadDutyValue(dutycycle);
        ECCP2_LoadDutyValue(dutycycle);
        
        DELAY_milliseconds(1000);
        
        // set duty cycle for RGB LEDs to 0%
        dutycycle = 0;
        CCP4_LoadDutyValue(dutycycle);
        ECCP1_LoadDutyValue(dutycycle);
        ECCP2_LoadDutyValue(dutycycle);
        
        DELAY_milliseconds(1000);
        
    }    
}

특이한 점은 dutycycle을 100이 아닌 160으로 설정했다는 건데, 이 값은 16-bit duty cycle value라고 적혀있습니다. 이 숫자는 MCC 구성기에서 매우 쉽게 얻을 수 있습니다. CCP4로 들어가시면 CCPR Value가 나옵니다. 100%를 원하면 100을 넣어서 CCPR Value를 확인해보세요. 159라는 값이 나옵니다. 제 경험에 따르면 실제로는 160을 사용해야 합니다.

빌드 및 동작 테스트

이제 이 코드를 컴파일해보겠습니다. Build Main Project를 클릭해보세요.

다행히 오류는 없다고 나옵니다.

빌드가 성공했으면 보드를 연결할 수 있습니다. (디버거와 PC를 연결해주고, 보드와 디버거를 연결해줍니다. 보드는 usb로 전원 공급을 해줍니다)

보드에 펌웨어를 업로드하려면 재생 버튼을 누르기만 하면 됩니다. RGB LED가 켜지는지 한번 보십쇼. 잘 됩니다.

profile
또 하나의 자아

0개의 댓글