你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

【经验分享】STM32开发项目:如何配置GPIO的外部中断

[复制链接]
STMCU小助手 发布时间:2022-4-15 10:00
如何配置GPIO的外部中断
以STM32F103为例,记录配置GPIO外部中断的一般方法与流程。

配置RCC时钟
RCC时钟配置是STM32MCU顺利运行的必备步骤,笔者使用的参考代码如下:

  1. void RCC_Config()
  2. {
  3.         RCC_DeInit();
  4.         //使能HSE,并等待 HSE 稳定
  5.         RCC_HSEConfig(RCC_HSE_ON);
  6.         ErrorStatus HSEStartUpStatus;
  7.         HSEStartUpStatus = RCC_WaitForHSEStartUp();
  8.         //HSE启动成功
  9.         if (HSEStartUpStatus == SUCCESS)
  10.         {
  11.                 //使能FLASH预存取缓冲区
  12.                 FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);
  13.                 //SYSCLK周期与闪存访问时间的比例设置
  14.                 FLASH_SetLatency(FLASH_Latency_2);
  15.                 //Configures the AHB clock (HCLK): AHB clock = SYSCLK
  16.                 RCC_HCLKConfig(RCC_SYSCLK_Div1);
  17.                 //Configures the High Speed APB clock (PCLK2): APB2 clock = HCLK
  18.                 RCC_PCLK2Config(RCC_HCLK_Div1);
  19.                 //Configures the High Speed APB clock (PCLK2): APB1 clock = HCLK/2
  20.                 RCC_PCLK1Config(RCC_HCLK_Div2);
  21.                 //Configures the PLL clock source and multiplication factor:
  22.                 //HSE oscillator clock selected as PLL clock entry
  23.                 //The PLL multiplication factor is 9
  24.                 RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9);
  25.                 //Enables the PLL.
  26.                 RCC_PLLCmd(ENABLE);
  27.                 //等待PLL时钟稳定
  28.                 while (RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET)
  29.                         ;
  30.                 //Configures the system clock (SYSCLK): PLL selected as system clock
  31.                 RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);
  32.                 //读取时钟切换状态位,确保PLLCLK被选为系统时钟
  33.                 while (RCC_GetSYSCLKSource() != 0x08)
  34.                         ;
  35.         }
  36.         //HSE启动失败
  37.         else
  38.         {
  39.                 while (1)
  40.                         ;
  41.         }
  42. }
复制代码

GPIO配置
以PB10, PB11, PB12, PB13作为外部中断输入口为例:

  1. void GPIO_Config()
  2. {
  3.         GPIO_InitTypeDef GPIO_InitStructure;
  4.         
  5.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
  6.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);
  7.         
  8.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10 | GPIO_Pin_11 | GPIO_Pin_12 | GPIO_Pin_13;
  9.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;
  10.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
  11.         
  12.         GPIO_Init(GPIOB, &GPIO_InitStructure);
  13.         //选择EXTI的信号源
  14.         GPIO_EXTILineConfig(GPIO_PortSourceGPIOB, GPIO_PinSource10);
  15.         GPIO_EXTILineConfig(GPIO_PortSourceGPIOB, GPIO_PinSource11);
  16.         GPIO_EXTILineConfig(GPIO_PortSourceGPIOB, GPIO_PinSource12);
  17.         GPIO_EXTILineConfig(GPIO_PortSourceGPIOB, GPIO_PinSource13);

  18. }
复制代码

EXTI配置
EXTI (External interrupt/event controller): 外部中断/事件控制器,管理了控制器的 20个中断/事件线。每个中断/事件线都对应有一个边沿检测器,可以实现输入信号的上升沿检测和下降沿的检测。EXTI 可以实现对每个中断/事件线进行单独配置,可以单独配置为中断或者事件,以及触发事件的属性。

  1. void EXTI_Config()
  2. {
  3.         EXTI_InitTypeDef EXTI_InitStructure;

  4.         EXTI_InitStructure.EXTI_Line=EXTI_Line10 | EXTI_Line11 | EXTI_Line12 | EXTI_Line13;
  5.         EXTI_InitStructure.EXTI_Mode=EXTI_Mode_Interrupt;
  6.         EXTI_InitStructure.EXTI_Trigger=EXTI_Trigger_Falling;
  7.         EXTI_InitStructure.EXTI_LineCmd=ENABLE;
  8.         
  9.         EXTI_Init(&EXTI_InitStructure);
  10. }
