娇小w搡bbbb搡bbb,《第一次の人妻》,中国成熟妇女毛茸茸,边啃奶头边躁狠狠躁视频免费观看

外部中斷作為處理器響應外部事件的通道,在控制系統中起著非常重要的作用。下面就來討論一下LPC1114外部中斷的使用情況。


LPC1114的每一個引腳都可以響應一個外部中斷,所以有多少個引腳就有多少個外部中斷。但LPC1114的中斷系統非常強大,外部中斷只是它其中的一小部分。因此,要用好外部中斷,就必須先來了解LPC1114的整個中斷系統。下面就來看一下它的中斷系統。


在LPC11xx系列處理器中,有一個部分被稱為“私有外設總線”(Private peripheral bus),它位于Memory map中地址為0xE0000000~0xE0100000的地方,包含有下表中的幾個核心外設。




其中的Nested Vectored Interrupt Contorller(NVIC)就是中斷系統,被稱為“內嵌套向量中斷控制器”。它與處理器內核緊密耦合,可實現低中斷延遲及對新中斷的有效處理。它具有以下特征:


擁有32路向量中斷;每個中斷的優先級均可編程設置為0~192(步長64),數值越小優先級越高,0級為最高優先級;支持電平和邊沿觸發中斷;支持中斷尾鏈;擁有一個外部不可屏蔽中斷NMI。


NVIC所涉及到的寄存器如下表所示。




從表中可以看出,每個寄存器都是32位的結構,都具有可讀可寫的屬性,復位值都為全0。其中ISER寄存器是設置中斷的使能,32位對應32路中斷,值為1使能中斷,值為0不使能中斷。ICER寄存器是設置中斷的禁能,32位對應32路中斷,值為1禁能中斷,值為0不禁能。ISPR寄存器是設置中斷的掛起,32位對應32路中斷,值為1掛起,值為0不掛起。ICPR寄存器是清除中斷的掛起,32位對應32路中斷,值為1清除掛起,值為0不清除掛起。IPR0~7寄存器是設置中斷優先級。


下面是NVIC寄存器組所對應的結構體形式(位于頭文件core_cm0.h中)。 


typedef struct

{

  __IO uint32_t ISER[1];                 /*!< Offset: 0x000 (R/W)  Interrupt Set Enable Register           */

       

uint32_t RESERVED0[31];
  

__IO uint32_t ICER[1];                 /*!< Offset: 0x080 (R/W)  Interrupt Clear Enable Register          */

       

uint32_t RSERVED1[31];
  

__IO uint32_t ISPR[1];                 /*!< Offset: 0x100 (R/W)  Interrupt Set Pending Register           */

       

uint32_t RESERVED2[31];
  

__IO uint32_t ICPR[1];                 /*!< Offset: 0x180 (R/W)  Interrupt Clear Pending Register         */
       

uint32_t RESERVED3[31];
       

uint32_t RESERVED4[64];
  

__IO uint32_t IP[8];                   /*!< Offset: 0x300 (R/W)  Interrupt Priority Register              */

}  NVIC_Type;

因NVIC寄存器組的基址為0xE000E100,所以要將基址指針強制轉換為上述結構體,還必須要加上下面的定義。


#define SCS_BASE            (0xE000E000UL)                            /*!< System Control Space Base Address */


#define NVIC_BASE           (SCS_BASE +  0x0100UL)                    /*!< NVIC Base Address                 */


#define NVIC                ((NVIC_Type      *)     NVIC_BASE     )   /*!< NVIC configuration struct          */


接下來給出的是上面NVIC32位寄存器所對應的32路中斷向量的中斷源。



為了能描述上面的32路中斷源,在C語言中運用了枚舉類型,代碼如下所示(位于頭文件lpc11xx.h中)。 


typedef enum IRQn

