定时器串口收发和空闲中断串口收发+STM32CubeMX

2023-10-29

引言:最近在做串口实验,总结了两种串口收发的方法,第一种是用定时器定的,第二种是使用空闲中断。

第一种 使用定时器

具体做法是在串口接收数据时启动定时器,每接收一帧数据要复位定时值以保证定时器不会溢出。根据波特率计算出大概什么时候接收数据完成,什么时候,缓存数组溢出。比如波特率是115200bit/s,就是1s钟传输115200位,每传输一位就是0.00868ms,一个字符占8位加上起始位和停止位一共是10位,所以每传输一个字符大概需要0.086ms,所以根据传输的数据帧设置传输完成的时间判定,比如想一次传输100个字符,就是1000位,需要时间是8.6ms,可以将传输完成时间设置成20-30ms,因为字符数组的最大长度是255,所以溢出时间是255*0.0868=22.134ms,可以将溢出时间设置成50ms,下面就是CubeMx配置和代码的编写了

1、打开CubeMx选择好单片机芯片后,配置SYS和时钟RCC

 2、配置串口,最后使能中断

3、配置定时器,定时时间为1ms,并使能中断

4、生成代码后进行代码编写

在main.c中定义变量和一些函数,对于fputc函数要    #include <stdio.h> 不然会报错

 

 在main.c中使能定时器和串口接收中断

 在main.c中重写串口接收中断回调函数,当接收完成时,a=1

 在main.c中的定时器回调函数中编写相应的代码,当定时器计时到50ms时,表示缓存数组溢出

 最后就是在while循环里的代码编写,当a=1时(即数据接收完成),将数据打印到串口,并将a赋值为0

 下载程序测试,如果发送的太过频繁,会有数据粘连

第二种 使用空闲中断进行串口收发

IDLE空闲中断是在监测到数据接收后(即串口的RXNE位被置位)开始检测,当总线上在一个字节对应的周期内未再有新的数据接收时,控制触发空闲中断的IDLE位被硬件置1, 便会激发一个空闲中断,在中断处理函数中,我们可以解析接收到的不定长数据。下面进行CubeMx配置和代码编写。

1、打开CubeMx选择好单片机芯片后,配置SYS和时钟RCC

 2、配置串口,最后使能中断

 3、生成代码后进行代码编写

main.h中添加

 main.c

 

main函数中注意确保DMA初始化函数放在串口初始化之前,并在串口初始化之后使能IDLE中断、开启串口DMA接收

 在/* USER CODE BEGIN 4 */下添加用户自定义IDLE空闲中断回调函数

由于hal库中没有定义IDLE空闲中断的中断处理函数,需要用户自行定义打开stm32f1xx_it.c,找到void USART1_IRQHandler(void)函数,并添加如下代码:

 下载程序测试

 总结:第一种定时器的串口收发,在发送数据频繁的时候,会有数据粘连的情况发生。第二种在发送频繁的时候没有出现数据粘连的情况,如果使用到了freertos,则往往选择第一种定时器的,因为第二种不能做临界保护。

第一次发博客,也算是单片机小白,如果有说的不对的地方,还请指教!感谢!

参考博客:

串口接收不定长数据的几种方式_苏提春晓_的博客-CSDN博客串口IDLE空闲中断+DMA实现接收不定长数据基于stm32cubemx_m0_58976369的博客-CSDN博客_串口空闲中断加dma接收

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

定时器串口收发和空闲中断串口收发+STM32CubeMX 的相关文章

