串口通信实现方案:采用中断方式

文章目录

  • 前言
  • 一、中断介绍
  • 1、中断方式
  • 2、中断优先级
  • 3、中断向量
  • 二、利用STM32CubeMX配置项目
  • 三、在keil配置代码
  • 四、实际效果
  • 五、总结
  • 六、参考资料
  • 前言

    一、中断介绍

    1、中断方式

    中断方式
    中断方式是处理器和外部设备的数据传输方式。一方通过申请中断的方式与另一方进行数据传输,收发双方可以并行工作。
    中断系统
    中断装置和中断处理程序统称为中断系统。
    中断系统是计算机的重要组成部分。实时控制、故障自动处理、计算机与外围设备间的数据传送往往采用中断系统。中断系统的应用大大提高了计算机效率。
    数据传输方式(处理器和外部设备之间)

    传输方式 说明
    无条件传输 处理器不需要了解外部设备状态,而直接进行数据传输
    查询方式 传输前一方先查询对方的状态,若已准备好就进行传输,没有就继续查询
    中断方式 一方通过申请中断的方式与对方进行数据传输,收发方可并行工作
    直接存储器访问 处理器内部建立片内外设和内存之间的数据传输通道,传输过程无需处理器参与

    中断全过程

  • 中断发生:当CPU在处理某一事件m,发生了另一事件n,请求CPU迅速去处理
  • 中断处理:CPU暂停当前的工作,转去处理事件n
  • 中断返回:当CPU将时间n处理完以后再回到事件m中被暂停的地方继续处理
  • HAL库外部中断处理流程

    中断的作用

    作用 具体说明
    速度匹配 可以解决快速的CPU与慢速的外部设备之间传送数据的矛盾
    分时操作 CPU可以分时为多个外部设备服务,提高计算机的利用率
    实时响应 CPU能够及时处理应用系统的随机事件,增强系统的实时性
    可靠性搞 CPU可以处理设备故障及掉电等突发事件,提高系统可靠性

    2、中断优先级

    处理器会根据不同中断的重要程序设置不同的优先等级。处理器在遇到高优先级的中断时可以打断低优先级的中断,反之则不行。

  • 因为中断优先级的问题会产生中断嵌套的情况,就类似于函数里面又嵌入了一个函数,但在中断此处的嵌套有一个重要特点就是被嵌套的中断优先级高于嵌套该中断的优先级,即低高优先级中断嵌套在优先级中断里面。
  • 3、中断向量

    中断服务程序
    在响应一个特定中断的时候,处理器会执行一个函数,该函数一般称为中断处理程序挥着中断服务程序。
    中断向量和中断向量表

  • 中断向量:中断服务程序在内存中的入口地址成为中断向量。
  • 中断向量表:把系统中所有的中断向量集中起来放到存储器的某一区域内,这个存放中断向量的存储区就叫中断向量表
  • 启动文件:startup_stm32f411xe.s
    查找中断向量

    1. 编号:计算机系统对每一个中断源进行编号,此号码称作中断类型号
    2. 查表:根据中断内型号,到中断向量表中找到对应的表项
    3. 执行:取出标项内容,即该中断源对应的中断拂去程序地址,进入该程序执行相应操作
      中断响应过程

    二、利用STM32CubeMX配置项目

    打开STM32CubeMX新建项目

    选择自己的芯片型号,并勾选

    设置RCC

    设置SYS

    设置USART

    设置NVIC

    创建项目

    三、在keil配置代码

    1.打开通过CubeMX生成的项目
    2.在main函数前定义全局变量

    char c;//指令 0:停止  1:开始
    char message[]="hello Windows\n";//输出信息
    char tips[]="CommandError\n";//提示1
    char tips1[]="Start.....\n";//提示2
    char tips2[]="Stop......\n";//提示3
    int flag=0;//标志 0:停止发送 1.开始发送
    

    3.在main函数中设置接收中断
    函数说明:

    函数原型

     HAL_UART_Receive_IT(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size)
    

    功能

    功能:串口中断接收,以中断方式接收指定长度数据。
    大致过程是,设置数据存放位置,接收数据长度,然后使能串口接收中断。
    接收到数据时,会触发串口中断。
    再然后,串口中断函数处理,直到接收到指定长度数据
    而后关闭中断,进入中断接收回调函数,不再触发接收中断。(只触发一次中断)

    参数

    UART_HandleTypeDef *huart      UATR的别名    
     huart1  *pData      			接收到的数据存放地址
     Size                      		接收的字节数
    
    HAL_UART_Receive_IT(&huart1, (uint8_t *)&c, 1);
    

    4.main函数中的while循环里面添加传输代码

    if(flag==1){
    			//发送信息
    			HAL_UART_Transmit(&huart1, (uint8_t *)&message, strlen(message),0xFFFF); 
    			
    			//延时
    			HAL_Delay(1000);
    		}
    

    5.在main函数下面重写中断处理函数

    void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
    {
    	
    	//当输入的指令为0时,发送提示并改变flag
    	if(c=='0'){
    		flag=0;
    		HAL_UART_Transmit(&huart1, (uint8_t *)&tips2, strlen(tips2),0xFFFF); 
    	}
    	
    	//当输入的指令为1时,发送提示并改变flag
    	else if(c=='1'){
    		flag=1;
    		HAL_UART_Transmit(&huart1, (uint8_t *)&tips1, strlen(tips1),0xFFFF); 
    	}
    	
    	//当输入不存在指令时,发送提示并改变flag
    	else {
    		flag=0;
    		HAL_UART_Transmit(&huart1, (uint8_t *)&tips, strlen(tips),0xFFFF); 
    	}
    
    	//重新设置中断
    		HAL_UART_Receive_IT(&huart1, (uint8_t *)&c, 1);  
    }
    

    编译并创建hex文件

    四、实际效果

    当发送s以后将会不断出现hello Windows

    发送t以后则停止输出

    五、总结

    在创建项目的时候,从STM32CubeMX到keil上面出现了配置及设置问题,从最开的创建项目开始去查找相关问题,发现配置的缺失。在整个实验中,设备配置、时钟设置等都有相应的要求,与之前的设置要有区分。这一整个实验流程操作下来,对于利用STM32CubeMX创建工程项目结合keil实现串口通信等实验有了一定的了解,同时大概清晰了对于外设和时钟的处理,并对中断有了更深层次的认识。

    六、参考资料

    https://blog.csdn.net/qq_47281915/article/details/121053903

    物联沃分享整理
    物联沃-IOTWORD物联网 » 串口通信实现方案:采用中断方式

    发表评论