精华内容
下载资源
问答
  • STM32HAL库中断函数原理 HAL_UART_Receive_IT函数分析 HAL_StatusTypeDef HAL_UART_Receive_IT(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size) { /* Check that a Rx process is not already ...

    STM32HAL库中断函数原理

    1. HAL_UART_Receive_IT函数分析
    HAL_StatusTypeDef HAL_UART_Receive_IT(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size)
    {
      /* Check that a Rx process is not already ongoing */    
      if (huart->RxState == HAL_UART_STATE_READY)       //检查串口是否准备接收数据
      {
        if ((pData == NULL) || (Size == 0U))            //如果数据缓冲区为空,或者需要接收的数据个数为0个则返回错误标志
        {
          return HAL_ERROR;                  //返回错误标志
        }
    
        /* Process Locked */                //设置进程锁:可以理解为接受过程中不被其他程序干扰
        __HAL_LOCK(huart);
    
        huart->pRxBuffPtr = pData;          //赋值 
        huart->RxXferSize = Size;
        huart->RxXferCount = Size;
    
        huart->ErrorCode = HAL_UART_ERROR_NONE;   //将错误码设置为无错误
        huart->RxState = HAL_UART_STATE_BUSY_RX;  //将接收状态设置为忙
    
        /* Process Unlocked */
        __HAL_UNLOCK(huart);                //解锁
    
        /* Enable the UART Parity Error Interrupt */
        __HAL_UART_ENABLE_IT(huart, UART_IT_PE);  //使能奇偶校验错误中断
    
        /* Enable the UART Error Interrupt: (Frame error, noise error, overrun error) */
        __HAL_UART_ENABLE_IT(huart, UART_IT_ERR); //使能错误中断
    
        /* Enable the UART Data Register not empty Interrupt */
        __HAL_UART_ENABLE_IT(huart, UART_IT_RXNE); //使能数据寄存器非空中断,数据寄存器中有值就中断。即使能接收中断
    
        return HAL_OK;    //返回OK状态
      }
      else
      {
        return HAL_BUSY;  //返回忙状态
      }
    }
    
    1. 发送函数同理。
    2. 其他问题可以留言,也可以访问我的个人博客谢谢!
    展开全文
  • 中断向量 中断源的识别标志,可用来形成相应的中断服务程序的入口地址或存放中断服务程序的首地址。...图一 中断函数声明 图二 配置中断服务函数 图三 设置中断服务函数的底层库函数举例 上图是利用山外

    中断向量
    中断源的识别标志,可用来形成相应的中断服务程序的入口地址或存放中断服务程序的首地址。

    运行过程
    在中断响应过程中,CPU通过从接口电路获取的中断类型号(中断向量号)计算对应中断向量在表中的位置,并从中断向量表中获取中断向量,将程序流程转向中断服务程序的入口地址。

    这里写图片描述
    图一 中断函数声明
    这里写图片描述
    图二 配置中断服务函数
    这里写图片描述
    图三 设置中断服务函数的底层库函数

    举例
    上图是利用山外K60库配置PORTC和DMA0的中断服务函数实例
    图二中PORTC_IRQHandler是需要设置的中断服务程序(用户自己设置),PORTC_VECT0Rn是中断向量表中的中断向量(K60底层已设置)。set_vector_handler函数的意义是将PORTC_IRQHandler的地址(PORTC_IRQHandler在图一中是定义的函数名,在图二中代表该函数在内存中的首地址)“赋值”给中断向量PORTC_VECT0Rn。
    简单来说,set_vector_handler(PORTC_VECT0Rn, PORTC_IRQHandler);的作用是把PORTC_IRQHandler添加到中断向量表中。
    K60在获取中断类型号(码)后,经计算(中断类型码*4)得到该中断类型服务子程序入口地址在中断向量表的位置(即中断向量PORTC_VECT0Rn),然后从中取出这个地址(PORTC_IRQHandler),转到相应的子程序(void PORTC_IRQHandle())。

    简单来说,中断向量指向地址,该地址下存放的是用户需要在中断时执行的函数。
    先获取中断类型号,再在中断向量表中找中断向量,指向一个地址,执行其中的中断服务程序。

    下图为山外K60平台部分中断号类型声明和中断向量表编号声明
    这里写图片描述

    如有错误,欢迎指正!

    展开全文
  • PAGE / NUMPAGES 单片机_C语言函数_中断函数中断服务程序 ? 在开始写中断函数之前我们来一起回顾一下单片机的中断系统 ? 中断的意思学习过微机原理与接口技术的同学没学过单片机也应该知道我们在这里就不讲了首先来...
  • 在开始写中断函数之前,我们来一起回顾一下,单片机的中断系统。 中断的意思(学习过微机原理与接口技术的同学,没学过单片机,也应该知道),我们在这里就不讲了,首先来回忆下中断系统涉及到哪些问题。 (1)...

    在开始写中断函数之前,我们来一起回顾一下,单片机的中断系统。

          中断的意思(学习过微机原理与接口技术的同学,没学过单片机,也应该知道),我们在这里就不讲了,首先来回忆下中断系统涉及到哪些问题。

         (1)中断源:中断请求信号的来源。(8051有3个内部中断源T0,T1,串行口,2个外部中断源INT0,INT1(这两个低电平有效,上面的那个横杠不知道怎么加上去))

         (2)中断响应与返回:CPU采集到中断请求信号,怎样转向特定的中断服务子程序,并在执行完之后返回被中断程序继续执行。期间涉及到CPU响应中断的条件,现场保护,现场恢复。

         (3)优先级控制:中断优先级的控制就形成了中断嵌套(8051允许有两级的中断嵌套,优先权顺序为INT0,T0,INT1,T1,串行口),同一个优先级的中断,还存在优先权的高低。优先级是可以编程的,而优先权是固定的。

          80C51的原则是①同优先级,先响应高优先权②低优先级能被高优先级中断③正在进行的中断不能被同一级的中断请求或低优先级的中断请求中断。

          80C51的中断系统涉及到的中断控制有中断请求,中断允许,中断优先级控制

         (1)3个内部中断源T0,T1,串行口,2个外部中断源INT0,INT1

         (2)中断控制寄存器:定时和外中断控制寄存器TCON(包括T0、T1,INT0、INT1),串行控制寄存器SCON,中断允许寄存器IE,中断优先级寄存器IP

          具体的是什么,包括哪些标志位,在这里不讲了,所有书上面都会讲。

          在这里我们讲下注意的事项

         (1)CPU响应中断后,TF0(T0中断标志位)和TF1由硬件自动清0。

         (2)CPU响应中断后,在边沿触发方式下,IE0(外部中断INT0请求标志位)和IE1由硬件自动清零;在电平触发方式下,不能自动清楚IE0和IE1。所以在中断返回前必须撤出INT0和INT1引脚的低电平,否则就会出现一次中断被CPU多次响应。

         (3)串口中断中,CPU响应中断后,TI(串行口发送中断请求标志位)和RI(接收中断请求标志位)必须由软件清零。

         (4)单片机复位后,TCON,SCON给位清零。

    C51语言允许用户自己写中断服务子程序(中断函数)

    首先来了解程序的格式:

    void 函数名() interrupt m [using n] 

    {}

    关键字 interrupt m [using n] 表示这是一个中断函数

    m为中断源的编号,有五个中断源,取值为0,1,2,3,4,中断编号会告诉编译器中断程序的入口地址,执行该程序时,这个地址会传个程序计数器PC,于是CPU开始从这里一条一条的执行程序指令。

    n为单片机工作寄存器组(又称通用寄存器组)编号,共四组,取值为0,1,2,3

    中断号 中断源
    0        外部中断0
    1        定时器0
    2        外部中断1
    3        定时器1中断
    4        串行口中断

     

    这5个中断源的中断入口地址为:(在上一篇文章中讲到的ROM前43个存储单元就是他们,这40个地址用来存放中断处理程序的地址单元,每一个类中断的存储单元只有8B,显然不是中断处理的程序,而是存放着中断处理程序的真正地址)

    INT0:0003H    0

    T0:   000BH    1

    INT1:0013H    2

    T1:   001BH    3

    串口: 0023H    4

    中断向量(中断入口地址)= 中断号x8 +3

     

          前面m意思很清楚,不同的m值表示这个函数是针对不同的中断源,比如m为1是表示它是定时器0的中断函数,

    如void time0() interrupt 1{}

     

          那么后面的using n 又是什么意思呢?在正在执行一个特定任务时,有更紧急的事情需要CPU来处理,涉及到中断优先权。高优先权中断低优先权正在处理的程序,所以最好给每个优先程序分配不同的寄存器组。

          CPU正在处理某个事件,突然另外一个事件需要处理,于是进入中断后,而你不想将现在执行的程序的各寄存器状态入栈,那么可以把这个中断程序放入另一个寄存器组,如切换到1组,然后退出中断时,再切回到0组(原来的程序在0组)。

          为了更好的了解这里意思,你可以看看工作寄存器组的作用是什么。

     

    下面的注意事项转自网络上其他朋友的文章(整理下,重复的去掉了,写的非常好):

    (1)中断函数不能进行参数传递
    (2)中断函数没有返回值
    (3)在任何情况下都不能直接调用中断函数

    (4)中断函数使用浮点运算要保存浮点寄存器的状态。 
    (5)如果在中断函数中调用了其它函数,则被调用函数所使用的寄存器必须与中断函数相同,被调函数最好设置为可重入的。 
    (6)C51编译器对中断函数编译时会自动在程序开始和结束处加上相应的内容,具体如下:在程序开始处对ACC、B、DPH、DPL和PSW入栈,结束时出栈。中断函数未加using n修饰符的,开始时还要将R0~R1入栈,结束时出栈。如中断函数加using n修饰符,则在开始将PSW入栈后还要修改PSW中的工作寄存器组选择位。
    (7)C51编译器从绝对地址8m+3处产生一个中断向量,其中m为中断号,也即interrupt后面的数字。该向量包含一个到中断函数入口地址的绝对跳转。
    (8)中断函数最好写在文件的尾部,并且禁止使用extern存储类型说明。防止其它程序调用。

    (9)在设计中断时,要注意的是哪些功能应该放在中断程序中,哪些功能应该放在主程序中。一般来说中断服务程序应该做最少量的工作,这样做有很多好处。首先系统对中断的反应面更宽了,有些系统如果丢失中断或对中断反应太慢将产生十分严重的后果,这时有充足的时间等待中断是十分重要的。其次它可使中断服务程序的结构简单,不容易出错。中断程序中放入的东西越多,他们之间越容易起冲突。简化中断服务程序意味着软件中将有更多的代码段,但可把这些都放入主程序中。中断服务程序的设计对系统的成败有至关重要的作用,要仔细考虑各中断之间的关系和每个中断执行的时间,特别要注意那些对同一个数据进行操作的ISR.

     

     

    转载于:https://www.cnblogs.com/lifan3a/articles/6433481.html

    展开全文
  • 单片机原理及应用 函数的定义 C C51 C C 1 2 stdio.h 中断函数的定义 C51 1 interrupt m interrupt m C51 interrupt m 有缘学习更多+谓ygd3076考证资料或关注桃报奉献教育店铺 interrupt m m 0~5 0 0 1 / T0 2 1 3 /...
  • 在开始写中断函数之前,我们来一起回顾一下,单片机的中断系统。  中断的意思(学习过微机原理与接口技术的同学,没学过单片机,也应该知道),我们在这里就不讲了,首先来回忆下中断系统涉及到哪些问题。  (1...

    关于中断函数调用带参数函数的问题 



    http://www.cnblogs.com/xianghang123/archive/2011/03/10/1979763.html   

    在开始写中断函数之前,我们来一起回顾一下,单片机的中断系统。

          中断的意思(学习过微机原理与接口技术的同学,没学过单片机,也应该知道),我们在这里就不讲了,首先来回忆下中断系统涉及到哪些问题。

         (1)中断源:中断请求信号的来源。(8051有3个内部中断源T0,T1,串行口,2个外部中断源INT0,INT1(这两个低电平有效,上面的那个横杠不知道怎么加上去))

         (2)中断响应与返回:CPU采集到中断请求信号,怎样转向特定的中断服务子程序,并在执行完之后返回被中断程序继续执行。期间涉及到CPU响应中断的条件,现场保护,现场恢复。

         (3)优先级控制:中断优先级的控制就形成了中断嵌套(8051允许有两级的中断嵌套,优先权顺序为INT0,T0,INT1,T1,串行口),同一个优先级的中断,还存在优先权的高低。优先级是可以编程的,而优先权是固定的。

          80C51的原则是①同优先级,先响应高优先权②低优先级能被高优先级中断③正在进行的中断不能被同一级的中断请求或低优先级的中断请求中断。

          80C51的中断系统涉及到的中断控制有中断请求,中断允许,中断优先级控制

         (1)3个内部中断源T0,T1,串行口,2个外部中断源INT0,INT1

         (2)中断控制寄存器:定时和外中断控制寄存器TCON(包括T0、T1,INT0、INT1),串行控制寄存器SCON,中断允许寄存器IE,中断优先级寄存器IP

          具体的是什么,包括哪些标志位,在这里不讲了,所有书上面都会讲。

          在这里我们讲下注意的事项

         (1)CPU响应中断后,TF0(T0中断标志位)和TF1由硬件自动清0。

         (2)CPU响应中断后,在边沿触发方式下,IE0(外部中断INT0请求标志位)和IE1由硬件自动清零;在电平触发方式下,不能自动清楚IE0和IE1。所以在中断返回前必须撤出INT0和INT1引脚的低电平,否则就会出现一次中断被CPU多次响应。

         (3)串口中断中,CPU响应中断后,TI(串行口发送中断请求标志位)和RI(接收中断请求标志位)必须由软件清零。

         (4)单片机复位后,TCON,SCON给位清零。

    C51语言允许用户自己写中断服务子程序(中断函数)

    首先来了解程序的格式:

    void 函数名() interrupt m [using n] 

    {}

    关键字 interrupt m [using n] 表示这是一个中断函数

    m为中断源的编号,有五个中断源,取值为0,1,2,3,4,中断编号会告诉编译器中断程序的入口地址,执行该程序时,这个地址会传个程序计数器PC,于是CPU开始从这里一条一条的执行程序指令。

    n为单片机工作寄存器组(又称通用寄存器组)编号,共四组,取值为0,1,2,3

    中断号 中断源
    0        外部中断0
    1        定时器0
    2        外部中断1
    3        定时器1中断
    4        串行口中断

    这5个中断源的中断入口地址为:(在上一篇文章中讲到的ROM前43个存储单元就是他们,这40个地址用来存放中断处理程序的地址单元,每一个类中断的存储单元只有8B,显然不是中断处理的程序,而是存放着中断处理程序的真正地址)

    INT0:0003H    0

    T0:   000BH    1

    INT1:0013H    2

    T1:   001BH    3

    串口: 0023H    4

    中断向量(中断入口地址)= 中断号x8 +3

          前面m意思很清楚,不同的m值表示这个函数是针对不同的中断源,比如m为1是表示它是定时器0的中断函数,

    如void time0() interrupt 1{}

          那么后面的using n 又是什么意思呢?在正在执行一个特定任务时,有更紧急的事情需要CPU来处理,涉及到中断优先权。高优先权中断低优先权正在处理的程序,所以最好给每个优先程序分配不同的寄存器组。

          CPU正在处理某个事件,突然另外一个事件需要处理,于是进入中断后,而你不想将现在执行的程序的各寄存器状态入栈,那么可以把这个中断程序放入另一个寄存器组,如切换到1组,然后退出中断时,再切回到0组(原来的程序在0组)。

          为了更好的了解这里意思,你可以看看工作寄存器组的作用是什么。

    下面的注意事项转自网络上其他朋友的文章(整理下,重复的去掉了,写的非常好):

    (1)中断函数不能进行参数传递
    (2)中断函数没有返回值
    (3)在任何情况下都不能直接调用中断函数

    (4)中断函数使用浮点运算要保存浮点寄存器的状态。 
    (5)如果在中断函数中调用了其它函数,则被调用函数所使用的寄存器必须与中断函数相同,被调函数最好设置为可重入的。 
    (6)C51编译器对中断函数编译时会自动在程序开始和结束处加上相应的内容,具体如下:在程序开始处对ACC、B、DPH、DPL和PSW入栈,结束时出栈。中断函数未加using n修饰符的,开始时还要将R0~R1入栈,结束时出栈。如中断函数加using n修饰符,则在开始将PSW入栈后还要修改PSW中的工作寄存器组选择位。
    (7)C51编译器从绝对地址8m+3处产生一个中断向量,其中m为中断号,也即interrupt后面的数字。该向量包含一个到中断函数入口地址的绝对跳转。
    (8)中断函数最好写在文件的尾部,并且禁止使用extern存储类型说明。防止其它程序调用。

    (9)在设计中断时,要注意的是哪些功能应该放在中断程序中,哪些功能应该放在主程序中。一般来说中断服务程序应该做最少量的工作,这样做有很多好处。首先系统对中断的反应面更宽了,有些系统如果丢失中断或对中断反应太慢将产生十分严重的后果,这时有充足的时间等待中断是十分重要的。其次它可使中断服务程序的结构简单,不容易出错。中断程序中放入的东西越多,他们之间越容易起冲突。简化中断服务程序意味着软件中将有更多的代码段,但可把这些都放入主程序中。中断服务程序的设计对系统的成败有至关重要的作用,要仔细考虑各中断之间的关系和每个中断执行的时间,特别要注意那些对同一个数据进行操作的ISR.

    展开全文
  • STM32输入捕获中断函数逻辑理解

    千次阅读 2020-09-10 17:47:05
    STM32输入捕获中断函数逻辑理解 写在前面: 本人最近在初学stm32定时器的应用之输入捕获的时候,发现其中断函数处理上升沿和下降沿的逻辑比较难理解,于是花了一些时间写下理解的过程。若有不正确之处,望请指正!!...
  • 近有时间了,于是试着整理一下linux的中断处理机制,目的是起码从原理上能够说得通。  一、简单的中断机制  简单的中断机制是像芯片手册上讲的那样,在中断向量表中填入跳转到对应处理函数的指令,然后在处理...
  • 通过生活中一个简单的例子来说明中断。当你正在家中看书时,突然电话铃响了,你停止看书,去接电话,和来电话的人进行交谈,通话结束后回来继续从刚才停止的位置看你的书。这就是生活中的“中断”的现象,就是正常的...
  • USB分析(一):中断函数分析

    千次阅读 2018-01-29 21:57:15
    USB中断函数分析: __usb_device_interrupt_handler() 首先看下寄存器: Common Device Host Registers Device Registers - Endpoint 1、读取中断端口寄存器: ep_inst = _usb_instances->hw->DEVICE....
  • STM32Cube HAL库中断处理机制,以及回调函数实现原理

    万次阅读 多人点赞 2019-03-20 18:00:05
    就是直接调用这个接收中断函数来进一步处理。 像L0、G0...是通过执行 指针函数 RxISR 来进一步处理 。G0的接收中断处理为: huart->RxISR(huart); void HAL_UART_IRQHandler(UART_HandleTypeDef *huart) {  //...
  • linux中断处理原理分析

    千次阅读 2015-09-04 17:58:01
    首先需要了解一下中断的概念:一个“中断”仅仅是一个信号,当硬件需要获得处理器对它的关注时,就可以发送这个信号。内核维护了一个中断信号线的注册表,该注册表类似于I/O端口的注册表。 模块在使用中断前要先...
  • 对ZYNQ设备GPIO中断函数的详解 (一)

    千次阅读 2020-03-04 23:11:13
    简言:同别的文章一样,各大厂商,正点原子,米联客,威视瑞等等,都对GPIO中断有...于是便有意借此机会,研究GPIO中断函数相关。本文是讲解PL发送中断,PS端接收的情况。当然,情形对应的是最简单的按键触发LED亮灭。
  • 中断处理函数注意事项

    千次阅读 2020-05-09 11:49:24
    中断服务函数由硬件触发,因此不能获得参数,也无法返回值;另一方面,在中断服务函数中使用不可重入的函数,往往会导致问题。
  • read函数原理

    千次阅读 2016-09-30 22:55:04
    0x80 中断处理程序接管执行后,先检察其系统调用号,然后根据系统调用号查找系统调用表,并从系统调用表中得到处理 read 系统调用的内核函数 sys_read ,最后传递参数并运行 sys_read 函数。至此,内核真正开始处理 ...
  • LINUX系统调用原理-既应用层如何调用内核层函数之软件中断   SWI:software interrupt 软件中断   ARM Linux系统利用SWI指令来从用户空间进入内核空间,还是先让我们了解下这个SWI指令吧。SWI指令用于产生...
  • 回调函数原理

    千次阅读 2015-07-16 11:09:23
    首先,让我们把它与回调函数对比一下,回调函数是一个定义了函数的原型,函数体则交由第三方来实现的一种动态应用模式。要实现一个回调函数,我们必须明确知道几点:该函数需要那些参数,返回什么类型的值。同样,一...
  • 中断 / 软中断原理和实现

    万次阅读 2015-12-06 20:46:10
    本文主要内容:硬中断 / 软中断原理和实现 内核版本:2.6.37 Author:zhangskd @ csdn blog   概述   从本质上来讲,中断是一种电信号,当设备有某种事件发生时,它就会产生中断,通过总线把电信号发送给...
  • 回调函数中断处理函数

    万次阅读 2012-10-04 22:42:00
    ==================================================================================== ...回调函数原理是使用函数指针实现类似“软中断”的概念。 比如在上层的两个函数A和B,把自己的函数指针传给了C
  • linux软中断与硬中断实现原理概述。

    千次阅读 2014-09-15 20:01:45
    中断通过open_softirq注册一个软中断处理函数,即在软中断向量表
  • 中断服务函数函数调用的区别

    千次阅读 2019-12-23 17:02:06
    在《微机原理》和《计算机组成》等课程[1-4]教学中(本文以MCS-51单片机为例),中断过程既是教学难点又是教学重点,它与主程序调用子程序过程有一定相似性,但又有很大区别,调用子程序过程相对比较容易掌握,通过...
  • 就是直接调用这个接收中断函数来进一步处理。 像L0、G0...是通过执行指针函数RxISR来进一步处理。G0的接收中断处理为:huart->RxISR(huart); void HAL_UART_IRQHandler(UART_HandleTypeDef *huart) { //删除了前面...
  • 51单片机的中断响应原理

    千次阅读 2019-11-12 11:26:35
    1.中断概念 CPU在处理某一事件A时,发生了另一事件B请求CPU迅速去处理(中断发生); CPU暂时中断当前的工作,转去处理事件B(中断响应和中断服务); 待CPU将事件B处理完毕后,再回到原来事件A被中断的地方继续...
  • 串口中断服务函数的触发

    千次阅读 2019-07-16 18:37:40
    串口中断服务函数的触发USART1_IRQHandler(void) 1. 串口发送中断 下图为状态寄存器(USART_SR)中的位7、位6说明,发送完一帧并且发送数据寄存器为空时,位6置1。 下图为控制寄存器(USART_CR1)的位6说明,当...
  • 回调函数原理以及自定义回调函数

    万次阅读 2009-03-02 16:32:00
    回调函数原理声明CALLBACK 调用(calling)机制从汇编时代起已经大量使用:准备一段现成的代码,调用者可以随时跳转至此段代码的起始地址,执行完后再返回跳转时的后续地址。CPU为此准备了现成的调用指令,调用时可以...
  • STM32 中断优先级原理

    千次阅读 2015-07-22 17:13:23
    CM3 内核支持 256 个中断,其中包含了 16 个内核中断和 240 个外部中断,并且具有 256级的可编程中断设置。但 STM32 并没有使用 CM3 内核的全部东西,而是只用了它的一部分。STM32 有 84 个中断,...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 106,280
精华内容 42,512
关键字:

中断函数原理