中断体系的原理

打印 上一主题 下一主题

主题 1732|帖子 1732|积分 5206

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

x
一、介绍

中断是为使单片机具有对外部或内部随机发生的变乱及时处理而设置的。中断是指‌CPU在正常运行步伐时,由于内部或外部变乱的发生,导致CPU中断当前运行的步伐,转而去执行其他步伐的过程。‌ 中断可以是硬件产生的,也可以是软件产生的。硬件中断通常由外围装备触发,而软件中断则是通过CPU指令会集的一个指令来实现。
二、原理

(1)中断哀求
中断源以硬件信号情势通过中断控制线路向CPU提出中断哀求。 中断源:引起中断变乱的原因。 中断源可以是外部的硬件装备,如键盘、打印机等输入/输出装备和各种控制装备;也可以是软件指令,如中断指令(软中断,访管指令);还大概是由各种故障和堕落引起的中断(自陷),如计算溢出等。
⑵ 中断判优及响应,中断控制器根据中断优先权进行判断,择优予以响应。
⑶ 保护现场 ,CPU保护主步伐的运行现状,如PC值、PSW、寄存器和内存中的重要数据。
⑷ 中断服务, 按中断源的工作要求,查询中断向量表,执行相应的中断服务步伐。
⑸ 规复现场, 为了正确返回原步伐,需要进行规复现场的工作,即将前面生存的寄存器的内容送回原寄存器。
⑹ 中断返回 返回被中断的步伐 ,继续执行。

 外部中断/变乱控制器
 
中断控制器NVIC 



  • 中断哀求:称为中断源或中断变乱、是指外部装备或内部模块发出的信号,通知微控制器发生了一个特定的变乱。
  • 中断控制器:中断控制器负责对中断哀求进行管理和分配优先级,如NVIC。
  • 中断优先级:每个中断都具有一个优先级,用于确定中断处理步伐的执行次序。较高优先级的中断会打断正在执行的较低优先级中断或主步伐。
  • 中断处理步伐:中断服务函数,是一段用于处理特定中断的代码。当中断发生时,微控制器会跳转到相应的中断处理步伐执行相干操作,处理完毕后返回主步伐。
  • 中断使能:通过设置相应的中断使能位,可以启用或禁用特定的中断。禁用中断后,纵然中断哀求发生,微控制器也不会响应。
  • 中断标志:中断标志用于指示特定中断是否已经发生。在处理完中断后,需要清除相应的中断标志,以便再次触发雷同中断。
  • 中断向量:是指中断服务步伐入口地点的偏移量与段基值,一个中断向量占据4字节空间。
  • 中断向量表:中断向量表是存储中断处理步伐地点的表格,当中断发生时微控制器会根据中断向量表中相应中断的地点跳转到对应的中断处理函数。

 
三、实例

 STM32处理中断的步调
            外设发出中断哀求
            处理器暂停当前执行的任务,保护现场,将当前位置的步伐计数器(PC)地点压栈。
            步伐跳转到中断服务步伐, 执行中断服务步伐
             规复现场, 将栈顶的值会送到PC
            跳转到被中断的位置执行下一个指令。
 

 