随机推荐

  • Buuctf——[RCTF2015]EasySQL

    Buuctf RCTF2015 EasySQL 一 解题步骤 1 看到注册登录 闲着没事先注册个号试试 1 123 2 进去看了 除了受到文化熏陶 别的好像没有啥 点一下试试其有什么功能 一不小心就看到了修改密码 3 惊奇的发现 密码可以被
  • 【数据结构】二、顺序表的定义和基本操作的实现

    目录 数据结构 DATA STRUCTURE 二 线性表 2 1 线性表的定义和基本操作概述 2 2 线性表的顺序表示 2 2 1 顺序表存储结构描述和特点 1 静态存储方式 2 动态存储方式 3 顺序表的优缺点 2 2 2 顺序表基本操作
  • 数据库-ER建模

    目录 基本概念 1 实体 entity 2 属性 attribute 3 联系 relation 3 1 基数约束的四种形态 3 1 1 基数约束形态一 3 1 2 基数约束形态二 3 1 3 基数约束形态三 3 1 4 基数约束形态四 扩
  • OneOS文字转语言组件实操

    本文分享自中移OneOS微信公众号 当万耦遇上chaoTTS 作者 柏灵 大家好 柏灵又又又来啦 相信大家已经开始在寒冷的冬季种植鲜嫩的豌豆尖 火锅里烫上豌豆尖 从此打工人有了豌豆尖自由 还没有种植的小伙伴 可以通过OneOS 基于端云融合
  • fit、transform、fit_transform的区别,为什么训练集用 fit_transform , 测试集用 transform

    三个函数的使用具体解释 在数据预处理中的应用 1 只涉及一组数据 fit data 对数据进行拟合 获得了数据的均值 最大最小 标准差等属性值 transform data 利用 fit data 获取到的属性对数据做预处理 如标准化 归一
  • cocos cretor shader effect-the book of shader前言

    前言 说来惭愧 半年前开始接触cocso creator shader的时候 看了官方教程 看了大神写的例子 搞懂了一些语法概念 可是当时看一遍有种似懂非懂的感觉 那种感觉就是听过很多道理 任然过不好一生 在cocos论坛里有大神也分享过自
  • Foxmail 搜索功能找不到全部邮件问题的解决方法。

    经常使用Foxmail办公收发邮件 发现Foxmail 搜索功能找不到全部邮件 原来问题出在搜索上 举例说明 迁移到Foxmail后 王卡卡同志给我发过3封邮件 可是我用据称无比强大的Foxmail搜索邮件时 输入关键字 root 只能找到
  • [计算机毕业设计]数字水印算法

    前言 大四是整个大学期间最忙碌的时光 一边要忙着准备考研 考公 考教资或者实习为毕业后面临的就业升学做准备 一边要为毕业设计耗费大量精力 近几年各个学校要求的毕设项目越来越难 有不少课题是研究生级别难度的 对本科同学来说是充满挑战 为帮助大
  • 梦幻模拟战pc版更新服务器正在维护,梦幻模拟战PC版免CD(更新2代跳出补丁 一些实用说明)...

    最近看到游侠有发梦幻模拟战PC版1 2 下载 不过要禁用DX 还要拔光驱 比较麻烦 我把我以前收藏的L1 L2 免CD发出来分享 我自己反正测试可以用 1代 第1步 替换langpc exe 请做好备份 第2步 复制光盘上 DISK1 ID
  • shell脚本中$!、$@、$#、$$、$0、$1、$2、$*的含义

    一 shell脚本中 0 1 2 的含义 Shell最后运行的后台Process的PID 后台运行的最后一个进程的进程ID号 添加到shell当中参数的个数 Shell本身的PID ProcessID 即脚本运行的当前进程ID号 0 脚本本
  • 【第八章 线程的同步机制(同步代码块、同步方法)】

    第八章 线程的同步机制 同步代码块 同步方法 1 线程的同步机制方式一 同步代码块 java中通过同步机制解决线程安全问题 synchronized 同步监视器 需要被同步的代码 说明 操作共享数据的代码即为需要被同步的代码 共享数据 多个
  • 关于浏览器静止音频自动播放的问题

    背景 今天在制作前端页面时 想要给网页加上会自动播放的音乐 但是用audio标签设置音频的自动播放后 即使将autoplay属性设置成true 谷歌等浏览器页面加载完成后也不会自动播放音乐 尝试了各种办法无果 原因 目前 最为流行的浏览器共
  • 求助TCanvas内存无限涨的问题

    求助TCanvas内存无限涨的问题 Delphi Windows SDK API http www delphi2007 net DelphiMultimedia html delphi 20061110220830160 html pro
  • 利用Wireshark分析TCP三次握手

    首先打开 http www baidu com这个网址进行抓包 首先在过滤器中输入 http过滤 找到 GET HTTP 1 1 我们可以看到在出现了三条TCP记录之后才出现了HTTP这也更加相信HTTP是基于TCP协议的 第一次TCP握手
  • uniapp 顶部头部样式

  • 【Python】剑指offer 14:剪绳子

    题目 给你一根长度为n的绳子 请把绳子剪成m段 m和n都是整数 n gt 1并且m gt 1 每段绳子的长度记为k 0 k 1 k m 请问k 0 k 1 k m 可能的最大乘积是多少 例如 当绳子的长度为8时 我们把它剪成长度分别为2 3
  • idea中类存在编译器报错类无法找到,打包正常解决

    步骤 关键在于清掉类在idea的cache 1 刷新maven项目 2 清理idea缓存 3 maven clean install 4 重新bulid 5 如果使用了lombok插件开启之后重新build 6 maven依赖冲突导致
  • Gin微服务框架_golang web框架_完整示例Demo

    Gin简介 前些天发现了一个巨牛的人工智能学习网站 通俗易懂 风趣幽默 忍不住分享一下给大家 点击跳转到网站 Gin是一个golang的微框架 封装比较优雅 API友好 源码注释比较明确 具有快速灵活 容错方便等特点 其实对于golang而
  • Haystack 太强了!存 2600 亿图片

    作者 奇伢 来源 奇伢云存储 小文件存储 小文件存储 老生常谈的问题 先聊聊小文件存储重点关注的是什么 以前我们提过 对于磁盘来说 小 io 吃 iops 大块 io 吃吞吐 划重点 小文件的重点是 io 次数 为什么每次提到海量小文件的时
  • 定时器串口收发和空闲中断串口收发+STM32CubeMX

    引言 最近在做串口实验 总结了两种串口收发的方法 第一种是用定时器定的 第二种是使用空闲中断 第一种 使用定时器 具体做法是在串口接收数据时启动定时器 每接收一帧数据要复位定时值以保证定时器不会溢出 根据波特率计算出大概什么时候接收数据完成