#ARM인터럽트실습
예제 1. 핀4번에 interrupt, 핀 8번에는 인터럽트를 발생시켜보았다.
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//---------- 입출력 IO설정
#define PIO_ASR (*(volatile unsigned int *) 0xFFFFF470)
#define PIO_BSR (*(volatile unsigned int *) 0xFFFFF474)
#define PIO_PDR (*(volatile unsigned int *) 0xFFFFF404)
#define PIO_SODR (*(volatile unsigned int *) 0xFFFFF430) //출력
#define PIO_CODR (*(volatile unsigned int *) 0xFFFFF434) //출력 하지 않음
#define PIO_OER (*(volatile unsigned int *) 0xFFFFF410) //출력 방향 설정
#define PIO_PER (*(volatile unsigned int *) 0xFFFFF400) //병렬 입출력 제어 레지스터 병렬 입출력 포트로 사용한다.
#define PIO_PUDR (*(volatile unsigned int *) 0xFFFFF460) //풀업 금지 레지스터
#define PIO_PUER (*(volatile unsigned int *) 0xFFFFF464)
#define PIO_IFER (*(volatile unsigned int *) 0xFFFFF420) //글리치 필터 사용허가 레지스터
#define PIO_IER (*(volatile unsigned int *) 0xFFFFF440) //인터럽트 인에이플 레지스터
#define PIO_ISR (*(volatile unsigned int *) 0xFFFFF44C)
//----------AIC 인터럽트 설정
#define AIC_IECR (*(volatile unsigned int *) 0xFFFFF120)
#define AIC_SMR (*(volatile unsigned int *) 0xFFFFF008)
#define AIC_SVR (*(volatile unsigned int *) 0xFFFFF088)
#define AIC_IDCR (*(volatile unsigned int *) 0xFFFFF124)
#define AIC_ICCR (*(volatile unsigned int *) 0xFFFFF128)
//---------- 전력 제어 설정
#define PMC_PCER (*(volatile unsigned int *) 0xFFFFFC10)
#define MASTERCLOCK 48000000
void Delayms(unsigned int ms) //딜레이 함수..
{
volatile unsigned int count, countmax = (MASTERCLOCK / 10000) * ms;
for(count = 0; count < countmax; count++);
}
int interrupt(void)
{
PIO_SODR = 0x00000010;
Delayms(300);
PIO_CODR = 0x00000010; //인터럽트가 발생하면, 1번실행되고 종료한다.
Delayms(300);
}
int main(void)
{
PMC_PCER=0x00000004; //PID2의 클록의 공급을 허용
PIO_PER=0x00000110;
//2진수: 0x0000 0000 0000 0000 0000 0000 0001 0001 0000 = 16진수 : 0x0000 0004이다.
//p8은 인터럽트이고, p4는 led이다.
PIO_PUER=0x00000100;
PIO_IER=0x00000100;
PIO_IFER=0x00000100;
PIO_SODR=0x00000000;
AIC_IECR=0x00000004; //PID2를 1로 설정하여 인터럽트를 허용해준다.
AIC_SMR=0x00000066; //2진수로 나타내면 : 110 0110이다.
//중요한건 110을 나타내는 6인데: 이것은 11을 나타내며 POSITIVE edge trigger이다
AIC_SVR=(unsigned int)interrupt;
while(1)
{
}
return 0;
}
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
결과는 인터럽트가 한번 발생하고 종료하게 된다.
예제 2. 핀4번에 interrupt, 핀 8번에는 인터럽트를 발생하는데, 스위치를 연결하여 누를때마다 인터럽트가 동작하는 실습
이때는 PIO_ISR레지스터를 설정해줘야 한다. 병렬 I/O포트의 각 핀에서 rising edge나 falling edge가 발생하면 병렬 입출력 제어기 인터럽트를 요청하도록 설정할 수 있따. 이러한 입력신호의 상채변화는 PIO_ISR 레지스터에 저장되어 인터럽트를 요청하며, 소프트웨어로 이 레지스터를 읽으면 모든 비트가 클리어된다.
두번째 실습은 define설정과 ISR설정 부분만 간략하게 나타내었다.
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////.
#define PIO_ISR (*(volatile unsigned int *) 0xFFFFF44C)
//define설정, 인터럽트에도 AIC_ISR레지스터가 있다. 구분하여 사용해야한다.
int interrupt(void)
{
int clear;
PIO_SODR = 0x00000010;
Delayms(300);
PIO_CODR = 0x00000010; //인터럽트가 발생하면, 1번실행되고 종료한다.
Delayms(300);
clear = PIO_ISR;
return 0;
}/////////////////////////////////////////////////////////////////////////////////////////////////////////////////
이렇게 설정을 해주면, ISR레지스터 특성상, read되는 순간 클리어 되므로, 스위치를 누를때 마다 인터럽트가 실행되는걸 확인해 볼 수 있다.
'코스웨어 > 10년 스마트폰BSP' 카테고리의 다른 글
[BSP]업무일지-박노준-20100701 (0) | 2010.07.01 |
---|---|
[BSP]업무일지-손대원-20100630 (0) | 2010.06.30 |
[BSP]업무일지-김 진-20100629 (1) | 2010.06.30 |
[BSP]-업무일지-정홍환-20100628 (1) | 2010.06.28 |
[BSP]업무일지_차상목_20100624 (0) | 2010.06.24 |
[BSP]업무일지_이도헌_ 20100623 (0) | 2010.06.23 |
[BSP]업무일지-박동수-20100622 (0) | 2010.06.22 |
[BSP]업무일지-한정효-20100621 (0) | 2010.06.21 |