首页 > 其他分享 >1.中断处理

1.中断处理

时间:2023-06-27 12:55:50浏览次数:55  
标签:HAL PIN 中断 WritePin GPIOB 处理 GPIO

##项目目标是通过中断控制GPIO,实现rgb灯的亮灭;

 

中断基本概念:

  CPU在正常执行程序的过程中,遇到内部/外部的紧急事件需要处理,暂时中止当前程序执行,转而去处理紧急事件,处理完成后再返回被打断的程序继续执行

  中断能提高CPU效率(针对不频繁事件),能针对突发事件做出实时处理,实现程序的并行化,嵌入式系统进程之间的切换。

  //内部中断也成为异常

  

  EXTI管理所有GPIO产生的中断——>    NVIC  (嵌套向量中断控制器)——>    内核指令执行单元查找查找中断向量表

  NVIC主要功能:①中断管理  

    外部中断可以被使能或者禁止,并且可以设置为挂起状态或者清楚状态

  ②支持异常及中断向量化处理

    当异常或中断发生时,处理器会把PC设置为一个特定地址,这一地址就称为异常向量。每一类异常源都对应一个特定的入口地址,这些地址按照优先级排列以后就组成一张异常向量表。

    向量化处理中断的好处:传统的处理方式需要软件去完成。采用向量表处理异常,处理器会从存储器的向量表中,自动定位异常的程序入口。从发生异常到异常的处理中间的时间被缩减。

 

  ③支持嵌套中断     数字越小优先级越高;优先级相同时,优先级相同时中断向量号小的先响应。
    //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////   一、按键中断:    步骤:  

1、使能相应的时钟

2、配置GPIO管脚为中断功能

3、设置中断优先级

4、使能相应的中断

5、实现中断服务程序

 

 

 

当使用轮询的方式通过GPIO控制灯亮灭,很简单

  while (1)
  {
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */

	  if(GPIO_PIN_RESET == HAL_GPIO_ReadPin(key1_GPIO_Port,key1_Pin))
	  {
		  HAL_GPIO_WritePin(GPIOB,GPIO_PIN_5,RESET);
		  HAL_Delay(500);
		  HAL_GPIO_WritePin(GPIOB,GPIO_PIN_6,RESET);
		  HAL_Delay(500);
		  HAL_GPIO_WritePin(GPIOB,GPIO_PIN_7,RESET);
		  HAL_Delay(1000);
	  }

	  else if(GPIO_PIN_RESET == HAL_GPIO_ReadPin(key2_GPIO_Port,key2_Pin))
	  {
		  HAL_GPIO_WritePin(GPIOB,GPIO_PIN_5,SET);
		  HAL_GPIO_WritePin(GPIOB,GPIO_PIN_6,SET);
		  HAL_GPIO_WritePin(GPIOB,GPIO_PIN_7,SET);
	  }

	  HAL_Delay(500);


  }

但是缺点很明显,cpu不能干其他事情,并且如果在延时时间段内接收到其他信号,将会错过这个信号(按键反应不灵敏)

因此改为中断模式更好,此时需要将引脚由GPIO_OUT 改为GPIO_EXTI模式并且打开上拉电阻设置,边缘下降沿触发

 

p.s硬件设计时候,多个引脚使用一个中断号,例如(PA0 PB0 PC0 PD0都使用GPIO_EXTI_0)因此要注意不要将多个按键映射到使用同一个中断号的引脚上

 

使能中断并调整优先级,优先级默认为0,因为延时函数优先级也为0,延时不能打断外部中断

所以这里需要降低中断的优先级 让System tick timer优先级高于中断

 

 

 

将代码逻辑放在gpio.c中,编写函数 HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)

/* USER CODE BEGIN 2 */
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin) { if(key1_Pin == GPIO_Pin) { HAL_GPIO_WritePin(GPIOB,GPIO_PIN_5,RESET); HAL_Delay(100); HAL_GPIO_WritePin(GPIOB,GPIO_PIN_6,RESET); HAL_Delay(100); HAL_GPIO_WritePin(GPIOB,GPIO_PIN_7,RESET); HAL_Delay(100); } else if(key2_Pin == GPIO_Pin) { HAL_GPIO_WritePin(GPIOB,GPIO_PIN_5,SET); HAL_GPIO_WritePin(GPIOB,GPIO_PIN_6,SET); HAL_GPIO_WritePin(GPIOB,GPIO_PIN_7,SET); } }

 