{

/******  Cortex-M0 Processor Exceptions Numbers 


***************************************************/
  

NonMaskableInt_IRQn           = -14,      /*!< 2 Non Maskable Interrupt                         */
 

 HardFault_IRQn                = -13,      /*!< 3 Cortex-M0 Hard Fault Interrupt                 */
  

SVCall_IRQn                   = -5,       /*!< 11 Cortex-M0 SV Call Interrupt                   */
  

PendSV_IRQn                   = -2,       /*!< 14 Cortex-M0 Pend SV Interrupt                   */
  

SysTick_IRQn                  = -1,       /*!< 15 Cortex-M0 System Tick Interrupt               */

/******  LPC11xx/LPC11Cxx Specific Interrupt Numbers 


**********************************************/
  

WAKEUP0_IRQn                  = 0,        /*!< All I/O pins can be used as wakeup source.       */
  

WAKEUP1_IRQn                  = 1,        /*!< There are 13 pins in total for LPC11xx           */
  

WAKEUP2_IRQn                  = 2,
  

WAKEUP3_IRQn                  = 3,
  

WAKEUP4_IRQn                  = 4,   
  

WAKEUP5_IRQn                  = 5,        
  

WAKEUP6_IRQn                  = 6,        
  

WAKEUP7_IRQn                  = 7,        
  

WAKEUP8_IRQn                  = 8,        
  

WAKEUP9_IRQn                  = 9,        
  

WAKEUP10_IRQn                 = 10,       
  

WAKEUP11_IRQn                 = 11,       
  

WAKEUP12_IRQn                 = 12,       
  

CAN_IRQn                      = 13,       /*!< CAN Interrupt                                    */
  

SSP1_IRQn                     = 14,       /*!< SSP1 Interrupt                                   */
  

I2C_IRQn                      = 15,       /*!< I2C Interrupt                                    */
  

TIMER_16_0_IRQn               = 16,       /*!< 16-bit Timer0 Interrupt                          */
  

TIMER_16_1_IRQn               = 17,       /*!< 16-bit Timer1 Interrupt                          */
  

TIMER_32_0_IRQn               = 18,       /*!< 32-bit Timer0 Interrupt                          */
  

TIMER_32_1_IRQn               = 19,       /*!< 32-bit Timer1 Interrupt                          */
  

SSP0_IRQn                     = 20,       /*!< SSP0 Interrupt                                   */
  

UART_IRQn                     = 21,       /*!< UART Interrupt                                   */
  

Reserved0_IRQn                = 22,       /*!< Reserved Interrupt                               */
  

Reserved1_IRQn                = 23,       
  

ADC_IRQn                      = 24,       /*!< A/D Converter Interrupt                          */
  

WDT_IRQn                      = 25,       /*!< Watchdog timer Interrupt                         */  
  

BOD_IRQn                      = 26,       /*!< Brown Out Detect(BOD) Interrupt                  */
  

FMC_IRQn                      = 27,       /*!< Flash Memory Controller Interrupt                */
  

EINT3_IRQn                    = 28,       /*!< External Interrupt 3 Interrupt                   */
  

EINT2_IRQn                    = 29,       /*!< External Interrupt 2 Interrupt                   */
  

EINT1_IRQn                    = 30,       /*!< External Interrupt 1 Interrupt                   */
  

EINT0_IRQn                    = 31,       /*!< External Interrupt 0 Interrupt                   */

} IRQn_Type;


從上述代碼中可以看出,除了32路中斷源外,還加入了優先級更高5個中斷源。這里先不進行說明,在后面用到時再來討論。定義好上述代碼后,就可以來寫中斷所需要的函數了。下面就是依據CMSIS規范所定義的8個中斷操作函數(位于頭文件core_cm0.h中)。

 

1.允許某個中斷或異常


static __INLINE void NVIC_EnableIRQ(IRQn_Type IRQn)

{
  

NVIC->ISER[0] = (1 << ((uint32_t)(IRQn) & 0x1F));

}


2.禁止某個中斷或異常


static __INLINE void NVIC_DisableIRQ(IRQn_Type IRQn)

{
  

NVIC->ICER[0] = (1 << ((uint32_t)(IRQn) & 0x1F));

}


3.讀取某個中斷或異常的掛起狀態


static __INLINE uint32_t NVIC_GetPendingIRQ(IRQn_Type IRQn)

