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

这篇具有很好参考价值的文章主要介绍了采用串口中断方式实现串口通信。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

前言

一、中断介绍

1、中断方式

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

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

中断全过程

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

HAL库外部中断处理流程
串口中断处理,网络,stm32

中断的作用

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

2、中断优先级

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

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

3、中断向量

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

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

启动文件:startup_stm32f411xe.s
查找中断向量

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

二、利用STM32CubeMX配置项目

打开STM32CubeMX新建项目
串口中断处理,网络,stm32
选择自己的芯片型号,并勾选
串口中断处理,网络,stm32
设置RCC
串口中断处理,网络,stm32
设置SYS
串口中断处理,网络,stm32
设置USART
串口中断处理,网络,stm32
设置NVIC
串口中断处理,网络,stm32
创建项目
串口中断处理,网络,stm32

三、在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
串口中断处理,网络,stm32
发送t以后则停止输出
串口中断处理,网络,stm32

五、总结

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

六、参考资料

https://blog.csdn.net/qq_47281915/article/details/121053903文章来源地址https://www.toymoban.com/news/detail-601067.html

到了这里,关于采用串口中断方式实现串口通信的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • HAL库 STM32运用DMA与IDLE中断实现高效串口通信 (附代码)

    最近想做一个控制电机的项目,其中会用到Pytho与单片机STM32之间的互同,最近也在看一些关于数据通信和拆包的相关知识,所以记录一下这段时间里对两者之间的互通所做的事情和发现的问题,以供自己和大家参考。 单片机的串口是我们常用的与电脑通信的外设,本次与P

    2024年01月22日
    浏览(42)
  • STM32使用三种方式(阻塞、中断、DMA)实现串口发送和接收数据

    记录下学习STM32开发板的心得的和遇见的问题。 板卡型号:STM32F405RGT6 软件:STM32CubeMX、IAR STM32串口外设提供了3种接收和发送方式:阻塞、中断、DMA,主要给大家分享中断方式接收不定长数据和DMA使用空闲中断接收不定长数据。 阻塞发送: 阻塞接收: 两个函数需要注意的就

    2024年02月03日
    浏览(35)
  • STM32通过DMA方式实现串口通信

    目录 一、DMA工作原理  二、创建工程项目 三、编写代码 1.在main.c写入以下函数 2.main函数中的while循环中写入以下代码

    2024年02月15日
    浏览(32)
  • HAL库中断方式进行串口通信

    软件: STM32CubeMX:6.6.0 KEIl:5.37.0.0 FlyMcu:0.188 硬件: STM32F103ZET6 1.1 设置SYS 1.2 设置RCC 1.3 设置USART 1.4 设置NVIC 1.5 设置时钟 1.6 创建项目 2.1 printf函数设置 在 main.c 和 usart.c 中添加头文件 #include \\\"stdio.h\\\" 之后,勾选Target中的use MicroLIB,在 mian.c 文件中,添加如下代码,进行重定义 2.2 设

    2024年02月03日
    浏览(28)
  • STM32使用中断及串口通信

    采用中断模式编程,当开关接高电平时,LED亮灯;接低电平时,LED灭灯。单片机除了基本的连线外,我们另外只接一只LED灯。 使用外部中断的基本步骤如下: 1.设置对应时钟 2.设置中断 3.初始化IO 4. 把特定IO口设置为中断线路进行初始化 5. 在中断通道的响应函数中中断函数

    2024年02月04日
    浏览(39)
  • STM32学习笔记 IO口模拟串口 (接收采用定时器方式)

            硬件:基于STM32F407VET6编写         软件:使用两个GPIO口,一个用作串口发送TX,一个用作串口接收RX,采用的是定时器模拟                     时序。          要模拟串口,首先肯定是需要了解串口的协议,根据协议来编写程序。                  UART的

    2024年01月15日
    浏览(48)
  • 基于STM32CubeMX与keil采用按键外部中断方式控制LED与蜂鸣器

    这篇文章详细记录外部中断方式控制LED的亮灭以及蜂鸣器的开关;本文从原理图开始到最后实现功能,内容详细。 本栏目的所有都是基于STM32F407ZET6芯片,博主采用的是普中的天马F407开发板。 实现功能:LED0与LED1默认熄灭,蜂鸣器默认关闭。按下按键KEY0,控LED0亮灭;按下按

    2024年02月16日
    浏览(39)
  • STM32串口通信——DMA中断 (简单配置即可直接使用)

    目录 各函数的功能及使用方法 1.串口调试输出 2. 串口调试输出 接口设置    3. 串口格式化输出 4.用户串口DMA中断初始化函数 使用方法 1.找到系统的串口初始化函数 2.在结束位置添加我们的串口初始化函数  5.用户中断回调函数 使用方法 1.找到系统的中断服务.c文件 打开  

    2024年02月09日
    浏览(28)
  • HAL库学习05---串口通信(三种方式轮询、中断、DMA)

    串行通信的通讯方式可以分为两类: 1、同步通信 ,带时钟信号的传输,如SPI、IIC、USART 2、异步传输 ,不带时钟信号的传输,如UART、USART UART通用异步收发器 :UART口指的是一种物理接口形式(硬件) UART是异步,全双工串口总线。它比同步串口复杂很多。有两根线,一根TXD用于

    2024年02月11日
    浏览(24)
  • STM32 UART串口通信IDLE空闲中断的使用步骤

    参考了各路大神的资料,蒙蔽了半天,终于学会了,记录一下,以后忘了可以回来复习参考。 一、首先在stm32cube中配置打开对应uart串口的中断 二、工程main函数调用 __HAL_UART_ENABLE_IT(huart1,UART_IT_IDLE);//hal库宏定义,使能串口空闲中断     HAL_UART_Receive_DMA(huart1,data,sizeof(data));//使

    2024年02月12日
    浏览(32)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包