본문 바로가기
임베디드 개발/STM32 (ARM Cortex-M)

STM32 레지스터 직접 접근해서 LED를 이용한 카운터, 7 segment FND 출력 제어하기

by eteo 2022. 5. 19.

 

 

먼저

PC8, 9, 10, 11 핀을 output 모드로 사용해 0x0-0xF 까지의 카운터를 구현하였고,

PD0, 1, 2, 3, 4, 5, 6 핀을 output 모드로 사용해 FND에 0-9까지의 숫자를 출력하였다.

 

참고로 핀을 선택할때 내가 한 것처럼 이어진 핀을 선택해야 나중에 코드짜기가 쉽다.

그리고 아무리 MODER 에 원하는 값을 대입해도 현재 해당 GPIOx 핀이 MX 툴에서 활성화된게 아무것도 없으면 모드 설정이 안되더라.. 아마 MX_GPIO_Init(); 함수 내에 설정이 안되서 그런거 같은데 MODER은 MX툴 쓰는게 편한거 같다.

 

unsigned char 배열을 사용해 0x0부터 0xF까지의 숫자를 미리 넣어주었다. 

 

  /* USER CODE BEGIN 2 */

  GPIOC->MODER |= 0x00550000;	// set PC8,9,10,11 to output mode
  GPIOD->MODER |= 0x00001555;	// set PD0,1,2,3,4,5,6 to output mode

  unsigned char num[16]= {0x1,0x2,0x3,0x4,0x5,0x6,0x7,0x8,0x9,0xa,0xb,0xc,0xd,0xe,0xf};

  /* USER CODE END 2 */

 

GPIOC->MODER의 경우 최상위비트부터 고려해서 아래와 같이 16진수 값을 대입해주면 되고

GPIOD->MODER의 경우는 이렇게 원하는 핀만 output mode로 설정해 주었다. |= 연산은 0인 곳은 이전상태에서 불변이고 1인 곳만 이전상태에 상관없이 1로 만들어 줘서 원하는 비트만 켤 수 있다.

 

 

그리고 for문으로 반복하면서

GPIOC->ODR = num[i] << 8;
GPIOD->ODR = ttl7447(num[i]);

을 반복하면서 output data 출력

  /* USER CODE BEGIN WHILE */
  while (1)
  {
	  for(int i=0; i<16; i++){	// count 0 to F through PC8,9,10,11
		  GPIOC->ODR = num[i] << 8;
		  GPIOD->ODR = ttl7447(num[i]);	// FND print 0-9
		  HAL_Delay(500);
	  }
    /* USER CODE END WHILE */

 

왼쪽으로 8만큼 시프트연산 해준 이유는 내가 PC8, 9, 10, 11 핀을 사용하였기 때문이다.

 

 

다음 ttl7447 함수의 내부이다.

0-15까지의 숫자를 받아서 7 segment FND에 출력하기 위한 신호로 리턴해준다.

/* USER CODE BEGIN PFP */
unsigned char ttl7447(unsigned char num);
/* USER CODE END PFP */
/* USER CODE BEGIN 4 */
unsigned char ttl7447(unsigned char num){
	if(num==0x0) return 0x01;
	else if(num==0x1) return 0x4f;
	else if(num==0x2) return 0x12;
	else if(num==0x3) return 0x06;
	else if(num==0x4) return 0x4c;
	else if(num==0x5) return 0x24;
	else if(num==0x6) return 0x60;
	else if(num==0x7) return 0x0f;
	else if(num==0x8) return 0x00;
	else if(num==0x9) return 0x0c;
	else return 0x7f;
}
/* USER CODE END 4 */

 

 

커먼 애노드 타입이라 리턴값은 아래를 참고해주었다.

 

예를 들어 숫자가 0이어서 리턴값이 0x01이라고 한다면 PD0번핀만 HIGH 신호가 가서 불이 안켜지고 나머지는 다 불이 켜진다.

그래서 회로는 PD0핀은 G에 ~ PD6핀은 a에 연결하면 된다.