执行main函数前还有其他操作:

设置栈指针

初始化cpu寄存器

将data 段拷贝(SRAM)

清空bss区

执行标准库的初始化函数等

 

标签:HAL,PIN,中断,WritePin,GPIOB,处理,GPIO
From: https://www.cnblogs.com/genm/p/17505259.html

相关文章

  • Python:中文域名的编码处理
    中文域名通过https://whois.aliyun.com/domain/百度.中国域名信息查询(WHOIS)结果如下DomainName:百度.中国PunyName:xn--wxtr44c.xn--fiqs8s中文域名处理print('中国'.encode('punycode'))#b'fiqs8s'print('百度.中国'.encode('punycode'))......
  • 基于DSP的设备振动信号的采集和处理模块研发总结
    前记 在能源领域,由于很多地方都是无人值守,设备故障检测是一个必须面对的问题。笔者通过最近几个行业案例了解到,由于很多设备发生故障时候会产生特定频谱的声音,所以该行业对振动监测的需求特别强烈,由于涉及到个性化的方案定制和处理,市面上此类的解决方案特别少。笔者希望把最近的......
  • go:接口、并发与协程、信道、缓冲信道、mutex、异常处理
    目录接口并发与协程信道、缓冲信道mutex异常处理接口1.实现多个接口2.接口嵌套3.接口零值packagemainimport"fmt"//接口//1实现多个接口具体类型可以赋值给多种接口类型//typeAnimalinterface{// run()//}////typeDoginterface{// eat()//}///......
  • 自然语言处理 Paddle NLP - 文本翻译技术及应用-理论
    什么是机器翻译机器翻译质量的自动评价从统计机器翻译到神经网络机器翻译多语言/多领域/多模态的翻译应用神经网络机器翻译面临的挑战视频:https://aistudio.baidu.com/aistudio/course/introduce/24177?sharedLesson=1480611&sharedType=2&sharedUserId=2631487&ts=1687143......
  • Python数据预处理
    1数据的生成与导入这里主要使用的pandasimportpandasaspd#加载excel数据df_excel=pd.read_excel('')df_excel.head()#加载text数据df_text=pd.read_table('')df_text.head()#加载csv数据df_csv=pd.read_csv('')df_csv.head()2读取多个数据并合并importglobg......
  • m基于NOMA-CoMP系统的保密信道中断概率的matlab仿真
    1.算法仿真效果matlab2022a仿真结果如下:   2.算法涉及理论知识概要        随着数字通信技术的不断发展,无线通信作为一种高效且灵活的通信方式,已经成为了现代社会中不可或缺的一部分。然而,随着通信技术的不断进步,网络安全问题也逐渐成为了无线通信领域中的热点......
  • 如何处理 SAP Pricing - Document currency missing 的错误消息
    问题当添加一个物料主数据到Quotation行项目时,遇到如下错误消息:Pricing:Documentcurrencymissing查看这条消息的技术明细:发现是如下代码抛出的,因为字段waerk为空:将下图的currency字段维护之后,问题消失:更一般的思路错误消息"SAPPricing-Documentcurrencym......
  • [ARM 汇编]高级部分—系统控制协处理器—3.2.3 控制寄存器的读写操作
    在这一部分,我们将学习如何使用ARM汇编指令在系统控制协处理器(CP15)的控制寄存器上执行读写操作。我们将通过实例来讲解如何使用MCR(MovetoCoprocessorRegister)和MRC(MovefromCoprocessorRegister)指令进行读写操作。MCR指令MCR指令用于将ARM内核寄存器的值写入协处理器寄存......
  • 熔断降级处理
    什么是熔断降级​ 微服务中难免存在服务之间的远程调用,比如:内容管理服务远程调用媒资服务的上传文件接口,当微服务运行不正常会导致无法正常调用微服务,此时会出现异常,如果这种异常不去处理可能导致雪崩效应。​ 微服务的雪崩效应表现在服务与服务之间调用,当其中一个服务无法提......
  • 自然语言处理 Paddle NLP - 结构化数据问答-理论
    NLP问答任务相似度和规则匹配,都是早期的方法,现在主流的方法,都是基于生成的方法结构化数据问答,有两种形式,一种是知识图谱形式、一种是关系型数据库形式。主要应用在企业中,减少销售的成本应用于商业智能,用于报告生成,解放了财务能力,降低人力成本结构化数据问答任务结构化数......