lpc1768 cortex-m3 interruptael.chungbuk.ac.kr/lectures/undergraduate/임베디드sw...-...

23
1 LPC1768 Cortex-M3 Interrupt

Upload: others

Post on 02-Feb-2021

35 views

Category:

Documents


0 download

TRANSCRIPT

  • 1

    LPC1768 Cortex-M3 Interrupt

  • 2 345v09

    개요 특징 EXTI는 System Control Part이며 동작하는 핀이 정해져 있음. GPIO Interrupt는 포트0, 2만 사용하며 동작하는 핀은 사용자가 설정함. NVIC는 관련 함수가 있지만 인터럽트는 관련 함수가 없고 레지스터에 접근해서 프로그램 해야 함.

    EXTI TheLPC17xx includes four External Interrupt Inputs as selectable pin functions. In

    addition, external interrupts have the ability to wake up the CPU from Power-down mode. The external interrupt function has four registers associated with it. The EXTINT

    register contains the interrupt flags. The EXTMODE and EXTPOLAR registers specify the level and edge sensitivity parameters.

  • 3 345v09

    개요 GPIO Interrupt Port 0 and Port 2 can provide a single interrupt for any combination of port pins. Each port pin can be programmed to generate an interrupt on a rising edge, a falling

    edge, or both. GPIO0 and GPIO2 interrupts share the same position in the NVIC with External

    Interrupt 3.

    관련 구조체 및 함수의 정의 EXTI를 설정하는 SystemContrl 구조체 SC와 GPIO 인터럽트를 설정하는 구조체

    GPIOINT_TypeDef는 Core/CM3/lpc17xx.h에 정의되어 있고 NVIC 관련 함수들은 Core/CM3/core_cm3.h와 drivers/source/lpc17xx _nvic.h에 정의되어 있다.

  • 4 345v09

    주요 함수와 구조체의 상세 설명 주요 함수와 구조체의 상세 설명 NVIC_EnableIRQ() : NVIC 인터럽트 컨트롤러의 인터럽트를 활성화한다. 함수원형 : static __INLINE void NVIC_EnableIRQ (IRQn_Type IRQn)

    매개변수 : IRQn : 인터럽트의 종류

    상세설명 NVIC에서 인터럽트를 활성화할 때 사용하는 함수로 IRQn_Type에 활성화하고자 하는 인터럽트의 종류를 입력해야 하며 인터럽트 종류는 다음과 같다.

  • 5 345v09

    주요 함수와 구조체의 상세 설명 주요 함수와 구조체의 상세 설명 NVIC_EnableIRQ() : NVIC 인터럽트 컨트롤러의 인터럽트를 활성화한다. 상세설명

    NonMaskableInt_IRQn 2 Non Maskable Interrupt MemoryManagement_IRQn 4 Cortex-M3 Memory Management Interrupt BusFault_IRQn 5 Cortex-M3 Bus Fault Interrupt UsageFault_IRQn 6 Cortex-M3 Usage Fault Interrupt SVCall_IRQn 11 Cortex-M3 SV Call Interrupt DebugMonitor_IRQn 12 Cortex-M3 Debug Monitor Interrupt PendSV_IRQn 14 Cortex-M3 Pend SV Interrupt SysTick_IRQn 15 Cortex-M3 System Tick Interrupt WDT_IRQn Watchdog Timer Interrupt TIMER0_IRQn Timer0 Interrupt TIMER1_IRQn Timer1 Interrupt TIMER2_IRQn Timer2 Interrupt TIMER3_IRQn Timer3 Interrupt UART0_IRQn UART0 Interrupt UART1_IRQn UART1 Interrupt UART2_IRQn UART2 Interrupt UART3_IRQn UART3 Interrupt PWM1_IRQn PWM1 Interrupt I2C0_IRQn I2C0 Interrupt I2C1_IRQn I2C1 Interrupt I2C2_IRQn I2C2 Interrupt

    I2C2_IRQn I2C2 Interrupt SPI_IRQn SPI Interrupt SSP0_IRQn SSP0 Interrupt SSP1_IRQn SSP1 Interrupt PLL0_IRQn PLL0 Lock (Main PLL) Interrupt RTC_IRQn Real Time Clock Interrupt EINT0_IRQn External Interrupt 0 Interrupt EINT1_IRQn External Interrupt 1 Interrupt EINT2_IRQn External Interrupt 2 Interrupt EINT3_IRQn External Interrupt 3 Interrupt ADC_IRQn A/D Converter Interrupt BOD_IRQn Brown-Out Detect Interrupt USB_IRQn USB Interrupt CAN_IRQn CAN Interrupt DMA_IRQn General Purpose DMA Interrupt I2S_IRQn I2S Interrupt ENET_IRQn Ethernet Interrupt RIT_IRQn Repetitive Interrupt Timer Interrupt MCPWM_IRQn Motor Control PWM Interrupt QEI_IRQn Quadrature Encoder Interface Interrupt PLL1_IRQn PLL1 Lock (USB PLL) Interrupt

  • 6 345v09

    주요 함수와 구조체의 상세 설명 NVIC_SetPriorityGrouping() : NVIC 인터럽트 컨트롤러의 우선순위 그룹을 설정한다.

    함수원형 static __INLINE void NVIC_SetPriorityGrouping (uint32_t PriorityGroup)

    매개변수 : PriorityGroup : 인터럽트 우선순위 그룹 필드 설정 값

    상세설명 NVIC에서 각각의 인터럽트에 우선순위를 설정하기 위한 함수. PriorityGroup의 값을 이용하여 우선순위를 설정하는 비트필드 PRI_N[7:0]에서 우선순위 그룹과 보조 우선순위의 비트수를 정하게 된다.

    반환 값 : 없음.

  • 7 345v09

    주요 함수와 구조체의 상세 설명 NVIC_SetPriority() : 인터럽트의 우선순위를 설정한다.

    함수원형 : static __INLINE void NVIC_SetPriority (IRQn_Type IRQn, uint32_t priority)

    매개변수 : IRQn : 인터럽트의 종류 priority : 인터럽트의 우선순위

    상세설명 인터럽트의 우선순위를 설정하기 위한 함수로 매개변수 IRQn은 우선순위를 설정할 인터럽트의 종류를 나타내며 인터럽트 종류는 앞서 설명한 NVIC_EnableIRQ()의 상세설명을 참조하기 바란다. priority는 인터럽트의 우선순위 값을 나타내며 인터럽트 우선순위는 최대 32단계로 지정이 가능하므로 0~31 사이의 값을 입력하면 된다.

    반환 값 : 없음.

  • 8 345v09

    주요 함수와 구조체의 상세 설명 SC_TypeDef : 시스템 컨트롤 관련 사항을 설정하는 구조체. EINT(External Interrupt)는 시스템 컨트롤에 속해있으므로 SC_TypeDef 구조체를 이용하여 설정한다. 구조체선언 : typedef struct{ ... 생략 ... __IO uint32_t EXTINT; /* External Interrupts */ uint32_t RESERVED5; __IO uint32_t EXTMODE; __IO uint32_t EXTPOLAR; uint32_t RESERVED6[12]; ... 생략 ... } SC_TypeDef;

  • 9 345v09

    주요 함수와 구조체의 상세 설명 SC_TypeDef : 시스템 컨트롤 관련 사항을 설정하는 구조체. EINT(External Interrupt)는 시스템 컨트롤에 속해있으므로 SC_TypeDef 구조체를 이용하여 설정한다. 구조체 멤버변수 EXTINT : 인터럽트 플래그 레지스터 EXTMODE : 인터럽트 트리거 모드 설정 레지스터 EXTPOLAR : 인터럽트 동작 극성 설정 레지스터

    상세설명 SC_TypeDef는 LPC1768의 리셋이나 저전압 검출 등을 설정하는 시스템 컨트롤 구조체로 EINT(External Interrupt)기능의 설정 사항도 포함하고 있다. SC_TypeDef 구조체의 멤버변수들은 모두 시스템 컨트롤 레지스터에 입력될 값을 가지게 되며 여기에서는 EINT 관련 레지스터에 대해서만 설명하고 다른 부분은 7.1절 시스템 컨트롤을 참조하기 바란다.

  • 10 345v09

    주요 함수와 구조체의 상세 설명 SC_TypeDef 상세설명 EXTINT는 레지스터의 0~3번 비트가 EINT0~ EINT3의 플래그 비트로 동작한다.

    EINTx에 인터럽트가 발생하면 x번 비트가 1로 설정되며, 다시 1을 입력해야 인터럽트가 클리어 된다. 클리어 후에 해당 비트의 값은 다시 0으로 돌아온다. 주의 : EINT가 Low 레벨 트리거로 동작하도록 설정되었을 경우 해당 핀에 Low 레벨의 신호가 입력되는 상태에서는 EXTINT의 해당 비트가 클리어 되지 않는다는 것을 주의한다. 해당 비트를 클리어하기 위해서는 해당 핀에 High 레벨의 신호가 입력되어야 한다. EXTMODE는 레지스터의 0~3번 비트가 EINT0~3에 해당되는 핀이 레벨 트리거 인터럽트로 동작할 것인지 에지 트리거 인터럽트로 동작할 것인지를 설정한다. 해당 비트를 0으로 설정하면 레벨 트리거 인터럽트로 동작하며 1로 설정하면 에지 트리거 인터럽트로 동작한다. EXTPOLAR는 레지스터의 0~3번 비트가 EINT0~3에 해당되는 핀의 인터럽트가 발생하는 시점을 설정한다. 해당 비트에 0을 입력하면 레벨 트리거 인터럽트로 설정 되었을 경우 Low-active로 동작하며 에지 트리거 인터럽트로 설정 되었을 경우 하강 에지에서 인터럽트가 발생한다. 1을 입력하면 레벨 트리거 인터럽트로 설정 되었을 경우 High-active로 동작하며 에지 트리거 인터럽트로 설정 되었을 경우 상승 에지에서 인터럽트가 발생한다.

  • 11 345v09

    Interrupt 예제 관련 회로도 SC_TypeDef 상세설명 EXTINT는 레지스터의 0~3번 비트가 EINT0~ EINT3의 플래그 비트로 동작한다.

    EINTx에 인터럽트가 발생하면 x번 비트가 1로 설정되며, 다시 1을 입력해야 인터럽트가 클리어 된다. 클리어 후에 해당 비트의 값은 다시 0으로 돌아온다. 주의 : EINT가 Low 레벨 트리거로 동작하도록 설정되었을 경우 해당 핀에 Low 레벨의 신호가 입력되는 상태에서는 EXTINT의 해당 비트가 클리어 되지 않는다는 것을 주의한다. 해당 비트를 클리어하기 위해서는 해당 핀에 High 레벨의 신호가 입력되어야 한다. EXTMODE는 레지스터의 0~3번 비트가 EINT0~3에 해당되는 핀이 레벨 트리거 인터럽트로 동작할 것인지 에지 트리거 인터럽트로 동작할 것인지를 설정한다. 해당 비트를 0으로 설정하면 레벨 트리거 인터럽트로 동작하며 1로 설정하면 에지 트리거 인터럽트로 동작한다. EXTPOLAR는 레지스터의 0~3번 비트가 EINT0~3에 해당되는 핀의 인터럽트가 발생하는 시점을 설정한다. 해당 비트에 0을 입력하면 레벨 트리거 인터럽트로 설정 되었을 경우 Low-active로 동작하며 에지 트리거 인터럽트로 설정 되었을 경우 하강 에지에서 인터럽트가 발생한다. 1을 입력하면 레벨 트리거 인터럽트로 설정 되었을 경우 High-active로 동작하며 에지 트리거 인터럽트로 설정 되었을 경우 상승 에지에서 인터럽트가 발생한다.

  • 12 345v09

    Interrupt 예제 관련 회로도

    상태 표시를 위한 LED는 포트1의 28,29,31번 핀과 포트 2의 2~6번 핀과 연결되어 있으며 해당 핀에 1을 출력하면 LED가 켜진다.

    포트2의 10번핀에 연결된 스위치 3은 스위치를 눌렀을 때 입력 핀에 0이 입력된다.

  • 13 345v09

    Interrupt 예제 하드웨어 연결을 아래와 같이 연결 한다.

  • 14 345v09

    Interrupt 예제1 Interrupt 예제1 과제 설명 EINT를 이용한 LED 순차 점등 예제 1은 인터럽트가 발생할 때 마다 GPIO 포트2에 연결되어 있는 5개의 LED가 순차적으로 점등된다. 최초 실행 시 LED3이 켜지고 스위치를 눌러 인터럽트가 발생하면 LED3→LED4→LED5→LED6→LED7→LED3..의 순서로 점등되는 동작을 반복한다.

  • 15 345v09

    Interrupt 예제1 Interrupt 예제1 프로젝트 파일 열기

  • 16 345v09

    Interrupt 예제1 코드 입력

  • 17 345v09

    Interrupt 예제1 분석 헤더 파일 LPC1768의 Cortex-M3 코어 접근 레이어 헤더파일

    GPIO 드라이버 라이브러리 헤더 파일

    주변장치 사용 설정 헤더파일

    핀 연결 기능 설정 헤더파일

    #include "lpc17xx_gpio.h“

    #include "lpc17xx_libcfg.h"

    #include "lpc17xx_pinsel.h"

    #include "lpc17xx.h"

  • 18 345v09

    Interrupt 예제1 분석 Interrupt 핸들러

    uint8_t led;

    void EINT0_IRQHandler(void)

    {

    SC->EXTINT = 0x01; //인터럽트 클리어

    GPIO_ClearValue(2, 0x0000007C);

    led = led

  • 19 345v09

    Interrupt 예제1 분석 Main 함수

    PINSEL_CFG_Type PinCfg; led = 0x04; …. SC->EXTINT = 0x0; SC->EXTMODE = 0x0; SC->EXTPOLAR = 0x0; SC->EXTMODE = 0x1; //에지 트리거 인터럽트 설정 SC->EXTPOLAR = 0x0; //하강 에지 트리거 인터럽트 설정 PinCfg.Funcnum = 1; //포트 2의 10번 EINT0을 동작 설정 PinCfg.OpenDrain = 0; // 오픈드레인 사용하지 않음 PinCfg.Pinmode = 0; //Pull-Up PinCfg.Pinnum = 10; //10핀 설정 PinCfg.Portnum = 2; //포트 2 설정 PINSEL_ConfigPin(&PinCfg); NVIC_EnableIRQ(EINT0_IRQn); // EINT0 활성화

  • 20 345v09

    Interrupt 예제1 분석 Interrupt 예제1 프로그램 설명

    1) 이 프로그램은 4개의 헤더파일을 포함하고 있는데 각 헤더파일의 역할은 다음과 같다. - lpc17xx.h : LPC1768의 Cortex-M3 코어 접근 레이어 헤더파일 - lpc17xx_gpio.h : GPIO 드라이버 라이브러리 헤더파일 - lpc17xx_libcfg.h : 주변장치 사용 설정 헤더파일 -lpc17xx_pinsel.h : 핀 연결 기능 설정 헤더파일

    2) 헤더파일을 포함한 다음에는 LED의 동작 상태를 설정하기 위한 변수 led를 정의하고, 시간 지연을 위한 delay 함수를 정의한다. 3) 인터럽트 핸들러 EINT0_IRQHandler()에서는 먼저 해당 인터럽트를 클리어한 다음 LED가 연결된 GPIO 포트2의 해당 핀들을 클리어하고 led 변수를 왼쪽으로 1비트 시프트 시킨다. 4) 메인 함수의 동작은 다음과 같다. ‧ 먼저 핀의 기능을 설정하기 위한 PINSEL_CFG_Type의 PinCfg 구조체를 선언한다.

    발표자프레젠테이션 노트void GPIO_SetValue ( uint8_t portNum, uint32_t bitValue) 매개변수 : portNum : GPIO포트 번호bitValue : 설정될 비트

  • 21 345v09

    Interrupt 예제1 분석 Interrupt 예제1 프로그램 설명

    ‧ LED가 포트 2의 2번~6번에 연결되어 있으므로 led 변수의 초기 값은 0x04로 설정하여 최초 실행시 포트2의 2번 LED가 켜지도록 한다.

    ‧ 다음으로 SystemInit() 함수를 사용하여 LP1768보드에서 사용하고 있는 12㎒ 외부 크리스탈을 시스템 클록으로 사용하도록 설정한다.

    ‧ 동작 클록을 설정한 다음은 GPIO_SetDir() 함수를 이용하여 LED가 연결되어 있는 해당 핀을 출력으로 설정한다. LED에 출력할 값을 설정하기 전에 먼저 GPIO_ClearValue() 함수를 이용하여 GPIO포트를 클리어 해준다.

    ‧ EINT를 사용하기 위해서 먼저 SC 구조체의 멤버변수인 EXTINT, EXTMODE, EXTPOLAR의 값을 0으로 초기화하고, EXTMODE의 0번 비트를 1로 설정하여 에지 트리거 인터럽트로 동작하도록 설정하고 EXTPOLAR의 0번 비트는 0으로 설정하여 하강 에지에서 인터럽트가 발생하도록 설정한다. 스위치가 눌리면 0이 입력되도록 설계되어 있으므로 스위치를 누르는 순간에 하강에지가 되고 떼는 순간에 상승에지가 된다는 점에 주의 한다.

    발표자프레젠테이션 노트void GPIO_SetValue ( uint8_t portNum, uint32_t bitValue) 매개변수 : portNum : GPIO포트 번호bitValue : 설정될 비트

  • 22 345v09

    Interrupt 예제1 분석 Interrupt 예제1 프로그램 설명

    ‧ 포트2의 10번핀을 EINT0로 동작하도록 설정하기 위해 앞에서 선언한 PinCfg 구조체의 멤버변수 Funcnum, OpenDrain, Pinmode, Pinnum, Portnum을 설정한다. 먼저 Portnum은 2로 Pinnum은 10으로 설정하여 포트2의 10번핀의 동작을 설정하도록 한다. Funcnum은 1로 설정하여 포트2의 10번핀이 EINT0로 동작하도록 설정하였다. Pinmode는 Pull-Up(0), Tri-State(2), Pull-Down(3) 세가지로 설정할 수 있는데, 이 예제에서는 Pinmode를 0으로 하여 Pull-Up으로 설정한다. OpenDrain은 사용하지 않도록 0으로 설정한다.

    ‧ PinCfg 구조체 멤버변수의 값을 모두 설정한 후 PinCfg 구조체와 PINSEL_ConfigPin()함수를 이용하여 EINT0 핀의 동작을 설정한다.

    ‧ 그 다음 NVIC_EnableIRQ() 함수를 이용하여 EINT0의 인터럽트를 활성화 시킨다.

    ‧ LED를 켜기 위해 GPIO_SetValue() 함수를 이용하며, led 변수가 시프트되어 7번 비트에 해당되는 LED까지 켜지면 다시 led 변수를 0x04로 초기화 시켜 주는 동작을 반복한다.

    발표자프레젠테이션 노트void GPIO_SetValue ( uint8_t portNum, uint32_t bitValue) 매개변수 : portNum : GPIO포트 번호bitValue : 설정될 비트

  • 23

    LPC1768 Cortex-M3 Interrupt

    LPC1768 Cortex-M3 �Interrupt개요개요 주요 함수와 구조체의 상세 설명주요 함수와 구조체의 상세 설명주요 함수와 구조체의 상세 설명주요 함수와 구조체의 상세 설명주요 함수와 구조체의 상세 설명주요 함수와 구조체의 상세 설명주요 함수와 구조체의 상세 설명Interrupt 예제 관련 회로도Interrupt 예제 관련 회로도Interrupt 예제Interrupt 예제1Interrupt 예제1Interrupt 예제1Interrupt 예제1 분석Interrupt 예제1 분석Interrupt 예제1 분석Interrupt 예제1 분석Interrupt 예제1 분석Interrupt 예제1 분석LPC1768 Cortex-M3 � Interrupt