キーブレークヌードマシンプログラミング操作手順

3385 ワード

1、CPSRレジスタbit 7をクリアする必要があります.これは割り込みの総スイッチです.bit 7が1に設定されている場合、cpuは割り込みに応答できません.
bic r0, r0, #(1<<7)  /*   I ,      */
msr cpsr, r0

2、異常入口の設置
    ldr pc, irq_addr /* vector 0x18 : irq          0x18    */

    irq_addr:
	    .word do_irq

3、入口での設定と呼び出し
do_irq:
	/*        :
	 * 1. lr_irq                       
	 * 2. SPSR_irq         CPSR
	 * 3. CPSR  M4-M0    10010,    irq  
	 * 4.   0x18        
	 */

	/* sp_irq   ,      */
	ldr sp, =0x33d00000

	/*      */
	/*  irq             r0-r12,       */
	/* lr-4            ,      */
	sub lr, lr, #4
	stmdb sp!, {r0-r12, lr}  
	
	/*   irq   */
	bl handle_irq_c
	
	/*      */
	ldmia sp!, {r0-r12, pc}^  /* ^  spsr_irq     cpsr  */

4、irq異常を扱う関数の作成

/*  EINTPEND     EINT  (eint4~23)
 *      ,  EINTPEND    
 */


void key_eint_irq(int irq)
{
	unsigned int val = EINTPEND;
	unsigned int val1 = GPFDAT;
	unsigned int val2 = GPGDAT;
	
	if (irq == 0) /* eint0 : s2    D12 */
	{
		if (val1 & (1<<0)) /* s2 --> gpf6 */
		{
			/*    */
			GPFDAT |= (1<<6);
		}
		else
		{
			/*    */
			GPFDAT &= ~(1<<6);
		}
		
	}
	else if (irq == 2) /* eint2 : s3    D11 */
	{
		if (val1 & (1<<2)) /* s3 --> gpf5 */
		{
			/*    */
			GPFDAT |= (1<<5);
		}
		else
		{
			/*    */
			GPFDAT &= ~(1<<5);
		}
		
	}
	else if (irq == 5) /* eint8_23, eint11--s4    D10, eint19---s5     LED */
	{
		if (val & (1<<11)) /* eint11 */
		{
			if (val2 & (1<<3)) /* s4 --> gpf4 */
			{
				/*    */
				GPFDAT |= (1<<4);
			}
			else
			{
				/*    */
				GPFDAT &= ~(1<<4);
			}
		}
		else if (val & (1<<19)) /* eint19 */
		{
			if (val2 & (1<<11))
			{
				/*    */
				/*     LED */
				GPFDAT |= ((1<<4) | (1<<5) | (1<<6));
			}
			else
			{
				/*   :     LED */
				GPFDAT &= ~((1<<4) | (1<<5) | (1<<6));
			}
		}
	}

	EINTPEND = val;
}


void handle_irq_c(void)
{
	/*       */
	int bit = INTOFFSET;

	/*           */
	if (bit == 0 || bit == 2 || bit == 5)  /* eint0,2,eint8_23 */
	{
		key_eint_irq(bit); /*     ,     EINTPEND */
	}

	/*     :        */
	SRCPND = (1<

5、main関数で初期化
	key_eint_init();   /*      ,       */
	timer_init();

6、初期化関数の作成
/* SRCPND            ,        
 * bit0-eint0
 * bit2-eint2
 * bit5-eint8_23
 */

/* INTMSK       , 1-masked
 * bit0-eint0
 * bit2-eint2
 * bit5-eint8_23
 */

/* INTPND             、       ,        
 * bit0-eint0
 * bit2-eint2
 * bit5-eint8_23
 */

/* INTOFFSET :     INTPND        1
 */

/*          */
void interrupt_init(void)
{
	INTMSK &= ~((1<<0) | (1<<2) | (1<<5));
}

/*      ,       */
void key_eint_init(void)
{
	/*   GPIO      */
	GPFCON &= ~((3<<0) | (3<<4));
	GPFCON |= ((2<<0) | (2<<4));   /* S2,S3         */

	GPGCON &= ~((3<<6) | (3<<22));
	GPGCON |= ((2<<6) | (2<<22));   /* S4,S5         */
	

	/*         :       */
	EXTINT0 |= (7<<0) | (7<<8);     /* S2,S3 */
	EXTINT1 |= (7<<12);             /* S4 */
	EXTINT2 |= (7<<12);             /* S5 */

	/*   EINTMASK  eint11,19 */
	EINTMASK &= ~((1<<11) | (1<<19));
}