Embeded/ARM Cortex-M4

GPIO/Timer를 활용한 FND제어 소스

gharlic 2015. 7. 8. 03:33

원래 Timer에 이어 GPIO까지 설명하고 이 소스를 공개하려 했는데

Timer에 대해 설명하기 너무 까다로워 일단 이 소스를 공개해버린다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
#include<stdio.h>
#include "stm32f4xx.h"
#include "led.h"
 
// 프리스캐어 계산용 전처리
#define TIMER_PRESCALER_FREQ    1000000
#define TIMER_FREQ                       1
 
void TIM2_IRQHandler(void);
 
void Init_GPIO() {
     GPIO_InitTypeDef GPIO_InitStructure;
     // GPIO 구조체 선언
 
     RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOE, ENABLE);
     // GPIO E포트를 Enable하게 한다.
 
     GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3 | GPIO_Pin_4;  
     // GPIO E포트의 1, 2, 3, 4번핀 초기화
  
     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT; 
     // Pin을 출력 MODE로 설정.
 
     GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; 
     // NOPULL로 설정 -> 풀업, 풀다운을 사용하지 않음.
 
     GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;  
     // GPIO의 OType을 Push-Pull로 설정 
 
     GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
     // 클럭을 100MHz로 설정한다.
 
     GPIO_Init(GPIOE, &GPIO_InitStructure);
     // GPIO E포트에 설정된 GPIO 구조체를 GPIO_Init함수에 전달하여 초기화한다.
}
 
void Init_Timer() {
     uint16_t PrescalerValue;
     // 프리스캐어 계산에 unit16_t를 사용
 
     TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
     // Timer관련 구조체
 
     NVIC_InitTypeDef NVIC_InitStructure;
     // NVIC 구조체
 
     NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn; 
     //Timer 인터럽트 핸들러 등록.
 
     NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x0f;
     NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x0f;
     // IRQ  Channel의 Pre-emption, Sub Priority를 설정
 
     NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
     //IRQChannelCmd를 Enable하게 함 
     NVIC_Init(&NVIC_InitStructure); 
     //Tim2에 대한 NVIC Init을 실시함
 
     RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);
     // TIM2 Clock을 Enable함.
 
     SystemCoreClockUpdate(); 
     // SystemCoreClock을 업데이트함.
     PrescalerValue = (uint16_t) (SystemCoreClock / TIMER_PRESCALER_FREQ) -1; //167
     // 시스템코어클럭 168Mhz를 전처리에서 등록한 Timer_PRESCALER_FREQ로 쪼개고 1을 빼줌
     // 1을 빼주는 이유는 예를 들어 4bit라고 하면 16가지 숫자가 표현이 가능하고 0~16이 아닌 0~15이기 때문이다.
 
     /* Time base configuration */
     TIM_TimeBaseStructure.TIM_Period = TIMER_PRESCALER_FREQ / TIMER_FREQ -1 ;
     // Timer의 Period를 설정한다. 즉 Prescale에 설정된 값 이상이 될수 없게끔 되어있다.
     TIM_TimeBaseStructure.TIM_Prescaler = PrescalerValue; // Timer의 최대 주파수를 설정함
     TIM_TimeBaseStructure.TIM_ClockDivision = 0;
     TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
 
     TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);
 
     /* TIM IT enable */
     TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE);
 
     /* TIM3 enable counter */
     TIM_Cmd(TIM2, ENABLE);
}
 
int i = 0;
void TIM2_IRQHandler(void) { //타이머 인터럽트 핸들러
     int arr[10][4] = { {0,0,0,0}, {0,0,0,1}, {0,0,1,0}, {0,0,1,1}, {0,1,0,0}, {0,1,0,1}, {0,1,1,0}, {0,1,1,1}, {1,0,0,0}, {1,0,0,1}};
 
     if (TIM_GetITStatus(TIM2, TIM_IT_Update) == SET) {
          TIM_ClearITPendingBit(TIM2, TIM_IT_Update);
                                            
          if(i == 10) i = 0; // 매 인터럽트 마다 0~9를 반복
  
          if(arr[i][0] == 0)
          GPIO_ResetBits(GPIOE,GPIO_Pin_1);
          else GPIO_SetBits(GPIOE,GPIO_Pin_1);
          if(arr[i][1] == 0)
          GPIO_ResetBits(GPIOE,GPIO_Pin_2);
          else GPIO_SetBits(GPIOE,GPIO_Pin_2);
          if(arr[i][2] == 0)
          GPIO_ResetBits(GPIOE,GPIO_Pin_3);
          else GPIO_SetBits(GPIOE,GPIO_Pin_3);
          if(arr[i][3] == 0)
          GPIO_ResetBits(GPIOE,GPIO_Pin_4);
          else GPIO_SetBits(GPIOE,GPIO_Pin_4);
  
          i++;
     }
}
 
int main() {
     Init_GPIO(); // GPIO를 초기화시킴
     Init_Timer(); // 타이머를 초기화시킴
 
     while(1) {
     } 
}
cs

 

FND와 7447 제어에 대해서 알아서 해결하길 바란다.

위 소스는 GPIO핀을 통해 7447에 4bit Input을 입력하는 소스이다.

arr에 2진 입력을 미리 설정해놓고 i의 카운트에 따라

GPIO E포트의 1,2,3,4번 핀에 Higt, Low신호를 입력하게 한다.

반응형