复制代码

NVIC配置
NVIC 是嵌套向量中断控制器,控制着整个芯片中断相关的功能,它跟内核紧密耦合,是内核里面的一个外设。但是各个芯片厂商在设计芯片的时候会对 Cortex-M3内核里面的 NVIC进行裁剪,把不需要的部分去掉,所以说 STM32 的 NVIC 是 Cortex-M3 的 NVIC 的一个子集。

在 NVIC 有一个专门的寄存器:中断优先级寄存器 NVIC_IPRx,用来配置外部中断的优先级,IPR 宽度为 8bit,原则上每个外部中断可配置的优先级为 0~255,数值越小,优先级越高。

但是绝大多数CM3芯片都会精简设计,以致实际上支持的优先级数减少,在F103中,只使用了高 4bit用于表达优先级的这 4bit,又被分组成抢占优先级和子优先级。

如果有多个中断同时响应,抢占优先级高的就会 抢占 抢占优先级低的优先得到执行,如果抢占优先级相同,就比较子优先级。如果抢占优先级和子优先级都相同的话,就比较他们的硬件中断编号,编号越小,优先级越高。

  1. void NVIC_Config()
  2. {
  3.         NVIC_InitTypeDef NVIC_InitStructure;
  4.         //NVIC_PriorityGroup_2: 2 bits for pre-emption priority & 2 bits for subpriority
  5.         NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);

  6.           NVIC_InitStructure.NVIC_IRQChannel = EXTI15_10_IRQn;
  7.           NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x00;
  8.           NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x01;
  9.           NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  10.          
  11.           NVIC_Init(&NVIC_InitStructure);
  12. }
复制代码

中断服务函数 IRQ_Handler
在启动文件 startup_stm32f10x_xd.s 中,我们已经初始化了中断向量表。实际的中断服务函数都需要重新编写,为了方便管理,可以把中断服务函数统一写在 stm32f10x_it.c 这个源文件中。关于中断服务函数的函数名必须跟启动文件里面预先设置的一样,否则系统就在中断向量表中找不到中断服务函数的入口,实现不了中断。

  1. void EXTI15_10_IRQHandler(void)
  2. {
  3.         if(EXTI_GetITStatus(EXTI_Line10)!=RESET)
  4.         {
  5.                 DoSomething_Line10();
  6.                 EXTI_ClearITPendingBit(EXTI_Line10);
  7.         }
  8.         else if(EXTI_GetITStatus(EXTI_Line11)!=RESET)
  9.         {
  10.                 DoSomething_Line11();
  11.                 EXTI_ClearITPendingBit(EXTI_Line11);
  12.         }
  13.         else if(EXTI_GetITStatus(EXTI_Line12)!=RESET)
  14.         {
  15.                 DoSomething_Line12();
  16.                 EXTI_ClearITPendingBit(EXTI_Line12);
  17.         }
  18.         else if(EXTI_GetITStatus(EXTI_Line13)!=RESET)
  19.         {
  20.                 DoSomething_Line13();
  21.                 EXTI_ClearITPendingBit(EXTI_Line13);
  22.         }
  23.         else if(EXTI_GetITStatus(EXTI_Line14)!=RESET)
  24.         {
  25.                 DoSomething_Line14();
  26.                 EXTI_ClearITPendingBit(EXTI_Line14);
  27.         }
  28.         else if(EXTI_GetITStatus(EXTI_Line15)!=RESET)
  29.         {
  30.                 DoSomething_Line15();
  31.                 EXTI_ClearITPendingBit(EXTI_Line15);
  32.         }
  33.         else
  34.         {

  35.         }
  36. }
复制代码




收藏 评论0 发布时间:2022-4-15 10:00

举报

0个回答

所属标签

相似技术帖

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版