设置定时器的定时中断
  1. #include "stm32f10x.h"                  // Device header
  2. /**
  3.   * 函    数:定时中断初始化
  4.   * 参    数:无
  5.   * 返 回 值:无
  6.   */
  7. void Timer_Init(void)
  8. {
  9.         /*开启时钟*/
  10.         RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);                        //开启TIM2的时钟
  11.        
  12.         /*配置时钟源*/
  13.         TIM_InternalClockConfig(TIM2);                //选择TIM2为内部时钟,若不调用此函数,TIM默认也为内部时钟
  14.        
  15.         /*时基单元初始化*/
  16.         TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;                                //定义结构体变量
  17.         TIM_TimeBaseInitStructure.TIM_ClockDivision = TIM_CKD_DIV1;                //时钟分频,选择不分频,此参数用于配置滤波器时钟,不影响时基单元功能
  18.         TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up;        //计数器模式,选择向上计数
  19.         TIM_TimeBaseInitStructure.TIM_Period = 10000 - 1;                                //计数周期,即ARR的值
  20.         TIM_TimeBaseInitStructure.TIM_Prescaler = 7200 - 1;                                //预分频器,即PSC的值
  21.         TIM_TimeBaseInitStructure.TIM_RepetitionCounter = 0;                        //重复计数器,高级定时器才会用到
  22.         TIM_TimeBaseInit(TIM2, &TIM_TimeBaseInitStructure);                                //将结构体变量交给TIM_TimeBaseInit,配置TIM2的时基单元       
  23.        
  24.         /*中断输出配置*/
  25.         TIM_ClearFlag(TIM2, TIM_FLAG_Update);                                                //清除定时器更新标志位
  26.                                                                                                                                 //TIM_TimeBaseInit函数末尾,手动产生了更新事件
  27.                                                                                                                                 //若不清除此标志位,则开启中断后,会立刻进入一次中断
  28.                                                                                                                                 //如果不介意此问题,则不清除此标志位也可
  29.        
  30.         TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE);                                        //开启TIM2的更新中断
  31.        
  32.         /*NVIC中断分组*/
  33.         NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);                                //配置NVIC为分组2
  34.                                                                                                                                 //即抢占优先级范围:0~3,响应优先级范围:0~3
  35.                                                                                                                                 //此分组配置在整个工程中仅需调用一次
  36.                                                                                                                                 //若有多个中断,可以把此代码放在main函数内,while循环之前
  37.                                                                                                                                 //若调用多次配置分组的代码,则后执行的配置会覆盖先执行的配置
  38.        
  39.         /*NVIC配置*/
  40.         NVIC_InitTypeDef NVIC_InitStructure;                                                //定义结构体变量
  41.         NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn;                                //选择配置NVIC的TIM2线
  42.         NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;                                //指定NVIC线路使能
  43.         NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2;        //指定NVIC线路的抢占优先级为2
  44.         NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;                        //指定NVIC线路的响应优先级为1
  45.         NVIC_Init(&NVIC_InitStructure);                                                                //将结构体变量交给NVIC_Init,配置NVIC外设
  46.        
  47.         /*TIM使能*/
  48.         TIM_Cmd(TIM2, ENABLE);                        //使能TIM2,定时器开始运行
  49. }
  50. /* 定时器中断函数,可以复制到使用它的地方
  51. void TIM2_IRQHandler(void)
  52. {
  53.         if (TIM_GetITStatus(TIM2, TIM_IT_Update) == SET)
  54.         {
  55.                
  56.                 TIM_ClearITPendingBit(TIM2, TIM_IT_Update);
  57.         }
  58. }
  59. */
复制代码
  1. #include "stm32f10x.h"                  // Device header
  2. #include "Delay.h"
  3. #include "OLED.h"
  4. #include "Timer.h"
  5. uint16_t Num;                        //定义在定时器中断里自增的变量
  6. int main(void)
  7. {
  8.         /*模块初始化*/
  9.         OLED_Init();                //OLED初始化
  10.         Timer_Init();                //定时中断初始化
  11.        
  12.         /*显示静态字符串*/
  13.         OLED_ShowString(1, 1, "Num:");                        //1行1列显示字符串Num:
  14.        
  15.         while (1)
  16.         {
  17.                 OLED_ShowNum(1, 5, Num, 5);                        //不断刷新显示Num变量
  18.         }
  19. }
  20. /**
  21.   * 函    数:TIM2中断函数
  22.   * 参    数:无
  23.   * 返 回 值:无
  24.   * 注意事项:此函数为中断函数,无需调用,中断触发后自动执行
  25.   *           函数名为预留的指定名称,可以从启动文件复制
  26.   *           请确保函数名正确,不能有任何差异,否则中断函数将不能进入
  27.   */
  28. void TIM2_IRQHandler(void)
  29. {
  30.         if (TIM_GetITStatus(TIM2, TIM_IT_Update) == SET)                //判断是否是TIM2的更新事件触发的中断
  31.         {
  32.                 Num ++;                                                                                                //Num变量自增,用于测试定时中断
  33.                 TIM_ClearITPendingBit(TIM2, TIM_IT_Update);                        //清除TIM2更新事件的中断标志位
  34.                                                                                                                         //中断标志位必须清除
  35.                                                                                                                         //否则中断将连续不断地触发,导致主程序卡死
  36.         }
  37. }
复制代码
四、中断和DMA有什么区别

中断传输方式是在数据缓冲区满后发生中断哀求,CPU进行中断处理将数据传输到内存,而DMA方式则是以数据块为单位传输的,在所要求传送的数据块全部传送竣事时要求CPU进行中断处理。DMA运输的大部门时间,CPU和输入输出都处于并行操作,因此,整个计算机体系的服从大大提高,但DMA也是要使用中断的,否则CPU无法获知数据已经传输竣事。
              
参考:
(七)STM32 NVIC 中断、优先级管理及 AFIO 时钟的开启_afio时钟-CSDN博客
一文搞懂中断-CSDN博客 
单片机底子:什么是中断体系、中断体系如何用(附中断体系应用实例)_中断体系 同时控制-CSDN博客 

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

泉缘泉

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表