{
  

return((uint32_t) ((NVIC->ISPR[0] & (1 << ((uint32_t)(IRQn) & 0x1F)))?1:0));

}


4.把某個中斷或異常的掛起狀態設為1


static __INLINE void NVIC_SetPendingIRQ(IRQn_Type IRQn)

{
  

NVIC->ISPR[0] = (1 << ((uint32_t)(IRQn) & 0x1F));

}


5.把某個中斷或異常的掛起狀態清為0


static __INLINE void NVIC_ClearPendingIRQ(IRQn_Type IRQn)

{
  

NVIC->ICPR[0] = (1 << ((uint32_t)(IRQn) & 0x1F)); /* Clear pending interrupt */

}


6.把某個中斷或異常的可配置優先級設為1


static __INLINE void NVIC_SetPriority(IRQn_Type IRQn, uint32_t priority)

{
  

if(IRQn < 0) {
    

SCB->SHP[_SHP_IDX(IRQn)] = (SCB->SHP[_SHP_IDX(IRQn)] & ~(0xFF << _BIT_SHIFT(IRQn))) |
       

 (((priority << (8 - __NVIC_PRIO_BITS)) & 0xFF) << _BIT_SHIFT(IRQn)); }
  

else {
    

NVIC->IP[_IP_IDX(IRQn)] = (NVIC->IP[_IP_IDX(IRQn)] & ~(0xFF << _BIT_SHIFT(IRQn))) |
      

  (((priority << (8 - __NVIC_PRIO_BITS)) & 0xFF) << _BIT_SHIFT(IRQn)); }

}


7.讀取某個中斷或異常的優先級


static __INLINE uint32_t NVIC_GetPriority(IRQn_Type IRQn)

{


  if(IRQn < 0) {
    

return((uint32_t)((SCB->SHP[_SHP_IDX(IRQn)] >> _BIT_SHIFT(IRQn) ) >> (8 - __NVIC_PRIO_BITS)));  } /* get priority for Cortex-M0 system interrupts */

 

 else {
    

return((uint32_t)((NVIC->IP[ _IP_IDX(IRQn)] >> _BIT_SHIFT(IRQn) ) >> (8 - __NVIC_PRIO_BITS)));  } /* get priority for device specific interrupts  */

}


8.復位NVIC


static __INLINE void NVIC_SystemReset(void)

{
  

__DSB();                                                     /* Ensure all outstanding memory accesses included buffered write are completed before reset */
  

SCB->AIRCR  = ((0x5FA << SCB_AIRCR_VECTKEY_Pos) | SCB_AIRCR_SYSRESETREQ_Msk);
 

 __DSB();                                                     /* Ensure completion of memory access */
  

while(1);                                                    /* wait until reset */

}


在上述函數中有幾點要說明一下,一是數組的引用其取值只能是0(即第一個元素),這是因為在結構體定義中只定義了一個數組元素,且由于需要利用數組的地址連續性來對映CPU物理地址,所以也不能將其定義為一個普通變量;二是關鍵字“__INLINE ”在頭文件core_cm0.h中已做了宏定義“#define __INLINE  __inline”,__inline是通知編譯器其后面的函數為內聯形式;三是中斷源IRQn要與0x1F與一下,是為了屏蔽高27位的值,因為中斷源的最大值只到31,所以只用了32位中的低5位(31的二進制是11111,十六進制是0x1F);四是在函數的參數中,由于引入了枚舉類型,所以可以在調用函數的時候,在參數部分可直接使用枚舉中的名稱,這樣就可以省去記憶32個中斷源在32位寄存器中的對應位置,便于書寫和閱讀。例如,要開啟端口0的外部中斷,執行程序“NVIC_EnableIRQ(EINT0_IRQn)”即可。

