电竞比分网-中国电竞赛事及体育赛事平台

分享

STM32筆記之外部中斷GPIO

 panhaosun 2011-03-15
b)        初始化函數(shù)定義:
void EXTI_Configuration(void); //定義IO中斷初始化函數(shù)
c)        初始化函數(shù)調(diào)用:
EXTI_Configuration();//IO中斷初始化函數(shù)調(diào)用簡(jiǎn)單應(yīng)用:
d)        初始化函數(shù):
void EXTI_Configuration(void)
{
  EXTI_InitTypeDef EXTI_InitStructure;        //EXTI初始化結(jié)構(gòu)定義

EXTI_ClearITPendingBit(EXTI_LINE_KEY_BUTTON);//清除中斷標(biāo)志
   GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource3);//管腳選擇
   GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource4);
     GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource5);
     GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource6);

    EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;//事件選擇
  EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;//觸發(fā)模式
  EXTI_InitStructure.EXTI_Line = EXTI_Line3 | EXTI_Line4; //線路選擇
  EXTI_InitStructure.EXTI_LineCmd = ENABLE;//啟動(dòng)中斷
  EXTI_Init(&EXTI_InitStructure);//初始化
}

e)        RCC初始化函數(shù)中開啟I/O時(shí)鐘
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA , ENABLE);

GPIO初始化函數(shù)中定義輸入I/O管腳。
//IO輸入,GPIOA的4腳輸入
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;         //上拉輸入
  GPIO_Init(GPIOA, &GPIO_InitStructure);                //初始化
f)        在NVIC的初始化函數(shù)里面增加以下代碼打開相關(guān)中斷:
  NVIC_InitStructure.NVIC_IRQChannel = EXTI9_5_IRQChannel;        //通道
  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;//占先級(jí)
  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;                        //響應(yīng)級(jí)
  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;                        //啟動(dòng)
  NVIC_Init(&NVIC_InitStructure);                                                                //初始化

g)        在stm32f10x_it.c文件中找到void USART1_IRQHandler函數(shù),在其中添入執(zhí)行代碼。一般最少三個(gè)步驟:先使用if語(yǔ)句判斷是發(fā)生那個(gè)中斷,然后清除中斷標(biāo)志位,最后給字符串賦值,或做其他事情。
  if(EXTI_GetITStatus(EXTI_Line3) != RESET)                                  //判斷中斷發(fā)生來(lái)源
   { EXTI_ClearITPendingBit(EXTI_Line3);                                          //清除中斷標(biāo)志
    USART_SendData(USART1, 0x41);                                              //發(fā)送字符“a”
    GPIO_WriteBit(GPIOB, GPIO_Pin_2, (BitAction)(1-GPIO_ReadOutputDataBit(GPIOB, GPIO_Pin_2)));//LED發(fā)生明暗交替
}
h)        中斷注意事項(xiàng):
中斷發(fā)生后必須清除中斷位,否則會(huì)出現(xiàn)死循環(huán)不斷發(fā)生這個(gè)中斷。然后需要對(duì)中斷類型進(jìn)行判斷再執(zhí)行代碼。
使用EXTI的I/O中斷,在完成RCC與GPIO硬件設(shè)置之后需要做三件事:初始化EXTI、NVIC開中斷、編寫中斷執(zhí)行代碼。
 
********************************************************************************************

我在板子上要使用PB11作為外部中斷,使用stm32f10x_stdperiphere_library

在例子程序中只找到了使用PA3 PA4的,這些線可以直接掛在EXTI3 EXTI4中斷上。

在STM32F10X的中斷向量表中,在EXTI9-5 和EXTI15-10 看來(lái)我只能用EXTI15-10了。

附上初始化程序

void ShuttleKeyInit(void){
  GPIO_InitTypeDef GPIO_InitStructure;
  EXTI_InitTypeDef EXTI_InitStructure;
  NVIC_InitTypeDef NVIC_InitStructure;
  HT_STM_KEYInit(KNOBRIGHT);
  /* Enable GPIOD clock */
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
 
 
 
/* Configure PB.11 as input floating */
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
  GPIO_Init(GPIOB, &GPIO_InitStructure);
  GPIO_EXTILineConfig(GPIO_PortSourceGPIOB, GPIO_PinSource11);
 
  // Configure EXTI Line11 to generate an interrupt on falling edge
  EXTI_InitStructure.EXTI_Line = EXTI_Line11;
  EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
  EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;
  EXTI_InitStructure.EXTI_LineCmd = ENABLE;
  EXTI_Init(&EXTI_InitStructure);
 


  /* Enable the EXTI15_10 Interrupt */
  NVIC_InitStructure.NVIC_IRQChannel = EXTI15_10_IRQn; //EXTI15_10_IRQChannel;
  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2;
  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  NVIC_Init(&NVIC_InitStructure);
}

中斷服務(wù)程序

/*******************************************************************************
* Function Name  : EXTI3_IRQHandler
* Description    : This function handles External interrupt Line 3 request.
* Input          : None
* Output         : None
* Return         : None
*******************************************************************************/
void EXTI15_10_IRQHandler(void)
{
 
 if(EXTI_GetITStatus(EXTI_Line11) != RESET)
  {
//    DISABLE_PB11_INT;
  if(HT_STM_KEYRead(KNOBRIGHT))
    g_Shuttle = LEFTTURN;
  else
    g_Shuttle = RIGHTTURN;
  EXTI_ClearITPendingBit(EXTI_Line11);
  }
}

中斷服務(wù)程序要力求精簡(jiǎn),不然會(huì)死機(jī)。沒搞明白是為什么。
******************************************************************************
端口上的16個(gè)外部中斷的任意一個(gè)中斷號(hào),可映射到一組引腳的任意一個(gè)(記住這里,是組中的任意一個(gè))。

    舉例來(lái)說(shuō):
    外部中斷號(hào)3,只可以映射到引腳PA3、PB3、PC3、PD3、PE3、PF3、PG3這一組中的任意一個(gè)(是一個(gè),不是多個(gè))引腳上,而不能映射其它引腳上。
    同理,外部中斷號(hào)4,只可以映射到引腳PA4、PB4、PC4、PD4、PE4、PF4、PG4這一組中的任意一個(gè)引腳上,而不能映射其它引腳上。

    另外,外部中斷只有7個(gè)處理接口,外部中斷號(hào)0~4,才具有獨(dú)立的中斷處理接口,外部中斷號(hào)5~9,共享一個(gè)中斷處理接口,外部中斷號(hào)10~15,共享一個(gè)中斷處理接口。

    基于上述原因,外部中斷盡量只使用引腳號(hào)0~4,或5~9中的某一個(gè),或10~15中的某一個(gè),以簡(jiǎn)化中斷處理的編寫,同時(shí)也會(huì)縮短外部中斷的處理時(shí)間(外部中斷號(hào)5~9、10~15,如果不止對(duì)應(yīng)一個(gè)中斷號(hào),則需要在中斷處理程序來(lái)確定是哪個(gè)引腳產(chǎn)生的中斷)。
 

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多