검색결과 리스트
글
[Tiva] TM4C 시리즈에서 외부인터럽트 구현
MCU를 활용하는 사람이면 거의 대다수가 맨 처음 프로그램을 구동할 때GPIO(General Purpose Input Output)를 구현하여 동작을 확인하는 경험을 해보셨을 것이라 생각합니다. TI에서 제공하는 Tiva C 시리즈인 TM4C MCU 시리즈 또한 이를 잘 구현해 놓았지요.
ATmega시리즈로 순식간에 인터럽트를 설정하시던 분들도 Tiva 시리즈를 다룰 때 다소 해메시는 분들도 계실것이라 생각합니다. 하지만 그렇다고 처음부터 겁을 먹을 필요는 없습니다. 코드로 표현하는 방식이 다를 뿐 다른 MCU들 처럼 구현할 수 있는 기능은 똑같으니 말이지요.
이번에는 MCU 프로그램의 필수 요소라 할 수 있는 Interrupt를 구현해보도록 하겠습니다. 인터럽트와 관련이 있는 부분은 직접 주석으로 적어두었으므로 하나씩 읽으면서 익혀두셨으면 합니다.
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 | #include <stdint.h> #include <stdbool.h> #include "inc/hw_gpio.h" #include "inc/hw_ints.h" #include "inc/hw_memmap.h" #include "inc/hw_nvic.h" #include "inc/hw_types.h" #include "driverlib/debug.h" #include "driverlib/fpu.h" #include "driverlib/gpio.h" #include "driverlib/interrupt.h" #include "driverlib/pin_map.h" #include "driverlib/rom.h" #include "driverlib/sysctl.h" #include "driverlib/systick.h" #include "driverlib/timer.h" #include "driverlib/uart.h" #include "utils/uartstdio.h" #ifdef DEBUG void __error__(char *pcFilename, uint32_t ui32Line) { } #endif //자신이 설정하고자 하는 인터럽트 핸들러를 설정한다. void INT_IntHandler(void) { ROM_IntDisable(INT_GPIOA); GPIOIntClear(GPIO_PORTA_BASE, GPIO_PIN_4 | GPIO_PIN_6); UARTprintf("Hello, Interrput!\n"); ROM_IntEnable(INT_GPIOA); } void ConfigureUART(void) { // // Enable the GPIO Peripheral used by the UART. // ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOA); // // Enable UART0 // ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_UART0); // // Configure GPIO Pins for UART mode. // ROM_GPIOPinConfigure(GPIO_PA0_U0RX); ROM_GPIOPinConfigure(GPIO_PA1_U0TX); ROM_GPIOPinTypeUART(GPIO_PORTA_BASE, GPIO_PIN_0 | GPIO_PIN_1); // // Use the internal 16MHz oscillator as the UART clock source. // UARTClockSourceSet(UART0_BASE, UART_CLOCK_PIOSC); // // Initialize the UART for console I/O. // UARTStdioConfig(0, 115200, 16000000); } int main(void) { // // Enable lazy stacking for interrupt handlers. This allows floating-point // instructions to be used within interrupt handlers, but at the expense of // extra stack usage. // ROM_FPULazyStackingEnable(); // // Set the clocking to run directly from the crystal. // ROM_SysCtlClockSet( SYSCTL_SYSDIV_4 | SYSCTL_USE_PLL | SYSCTL_XTAL_16MHZ | SYSCTL_OSC_MAIN); //INTERRUPT를 사용할 GPIO핀을 활성화 시킨다. ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOA); // Initialize the UART. ConfigureUART(); //인터럽트를 받아들일 핀을 Input으로 설정한다. ROM_GPIOPinTypeGPIOInput(GPIO_PORTA_BASE, GPIO_PIN_4 | GPIO_PIN_6); //인터럽트되는 핀의 입력 형태를 선택한다. LOW에서 HIGH 상태로 넘어갈 때 인터럽트를 발생시키고자 하면 //GPIO_RISING_EDGE를 선택한다. ROM_GPIOIntTypeSet(GPIO_PORTA_BASE, GPIO_PIN_4 | GPIO_PIN_6, GPIO_RISING_EDGE); //PORTA의 GPIO 인터럽트를 허용한다. GPIOIntEnable(GPIO_PORTA_BASE, GPIO_PIN_4 | GPIO_PIN_6); //PORTA에서 인터럽트가 발생하였을 때 실행할 함수를 설정한다. GPIOIntRegister(GPIO_PORTA_BASE, INT_IntHandler); //인터럽트가 시작되기 전 Clear 시켜준다.(인터럽트 관련 레지스터를 0으로 만든다.) GPIOIntClear(GPIO_PORTA_BASE, GPIO_PIN_4 | GPIO_PIN_6); ROM_IntEnable(INT_GPIOA); while (1) { } } |
4번 핀과 6번 핀에 HIGH_EDGE 입력이 들어오면 mcu에서 인터럽트가 발생하여 설정된 함수를 실행한다.
'임베디드 > TI' 카테고리의 다른 글
[Tiva] I2CMasterSlaveAddrSet() (0) | 2014.08.01 |
---|---|
[Tiva] TM4C의 I2C 통신 파형 보는 방법 (4) | 2014.07.28 |
[Tiva] TM4C 시리즈에서 타이머 구현 (0) | 2014.07.26 |
[Tiva] Tera Term으로 런치패드와 UART 통신하기 (0) | 2014.07.23 |
[Tiva] Tiva C 런치패드에 프로그램 올리기 (0) | 2014.07.21 |
설정
트랙백
댓글
글
[Tiva] TM4C 시리즈에서 타이머 구현
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 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 | #include <stdint.h> #include <stdbool.h> #include "inc/hw_ints.h" #include "inc/hw_memmap.h" #include "inc/hw_types.h" #include "driverlib/debug.h" #include "driverlib/fpu.h" #include "driverlib/gpio.h" #include "driverlib/interrupt.h" #include "driverlib/pin_map.h" #include "driverlib/rom.h" #include "driverlib/sysctl.h" #include "driverlib/timer.h" #include "driverlib/uart.h" #include "utils/uartstdio.h" uint32_t count=0, count1=0; #ifdef DEBUG void __error__(char *pcFilename, uint32_t ui32Line) { } #endif //TIMER0을 설정하는 인터럽트 핸들러 void Timer0IntHandler(void) { // // Clear the timer interrupt. // ROM_TimerIntClear(TIMER0_BASE, TIMER_TIMA_TIMEOUT); count++; if(count>=100) count=0; ROM_IntMasterDisable(); UARTprintf("\r%2d : %2d",count1, count); ROM_IntMasterEnable(); } //TIMER1을 설정하는 인터럽트 핸들러 void Timer1IntHandler(void) { // // Clear the timer interrupt. // ROM_TimerIntClear(TIMER1_BASE, TIMER_TIMA_TIMEOUT); count1++; if(count1>=60) count1=0; ROM_IntMasterDisable(); UARTprintf("\r%2d : %2d",count1, count); ROM_IntMasterEnable(); } //UART 출력을 설정한다. void ConfigureUART(void) { // // Enable the GPIO Peripheral used by the UART. // ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOA); // // Enable UART0 // ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_UART0); // // Configure GPIO Pins for UART mode. // ROM_GPIOPinConfigure(GPIO_PA0_U0RX); ROM_GPIOPinConfigure(GPIO_PA1_U0TX); ROM_GPIOPinTypeUART(GPIO_PORTA_BASE, GPIO_PIN_0 | GPIO_PIN_1); // // Use the internal 16MHz oscillator as the UART clock source. // UARTClockSourceSet(UART0_BASE, UART_CLOCK_PIOSC); // // Initialize the UART for console I/O. // UARTStdioConfig(0, 115200, 16000000); } int main(void) { // // Enable lazy stacking for interrupt handlers. This allows floating-point // instructions to be used within interrupt handlers, but at the expense of // extra stack usage. // ROM_FPULazyStackingEnable(); // // Set the clocking to run directly from the crystal. // ROM_SysCtlClockSet(SYSCTL_SYSDIV_1 | SYSCTL_USE_OSC | SYSCTL_OSC_MAIN | SYSCTL_XTAL_16MHZ); // // Initialize the UART and write status. // ConfigureUART(); // // TIMER0과 TIMER1이 동작할 수 있도록 설정해준다. // ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_TIMER0); ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_TIMER1); // // MCU가 인터럽트를 사용할 수 있도록 설정해준다. // ROM_IntMasterEnable(); // // 타이머의 동작 방식을 설정해준다. 매 주기마다 동작할 수 있도록 TIMER_CFG_PERIODIC을 설정한다. // ROM_TimerConfigure(TIMER0_BASE, TIMER_CFG_PERIODIC); ROM_TimerConfigure(TIMER1_BASE, TIMER_CFG_PERIODIC); // // TIMERA의 주기를 설정한다. ROM_SysCtlClockGet()의 값은 MCU의 주파수를 뜻하며 1초당 동작수를 말한다. // ROM_TimerLoadSet(TIMER0_BASE, TIMER_A, ROM_SysCtlClockGet() / 100); ROM_TimerLoadSet(TIMER1_BASE, TIMER_A, ROM_SysCtlClockGet() / 1); // // 각 타이머의 인터럽트를 사용할 수 있도록 설정한다. // ROM_IntEnable(INT_TIMER0A); ROM_IntEnable(INT_TIMER1A); // // 설정한 타이머의 인터럽트가 동작할 수 있도록 허용한다. // ROM_TimerIntEnable(TIMER0_BASE, TIMER_TIMA_TIMEOUT); ROM_TimerIntEnable(TIMER1_BASE, TIMER_TIMA_TIMEOUT); // // 타이머를 동작시킨다. // ROM_TimerEnable(TIMER0_BASE, TIMER_A); ROM_TimerEnable(TIMER1_BASE, TIMER_A); // // Loop forever while the timers run. // while (1) { } } |
'임베디드 > TI' 카테고리의 다른 글
[Tiva] TM4C의 I2C 통신 파형 보는 방법 (4) | 2014.07.28 |
---|---|
[Tiva] TM4C 시리즈에서 외부인터럽트 구현 (12) | 2014.07.26 |
[Tiva] Tera Term으로 런치패드와 UART 통신하기 (0) | 2014.07.23 |
[Tiva] Tiva C 런치패드에 프로그램 올리기 (0) | 2014.07.21 |
[Tiva] Error connecting to the target: Frequency is out of range. (0) | 2014.07.19 |
설정
트랙백
댓글
글
mcu를 활용한 진동모터 회로 설계
mcu의 출력을 직접 진동모터에 연결해보니 진동모터에 걸리는 전압이 급격히 낮아지면서 진동모터가 전혀 동작을 하지 않는 것을 깨닫고 방법을 생각하던 중 문득 트랜지스터를 사용하는 방법을 깨닫게 되었습니다.
전자회로에 대한 기본 베이스가 약하신 분들의 경우 직접 설계를 하는 것이 약간은 어려울 것이라 생각합니다. 대략 아래와 같이 설계해본 결과 진동모터가 수월하게 작동하는 것을 확인할 수 있었습니다.
대략 회로를 설명드리자면 MCU에서 OUTPUT으로 설정한 핀을 트랜지스터의 Base에 연결하고 진동모터를 Collector에 연결한 후 Emitter는 GND로 연결한 상황입니다.
Output 단자의 출력이 0일 경우 Collector에는 전류가 흐르지 않습니다.
Output 단자의 출력이 1일 경우 Collector에는 전류가 흐르게 되어 진동모터가 동작을 하게 됩니다.
약간은 단순한 회로이지만 다른 MCU의 전압으로는 동작이 곤란한 회로에 활용할 수 있을 것입니다.
'임베디드 > MCU' 카테고리의 다른 글
Infineon AURIX TC237 사용기(2) - TriCore™ 컴파일 후 프로그램 실행 (5) | 2016.06.26 |
---|---|
Infineon AURIX TC237 사용기(1) - TriCore™ Entry Tool Chain 설치하기 (1) | 2016.04.26 |
Timer를 활용하여 특정 파형간 간격 측정방법 (0) | 2015.03.25 |
MCU 입력으로 설정한 핀의 값이 일정하지 않을 때(Floating) (1) | 2014.07.27 |
I2C(TWI) 통신 (2) | 2014.07.24 |