STM32/STM32C031-DK

STM32C031-DK와 DOT MATRIX 사용하기 1편(MAX7219사용)

원원 2024. 2. 19. 22:50

안녕하세요. 오늘은 STM32C031-DK와 DOT MATRIX를 이용해보겠습니다.

사용 할 DOT MATRIX는 8*8입니다.



*DOT MATRIX 관련내용
모듈 회로도는 아래와 같습니다. LED가 8*8=64개있고 이 LED를 제어하기위해서 MAX7219가 연결해있습니다.
MAX7219은 SPI통신을 합니다. DIN은 MOSI이고 MISO는 사용하지않습니다.

회로도출처: Interfacing MAX7219 LED Dot Matrix Display with Arduino (simple-circuit.com)



타이밍도) MSB방식이고 CHOL은 LOW이고 CPHA은 1 Edge입니다


데이터포맷) 16Bits이므로 2바이트를 보내면 됩니다. 처음에는 주소를 보내고 그 다음에 데이터를 보냅니다


클럭속도) 10Mhz 이하로 설정합니다



어드레스에 따른 데이터) 0x00주소는 사용하지않고 0x01~0x08은 자릿수를 나타냅니다Digit 0이면 첫번째 행(맨윗줄) Digit 7이면 마지막 행(맨 아랫줄)입니다.

Decode(0x09) : 세븐세그먼트를 MAX7219연결했을때 사용한다는데, 도트매트릭스를 연결했으니 미사용으로 설정합니다==> 미사용 (0x00)


Intensity(0x0A) : 도트매트릭스의 밝기조절 0x00~0x0f, 0x00은 완전히 OFF이고 0x01은 약간 밝은거고 0x0f은 아주 밝은것입니다. 0x01로만 설정해도 잘 보이니 0x01로 설정합니다
==> 약간 밝음(0x01)
아래의 동영상은 0x01 => 0x0f한 동영상입니다


Scan Limit(0x0B) : 디스플레이할 자릿수.  0~7자리 모두 표시합니다
==> 0~7 자릿수 표시 (0x07)

Shutdown(0x0C) : 저전력모드입니다. 설정하지않습니다
==> Normal operation 설정 (0x01)


Display Test(0x0F) : 밝기 FULL, DOT MATRIX 64개 모두 킴, 테스트모드를 사용하지 않습니다
==> Normal operation 설정 (0x00)

 

결론적으로 세팅은 아래처럼 하면 됩니다
Decode => 0x09,0x00
Intensity => 0x0A, 0x01
Scan Limit => 0x0B, 0x07
Shutdown => 0x0C, 0x01
Display Test => 0x0F, 0x00


화면에 표시하기)
위에 동영상에있는 H표시를 해보겠습니다. 아래의 사이트를 참고하면 이해하기 쉽습니다
LED Matrix Editor (xantorohara.github.io)

맨 윗줄은 Digit 0번의 주소인 0x01입니다 0x01, 0xC3을 보내면 도트매트릭스H표시 기준 맨 윗줄이 완성됩니다.
(0xC3 = 0b11000011)
0~7번째 줄도 2진수로 적어보겠습니다
0b11000011  => 맨윗줄
0b11000011  => 두번째줄
0b11000011 => 세번째줄
0b11111111 =>네번째줄
0b11111111 =>다섯번째줄
0b11000011 =>여섯번째줄
0b11000011 => 일곱번째줄 
0b11000011 => 여덟번째줄


이제 위에서 했던 내용들을 코드로 옮겨보겠습니다

*하드웨어설정
SPI설정)
MOSI만 필요하므로 Transmist Only Master 설정을 했습니다.
Data Size는 8bits로 하고 보낼때 레지스터+데이터 2바이트 보내겠습니다
Prescaler는 SCK가 10Mhz 이하면 되므로 스코프에 잘 찍히게 가장큰 Prescaler값을 했습니다.

CPOL,CPHA는 타이밍도에서 봤던 대로 설정했습니다.

CS핀은 PA9번을 OUTPUT 설정했습니다

코드제너레이터를하면 설정한대로 코드가 만들어집니다. 


*FW작성
SPI.C)
spi_cs함수는 cs핀을 LOW,HIGH로 만들어줍니다.
spi_transmit함수는 매개변수로 2바이트 data를 받고 data_to_send배열에 1바이트씩 저장한다음에 SPI 전송을 합니다.

#include "spi.h"
extern SPI_HandleTypeDef hspi1;

void spi_cs(bool b)
{
	HAL_GPIO_WritePin(DOT_CS_GPIO_Port, DOT_CS_Pin, b);
}


void spi_transmit(uint16_t data)
{
	uint8_t data_to_send[2];
	data_to_send[0] = (uint8_t)(data >> 8);
	data_to_send[1] = (uint8_t)data;

	spi_cs(LOW);
	HAL_SPI_Transmit(&hspi1, data_to_send, 2, 100);
	spi_cs(HIGH);
}


max7219.c)
max7219_init에서는 세팅을합니다.
max7219_data에서는 화면에 실제로 표시를합니다. data1은 H모양이고 data2는 I모양입니다

void max7219_init()
{
	uint16_t init[] = {0x0900,0x0A01,0x0b07,0x0c01,0x0f00};
	uint8_t i;
	for(i=0; i<sizeof(init)/2; i++)
	{
		spi_transmit(init[i]);
	}
}

void max7219_data()
{
	uint16_t data1[] = {0x01c3,0x02c3,0x03c3,0x04ff,0x05ff,0x06c3,0x07c3,0x08c3};
	uint16_t data2[] = {0x01ff,0x02ff,0x0318,0x0418,0x0518,0x0618,0x07ff,0x08ff};
	uint8_t i;

	for(i=0; i<sizeof(data1)/2; i++)
	{
		spi_transmit(data1[i]);
	}
	HAL_Delay(1000);
	for(i=0; i<sizeof(data2)/2; i++)
	{
		spi_transmit(data2[i]);
	}
	HAL_Delay(1000);
}


ap.c)
처음에 max7219_init함수를 호출해주고 while문에서는 max7219_data를 호출해줘서 H->I->H->I..를 반복합니다.
apInit, apMain함수는 상위에서 실행되는 main.c에서 호출하게 됩니다

#include "ap.h"

void apInit(void)
{
	max7219_init();
}

void apMain(void)
{
  while(1)
  {
  	max7219_data();
  }
}


결과

 

소스코드
https://github.com/yhunterr/STM32C031-DK/tree/main/stm32c0316_dk_dotmatrix


2편에서는 도트매트릭스 4개가 붙어있는 모듈을 사용해보겠습니다.

'STM32 > STM32C031-DK' 카테고리의 다른 글

STM32C031-DK와 DOT MATRIX 사용하기 2편(MAX7219사용)  (1) 2024.02.24