音影先锋亚洲天堂网|电影世界尽头的爱完整版播放|国产 熟女 91|高清无码免费观看欧美日韩|韩国一区二区三区黄色录像|美女亚洲加勒比在线|亚洲综合网 开心五月|7x成人在线入口|成人网站免费日韩毛片区|国产黄片?一级?二级?三级

STM32_外部中斷之按鍵控制點(diǎn)亮LED燈

出處:eefocus 發(fā)布于:2018-07-21 14:40:22

 說明:對于STM32來說,其中斷種類眾多。(除了外部中斷還有內(nèi)部異常)其每個GPIO端口的引腳都可以作為外部中斷的中斷源。 對其的設(shè)置也比C51要復(fù)雜的多。對于具體的使用來說可以總結(jié)為以下步驟:

  1.初始化作為外部中斷源的GPIO口。和普通的GPIO的設(shè)置類似,不過由于是使用GPIO引腳作為中斷源,所以還需要開啟復(fù)用時鐘。

  2..配置中斷控制器 NVIC。由于有很多的中斷,所以STM32用NVIC來控制操作各種中斷。配置NVIC主要是配置一些中斷源,中斷的優(yōu)先級(包括搶占優(yōu)先級和相應(yīng)優(yōu)先級)還有設(shè)置使能中斷(類似于C51中開啟總開關(guān))。

  3..配置中斷線EXIT線,是中斷線和IO管腳聯(lián)系在一起。這個過程主要是配置中斷線,包括設(shè)置中斷的觸發(fā)方式、中斷請求模式還有使能中斷線(相當(dāng)于C51中的開啟小開關(guān))。

  4.編寫對應(yīng)的中斷服務(wù)函數(shù)。對于中斷服務(wù)函數(shù)的書寫基本上和普通的函數(shù)差不多,只不過沒有參數(shù)和返回值。還有一點(diǎn)特別的是,中斷函數(shù)名不能隨意起,系統(tǒng)已經(jīng)固定好了。

  1

  2

  3

  4

  5

  本實(shí)驗(yàn)是配置了八個外部中斷,用來按鍵控制點(diǎn)亮八個LED燈的

  */

  中斷部分主要代碼:

  //外部中斷配置

  void NVIC_ConfiguraTIon(void)

  {

  int i = 0;

  uint8_t temp_EXTI_IRQn = EXTI0_IRQn;        //初始值賦值為中斷源0

  NVIC_InitTypeDef    NVIC_InitStructure;

  NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);             //配置優(yōu)先級組

  //配置中斷源0,1,2,3

  for(i = 0;i<4;++i)

  {

  NVIC_InitStructure.NVIC_IRQChannel = temp_EXTI_IRQn++;      ///配置中斷通道

  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;//搶占優(yōu)先級 0

  NVIC_InitStructure.NVIC_IRQChannelSubPriority = i;//響應(yīng)優(yōu)先級

  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;//中斷使能

  NVIC_Init(&NVIC_InitStructure);

  }

  //配置中斷源4

  NVIC_InitStructure.NVIC_IRQChannel = EXTI4_IRQn;        ///配置中斷通道

  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;//搶占優(yōu)先級 1

  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;//響應(yīng)優(yōu)先級 0

  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;//中斷使能

  NVIC_Init(&NVIC_InitStructure);

  //配置中斷源5~10

  NVIC_InitStructure.NVIC_IRQChannel = EXTI9_5_IRQn;      ///配置中斷通道

  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;//搶占優(yōu)先級 1

  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;//響應(yīng)優(yōu)先級 1

  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;//中斷使能

  NVIC_Init(&NVIC_InitStructure);

  }

  //配置中斷的GPIO口

  void KEY_GPIO_Config(void)

  {

  GPIO_InitTypeDef GPIO_InitStructure; //GPIO 結(jié)構(gòu)體

  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_AFIO,ENABLE);

  //打開 GPIOA 和 GPIOA的復(fù)用時鐘

  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;//輸出速率 50MHz

  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU ; //上拉拉輸入

  GPIO_InitStructure.GPIO_Pin = ALL_EXIT_KEY_PIN;//選擇引腳 0

  GPIO_Init(EXIT_KEY_PORT, &GPIO_InitStructure);//GPIOA 為配置對象

  }

  //配置EXTI線,使中斷線和IO管腳連接在一起

  void EXTI_PA_Config(void)// 配置相應(yīng) IO 口中斷線

  {

  EXTI_InitTypeDef EXTI_InitStructure; //中斷線結(jié)構(gòu)體

  int i = 0;

  uint32_t temp_EXTI_Line = EXTI_Line0;       //初始化為1,即外部中斷線0

  uint8_t temp_GPIO_PinSource = GPIO_PinSource0;              //初始化中斷源為0

  //配置0~7個中斷線        //???不知能不能像GPIO那樣一起設(shè)置???///

  for(i = 0;i<8;++i)

  {

  EXTI_ClearITPendingBit(temp_EXTI_Line);//清空中斷標(biāo)志

  GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, temp_GPIO_PinSource); //GPIOA 中斷

  //配置中斷線的相關(guān)屬性

  EXTI_InitStructure.EXTI_Line = temp_EXTI_Line; //中斷線 0

  EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt; //中斷請求模式

  EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling; //中斷觸發(fā)方式為下降沿觸發(fā)

  EXTI_InitStructure.EXTI_LineCmd = ENABLE; //外部中斷使能

  EXTI_Init(&EXTI_InitStructure);

  //改變中斷源或中斷線

  temp_EXTI_Line = temp_EXTI_Line<<1;

  temp_GPIO_PinSource++;

  }

  }

  1

  2

  3

  4

  5

  6

  7

  8

  9

  10

  11

  12

  13

  14

  15

  16

  17

  18

  19

  20

  21

  22

  23

  24

  25

  26

  27

  28

  29

  30

  31

  32

  33

  34

  35

  36

  37

  38

  39

  40

  41

  42

  43

  44

  45

  46

  47

  48

  49

  50

  51

  52

  53

  54

  55

  56

  57

  58

  59

  60

  61

  62

  63

  64

  65

  66

  67

  68

  69

  70

  71

  72

  73

  74

  75

  76

  77

  78

  79

  80

  81

  82

  83

  84

  85

  86

  87

  88

  89

  中斷函數(shù)部分:

  //EXTI0中斷服務(wù)函數(shù)

  void EXTI0_IRQHandler(void)

  {

  if(EXTI_GetFlagStatus(EXTI_Line0) != RESET)

  {

  //GPIO_WriteBit(LED_PORT, GPIO_Pin_0,(BitAction)((1-GPIO_ReadOutputDataBit(LED_PORT, GPIO_Pin_0))));

  if(GPIO_ReadOutputDataBit(LED_PORT,GPIO_Pin_8) == SET)

  GPIO_ResetBits(LED_PORT, GPIO_Pin_8);

  else

  GPIO_SetBits(LED_PORT, GPIO_Pin_8);

  EXTI_ClearITPendingBit(EXTI_Line0);             //清楚中斷位標(biāo)志

  }

  }

  //EXTI1中斷服務(wù)函數(shù)

  void EXTI1_IRQHandler(void)

  {

  if(EXTI_GetFlagStatus(EXTI_Line1) != RESET)

  {

  //GPIO_WriteBit(LED_PORT, GPIO_Pin_0,(BitAction)((1-GPIO_ReadOutputDataBit(LED_PORT, GPIO_Pin_0))));

  if(GPIO_ReadOutputDataBit(LED_PORT,GPIO_Pin_9) == SET)

  GPIO_ResetBits(LED_PORT, GPIO_Pin_9);

  else

  GPIO_SetBits(LED_PORT, GPIO_Pin_9);

  EXTI_ClearITPendingBit(EXTI_Line1);             //清楚中斷位標(biāo)志

  }

  }

  //EXTI2中斷服務(wù)函數(shù)

  void EXTI2_IRQHandler(void)

  {

  if(EXTI_GetFlagStatus(EXTI_Line2) != RESET)

  {

  //GPIO_WriteBit(LED_PORT, GPIO_Pin_0,(BitAction)((1-GPIO_ReadOutputDataBit(LED_PORT, GPIO_Pin_0))));

  if(GPIO_ReadOutputDataBit(LED_PORT,GPIO_Pin_10) == SET)

  GPIO_ResetBits(LED_PORT, GPIO_Pin_10);

  else

  GPIO_SetBits(LED_PORT, GPIO_Pin_10);

  EXTI_ClearITPendingBit(EXTI_Line2);             //清楚中斷位標(biāo)志

  }

  }

  //EXTI3中斷服務(wù)函數(shù)

  void EXTI3_IRQHandler(void)

  {

  if(EXTI_GetFlagStatus(EXTI_Line3) != RESET)

  {

  //GPIO_WriteBit(LED_PORT, GPIO_Pin_0,(BitAction)((1-GPIO_ReadOutputDataBit(LED_PORT, GPIO_Pin_0))));

  if(GPIO_ReadOutputDataBit(LED_PORT,GPIO_Pin_11) == SET)

  GPIO_ResetBits(LED_PORT, GPIO_Pin_11);

  else

  GPIO_SetBits(LED_PORT, GPIO_Pin_11);

  EXTI_ClearITPendingBit(EXTI_Line3);             //清楚中斷位標(biāo)志

  }

  }

  //EXTI4中斷服務(wù)函數(shù)

  void EXTI4_IRQHandler(void)

  {

  if(EXTI_GetFlagStatus(EXTI_Line4) != RESET)

  {

  //GPIO_WriteBit(LED_PORT, GPIO_Pin_0,(BitAction)((1-GPIO_ReadOutputDataBit(LED_PORT, GPIO_Pin_0))));

  if(GPIO_ReadOutputDataBit(LED_PORT,GPIO_Pin_12) == SET)

  GPIO_ResetBits(LED_PORT, GPIO_Pin_12);

  else

  GPIO_SetBits(LED_PORT, GPIO_Pin_12);

  EXTI_ClearITPendingBit(EXTI_Line4);             //清楚中斷位標(biāo)志

  }

  }

  void EXTI9_5_IRQHandler()

  {

  int i = 5;

  uint32_t temp_EXIT_Line = EXTI_Line5;       //初始化為中斷線5

  uint16_t temp_GPIO_Pin = GPIO_Pin_13;       //初始化為第13個引腳

  for(i = 5;i <= 7;++i)

  {

  if(EXTI_GetFlagStatus(temp_EXIT_Line) != RESET)

  {

  if(GPIO_ReadOutputDataBit(LED_PORT,temp_GPIO_Pin) == SET)

  GPIO_ResetBits(LED_PORT,temp_GPIO_Pin);

  else

  GPIO_SetBits(LED_PORT, temp_GPIO_Pin);

  EXTI_ClearITPendingBit(temp_EXIT_Line);             //清中斷位標(biāo)志

  }

  //改變中斷線和輸出引腳

  temp_EXIT_Line = temp_EXIT_Line<<1;

  temp_GPIO_Pin = temp_GPIO_Pin<<1;

  }

  }


