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双串口 的相关文章

  • 133-基于stm32单片机停车场车位管理系统Proteus仿真+源程序

    资料编号 133 一 功能介绍 1 采用stm32单片机 4位数码管 独立按键 制作一个基于stm32单片机停车场车位管理系统Proteus仿真 2 通过按键进行模拟车辆进出 并且通过程序计算出当前的剩余车位数量 3 将剩余的车位数量显示到
  • Gem5 中与 ARM 裸机的 UART 通信

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

    提示 来源正点原子 参考STM32F103 战舰开发指南V1 3PDF资料 文章目录 前言 一 pandas是什么 二 使用步骤 1 引入库 2 读入数据 总结 前言 提示 这里可以添加本文要记录的大概内容 开发环境硬件普中科技 接线图在g
  • 物联网网关

    物联网网关是 连接物联网设备和互联网的重要桥梁 它负责将物联网设备采集到的数据进行处理 存储和转发 使其能够与云端或其它设备进行通信 物联网网关的作用是实现物联网设备与云端的无缝连接和数据交互 物联网网关功能 数据采集 物联网网关可以从物联
  • STM32F103概要

    The STM32F103x4 STM32F103x6 STM32F103xC STM32F103xD and STM32F103xE are a drop in replacement for STM32F103x8 B medium d
  • [MM32硬件]搭建灵动微MM32G0001A6T的简易开发环境

    作为学习单片机的经典 自然是通过GPIO点亮LED 或者是响应按钮的外部中断例程 这我们看看SOP8封装的芯片MM32G0001A6T得引脚 除了VDD和GND固定外 我们可以使用PA14 PA1 PA13 PA15 PA2 PA3这六个G
  • 解决KEIL编译慢问题

    两种方案 使用v6版本的ARM Compiler 如果v6版本编译不过 必须使用v5版本的 则可以勾选掉Browse Information选项 提升很明显 1分多钟能优化到几秒 看代码量 但是这个有个弊端 在KEIL中会影响函数跳转 建议
  • 在 Atollic TrueStudio、STM32CubeMX 中导入 C 库

    我目前正在开发 STM32F767ZI Nucleo 板和一个小安全芯片 microchip atecc508a 通过 i2c 连接进行连接 该芯片有一个可用的库加密验证库 https github com MicrochipTech cr
  • 跟着野火学FreeRTOS:第一段(任务定义,切换以及临界段)

    在裸机系统中 系统的主体就是 C P U CPU CP U 按照预先设定的程序逻辑在 m a i n
  • 跟着野火学FreeRTOS:第一段(任务定义,切换以及临界段)

    在裸机系统中 系统的主体就是 C P U CPU CP U 按照预先设定的程序逻辑在 m a i n
  • STM32F4-Discovery (STM32F429ZIT6) 上的 RS232 (UART) 与 HAL 库?

    背景 这是我的一些背景 以便你们知道我有或没有哪些相关知识 我完全是这种嵌入式系统的新手 而且我对电子产品一无所知 我是一个纯粹的软件人员 我唯一的嵌入式系统经验是Raspberry Pi 它与STM32F4 Discovery有很大不同
  • Freertos低功耗管理

    空闲任务中的低功耗Tickless处理 在整个系统运行得过程中 其中大部分时间都是在执行空闲任务的 空闲任务之所以执行 因为在系统中的其他任务处于阻塞或者被挂起时才会执行 因此可以将空闲任务的执行时间转换成低功耗模式 在其他任务解除阻塞而准
  • 使用 read(...) 时在换行符处停止

    我需要从通过 UART 连接的 GPS 读取 NMEA 语句 操作系统是Debian 语言必须是C 为此 我使用以下命令打开文件open 并读取一个字符串read 但是 这样我必须指定字符串长度 这会分解句子 相反 我想读到 NMEA 句子
  • Cortex-M3与M4权威指南

    处理器类型 所有的ARM Cortex M 处理器是32位的精简指令集处理器 它们有 32位寄存器 32位内部数据路径 32位总线接口 除了32位数据 Cortex M处理器也可以有效地处理器8位和16位数据以及支持许多涉及64位数据的操作
  • 通过JTAG恢复STM32 MCU磨掉的标记

    我有一块可能带有 STM32 MCU 的板 我想为该板制作定制固件 因为库存板有很多问题 不幸的是 电路板制造商很友善地磨掉了所有标记 有没有办法通过 jtag 获取设备 系列 ID 并将其交叉引用到型号 我能找到的一切都是关于获取芯片的唯
  • STM32 上的 ADC 单次转换

    我正在研究 STM32 F103x 上的 ADC 编程 并从最简单的情况 单次转换开始 测量内部温度传感器 连接到 ADC1 的值 并使用 USART 将其发送到 COM 端口 目标似乎很明确 但是当我尝试将源代码下载到闪存时 它不会向 C
  • 跨线程操作无效:从创建它的线程以外的线程访问控制“textBox1”[重复]

    这个问题在这里已经有答案了 我想使用 UART 将温度值从微控制器发送到 C 接口并显示温度Label Content 这是我的微控制器代码 while 1 key scan get value of temp if Usart Data
  • PWM DMA 到整个 GPIO

    我有一个 STM32F4 我想对一个已与掩码进行 或 运算的 GPIO 端口进行 PWM 处理 所以 也许我们想要 PWM0b00100010一段时间为 200khz 但随后 10khz 后 我们现在想要 PWM0b00010001 然后
  • 移动数组中的元素

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

    我主要知道两种使用 GCC 声明内存映射寄存器的方法 有许多变体 使用双字段 每个外设的数据结构等 要么使用初始化为正确地址的指针 例如volatile uint32 t pMyRegister uint32 t 0xDEADBEEFUL

随机推荐

  • 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 发