b. 임베디드/STM32

[STM32F407VGT Discovery] Timer FND(7segment)초 단위 동작

로봇쟁이 2019. 6. 20. 23:31

이번에는 타이머를 한번 익혔으니 4자리 7segment를 1초 단위로 동작시켜보도록 하겠습니다.

저의 FND 아두이노 쉴드는 Cathode 형태입니다. ^^;

 

회로는 검색해서 본인이 가지고 있는 FND에 맞게끔 PORT를 지정해줘야합니다.

 

저는 PORTD = 자릿수 COMMON 으로 지정하고

PORTC, PORTE OUTPUT으로 지정하였습니다.

 

타이머는 기존에 사용한 TIM7번을 사용하여 UPDATE INTERRUPT를 발생하여 COUNT 및 DISPLAY를 진행했습니다.

TIM7은 1ms 인터럽트를 생성하기 위해 

Prescaler = 99

Counter Period = 839로 설정하였습니다.

 

별도의 display 함수를 만들어줬습니다.

하나씩 숫자 만들기가 조금 까다롭지만 한번 해볼만 합니다 ^^;;;

void display_num(uint8_t pos, uint16_t num)
{
	uint32_t Coutput = 0x0;
	uint32_t Eoutput = 0x0;
	uint32_t Doutput = 0x0;

//	Coutput |= GPIO_PIN_12;              //  --
//	Coutput |= GPIO_PIN_10;              // l
//	Eoutput |= GPIO_PIN_10;              //    l
//	Eoutput |= GPIO_PIN_12;              //  --
//	Eoutput |= GPIO_PIN_7;               // l
//	Eoutput |= GPIO_PIN_14;              //    l
//	Eoutput |= GPIO_PIN_9;               //  --
//	Eoutput |= GPIO_PIN_15;              //  :
//	Eoutput |= GPIO_PIN_11;              //  .

	if(pos == 1)		Doutput |= GPIO_PIN_0;
	else if(pos == 2)	Doutput |= GPIO_PIN_2;
	else if(pos == 3)	Doutput |= GPIO_PIN_4;
	else if(pos == 4)	Doutput |= GPIO_PIN_1;

   switch(num)
   {
      case 1:
   	   	   Coutput |= GPIO_PIN_12;              //  --
   	   	   Coutput |= GPIO_PIN_10;              // l
   	   	   Eoutput &= ~GPIO_PIN_10;              //    l
   	   	   Eoutput |= GPIO_PIN_12;              //  --
   	   	   Eoutput |= GPIO_PIN_7;               // l
   	   	   Eoutput &= ~GPIO_PIN_14;              //    l
   	   	   Eoutput |= GPIO_PIN_9;				//  --
   	   	   Eoutput |= GPIO_PIN_15;              //  :
   	   	   Eoutput |= GPIO_PIN_11;              // .
      break;
      case 2:
	   	   Coutput &= ~GPIO_PIN_12;              //  --
	   	   Coutput |= GPIO_PIN_10;              // l
	   	   Eoutput &= ~GPIO_PIN_10;              //    l
	   	   Eoutput &= ~GPIO_PIN_12;              //  --
	   	   Eoutput &= ~GPIO_PIN_7;               // l
	   	   Eoutput |= GPIO_PIN_14;              //    l
	   	   Eoutput &= ~GPIO_PIN_9;				//  --
	   	   Eoutput |= GPIO_PIN_15;              //  :
	   	   Eoutput |= GPIO_PIN_11;              // .
      break;
      case 3:
	   	   Coutput &= ~GPIO_PIN_12;              //  --
	   	   Coutput |= GPIO_PIN_10;              // l
	   	   Eoutput &= ~GPIO_PIN_10;              //    l
	   	   Eoutput &= ~GPIO_PIN_12;              //  --
	   	   Eoutput |= GPIO_PIN_7;               // l
	   	   Eoutput &= ~GPIO_PIN_14;              //    l
	   	   Eoutput &= ~GPIO_PIN_9;				//  --
	   	   Eoutput |= GPIO_PIN_15;              //  :
	   	   Eoutput |= GPIO_PIN_11;              // .
      break;
      case 4:
	   	   Coutput |= GPIO_PIN_12;              //  --
	   	   Coutput &= ~GPIO_PIN_10;              // l
	   	   Eoutput &= ~GPIO_PIN_10;              //    l
	   	   Eoutput &= ~GPIO_PIN_12;              //  --
	   	   Eoutput |= GPIO_PIN_7;               // l
	   	   Eoutput &= ~GPIO_PIN_14;              //    l
	   	   Eoutput |= GPIO_PIN_9;				//  --
	   	   Eoutput |= GPIO_PIN_15;              //  :
	   	   Eoutput |= GPIO_PIN_11;              // .
      break;
      case 5:
	   	   Coutput &= ~GPIO_PIN_12;              //  --
	   	   Coutput &= ~GPIO_PIN_10;              // l
	   	   Eoutput |= GPIO_PIN_10;              //    l
	   	   Eoutput &= ~GPIO_PIN_12;              //  --
	   	   Eoutput |= GPIO_PIN_7;               // l
	   	   Eoutput &= ~GPIO_PIN_14;              //    l
	   	   Eoutput &= ~GPIO_PIN_9;				//  --
	   	   Eoutput |= GPIO_PIN_15;              //  :
	   	   Eoutput |= GPIO_PIN_11;              // .
      break;
      case 6:
	   	   Coutput &= ~GPIO_PIN_12;              //  --
	   	   Coutput &= ~GPIO_PIN_10;              // l
	   	   Eoutput |= GPIO_PIN_10;              //    l
	   	   Eoutput &= ~GPIO_PIN_12;              //  --
	   	   Eoutput &= ~GPIO_PIN_7;               // l
	   	   Eoutput &= ~GPIO_PIN_14;              //    l
	   	   Eoutput &= ~GPIO_PIN_9;				//  --
	   	   Eoutput |= GPIO_PIN_15;              //  :
	   	   Eoutput |= GPIO_PIN_11;              // .
      break;
      case 7:
	   	   Coutput &= ~GPIO_PIN_12;              //  --
	   	   Coutput &= ~GPIO_PIN_10;              // l
	   	   Eoutput &= ~GPIO_PIN_10;              //    l
	   	   Eoutput |= GPIO_PIN_12;              //  --
	   	   Eoutput |= GPIO_PIN_7;               // l
	   	   Eoutput &= ~GPIO_PIN_14;              //    l
	   	   Eoutput |= GPIO_PIN_9;				//  --
	   	   Eoutput |= GPIO_PIN_15;              //  :
	   	   Eoutput |= GPIO_PIN_11;              // .
      break;
      case 8:
	   	   Coutput &= ~GPIO_PIN_12;              //  --
	   	   Coutput &= ~GPIO_PIN_10;              // l
	   	   Eoutput &= ~GPIO_PIN_10;              //    l
	   	   Eoutput &= ~GPIO_PIN_12;              //  --
	   	   Eoutput &= ~GPIO_PIN_7;               // l
	   	   Eoutput &= ~GPIO_PIN_14;              //    l
	   	   Eoutput &= ~GPIO_PIN_9;				//  --
	   	   Eoutput |= GPIO_PIN_15;              //  :
	   	   Eoutput |= GPIO_PIN_11;              // .
      break;
      case 9:
	   	   Coutput &= ~GPIO_PIN_12;              //  --
	   	   Coutput &= ~GPIO_PIN_10;              // l
	   	   Eoutput &= ~GPIO_PIN_10;              //    l
	   	   Eoutput &= ~GPIO_PIN_12;              //  --
	   	   Eoutput |= GPIO_PIN_7;               // l
	   	   Eoutput &= ~GPIO_PIN_14;              //    l
	   	   Eoutput &= ~GPIO_PIN_9;				//  --
	   	   Eoutput |= GPIO_PIN_15;              //  :
	   	   Eoutput |= GPIO_PIN_11;              // .
      break;
      case 0:
	   	   Coutput &= ~GPIO_PIN_12;              //  --
	   	   Coutput &= ~GPIO_PIN_10;              // l
	   	   Eoutput &= ~GPIO_PIN_10;              //    l
	   	   Eoutput |= GPIO_PIN_12;              //  --
	   	   Eoutput &= ~GPIO_PIN_7;               // l
	   	   Eoutput &= ~GPIO_PIN_14;              //    l
	   	   Eoutput &= ~GPIO_PIN_9;				//  --
	   	   Eoutput |= GPIO_PIN_15;              //  :
	   	   Eoutput |= GPIO_PIN_11;              // .
      break;
   }

   LL_GPIO_WriteOutputPort(GPIOD, Doutput);
   LL_GPIO_WriteOutputPort(GPIOC, Coutput);
   LL_GPIO_WriteOutputPort(GPIOE, Eoutput);
}

 

그리고 인터럽트 함수입니다.

void TIM7_IRQHandler(void)
{
  /* USER CODE BEGIN TIM7_IRQn 0 */
	LL_TIM_ClearFlag_UPDATE(TIM7);

	if(cnt++ > 999)
	{
		cnt = 0;
		if(sec++ > 9999)	sec = 0;
	}
	uint8_t digit_1000 = sec / 1000;
	uint8_t digit_100 = (sec % 1000) / 100;
	uint8_t digit_10 = (sec % 100) / 10;
	uint8_t digit_1 = sec % 10;

	if(digit < 4)		digit++;
	else				digit = 0;

	switch(digit)
	{
		case 1:		display_num(1, digit_1);		break;
		case 2:		display_num(2, digit_10);		break;
		case 3:		display_num(3, digit_100);		break;
		case 4:		display_num(4, digit_1000);		break;
	}

  /* USER CODE END TIM7_IRQn 0 */
  /* USER CODE BEGIN TIM7_IRQn 1 */

  /* USER CODE END TIM7_IRQn 1 */
}

 

메인함수에서는 타이머 카운터를 ENABLE하고 인터럽트를 ENABLE 구문만 실행해서 생략하였습니다.

 

 

반응형