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

基于STM32F103入门3——外部中断

[复制链接]
STMCU小助手 发布时间:2022-8-22 17:45
外部中断
基本概念

CPU在处理某一事件A时,发生了另一事件B请求CPU迅速去处理(中断发生),那么CPU就会暂停当前的工作(A事件),去执行B事件(中断响应和中断服务),然后B事件做完之后,再回到原来的事件(A事件)中继续工作。(中断的返回)。

简单的说就是 比如你在家看电视,突然电话响了(中断),然后又突然有人敲门(又另一个中断),这时,你是不是应该先不看电视,先去接电话,然后去开门,然后再回来看电视呢?
当然 电话响和有人敲门 你先去干哪个 取决于你觉得哪个更重要,更应该先去做。这个属于中断嵌套。

框图

a46c58e9ccf149f8902ae910b31caa9f.png

功能说明

c760d1b96f834275946b7e94133abfba.png

外部中断的配置
代码编写步骤

1:打开相应的时钟
1.1:GPIO的时钟
2.2:功能复用IO的时钟

2:配置GPIO结构体
2.1:引脚
2.2:模式(输入还是输出)
2.3:速率(输出才用 输入不用)
2.4:对结构体成员初始化

3:选择 哪个GPIO 管脚用作外部中断线路

4:配置EXTI结构体
4.1:哪个线 (比如你引脚是GPIO_Pin_3 那就是第3线)
4.2:中断模式还是事件模式
4.3:怎么触发(上升沿、下降沿、上下都触发)
4.4:EXTI使能
4.5:对结构体成员初始化

5:配置NVIC优先级结构体
5.1:选择哪个组 NVIC_PriorityGroupConfig (misc.h找)
5.2::哪个中断通道 (stm32f10x.h里 IRQn_Type结构体里找)
5.3:主优先级
5.4:次优先级
5.5:NVIC使能开启
5.6:对成员初始化

6:编写中断服务函数
函数名字在启动文件里找。

外部中断例程
这里就整一下按键按下的话就让灯闪烁一下吧
首先看一下原理图,
LED给个低电平就能点亮。
按键按下的话是低电平。

996f7fb2955c48d2bf05b5388a53c7bf.png

main.c
  1. #include "stm32f10x.h"
  2. #include "led.h"
  3. #include "exti.h"
  4. #include "systick.h"

  5. int  main()
  6. {
  7.         led_init();   //LED初始化
  8.         exti_keyInit();//按键中断初始化        
  9.         while(1);
  10. }

  11. /*外部中断服务函数*/
  12. void EXTI3_IRQHandler(void)
  13. {
  14.         if(EXTI_GetITStatus(EXTI_Line3) != RESET) //判断是否发生边沿事件 是则发生外部中断
  15.         {
  16.                 led_flash();
  17.         }        
  18.         EXTI_ClearFlag(EXTI_Line3); //清除 EXTI 线路挂起标志位
  19. }
复制代码

led.c
  1. #include "led.h"
  2. #include "systick.h"

  3. /*LED初始化函数*/
  4. void led_init(void)
  5. {
  6.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE,ENABLE);
  7.         
  8.         GPIO_InitTypeDef GPIO_initStruction;
  9.         GPIO_initStruction.GPIO_Pin = LED;
  10.         GPIO_initStruction.GPIO_Mode = GPIO_Mode_Out_PP;
  11.         GPIO_initStruction.GPIO_Speed = GPIO_Speed_50MHz;
  12.         
  13.         GPIO_Init(GPIOE, &GPIO_initStruction);
  14.         
  15.         GPIO_SetBits(GPIOE,LED);
  16. }

  17. /*LED闪烁函数*/
  18. void led_flash(void)
  19. {
  20.         GPIO_ResetBits(GPIOE,LED);
  21.         SysTick_delay_ms(250);
  22.         GPIO_SetBits(GPIOE,LED);
  23.         SysTick_delay_ms(250);
  24.         GPIO_ResetBits(GPIOE,LED);
  25.         SysTick_delay_ms(250);
  26.         GPIO_SetBits(GPIOE,LED);
  27. }
复制代码

exti.c
  1. #include "exti.h"

  2. /*按键中断配置函数*/
  3. void exti_keyInit(void)
  4. {        
  5.         //打开时钟
  6.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE,ENABLE);//GPIOE时钟
  7.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE); //时钟复用
  8.         
  9.         //配置GPIO结构体
  10.         GPIO_InitTypeDef GPIO_initStruction;
  11.         GPIO_initStruction.GPIO_Pin = KEY;
  12.         GPIO_initStruction.GPIO_Mode = GPIO_Mode_IPU;  //上拉输入
  13.         GPIO_Init(GPIOE, &GPIO_initStruction); //对结构体成员初始化        
  14.         
  15.         //选择 哪个GPIO 管脚用作外部中断线路
  16.         GPIO_EXTILineConfig(GPIO_PortSourceGPIOE, GPIO_PinSource3);//PE3引脚
  17.         
  18.         //配置EXTI结构体
  19.         EXTI_InitTypeDef EXTI_initStruction;
  20.         EXTI_initStruction.EXTI_Line = EXTI_Line3; //3线
  21.         EXTI_initStruction.EXTI_Mode = EXTI_Mode_Interrupt;//中断模式
  22.         EXTI_initStruction.EXTI_Trigger = EXTI_Trigger_Falling;//下降沿触发
  23.         EXTI_initStruction.EXTI_LineCmd = ENABLE;//EXTI使能
  24.         EXTI_Init(&EXTI_initStruction);//对结构体成员初始化
  25.         
  26.         //配置NVIC结构体
  27.         NVIC_InitTypeDef NVIC_initStruction;
  28.         NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0); //组
  29.         NVIC_initStruction.NVIC_IRQChannel = EXTI3_IRQn; //中断通道
  30.         NVIC_initStruction.NVIC_IRQChannelPreemptionPriority = 0; //主优先级
  31.         NVIC_initStruction.NVIC_IRQChannelSubPriority = 0; //次优先级
  32.         NVIC_initStruction.NVIC_IRQChannelCmd = ENABLE;//NVIC使能
  33.         NVIC_Init(&NVIC_initStruction);//对结构体成员初始化
  34.         
  35.         GPIO_SetBits(GPIOE,KEY);//KEY初始化为高电平
  36.                
  37. }
复制代码

效果展示

13adeba60ea64fb2be4cf6a04dee7fd4.gif
————————————————
转载:皮卡丘吉尔

收藏 评论0 发布时间:2022-8-22 17:45

举报

0个回答

所属标签

相似分享

官网相关资源

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