關(guān)鍵詞:STM32,外部中斷,按鍵控制,LED燈

版權(quán)與免責(zé)聲明

凡本網(wǎng)注明“出處:維庫電子市場網(wǎng)”的所有作品,版權(quán)均屬于維庫電子市場網(wǎng),轉(zhuǎn)載請必須注明維庫電子市場網(wǎng),http://m.58mhw.cn,違反者本網(wǎng)將追究相關(guān)法律責(zé)任。

本網(wǎng)轉(zhuǎn)載并注明自其它出處的作品,目的在于傳遞更多信息,并不代表本網(wǎng)贊同其觀點(diǎn)或證實(shí)其內(nèi)容的真實(shí)性,不承擔(dān)此類作品侵權(quán)行為的直接責(zé)任及連帶責(zé)任。其他媒體、網(wǎng)站或個人從本網(wǎng)轉(zhuǎn)載時,必須保留本網(wǎng)注明的作品出處,并自負(fù)版權(quán)等法律責(zé)任。

如涉及作品內(nèi)容、版權(quán)等問題,請?jiān)谧髌钒l(fā)表之日起一周內(nèi)與本網(wǎng)聯(lián)系,否則視為放棄相關(guān)權(quán)利。

廣告
OEM清單文件: OEM清單文件
*公司名:
*聯(lián)系人:
*手機(jī)號碼:
QQ:
有效期:

掃碼下載APP,
一鍵連接廣大的電子世界。

在線人工客服

買家服務(wù):
賣家服務(wù):
技術(shù)客服:

0571-85317607

網(wǎng)站技術(shù)支持

13606545031

客服在線時間周一至周五
9:00-17:30

關(guān)注官方微信號,
第一時間獲取資訊。

建議反饋

聯(lián)系人:

聯(lián)系方式:

按住滑塊,拖拽到最右邊
>>
感謝您向阿庫提出的寶貴意見,您的參與是維庫提升服務(wù)的動力!意見一經(jīng)采納,將有感恩紅包奉上哦!