新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > at91rm9200的io口電平中斷簡單理解

        at91rm9200的io口電平中斷簡單理解

        作者: 時間:2016-11-09 來源:網絡 收藏
        對于PQFP封裝的9200的PIOA、PIOB和PIOC三組32*3=64個io口,他們的io中斷有這樣的特性PIO的中斷AT91C_AIC_SRCTYPE_EXT_HIGH_LEVEL和AT91C_AIC_SRCTYPE_INT_LEVEL_SENSITIVE都是電平中斷,對于PIO來說沒有區別,在PIO中斷處理函數里邊通過檢測發生io中斷的相應io引腳輸入值為0還是為1,來判斷是高電平中斷還是低電平中斷,PIO的PIO_IER使能的相應io口線上輸入變化中斷--注意是變化中斷,所以對于io電平中斷也必須存在電平變化之后才能被9200捕獲到,也才能引發中斷,執行中斷處理函數,io口線上無電平變化也就無電平中斷會被觸法,這和51單片機的io電平中斷機制不同,51單片機當啟用外部電平中斷之后,51處理器每個clk都會檢測io的電平,如果符合中斷電平,那么立即觸發電平中斷,所以對于51單片機,只要io口上的電平為中斷電平值,那么就會不斷的觸法51的中斷處理程序,直到io口電平變為非中斷電平值51處理器才會停止觸法中斷,9200即便配置io為電平中斷,但是也需要io線上只有發上了電平變化,9200才會觸法電平變化中斷,至于這個變化中斷最終是變為了低電平還是變為了高電平,那么需要在處理程序中讀取io值才可以進一步判斷,不過如果存在其他irq中斷屏蔽I時間比較長,同時io電平中斷變化持續時間又比較短,那么很可能出現,到執行io電平中斷處理程序時,讀取到的io口數據已經不是引發中斷的電平值了,所以io電平中斷不是很好用,可以使用AT91C_AIC_SRCTYPE_INT_EDGE_TRIGGERED雙邊沿中斷或者AT91C_AIC_SRCTYPE_EXT_POSITIVE_EDGE上升沿中斷來完成,對于io口最好使用AT91C_AIC_SRCTYPE_EXT_POSITIVE_EDGE上升沿中斷機制,這不會出現誤數據,最壞僅僅是可能會丟掉后面的1~2個上升沿[gliethttp_20080104]

        以PIOB的PB0為例:
        #defineLEVEL_IRQ_PIN(0x01<<0)
        AT91F_PMC_EnablePeriphClock(AT91C_BASE_PMC,((unsignedint)1AT91F_AIC_ConfigureIt(AT91C_BASE_AIC,
        AT91C_ID_PIOB,
        1,
        AT91C_AIC_SRCTYPE_EXT_POSITIVE_EDGE,
        //AT91C_AIC_SRCTYPE_INT_EDGE_TRIGGERED,//雙邊沿
        //AT91C_AIC_SRCTYPE_EXT_HIGH_LEVEL,
        //AT91C_AIC_SRCTYPE_INT_LEVEL_SENSITIVE,//
        (void(*)(void))piob_interrupt_proc);
        {volatiledummy;dummy=AT91C_BASE_PIOB->PIO_ISR;}
        AT91F_PIO_InterruptEnable(AT91C_BASE_PIOB,LEVEL_IRQ_PIN);//使能PB0變化中斷
        {volatiledummy;dummy=AT91C_BASE_PIOB->PIO_ISR;}
        AT91F_AIC_EnableIt(AT91C_BASE_AIC,AT91C_ID_PIOB);//使能PIOB控制器中斷
        以上就完成了PB0的上升沿中斷啟動,來看看中斷處理函數[ads1.2]
        void__irq piob_interrupt_proc(void)
        {
        {volatiledummy;dummy=AT91C_BASE_PIOB->PIO_ISR;}
        AT91C_BASE_AIC->AIC_EOICR=0;
        if(AT91F_PIO_GetInput(AT91C_BASE_PIOB)&LEVEL_IRQ_PIN)
        {
        //...1電平
        }else
        {
        //...0電平
        }
        }


        評論


        技術專區

        關閉
        主站蜘蛛池模板: 方山县| 从化市| 江安县| 阿城市| 平原县| 大田县| 墨竹工卡县| 吴忠市| 乐山市| 临猗县| 方山县| 洪湖市| 同心县| 林芝县| 时尚| 获嘉县| 咸丰县| 栾川县| 庄浪县| 吉木萨尔县| 河池市| 平凉市| 沁水县| 灯塔市| 调兵山市| 科技| 大竹县| 连州市| 卢湾区| 邯郸县| 紫阳县| 泰安市| 泾阳县| 阳信县| 精河县| 长子县| 滨州市| 都兰县| 阿拉善右旗| 太保市| 长海县|