제목을 HAL Driver로 바꾸었다.
STM32보다는 현재 내가 하고 있는 포스팅이 HAL Driver를 사용하는 거기 때문이다.
HAL Driver로 어떻게 MCU가 다루어 지는지 나중에 자세히 포스팅해보겠다.
Button & LED
먼저 택트 버튼과 LED를 준비한다.
누르면 전부 연결되는거 같다.
(테스터기로 검사해보고 진행하자)
저번에 LED 제어했던거 중에서 PB7만 남겨두고 전부 제거했다.
그리고 간단하게 한번 버튼을 사용하여 제어해보았다.
간단한 회로 이다.
이제 세그먼트를 제어해보겠다.
먼저 세그먼트에 대해 알아야 한다.
내가 사용할 세크먼트에 들어가는 칩은 TM74HC595이다.
구글에 TM74HC595 데이터 시트 쳐서 데이터 시트 다운 받으면
( https://www.alldatasheet.com/html-pdf/1134276/TITAN/TM74HC595/908/5/TM74HC595.html )
칩에 대한 정보를 얻을 수 있다.
또한 모듈에 관한 데이터 시트도 얻을 수 있다. -> 모듈의 데이터 시트를 구할 수 있으면 최고다. 없는 경우는 하나씩 멀티미터기로 찍어보면서 연결 부분을 찾아야할지도..
다음과 같은 검색어로 얻을 수 있다. (모듈에 이름이 적혀 있음)
7세그먼트 모듈 3641BS DataSheet
https://blog.naver.com/boilmint7/221442725896?viewType=pc
해당 블로그에 예제 코드가 있다.
우리꺼에 맞게 코드를 변경하겠다.
선 연결은 다음과 같이 해줘라
7세그먼트 | VCC | SCLK | RCLK | DIO | GND |
STM32F103 | 3V3 | PB15 | PB13 | PB14 | GND |
이것을 토대로 버튼을 눌었을 때마다 숫자가 1씩 올라가도록 하는 실습을 해보겠다.
COMMON ANODE란?
COMMON ANODE는 7세그먼트 디스플레이의 구성 방식 중 하나로, 모든 LED의 양극(Anode)이 공통으로 연결되어 있음을 의미합니다.구동 방식:공통 양극이므로 공통 핀(COM)에는 양전압(보통 3.3V 또는 5V)가 연결됩니다.특정 세그먼트를 켜기 위해서는 해당 세그먼트의 핀을 GND(0V)에 연결해야 합니다. 그러면 공통 양극과 해당 세그먼트의 음극 간에 전압차가 발생하여 LED가 켜지게 됩니다.
즉, COMMON ANODE 방식에서는 각 세그먼트를 개별적으로 GND에 연결해주면 점등이 됩니다. 반대로 COMMON CATHODE 방식에서는 각 세그먼트를 전압에 연결해줘야 점등됩니다.
이 모듈도 COMMON ANODE 방식이라 0일때 LED가 점등되고 1값을 주면 LED 가 꺼지는 것을 참고하자.
우리는 총 16비트를 보낼 것이다. ( 예제 코드에서 8비트는 LED글자를 제어하고, 나머지 8비트로 LED의 위치(총 4개의 위치가 있음) 를 제어한다.)
void TM74HC595Display::send(unsigned char X)
{
for (int i = 8; i >= 1; i--)
{
if (X & 0x80)
{
digitalWrite(_DIO, HIGH);
}
else
{
digitalWrite(_DIO, LOW);
}
X <<= 1;
digitalWrite(_SCLK, LOW);
digitalWrite(_SCLK, HIGH);
}
}
위 코드는 라이브러리에 있는 건데 이것을 HAL로 변경하겠다.
void send(uint8_t X){
for (int i = 8; i >= 1; i--)
{
if (X & 0x80)
{
HAL_GPIO_WritePin(PB13_FND_DIO_GPIO_Port, PB13_FND_DIO_Pin, HIGH);
}
else
{
HAL_GPIO_WritePin(PB13_FND_DIO_GPIO_Port, PB13_FND_DIO_Pin, LOW);
}
X <<= 1;
// make CLK
HAL_GPIO_WritePin(PB_15_FND_SCLK_GPIO_Port, PB_15_FND_SCLK_Pin, LOW);
HAL_GPIO_WritePin(PB_15_FND_SCLK_GPIO_Port, PB_15_FND_SCLK_Pin, HIGH);
}
}
여기서 GPIO를 이용해 CLK를 생성하였다.
따라서 우리는 이것을 이용해보겠다.
또한 자릿수를 나타내는 코드는 다음 코드이다.
void send_port(uint8_t X, uint8_t port){
send(X);
send(port);
HAL_GPIO_WritePin(PB_14_FND_RCLK_GPIO_Port, PB_14_FND_RCLK_Pin, LOW);
HAL_GPIO_WritePin(PB_14_FND_RCLK_GPIO_Port, PB_14_FND_RCLK_Pin, HIGH);
}
이것까지 해야 LED에 불이 들어온다.
send를 두번 보내니 총 16비트를 보낸다.
따라서 앞의 8비트는 숫자를 제어하고, 뒤의 8비트는 자릿수를 담당한다.
이것을 활용하여 아래에 실습을 해보았다.
오실로스코프에서 노랑색은 SCK, 파랑색은 DIO에 달았다.
먼저 0만 출력해보겠다. ( 겹치게 볼려고 해둔거고 클럭은 HIGH에서 들어온다, 이유는 클럭을 만들때 마지막에 HIGH로 끝냈고, 데이터 시트랑 맞춰주기 위함이다.)
다음은 1을 출력해보겠다.
마지막은 3--- 을 출력해보겠다. ( 여기선 정상으로 맞춰두었다.)
3만의 오실로스코프만 한번 보겠다.
클럭이 HIGH에서 LOW로 떨어지면서 시작한다.
앞에 8비트는 숫자부분, 뒤에는 자릿수이다.
우리가 3---을 출력했으므로 자릿수는 맞고, 숫자를 확인해보자
1011 0000 -> 0xB0 ( 코드상에서 0xB0로 해두어서 잘 들어왔나 계산해봄 )
간단하게 뒤에서 부터 a ~ h까지니
1 0 1 1 0 0 0 0
h g f e d c b a
0일때 LED 점등
따라서 a, b, c, d, g에만 점등되면 된다.
위 사진을 보면 3이 점등되는 것을 알 수 있다.
이제 마지막으로 버튼을 눌렀을 때 1씩 올라가는 코드는 너무 길어 다음 포스터에서 구현해서 보여주겠다.
'STM32' 카테고리의 다른 글
7세그먼트 코드 수정 (0) | 2024.11.10 |
---|---|
버튼 누르면 1씩 올라가는 7세그먼트 (1) | 2024.11.10 |
GPIO를 사용하여 LED 제어 (1) | 2024.11.08 |
STM32 Cube IDE Install (0) | 2024.11.04 |
혼자서 공부하는 STM32 (0) | 2024.11.01 |