上述就是LPC1114中的整個中斷系統,即“內嵌套向量中斷控制器”。可以看出,它控制著整個處理器32路中斷源的使能與掛起等8個動作,功能非常強大。但做為外部中斷的端口中斷源卻只有4個,即EINT0_IRQn、EINT1_IRQn、EINT2_IRQn、EINT3_IRQn四個。而每一個端口又對應有12個引腳(端口3為6個)又都可以產生外部中斷,那怎么來判斷是那個引腳上申請的中斷呢?這就需要借助前面“通用輸入/輸出端口”部分介紹過的MIS寄存器了。在外部中斷響應的服務程序內,判別MIS寄存器的各個位,值為1的位所對應的就是觸發本次外部中斷的引腳。


和所有的單片機一樣,在中斷響應后,程序指針會跳轉到相應的中斷向量入口處去執行中斷服務程序,而在C語言中則是以特定形式的中斷入口函數來呈現。比如EINT0_IRQn、EINT1_IRQn、EINT2_IRQn、EINT3_IRQn四個端口的外部中斷入口函數分別如下:


void PIOINT0_IRQHandler(void)

{
  

端口0的中斷服務程序部分

}

void PIOINT1_IRQHandler(void)

{
  

端口1的中斷服務程序部分

}

void PIOINT2_IRQHandler(void)

{
  

端口2的中斷服務程序部分

}

void PIOINT3_IRQHandler(void)

{
  

端口3的中斷服務程序部分

}

上述函數的名稱是不能改變的,它標志著特定的中斷入口,除了四個外部中斷以外的其它中斷源,也有各自的中斷入口函數,它們都位于起動文件“startup_LPC11xx.s”中,在以后用到時再討論,這里就不給出了。


下面來討論一個外部中斷的例子,要求使用外部中斷來實現按鍵控制LED的亮滅。程序代碼如下(假設KEY接在GPIO1.9,LED接在GPIO1.0):


#include


把上述程序編譯后下載到LPC1114中,給系統上電,可以看出在按下KEY后LED亮,放開KEY后LED滅,達到了使用外部中斷控制的目的。


最后說明一點,如果需要打開或關閉中斷“總中斷”,可調用“__enable_irq();和__disable_irq();”來實現,它們是通過調用匯編語言來實現這一操作的,具體的原型在頭文件“core_cmFunc.h”中,可自行查看,這里就不詳述了。


原文地址:http://blog.chinaaet.com/detail/14716


  • LPC1114/LPC1343使用GPIO中斷

/*****************************************************************************
 

*   gpiotest.c:  main C entry file for AutoHome-M0 Develop Board
 

*   Copyright(C) 2010, 貞明電子
 

*   All rights reserved.
 

*  http://djbgreen.taobao.com
 

*   History
 

*   2010.12.12  ver 1.00   綠無涯

******************************************************************************/

#include "LPC11xx.h"   /* LPC11xx Peripheral Registers */

#include "gpio.h"


void Delay(uint32_t nCount)

{
  

for(; nCount != 0; nCount--);


}


void PIOINT1_IRQHandler(void)   //中斷服務函數

{
 

 uint32_t regVal;
  

regVal = GPIOIntStatus( PORT1, 4 ); //讀取該IO組的中斷狀態
  

if ( regVal )
  

{
 

LPC_GPIO3->DATA^=(1<<4);  //P3_4閃動1次  LED3

GPIOIntClear( PORT1, 4);  //清除中斷標志
  

}  
  

return;

}


void PIOINT2_IRQHandler(void)


{
  

uint32_t regVal;
  

regVal= GPIOIntStatus( PORT2, 11); 
  

if(regVal)
  


   

LPC_GPIO2->DATA^=(1<<8); //P2_8閃動1次  LED1 
 

GPIOIntClear( PORT2, 11);
  


  

return;

}


void PIOINT3_IRQHandler(void)     

{
  

uint32_t regVal;
  

regVal= GPIOIntStatus( PORT3, 5); 
  

if(regVal)
  


   

LPC_GPIO2->DATA^=(1<<9); //P2_9閃動1次    LED2 
 

GPIOIntClear( PORT3, 5);
  


  

return;

}


void UserIO_Init(void)

