#include "exynos_4412.h"
void do_irq()
{
// 獲取中斷號
unsigned int irq_num = CPU0.ICCIAR & 0x3ff;
switch(irq_num)
{
case 57:
printf("This interrupt id is %d\n", irq_num);
PWM.TCON = PWM.TCON ^ 0x1;
EXT_INT41_PEND = 0x1 << 1; // 清pend(置1清0)
ICDICPR.ICDICPR1 = 0x1 << 25; // 清gic
break;
case 58:
printf("This interrupt id is %d\n", irq_num);
GPX2.DAT = GPX2.DAT ^ (0x1 << 7);
EXT_INT41_PEND = 0x1 << 2; // 清pend(置1清0)
ICDICPR.ICDICPR1 = 0x1 << 26; // 清gic
break;
default:
printf("error!\n");
break;
}
// 把處理器中處理完的中斷號返回給gic
// 告訴gic該中斷處理結束,可以送入下一個pending進入
CPU0.ICCEOIR = (CPU0.ICCEOIR & ~(0x3ff)) | irq_num;
}
void peripheral_init()
{
GPX1.CON = 0xff << 4; // 配置GPIO為外部中斷
EXT_INT41_CON = 0x22 << 4; // 下降沿觸發中斷
EXT_INT41_MASK = 0x0; // 使能相應外設
}
void gic_init()
{
ICDISER.ICDISER1 = 0x3 << 25; // 使能按鍵中斷號
ICDIPTR.ICDIPTR14 = 0x0101 << 8; // 選擇cpu接口
ICDDCR = 0x1; // 使能中斷到分配器
CPU0.ICCICR = 0x1; // 把中斷從cpu接口送入處理器
// 屏蔽中斷優先級,255表示所有中斷都允許通過
CPU0.ICCPMR = 0xff;
}
void mydelay_ms(int ms)
{
int i, j;
while(ms--)
{
for (i = 0; i < 5; i++)
for (j = 0; j < 500; j++);
}
}
void pwm_init()
{
GPD0.CON = 0x2; // GPIO配置為TOUT_0
PWM.TCNTB0 = 1000;
PWM.TCMPB0 = 500;
PWM.TCFG0 = 0x63; // 預分頻值為99 -> 100
PWM.TCFG1 = 0x3; // 二級分頻為1/8
PWM.TCON = 0x2; // 手動裝載
PWM.TCON = 0x8; // 自動重裝
}
void led_init()
{
GPX2.CON = GPX2.CON & (0xf << 28) | (0x1 << 28);
}
int main()
{
peripheral_init();
gic_init();
pwm_init();
led_init();
int i = 0;
while(1)
{
mydelay_ms(800);
}
return 0;
}
|