写保留位,会导致不可预料的错误 !

typedef unsigned long  uint32_t;
#define wdtcon (*((volatile uint32_t *)0x53000000))

#define GPFCON (*((volatile uint32_t *)0X56000050))
#define GPFDATA (*((volatile uint32_t *)0X56000054))
#define GPFUP   (*((volatile uint32_t *)0X56000058))

#define GPGCON (*((volatile uint32_t *)0X56000060))

#define SRCPND (*((volatile uint32_t *)0X4A000000))
#define INTMOD (*((volatile uint32_t *)0X4A000004))
#define INTMASK (*((volatile uint32_t *)0X4A000008))
#define PRIORITY (*((volatile uint32_t *)0X4A00000C))
#define EXTINT0 (*((volatile uint32_t *)0X56000088))
#define EXTINT1 (*((volatile uint32_t *)0X5600008C))
#define EINTMASK (*((volatile uint32_t *)0X560000A4))
#define EINTPEND (*((volatile uint32_t *)0X560000A8))
#define INTPEND (*((volatile uint32_t *)0X4A000010))
#define INTOFFSET (*((volatile uint32_t *)0X4A000014))

#define Fall_INT 2

#define KEY1_EINT 0
#define KEY2_EINT 2
#define KEY3_EINT 5

#define KEY1_PIN 0
#define KEY2_PIN 2
#define KEY3_PIN 3

/*
 * LED1,LED2,LED4对应GPF4、GPF5、GPF6
 */
#define GPF4_out (1<<(4*2))
#define GPF5_out (1<<(5*2))
#define GPF6_out (1<<(6*2))

#define GPF4_msk (3<<(4*2))
#define GPF5_msk (3<<(5*2))
#define GPF6_msk (3<<(6*2))

/*
 * S2,S3,S4对应GPF0、GPF2、GPG3
 */
#define GPF0_eint     (0x2<<(0*2))
#define GPF2_eint     (0x2<<(2*2))
#define GPG3_eint     (0x2<<(3*2))

#define GPF0_msk    (3<<(0*2))
#define GPF2_msk    (3<<(2*2))
#define GPG3_msk    (3<<(3*2))

#define LED1  4
#define LED2  5
#define LED3  6
#define output 1
#define eint 2
#define Ledon 0
#define Ledclose 1
#define Led_ON(n) GPFDATA &= ~((Ledclose << LED##n))
#define Led_Toggle(n) GPFDATA ^= ((Ledclose << LED##n))
#define Led_CLOSE(n) GPFDATA |= (Ledclose << LED##n)
void disable_watch_dog(void)
{
    wdtcon = 0;
}
void delayms(uint32_t u32delayms)
{
    uint32_t i;
    for(i = 0; i < 1000*u32delayms; i++)
    {
    }    
}
void ledinit(void)
{
    // LED1,LED2,LED4对应的3根引脚设为输出
    GPFCON &= ~(GPF4_msk | GPF5_msk | GPF6_msk);
    GPFCON |= GPF4_out | GPF5_out | GPF6_out;
    
    //GPFCON = 0;   给这个寄存器直接赋值,其中这个寄存器有一些是保留位,会导致系统复位。
    //GPFCON |= (output << (LED1 * 2)) | (output << (LED2 * 2)) | (output << (LED3 * 2));

    //GPFDATA = wdtcon;
    //delayms(2);
    //GPFDATA |= ((Ledclose << LED1) | (Ledclose << LED2) | (Ledclose << LED3));
    //GPFUP = 0;
   /* */
}

void initKeyIRQ(void)
{
    
    GPFCON |= (eint << (KEY1_PIN * 2)) | (eint << (KEY2_PIN * 2)); 
    GPGCON |= (eint << (KEY3_PIN * 2));
    SRCPND = (1 << KEY1_EINT) | (1 << KEY2_EINT)|  (1 << KEY3_EINT);
    INTPEND = (1 << KEY1_EINT) | (1 << KEY2_EINT)|  (1 << KEY3_EINT);
    EINTMASK &= ~(1 << 11);
    INTMOD = 0;
    /*
    //PRIORITY = 0;
    PRIORITY = (PRIORITY & ((~0x01) | (0x3<<7))) | (0x0 << 7) ;
    //PRIORITY = (PRIORITY & ((~0x01) | (0x3<<7))) | (0x0 << 7) ;
    //EXTINT0 |= (Fall_INT << (KEY1_EINT * 4)) | (Fall_INT << (KEY2_EINT * 4));
    //EXTINT1 |= (Fall_INT << (12));
    INTMASK &= ~((1 << KEY1_EINT) | (1 << KEY2_EINT) | (1 << KEY3_EINT));
    
    // S2,S3对应的2根引脚设为中断引脚 EINT0,ENT2
    GPFCON &= ~(GPF0_msk | GPF2_msk);
    GPFCON |= GPF0_eint | GPF2_eint;


    // S4对应的引脚设为中断引脚EINT11
    GPGCON &= ~GPG3_msk;
    GPGCON |= GPG3_eint;
    
    // 对于EINT11,需要在EINTMASK寄存器中使能它
    EINTMASK &= ~(1<<11);
       */ 
    /*
     * 设定优先级:
     * ARB_SEL0 = 00b, ARB_MODE0 = 0: REQ1 > REQ3,即EINT0 > EINT2
     * 仲裁器1、6无需设置
     * 最终:
     * EINT0 > EINT2 > EINT11即K2 > K3 > K4
     */
    PRIORITY = (PRIORITY & ((~0x01) | (0x3<<7))) | (0x0 << 7) ;


    // EINT0、EINT2、EINT8_23使能
    INTMASK   &= (~(1<<0)) & (~(1<<2)) & (~(1<<5));
}


void EINT_Handle(void)
{
    uint32_t offt;
    offt = INTOFFSET;
    switch(offt)
    {
        case 0:
            //GPFDATA |= (0x7<<4);   // 所有LED熄灭
            Led_Toggle(1);
            //GPFDATA &= ~(1<<4);      // LED1点亮
            break;
        case 2:
            //GPFDATA |= (0x7<<4);   // 所有LED熄灭
            Led_Toggle(2);
            //GPFDATA &= ~(1<<5);      // LED1点亮
            break;
        case 5:
            //GPFDATA |= (0x7<<4);   // 所有LED熄灭
            Led_Toggle(3);
            //GPFDATA &= ~(1<<6);      // LED1点亮
            break;
    }
    delayms(50);
    if(5 == offt)
    {
        EINTPEND = (1 << 11);
    }
    
    SRCPND = (1 << offt);
    INTPEND = (1 << offt);

}

后来网上查了一下, 写保留位,会导致不可预料的错误 !

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值