원래 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신호를 입력하게 한다.
반응형
'Embeded > ARM Cortex-M4' 카테고리의 다른 글
ADC(Analog-Digital Converter) (0) | 2015.07.10 |
---|---|
GPIO(General Purpose Input Output) IN, OUT 소스 (0) | 2015.07.08 |
Timer / Timer_Handler 소스 (0) | 2015.07.08 |
라이브러리(library)코딩과 레지스터(Register)코딩 (0) | 2015.07.08 |
펌웨어(Firmware)의 구조 (0) | 2015.07.08 |