新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > OK6410按鍵中斷點亮lED

        OK6410按鍵中斷點亮lED

        作者: 時間:2016-11-21 來源:網絡 收藏
        首先理清楚要準備的幾個方面
        1.LED初始化
        2.按鍵初始化
        3.中斷初始化
        4.中斷處理程序
        首先初始化LED,以前說過了,不說
        按鍵初始化,這里既然要用到中斷,就不用傳統的延時消抖的辦法了,直接用中斷。
        只要把對應的位設置成10,就是外部中斷了
        這里用XEINT0和XEINT5,有理由的,為什么選這兩個后面會說
        void button_init()
        {
        *(GPNCON)=0x802; //配置按鍵位外部中斷
        }
        接下來中斷初始化,一下說的比較清楚了,寄存器的名字直接在s3c6410里面查找就可以了,為什么選XEINT0和XEINT5的原因在注釋最長的那一行里面
        void init_irq()
        {
        //配置按鍵中斷下降沿觸發
        *(EINT0CON0)=0b010;
        //取消中斷屏蔽
        *(EINT0MASK)=0x0;
        //打開中斷
        *(VIC0INTENABLE)=0x3;
        *(VIC0VECTADDR0)=(int)k1_isr; //把中斷處理程序的地址寫入中斷向量表
        *(VIC0VECTADDR1)=(int)k2_isr; //注意external interrupt0和external interrupt1屬于同一個VIC0,使用同一個中斷向量地址,所以這里用XEINT1和XEINT5
        //設置cpsr寄存器使用向量方式中斷,打開總中斷
        __asm__(
        "mrc p15,0,r0,c1,c0,0n" //使用中斷向量表
        "orr r0,r0,#(1<<24)n"
        "mcr p15,0,r0,c1,c0,0n"
        "mrs r0,cpsrn"
        "bic r0, r0, #0x80n" //cpsr第7位清零,取消中斷不使能
        "msr cpsr_c, r0n"
        :
        :
        );
        }
        中斷處理程序
        void k1_isr()
        {
        //保存環境
        __asm__(
        "sub lr, lr, #4n"
        "stmfd sp!, {r0-r12, lr}n"
        :
        :
        );
        //中斷處理
        led_off();
        //清除中斷
        EXT_INT_0_PEND = ~0x0; //清除標記 pend是中斷標志位
        VIC0ADDRESS = 0; //把向量地址清零,方便下次用向量方式處理中斷
        VIC1ADDRESS = 0; //
        //恢復環境
        __asm__(
        "ldmfd sp!, {r0-r12, pc}^ n"
        :
        :
        );
        }
        OK6410里面我感覺中斷有一點比較特殊,就是可以采用向量方式處理中斷,這里就需要知道,先來個表格





        就是這個,這里可以看到,external interrupt0到external interrupt3共同屬于VIC0組,這樣它在使用向量方式時就會共用向量地址,所以在同時用external interrupt0和external interrupt1時就會出現external interrupt1的按鍵沒有用,就是因為向量地址被external interrupt0占用了,所以我用了external interrupt0和external interrupt5,external interrupt5屬于VIC1,向量地址在external interrupt0的向量地址的基礎上加4。
        This time can be OK


        評論


        技術專區

        關閉
        主站蜘蛛池模板: 陵川县| 荃湾区| 沙田区| 慈溪市| 桐城市| 丹棱县| 阿巴嘎旗| 大竹县| 邳州市| 信宜市| 黔南| 辽阳市| 卢氏县| 金阳县| 陇南市| 襄垣县| 静乐县| 龙江县| 东丽区| 秦安县| 湟源县| 临澧县| 新蔡县| 东光县| 民勤县| 瑞昌市| 成安县| 宜城市| 长白| 桐柏县| 武邑县| 鄄城县| 潼关县| 富裕县| 宿州市| 卫辉市| 武穴市| 武冈市| 清丰县| 南召县| 德兴市|