STM32F103C8T6로 RA8835를 이용한 그래픽 LCD WS320240을 다루어 보았습니다.
총 6편으로 나누어 진행할 예정입니다.
제1편 : 회로도와 프로젝트 만들기
제2편 : STM32F103 GPIO 다루기(1)
제3편 : STM32F103 GPIO 다루기(2)
제4편 : RA8835 제어 함수 만들기
제5편 : 한글 및 영문자 출력하기
제6편 : 그래픽 라이브러리 활용하기
1. 회로도
회로도라기보다 연결도라고 하는 것이 더 어울릴 듯합니다. 이번에 사용한 그래픽 LCD는 WS320240입니다. 이 그래픽 LCD는 컨트롤러로 RA8835를 사용하고 있습니다. RA8835는 SED1335와 완벽히 호환되기 때문에 SED1335의 매뉴얼을 보고 프로그래밍해도 됩니다.
회로도 상에 사용된 부품은 STM32F103 보드(Blue Pill), GLCD WS320240C, 반고정 저항 10㏀ 1개입니다.
WS320240C와 STM32F130 보드의 연결은 다음과 같이 합니다.
WS320240 |
STM32F103 |
WS320240 |
STM32F103 | ||
핀 |
기능 |
|
핀 |
기능 |
|
1 |
A0 |
B12 |
11 |
/RD |
B14 |
2 |
/CS |
B13 |
12 |
/WR |
B15 |
3 |
D0 |
A0 |
13 |
/Reset |
R |
4 |
D1 |
A1 |
14 |
BLK |
Gnd |
5 |
D2 |
A2 |
15 |
BLA |
5V |
6 |
D3 |
A3 |
16 |
Gnd |
Gnd |
7 |
D4 |
A4 |
17 |
VEE |
가변저항 |
8 |
D5 |
A5 |
18 |
VDD |
5V |
9 |
D6 |
A6 |
19 |
V0 |
가변저항 |
10 |
D7 |
A7 |
20 |
SEL1 |
Gnd |
그래픽 LCD WS320240은 5V로 동작하고 STM32F103은 3.3V로 동작하기 때문에 원칙적으로는 레벨시프트를 넣어 주어야 하지만, 회로도에서는 바로 직결하는 것으로 표시했습니다. 다만, 다음의 사진에서 볼 수 있듯이 브레드보드에 구현한 실제 회로는 레벨시프트 회로 대신에 1㏀의 저항을 연결하였습니다. WS320240을 기준으로 1번핀(A0)부터 12번핀(/WR)까지 12개의 저항을 사용했습니다.
화면 상단의 2행은 STM32F103에 폰트를 내장시켜서 그래픽 방식으로 출력한 것입니다. 한글은 16(가로) x 16(세로) , 영문은 8(가로) x 16(세로) 크기로 출력했습니다. 그 아래로는 RA8835가 가지고 있는 영문 폰트를 이용해서 출력했습니다.
PC13에 달려 있는 LED를 1초에 한 번씩 켰다 껐다 하겠습니다.
2. 프로젝트 만들기
STM32CubeMX를 열고 MCU를 ATM32F103CBT6으로 선택했습니다. 본 보드는 STM32F103C8T6이 적용되어 있지만 실제로는 flash memory가 128 kB입니다. STM32F103CB 시리즈와 STM32FC8 시리즈는 flash memory 크기 이외에는 모두 동일합니다. 본 보드는 ST-LINK Utility 프로그램이 flash memory가 64kB라고 인식함에도 불구하고 실제로는 128kB인 것을 확인했습니다. 프로그램 실행코드를 64kB주소 영역(0x0800 0000 ~ 0x0800 FFFF) 밖인 0x0801 0000 영역에 두고 실행해도 에러 없이 잘 실행되는 것을 확인했습니다.
① [SYS] 항목에서 Debug를 Serial Wire로 설정합니다.
② [RCC] 항목에서 High Speed Clock(HSE)를 Crystal/Ceramic Resonator로 설정합니다.
③ [TIM2] 항목의 Clock Source를 Internal Clock으로 설정합니다. PC13에 달려 있는 LED를 제어하는데 Timer2를 사용할 예정입니다.
④ PA0부터 PA7까지의 핀들을 GPIO_Output으로 설정하고 User Label로 각각 DB0, DB1, ... DB6, DB7을 부여합니다.
⑤ PB12부터 PB15까지의 핀들도 GPIO_Output으로 설정하고 User Label로 각각 A0, CS, RD, WR을 부여합니다. LED를 제어할 PC13도 GPIO_Output으로 지정하고 Label로 LED를 부여합니다.
⑥ [Clock Configuration] 탭으로 가서 위의 그림과 같이 설정합니다. GLCD도 속도가 빠른 편이 아니기 때문에 굳이 HCLK를 72MHz로 설정할 필요는 없습니다만, 그냥 최대 속도인 72MHz로 동작시켜 보겠습니다. TIM2 타이머를 이용해서 1초에 1번씩 led를 깜빡이게 할 예정입니다. TIM2는 APB1 버스로부터 클럭을 받아오기 때문에 APB1 Timer clock이 너무 크지 않도록 APB1 Prescaler를 1/16으로 수정해서 APB1 Timer clock이 9MHz가 되도록 조정했습니다.
⑦ [Configuration] 탭으로 가서 [GPIO] 버튼을 클릭하여 GPIO output level을 다음과 같이 수정합니다. PA0부터 PA7까지는 수정하지 않았고, 빨간색으로 네모 친 PB12부터 PB15까지를 High로 수정합니다.
⑧ [TIM2] 버튼을 클릭한 다음에 Prescale의 값으로 8999을 입력하고 Counter Period를 499으로 입력한 후에 [OK] 버튼을 클릭합니다. ⑥ 단계에서 TIM2의 클럭이 9MHz로 동작하도록 했기 때문에 9000으로 나누면 1mS마다 Timer2 counter가 증가합니다. 9000이 아니라 8999를 넣은 이유는 타이머 값이 0부터 시작하기 때문입니다. 이 Timer2의 Counter Period에 499를 넣음으로써 counter가 0부터 시작하여 499가 되면 TIM2 인터럽트가 발생하도록 설정하였습니다. 즉 500mS 마다 TIM2 인터럽트가 발생합니다.
⑨ 다음의 그림에서와 같이 TIM2 인터럽트가 발생하도록 NVIC를 설정하고 [OK] 버튼을 누릅니다.
⑩ [Project] 메뉴에서 [Settings] 항목을 선택하여 Project Location, Project Name을 입력하고, Toolchain/IDE를 TrueSTUDIO로 지정한 다음에 [OK] 버튼을 누릅니다.
⑪ [Project] 메뉴에서 [Generate Code]를 실행하고, [Generate Report]도 실행합니다.
앞으로의 글에는 프로젝트를 만드는 과정은 언급하지 않겠습니다. 각 핀들의 설정한 상태 등 그 프로젝트에 필요한 설정 사항들을 담은 화면을 제시하는 것으로 대신하겠습니다.
다음 편인 제2편에서는 STM32F103의 GPIO에 관하여 학습할 예정입니다.
'STM32F103' 카테고리의 다른 글
RA8835 GLCD 제어하기(제4편) - RA8835 제어함수 만들기 (0) | 2018.11.15 |
---|---|
RA8835 GLCD 제어하기(제3편) - STM32F103 GPIO 다루기(2) (0) | 2018.11.15 |
RA8835 GLCD 제어하기(제2편) - STM32F103 GPIO 다루기(1) (0) | 2018.11.11 |
문자형 LCD 4비트로 제어하기 (GPIO와 Timer2 인터럽트 이용) (2) | 2018.11.11 |
STM32F103C8T6 도착 (0) | 2018.11.11 |