采用串口中断方式实现串口通信
文章目录
- 前言
- 一、中断介绍
- 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
查找中断向量
- 编号:计算机系统对每一个中断源进行编号,此号码称作中断类型号
- 查表:根据中断内型号,到中断向量表中找到对应的表项
- 执行:取出标项内容,即该中断源对应的中断拂去程序地址,进入该程序执行相应操作
中断响应过程
二、利用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时,发送提示并改变flagif(c=='0'){flag=0;HAL_UART_Transmit(&huart1, (uint8_t *)&tips2, strlen(tips2),0xFFFF); }//当输入的指令为1时,发送提示并改变flagelse if(c=='1'){flag=1;HAL_UART_Transmit(&huart1, (uint8_t *)&tips1, strlen(tips1),0xFFFF); }//当输入不存在指令时,发送提示并改变flagelse {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
采用串口中断方式实现串口通信相关推荐
- 使用串口中断方式实现串口通信
文章目录 一. 实验环境 二.实验目标 三.串口中断方式特点 四.HAL配置串口通信 五.开发板引脚连接 六.程序代码 (1)接收单个字符控制串口发送 (2)接收多个字符控制串口发送 七.总结 一. ...
- 采用串口中断方式实现串口通信:停止/持续发送“hello windows!”
文章目录 一.stm32接收到字符"s"/"t"时停止/持续发送"hello windows!" 1.STM32CubeMX工程创建 2.程 ...
- 使用51单片机采用中断方式进行串口通信的学习记录:
使用51单片机进行串口通信的学习记录之中断方式: 1.51单片机采用中断方式的串口通信过程及程序分析: 所谓中断方式,就是串口收/发标志位出发中断后,在中断中执行既定操作,可通过函数调用来实现. 接收 ...
- 串口中断方式与DMA方式通信
文章目录 一.串口中断介绍 1.串口发送/接收函数 2.串口中断函数 3.串口查询函数 二.中断方式串口通信 1.题目要求 2.工程建立 3.代码编写 4.烧录与结果演示 三.DMA介绍 1.DMA简 ...
- 【嵌入式系统开发13】采用串口中断方式完成单字符接受与字符串接受
本文目的是主要介绍通过STM32F103C8T6接收到字符"s"时,停止持续发送"hello windows!"; 当接收到字符"t"时,持 ...
- HAL库中断方式实现串口通信操作
文章目录 一.实验工具 二.CubeMX配置项目 1.引脚配置 2.RCC设置 3.SYS设置 4.USART设置 5.NVIC设置 6.创建项目 三.keil中配置代码 1.main函数前定义全局变 ...
- stm32中断方式的串口通信——上位机控制串口收发
文章目录 前言 一.什么是串口通信 二.什么是中断--STM32 1.中断的概念 2.STM32下NVIC的介绍 3.中断优先级的介绍 4.外部中断的介绍 三.串口通信keil工程文件 1.新建工程模 ...
- STM32之中断方式实现串口通信
中断方式实现串口通信 一.创建项目 二.编写代码 三.运行 四.总结 一.创建项目 创建一个STM32f103c8的STM32CubeMX项目: SYS设置: RCC设置: 时钟树设置,输入72后回车 ...
- 【STM32】基于STM32F407中断方式实现串口通信
目录 一.中断介绍 二.中断方式实现串口通信 1. 新建工程 2. 工程设置 3.代码编写 4. 烧录验证 三.总结 四.参考 一.中断介绍 具体介绍参考文章: [STM32]基于STM32F407的 ...
最新文章
- 如何直接从GitHub安装npm软件包?
- 打开了悬浮窗权限但是没有_给你的手机添加“樱花雨”特效,打开手机樱花就满屏飘落,漂亮!...
- 速递|2021双11阿里云数据库技术快报
- 游戏光线追踪往事:十年技术轮回
- 深入理解条件过滤Conditional
- 关于重写equals()与hashCode()
- 使用电脑无线网卡分享网络命令
- this 的4种绑定机制
- 慢慢看Spring源码
- python新手如何编写一个猜数字小游戏
- 【20保研】厦门大学软件学院暑期夏令营招生简章
- css怎么设置鼠标手势?
- 标签、画像设计与模型落地
- 格式化输出函数setw与setfill的使用
- [kubernetes]-kubernetes+nfs创建高可用mysql
- 【xinput1_3.dll下载】xinput1_3.dll丢失怎么修复win10
- Java随笔记 - 断包和粘包 解决方法
- 第2章第6节:使用Slider滑杆在指定的范围内选择一个数值 [SwiftUI快速入门到实战]
- java实验作业答案_JAVA实验作业 JAVA题目
- h5禁用浏览器下载视频_【HTML5】video 标签禁用自带的下载按钮
热门文章
- html的em属性,css中的em是什么意思?
- 武林外传服务器位置,《武林外传手游》数据互通规则 合区详情
- 报错`RuntimeError: CUDA out of memory. Tried to allocate 256.00 MiB (GPU 0; 9.78 GiB total capaci
- 事关企业转型 联想超融合回答的5个关键问题
- 模具设计最基础的知识, 模具人必须要掌握
- 黑客大曝光:恶意软件和Rootkit安全
- Error:(7, 21) java: 程序包javax.servlet不存在
- 笔记本外接显示器显示很模糊解决办法
- JointJS动态流程图
- restful 简单理解