{

// LPC_IOCON
 

LPC_GPIO2->DIR=(1<<8)|(1<<9); //P2_8,P2_9  LED1,LED2
 

GPIOSetDir(PORT3,4,1); //P3_4 output LED3
 

GPIOSetDir(PORT2,11,0); //Set P2.11 input
 

GPIOSetDir(PORT1,4,0); //P1_4
 

GPIOSetDir(PORT3,5,0); //P2_5
 

//LPC_GPIO2->DIR=~((1<<11)|(1<<5));
 

//LPC_GPIO1->DIR=~(1<<4);
 

GPIOSetInterrupt(PORT2,11,0,0,1);//端口號, 位地址, sense, single/doube, 上升/下降沿
 

GPIOSetInterrupt(PORT3,5,0,0,1);
 

GPIOSetInterrupt(PORT1,4,0,0,1);
 

GPIOIntEnable(PORT2,11);   //使能該端口中斷P2_11
 

GPIOIntEnable(PORT3,5);    //使能該端口中斷P3_5 (LPC1343為P2_5)
 

GPIOIntEnable(PORT1,4);    //使能該端口中斷P1_4

}


int main(void)

{
 

SystemInit();    //系統初始化
 

GPIOInit();     //GPIO初始化,包括GPIO時鐘初始化
 

UserIO_Init();    //用戶使用的IO初始化(設置IO方向、中斷、IO功能選擇)
       

 //有時所有配置正確,卻得不到功能,就是沒有進行IO功能選擇
 

while(1)
 

{
 
 

}


}
 

/*********************************************************************************

**                            End Of File

*********************************************************************************/


關鍵字:LPC1114  外部中斷 引用地址:LPC1114 外部中斷介紹

上一篇:用LPC1114做產品-如何設計程序下載接口flashmagicISP
下一篇:LPC1114在KEIL環境下不能進入調試狀態的解決方法

推薦閱讀

本報訊(中國青年報·中青在線記者 邱晨輝)“新材料是制造業和武器裝備高質量發展的前提。近幾年來,我國材料科技發展迅速,但高水平材料產業化有待進一步發展,高端材料的技術壁壘日趨呈現。”在近日舉行的中科院深圳先進技術研究院先進電子材料研究所(籌)成立揭牌儀式上,中國工程院院士、中國工程院原副院長干勇談及“卡脖子”問題時呼吁,科研人員...
11 月 27 日訊,根據最近的一項專利顯示,蘋果 iPhone 提供了蘋果汽車無鑰匙進入的可能性。與目前基于 keyfob 的系統相比,該系統使用超寬帶精確地確定汽車和用戶之間的距離和范圍。 該專利名稱是“用于與具有自動功能的訪問控制系統進行通信和測距的移動設備”。當前的無鑰匙進入系統依靠包含無線電發射器的鑰匙扣,該無線電發射器在車輛處于范圍內時...
在上證 e 互動平臺上,中芯國際對于“四季度 8英寸晶圓代工是否進行調價?相關生產是否有收到美國商務部限制影響?”等問題進行了回復。中芯國際表示,現有客戶訂單將按已簽訂合同進行,新客戶、新項目則由雙方協商確定價格,公司也會通過優化產品組合來提升平均晶圓價格。同時,中芯國際稱,目前公司正常運營,針對該出口限制,公司和美國相關政府部門...
今年小米共推出了兩款MIX系列機型,一款為折疊屏MIX FOLD,一款為MIX 4。現在小米MIX系列新成員已在路上,它是一款折疊屏手機。  今天,業內人士Ross Young爆料,小米MIX FOLD的繼任者將于2022年發布,這意味著小米新款折疊屏旗艦將無緣小米12月份舉行的新品發布會,這場發布會小米會推出年度旗艦小米12和MIUI 13操作系統。  根據此前爆...

史海拾趣

問答坊 | AI 解惑

我對如何編寫高質量的程序的看法

我對嵌入式軟件開發的時間也不是很長,僅僅只有5年,算不上高手,也不是老手只能算是5歲的老菜鳥 ,在前面的3年里沒有高人指點,靠著自己摸索也寫了不少的程序吧,那時侯我沒有想過要寫出容易理解 和維護以及移植的問題,僅僅想著如何把這個功能 ...…

查看全部問答∨

