이번에는 타이머를 한번 익혔으니 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 구문만 실행해서 생략하였습니다.
반응형
'b. 임베디드 > STM32' 카테고리의 다른 글
[STM32F407VGT Discovery] ADC Single Conversion(Polling) 사용하기 (0) | 2019.06.25 |
---|---|
[STM32F407VGT Discovery] USART printf 사용하기 (0) | 2019.06.24 |
[STM32F407VGT Discovery] USART Interrupt, Polling 사용하기 (0) | 2019.06.23 |
[STM32F407VGT Discovery] Timer Output Compare Mode (0) | 2019.06.21 |
[STM32F407VGT Discovery] Timer PWM으로 LED 밝기 조절 (0) | 2019.06.19 |
[STM32F407VGT Discovery] Timer UPDATE INTERRUPT (1) | 2019.06.18 |
[STM32F407VGT Discovery] EXT 외부 인터럽트 (0) | 2019.06.17 |
[STM32F407VGT Discovery] GPIO 버튼 (1) | 2019.06.15 |