STM32双串口

2023-11-07

STM32双串口的使用

最近老是需要stm32通过串口去跟WiFi模块、蓝牙模块、openmv进行数据交互,然后需要用到stm32的串口调试,就把这个程序整理成一个工程,方便调试。

实验目的:外设模块(WiFi模块、蓝牙模块、openmv)发数据给stm32,然后stm32将数据发给上位机(电脑),以及电脑将数据发送给stm32,stm32将数据发给外设模块。
硬件:stm32F103zet6,openmv4,stlink。

一、初始化配置(hal库)
1、时钟设置
在这里插入图片描述
在这里插入图片描述
2、sys设置
在这里插入图片描述

3、配置串口1(用于stm32与电脑的数据交互)和串口3(stm32与外设模块的数据交互)(记得开启中断!!!!!!同时记得配置中断优先级)

在这里插入图片描述
开启中断

在这里插入图片描述
在这里插入图片描述

4、设置几个led灯和蜂鸣器(个人喜欢用来检测程序运行到哪一步,比较直观)另外,我是用正点原子的,led0是PB5,beep是PB8,初始都设置为不亮,不响。
LED
蜂鸣器
5、设置文件名以及ide,然后生成。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
二、程序编写
首先,设置几个变量

#define MAX_rebuffsize 512//定义最大的接受字节数
#define my_timeout     1000//超时
uint8_t usart3_rebuff[MAX_rebuffsize];//定义串口三的接受数据
uint8_t usart3_rebuf;//串口3接受中断缓冲
uint16_t usart3_Rx_cnt=0;  //用于中断计数
uint8_t usart1_rebuff[MAX_rebuffsize];//定义串口一的接受数据
uint8_t usart1_rebuf;//串口1接收中断缓冲
uint16_t usart1_Rx_cnt=0; 

然后在main里面开启串口一和串口三的接收中断。

HAL_UART_Receive_IT(&huart1,(void *)&usart1_rebuf,1);
HAL_UART_Receive_IT(&huart3,(void *)&usart3_rebuf,1);//每收到一个字
                                                    //节就进入中断

接下来就是整个回调函数的编写:

void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
   if(huart->Instance==USART1)
   {
       if(usart1_Rx_cnt >= 511) //溢出判断
        {
          usart1_Rx_cnt = 0;
          memset(usart1_rebuff,0x00,sizeof(usart1_rebuff));
          HAL_UART_Transmit(&huart1, (uint8_t *)"usart1数据溢出\r\n", 16,0xFFFF); 	
              
        }
        else{
             usart1_rebuff[usart1_Rx_cnt++] = usart1_rebuf;   //接收数据转存
             if((usart1_rebuff[usart1_Rx_cnt-1] == 0x0A)&&(usart1_rebuff[usart1_Rx_cnt-2] == 0x0D)) //判断结束位
                {
                  HAL_UART_Transmit(&huart3, usart1_rebuff, usart1_Rx_cnt,0xFFFF); //将收到的信息发送出去
                while(HAL_UART_GetState(&huart1) == HAL_UART_STATE_BUSY_TX);//检测UART发送结束
                  usart1_Rx_cnt = 0;
                  memset(usart1_rebuff,0x00,sizeof(usart1_rebuff)); //清空数组
                }
          
              }
            HAL_UART_Receive_IT(&huart1,(void *)&usart1_rebuf,1);  
      }
 else{
        HAL_GPIO_WritePin(GPIOB,GPIO_PIN_5,GPIO_PIN_SET);//判断是否进入串口三中断回调
        if(usart3_Rx_cnt >= 511 )//溢出判断
        {
          usart3_Rx_cnt = 0;
          memset(usart3_rebuff,0x00,sizeof(usart3_rebuff));
          HAL_UART_Transmit(&huart1, (uint8_t *)"usart3数据溢出\r\n", 16,0xFFFF); 	
         }
        else{
             usart3_rebuff[usart3_Rx_cnt++] = usart3_rebuf;   //接收数据转存
             if((usart3_rebuff[usart3_Rx_cnt-1] == 0x0A)&&(usart3_rebuff[usart3_Rx_cnt-2] == 0x0D)) //判断结束位
                {
                  HAL_UART_Transmit(&huart1, usart3_rebuff, usart3_Rx_cnt,0xFFFF); //将收到的信息发送出去
                  while(HAL_UART_GetState(&huart3) == HAL_UART_STATE_BUSY_TX);//检测UART发送结束
                  // HAL_GPIO_WritePin(GPIOB,GPIO_PIN_5,GPIO_PIN_RESET);//判读是否发出去
                  usart3_Rx_cnt = 0;
                  memset(usart3_rebuff,0x00,sizeof(usart3_rebuff)); //清空数组
                }
            }
        HAL_UART_Receive_IT(&huart3,(void *)&usart3_rebuf,1);  
       }
}

