キーブレークヌードマシンプログラミング操作手順
3385 ワード
1、CPSRレジスタbit 7をクリアする必要があります.これは割り込みの総スイッチです.bit 7が1に設定されている場合、cpuは割り込みに応答できません.
2、異常入口の設置
3、入口での設定と呼び出し
4、irq異常を扱う関数の作成
5、main関数で初期化
6、初期化関数の作成
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));
}