主語上道產品品牌設計廣納賢才

品牌設計師 崗位要求: * 視覺傳達設計類專業本科以上學歷; * 有平面設計從業經驗,并有較多的作品; * 熟練使用Photoshop、Illustrator、CorelDraw等軟件,熟悉排版、印刷等后期制作; * 能快速、全面、準確的領悟產品信息,對產品設計有獨 ...…

查看全部問答∨

MCF51CN128 定時器輸出捕獲示例

下面貼個freescale的coldfire v1系列中mcf51cn128 MCU的一個示例,利用定時器實現輸出捕獲的功能。 MCF51CN128是freescale去年推出的V1 CORE的coldfire處理器,具有一個以太網控制器,是實現以太網應用的不錯選擇 具有50MHZ的主頻 ------------- ...…

查看全部問答∨

關于nRF2401的收發。

我想問一下,NRF2401的芯片發送數據時,怎么檢測它到底發沒發信號,我看了許多關于這部分調試的文章,只是對這個問題一帶而過,我現在都不知道整個程序到底是哪出了問題。是發射呢,還是i接收呢? 還有一個小問題就是,我用的是MSP430單片機,沒有 ...…

查看全部問答∨

求助:FPGA對SATA 2硬盤的讀寫

是不是在FPGA和硬盤之間還要一個什么轉接的芯片?怎么在網上也搜不這種芯片。。。求高人指點一下FPGA對SATA 2硬盤的讀寫整體構架和需要的硬件!!!…

查看全部問答∨

模擬電路--做畢設時心電圖設計資料

模擬電路--做畢設時心電圖設計資料…

查看全部問答∨

SD卡顯示盤符的問題

wince5.0系統 SD卡驅動已經可以發現識別卡 并且sdmemory.dll已經被sdbus加載 但是有一個問題: 如果sd卡沒有格式化(其實里面有東西,而且用其他的windows mobile手機能看見卡里面的東西) 那么就沒有sd盤符顯示但是在存儲管理器中能看見它的存在 ...…

查看全部問答∨

H-JTAG SERVER無法連接?

目前我司開發了一套ARM測試板,用的是菲利浦LPC2138型號的cpu,H-JTAG的引腳與cpu的連接正確,前幾天用H-JTAG SERVER檢測cpu的時候可以檢測,也可以在線編程,但是昨天不知道怎么回事用H-JTAG SERVER檢測cpu的時候就是檢測不到,但是沒有改任何的設置, ...…

查看全部問答∨

一個關于Vxworks的實時系統項目

  我以前做工控的,現在有個項目,需要實時系統,本來說基于pc104+IO擴展卡,由于IO數目比較多,PC104可能達不到要求,我現在想基于PC機+PCI或者是PXI,我目前的問題是 1.Vxworks支持哪些CPU,是不是只要是X86架構的都能夠運行。 2.哪 ...…

查看全部問答∨
小廣播
設計資源 培訓 開發板 精華推薦

最新單片機文章
何立民專欄 單片機及嵌入式寶典

北京航空航天大學教授,20余年來致力于單片機與嵌入式系統推廣工作。

 
EEWorld訂閱號

 
EEWorld服務號

 
汽車開發圈

 
機器人開發圈

電子工程世界版權所有 京ICP證060456號 京ICP備10001474號-1 電信業務審批[2006]字第258號函 京公網安備 11010802033920號 Copyright ? 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
主站蜘蛛池模板: 海丰县| 托克托县| 浮山县| 巴里| 禹州市| 盐城市| 兰西县| 淳安县| 银川市| 射阳县| 获嘉县| 澄城县| 漠河县| 平顶山市| 潞西市| 喀什市| 磴口县| 云和县| 思茅市| 呼图壁县| 桦甸市| 德兴市| 宜阳县| 青铜峡市| 青龙| 岢岚县| 邳州市| 霍邱县| 南靖县| 瑞金市| 宜春市| 鄂托克前旗| 马龙县| 大理市| 黄平县| 普安县| 汶川县| 洪湖市| 泰州市| 中阳县| 礼泉县|