其中,led和蜂鸣器的函数可以随意写入你想检测的位置,看需要,也可以不写。
至此函数编写完毕,编译后直接烧入stm32,进行测试。

三、测试
在这里插入图片描述
ok大概就是这样子!希望对大家有点帮助。

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

STM32双串口 的相关文章

  • 136-基于stm32单片机家庭温湿度防漏水系统设计Proteus仿真+源程序

    资料编号 136 一 功能介绍 1 采用stm32单片机 LCD1602显示屏 独立按键 DHT11传感器 蜂鸣器 制作一个基于stm32单片机家庭温湿度防漏水系统设计Proteus仿真 2 通过DHT11传感器检测当前温湿度 并且显示到L
  • Push_back() 导致程序在进入 main() 之前停止

    我正在为我的 STM32F3 Discovery 板使用 C 进行开发 并使用 std deque 作为队列 在尝试调试我的代码 直接在带有 ST link 的设备上或在模拟器中 后 代码最终在 main 中输入我的代码之前在断点处停止 然
  • STM32F4 通过软复位跳转到引导加载程序,无需 BOOT0 和 BOOT1 引脚

    我问这个问题是因为可以在这里找到类似问题的答案 通过应用程序跳转到 STM32 中的引导加载程序 即从用户闪存在引导模式下使用引导 0 和引导 1 引脚 用户 JF002 JF002回答 当我想跳转到引导加载程序时 我在其中一个备份寄存器中
  • Gem5 中与 ARM 裸机的 UART 通信

    我目前正在使用 Gem5 我必须通过 UART 从我的主机访问 ARMv8 裸机选项 所以我尝试了很多方法 但我还没有准备好 您能否让我知道 如何在裸机类型编程中将主机的串行端口映射到 ARMv8 的串行端口 任何帮助 将不胜感激 工作设置
  • STM32用一个定时器执行多任务写法

    文章目录 main c include stm32f4xx h uint32 t Power check times 电量检测周期 uint32 t RFID Init Check times RFID检测周期 int main Timer
  • STM32超声波——HC_SR04

    文章目录 一 超声波图片 二 时序图 三 超声波流程 四 单位换算 五 取余计算 六 换算距离 七 超声波代码 一 超声波图片 测量距离 2cm 400cm 二 时序图 1 以下时序图要先提供一个至少10us的脉冲触发信号 告诉单片机我准备
  • 物联网网关

    物联网网关是 连接物联网设备和互联网的重要桥梁 它负责将物联网设备采集到的数据进行处理 存储和转发 使其能够与云端或其它设备进行通信 物联网网关的作用是实现物联网设备与云端的无缝连接和数据交互 物联网网关功能 数据采集 物联网网关可以从物联
  • 跟着野火学FreeRTOS:第一段(任务定义,切换以及临界段)

    在裸机系统中 系统的主体就是 C P U CPU CP U 按照预先设定的程序逻辑在 m a i n
  • 擦除后无法写入闪存

    所以我不能在擦除后直接写入内部闪存 如果写操作之前没有擦除操作 那么我可以 有什么想法吗 编程函数返回 成功写入 值 但查看内存时 没有写入任何数据 这是代码 uint32 t pageAddress 0x08008000 uint16 t
  • STM32 暂停调试器时冻结外设

    当到达断点或用户暂停代码执行时 调试器可以停止 Cortex 中代码的执行 但是 当皮质停止在暂停状态下执行代码时 调试器是否会冻结其他外设 例如 DMA UART 和定时器 您只能保留时间 r 取决于外围设备 我在进入主函数时调用以下代码
  • STM32F207 I2C 测试失败

    我正在使用 STM32F207 微控制器在 STM3220G EVAL 板上学习嵌入式开发 我尝试通过连接同一芯片上的两个 I2C2 和 I2C3 模块并发送 接收字符来测试 I2C 接口 这是我当前编写的代码 使用 mdk arm 5 i
  • 无法使用 OpenOCD 找到脚本文件

    我正在尝试按照本教程将 OpenOCD 与我的 ST 发现板一起使用 https japaric github io discovery README html https japaric github io discovery READM
  • 毕设开题分享 单片机智能教室系统(智能照明+人数统计)

    1 简介 Hi 大家好 今天向大家介绍一个学长做的单片机项目 单片机智能教室系统 智能照明 人数统计 大家可用于 课程设计 或 毕业设计 项目分享 https gitee com feifei1122 simulation project
  • CMSIS & STM32,如何开始? [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我想在 STM32 上使用 CMSIS 启动项目 网上一搜 没找到具体的教程 有些使用 SPL 开始项
  • 特殊寄存器

    特殊寄存器 文章目录 前言 一 背景 二 2 1 2 2 总结 前言 前期疑问 STM32特殊寄存器到底是什么 特殊寄存器怎么查看和调试代码 本文目标 记录和理解特殊寄存器 一 背景 最近在看ucosIII文章是 里面提到特殊寄存器 这就进
  • 如何将 microbit 与 BLE 连接并监听按钮按下事件?

    2021 年 11 月 28 日编辑 如果您需要使用蓝牙低功耗将 microbit 连接到计算机 并在单击按钮时执行操作 直接跳并跟随 ukBaz https stackoverflow com users 7721752 ukbaz的回答
  • 嵌入式 C++11 代码 — 我需要 volatile 吗?

    采用 Cortex M3 MCU STM32F1 的嵌入式设备 它具有嵌入式闪存 64K MCU固件可以在运行时重新编程闪存扇区 这是由闪存控制器 FMC 寄存器完成的 所以它不像a b那么简单 FMC 获取缓冲区指针并将数据刻录到某个闪存
  • 嵌入式Linux中UART上的9位协议

    我正在尝试在嵌入式 Linux 中的 UART 上强制使用 9 位协议 目前我正在 am335x evm 板上对此进行测试 我计划使用坚持平价来做到这一点 理想情况下 我希望不需要实际修改 omap serial c 驱动程序的任何代码 9
  • 使用 STM32F0 ADC 单独读取不同的输入

    STM32F072CBU 微控制器 我有多个 ADC 输入 并且希望单独读取它们 STMcubeMX 生成样板代码 假设我希望按顺序读取所有输入 但我无法弄清楚如何纠正这个问题 这篇博文 http blog koepi info 2015
  • 移动数组中的元素

    我需要一点帮助 我想将数组中的元素向上移动一个元素 以便新位置 1 包含位置 1 中的旧值 new 2 包含 old 1 依此类推 旧的最后一个值被丢弃 第一个位置的新值是我每秒给出的新值 我使用大小为 10 的数组 uint32 t TE

随机推荐

  • linux crontab 文件位置和日志位置

    一 文件位置 位置一般在 var spool cron 下 如果你是root用户 那下面有个root文件 建议日常备份 避免误删除导致crontab 文件丢失 二 日志文件位置 默认情况下 crontab中执行的日志写在 var log下
  • python 使用 with open() as 读写文件的操作方法

    读文件 要以读文件的模式打开一个文件对象 使用Python内置的open 函数 传入文件名和标示符 1 gt gt gt f open E python python test txt r 标示符 r 表示读 这样 我们就成功地打开了一个文
  • R语言倾向性评分:加权

    之前已经介绍过倾向性评分匹配 propensity score matching 倾向性评分回归和分层 R语言倾向性评分 回归和分层 R语言倾向性评分 匹配 今天继续介绍倾向性评分最后一个重要的部分 倾向性评分加权 主要介绍两种加权方法 逆
  • Anaconda环境下配置GPU版本pytorch和tensorflow、安装pycharm较全教程,避免踩坑

    一 安装Anaconda 1 安装anaconda的教程 1条消息 Anaconda的下载及安装 详细图文教程 伏城无嗔的博客 CSDN博客 anaconda如何下载https blog csdn net qq 45281807 artic
  • Linux开发板ping通WSL2并且能够通过无线网连接外网(虚拟机同样适用)

    Linux开发板ping通WSL2并且能够通过无线网连接外网 虚拟机同样适用 前言 安装Hyper V 创建虚拟网卡 将WSL的网络桥接 共享WIFI 修改共享网段的IP VMWare虚拟机 参考 前言 由于笔者入手了一块linux开发板
  • Linux下tty驱动框架

    在Linux下编写串口驱动程序 需要使用Linux提供的tty和serial驱动模块 以下是一个简单的tty串口驱动程序示例 使用C语言编写 include
  • 生成子集——位向量法

    生成0 n序列的子集 对于0 n的每一个值在集合中都有存在和不存在两种状态 所以递归每个值的存在状态即可生成子集 include
  • pyspark环境搭建,连接hive

    pyspark环境搭建 连接hive 一 环境搭建 1 1环境 1 1 1 集群环境 1 1 2 系统环境配置 1 1 3 host文件配置 1 1 4hive hadoop的配置文件 1 1 5 pyspark安装 2 1环境测试 二 项
  • 从windows下切换到Linux

    想从windows下切换到Linux 感觉好难 虽然早有这个想法 但是真正做起来后感觉还是有点难度 主要是命令行的界面感觉不习惯 感觉没有了鼠标就什么都不会干了 尤其是在vi下的时候 连上下左右都不会了 但是换了vim tiny后感觉我又会
  • ML算法基础——分类模型评估与调参

    文章目录 一 分类模型评估 1 准确率 2 精确率和召回率 2 1 混淆矩阵 2 2 精确率 Precision 与召回率 Recall 2 3 分类模型评估API 2 4 贝叶斯模型评估实例 二 模型的选择与调优 1 交叉验证 2 网格搜
  • SLVS-EC接口学习

    SLVS summarize 一 概述 SLVS EC高速串行接口技术 在CIS和DSP 数字信号处理器 之间实现了高帧率的宽带像素数据传输 SLVS EC引入了一个优化的数据包格式和控制协议 几乎没有冗余 而且结构简单 仅由两层组成 LI
  • Windows下部署Appium教程(Android App自动化测试框架搭建)

    摘要 1 appium是开源的移动端自动化测试框架 2 appium可以测试原生的 混合的 以及移动端的web项目 3 appium可以测试ios android firefox os 4 appium是跨平台的 可以用在osx windo
  • 【SpringCloudAlibaba学习 01】创建父工程项目

    文章目录 SpringBoot SpringCloud SpringCloudAlibaba版本对应关系 第一步 创建父工程 第二步 配置父工程Maven依赖 第三步 本地项目上传Git仓库 这一步可不做 1 登录自己的Git 2 进入个人
  • 详解深度语义匹配模型DSSM

    所谓语义匹配 就是在语义上衡量文本的相似度 在产业界有很多的应用需求 例如 在FAQ场景中需要计算用户输入与标问之间的相似度来寻找合适的答案 本文介绍一种经典的语义匹配技术 DSSM 主要用于语料的召回和粗排 作者 编辑 小Dream哥 1
  • ZooKeeper-Curator-InterProcessMutex分布式锁源码

    这里写自定义目录标题 InterProcessMutex 可重入互斥锁 ConnectionStateListener 注意 临时节点下不能创建临时子节点 InterProcessMutex 可重入互斥锁 具体流程图 入口1 Overrid
  • 在vue3中如何使用百度地图API(详细步骤+demo示例)

    提示 文章写完后 目录可以自动生成 如何生成可参考右边的帮助文档 文章目录 一 注册账号 申请成为开发者 二 申请密钥AK 三 在vue3 0中使用百度地图API 提示 以下是本篇文章正文内容 下面案例可供参考 一 注册账号 申请成为开发者
  • linux VM与容器的存储IO性能测试

    linux VM与容器的存储IO测试 测试由KVM vmwarm virtualbox生产的VM和docker容器的存储IO性能 测试过程 1 分别在同一台物理机安装kvm和virtualbox的hypervisor 生产kvm virtu
  • 网络网段分类

    A类网段 0 0 0 0 127 255 255 255 B类网段 128 0 0 0 191 255 255 255 C类网段 192 0 0 0 223 255 255 255 D类网段 224 0 0 0 239 255 255 25
  • python多变量赋值和三元表达式出错(求解答)

    直接给出问题吧 以后只在定义是进行多变量同时赋值算了 希望有大神能够解答 定义变量 minL 0 a 0 b 1 subL 2 print minL a b subL 0 0 1 2 方法一 minL a subL b if subL lt
  • STM32双串口

    STM32双串口的使用 最近老是需要stm32通过串口去跟WiFi模块 蓝牙模块 openmv进行数据交互 然后需要用到stm32的串口调试 就把这个程序整理成一个工程 方便调试 实验目的 外设模块 WiFi模块 蓝牙模块 openmv 发