STM32_外部中断之按键控制点亮LED灯

出处:eefocus 发布于:2018-07-21 14:40:22

 说明:对于STM32来说,其中断种类众多。(除了外部中断还有内部异常)其每个GPIO端口的引脚都可以作为外部中断的中断源。 对其的设置也比C51要复杂的多。对于具体的使用来说可以总结为以下步骤:

  1.初始化作为外部中断源的GPIO口。和普通的GPIO的设置类似,不过由于是使用GPIO引脚作为中断源,所以还需要开启复用时钟。

  2..配置中断控制器 NVIC。由于有很多的中断,所以STM32用NVIC来控制操作各种中断。配置NVIC主要是配置一些中断源,中断的优先级(包括抢占优先级和相应优先级)还有设置使能中断(类似于C51中开启总开关)。

  3..配置中断线EXIT线,是中断线和IO管脚联系在一起。这个过程主要是配置中断线,包括设置中断的触发方式、中断请求模式还有使能中断线(相当于C51中的开启小开关)。

  4.编写对应的中断服务函数。对于中断服务函数的书写基本上和普通的函数差不多,只不过没有参数和返回值。还有一点特别的是,中断函数名不能随意起,系统已经固定好了。

  1

  2

  3

  4

  5

  本实验是配置了八个外部中断,用来按键控制点亮八个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);             //配置优先级组

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

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

  {

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

  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;//抢占优先级 0

  NVIC_InitStructure.NVIC_IRQChannelSubPriority = i;//响应优先级

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

  NVIC_Init(&NVIC_InitStructure);

  }

  //配置中断源4

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

  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;//抢占优先级 1

  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;//响应优先级 0

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

  NVIC_Init(&NVIC_InitStructure);

  //配置中断源5~10

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

  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;//抢占优先级 1

  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;//响应优先级 1

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

  NVIC_Init(&NVIC_InitStructure);

  }

  //配置中断的GPIO口

  void KEY_GPIO_Config(void)

  {

  GPIO_InitTypeDef GPIO_InitStructure; //GPIO 结构体

  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_AFIO,ENABLE);

  //打开 GPIOA 和 GPIOA的复用时钟

  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)// 配置相应 IO 口中断线

  {

  EXTI_InitTypeDef EXTI_InitStructure; //中断线结构体

  int i = 0;

  uint32_t temp_EXTI_Line = EXTI_Line0;       //初始化为1,即外部中断线0

  uint8_t temp_GPIO_PinSource = GPIO_PinSource0;              //初始化中断源为0

  //配置0~7个中断线        //???不知能不能像GPIO那样一起设置???///

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

  {

  EXTI_ClearITPendingBit(temp_EXTI_Line);//清空中断标志

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

  //配置中断线的相关属性

  EXTI_InitStructure.EXTI_Line = temp_EXTI_Line; //中断线 0

  EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt; //中断请求模式

  EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling; //中断触发方式为下降沿触发

  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

  中断函数部分:

  //EXTI0中断服务函数

  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);             //清楚中断位标志

  }

  }

  //EXTI1中断服务函数

  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);             //清楚中断位标志

  }

  }

  //EXTI2中断服务函数

  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);             //清楚中断位标志

  }

  }

  //EXTI3中断服务函数

  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);             //清楚中断位标志

  }

  }

  //EXTI4中断服务函数

  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);             //清楚中断位标志

  }

  }

  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);             //清中断位标志

  }

  //改变中断线和输出引脚

  temp_EXIT_Line = temp_EXIT_Line<<1;

  temp_GPIO_Pin = temp_GPIO_Pin<<1;

  }

  }


关键词:LEDLED灯STM32

版权与免责声明

凡本网注明“出处:维库电子市场网”的所有作品,版权均属于维库电子市场网,转载请必须注明维库电子市场网,https://www.dzsc.com,违反者本网将追究相关法律责任。

本网转载并注明自其它出处的作品,目的在于传递更多信息,并不代表本网赞同其观点或证实其内容的真实性,不承担此类作品侵权行为的直接责任及连带责任。其他媒体、网站或个人从本网转载时,必须保留本网注明的作品出处,并自负版权等法律责任。

如涉及作品内容、版权等问题,请在作品发表之日起一周内与本网联系,否则视为放弃相关权利。

上传BOM文件: BOM文件
*公司名:
*联系人:
*手机号码:
QQ:
应用领域:

有效期:
OEM清单文件: OEM清单文件
*公司名:
*联系人:
*手机号码:
QQ:
有效期:

扫码下载APP,
一键连接广大的电子世界。

在线人工客服

买家服务:
卖家服务:

0571-85317607

客服在线时间周一至周五
9:00-17:30

关注官方微信号,
第一时间获取资讯。

建议反馈

联系人:

联系方式:

按住滑块,拖拽到最右边
>>
感谢您向阿库提出的宝贵意见,您的参与是维库提升服务的动力!意见一经采纳,将有感恩红包奉上哦!