STM32串口发送数据

2023-05-16

串口通信经常作为开发调试的工具,所以先介绍下串口通信。

串口通讯(Serial Communication)是一种设备间非常常用的串行通讯方式,因为它简单便捷,大部分电子设备都支持该通讯方式,电子工程师在调试设备时也经常使用该通讯方式输出调试信息。目前STM32一般只使用 RXD、TXD 以及 GND 三条信号线,直接传输数据信号。

STM32的串口通信外设有USART和UART。USART是Universal Synchronous Asynchronous Receiver and Transmitter的缩写,即通用同步异步收发器可以灵活地与外部设备进行全双工数据交换。UART(Universal Asynchronous Receiver and Transmitter)在USART基础上裁减了同步通信功能,只有异步通信。

接口通过三个引脚从外部连接到其它设备(如以下USART框图所示)。任何 USART 双向通信均需要至少两个引脚:接收数据输入引脚 (RX) 和发送数据引脚输出 (TX)。

RX :接收数据输入引脚就是串行数据输入引脚。过采样技术可区分有效输入数据和噪声,从而用于恢复数据。

TX :发送数据输出引脚。如果关闭发送器,该输出引脚模式由其 I/O 端口配置决定。如果使能了发送器但没有待发送的数据,则 TX 引脚处于高电平。在单线和智能卡模式下,该 I/O用于发送和接收数据(USART 电平下,随后在 SW_RX 上接收数据)。

TX和RX分别用PA9和PA10。即使用USART1。

配置串口时,首先要对相应的GPIO口进行初始化,初始化方式和LED灯初始化类似。开启外设时钟,设置端口模式,端口输出类型、输出速度、上下拉、初始输入输出状态。由于USART属于可选功能项,所以两个端口工作模式都为复用功能模式。

GPIO口配置好后,需要选用复用的功能USART1。

从图中可以知道USART1属于寄存器GPIOx_AFRH中的AF7。需要在相应GPIO口写入0111。

接着,设置USART1模式。

根据寄存器说明,配置为过采样16倍、字长8位、不校验,设置一个停止位,设置波特率,使能发送器和接收器。最后使能USART。

波特率指数据信号对载波的调制速率,它用单位时间内载波调制状态改变次数来表示,单位为波特。比特率指单位时间内传输的比特数,单位 bit/s(bps)。对于 USART 波特率与比特率相等。波特率越大,传输速率越快。USART 的发送器和接收器使用相同的波特率。

波特率计算公式

其中,f PLCK 为 USART 时钟,OVER8 为 USART_CR1 寄存器的 OVER8位对应的值,USARTDIV 是一个存放在波特率寄存器(USART_BRR)的一个无符号定点数。其中 DIV_Mantissa[11:0]位定义 USARTDIV 的整数部分,DIV_Fraction[3:0]位定义USARTDIV 的小数部分,DIV_Fraction[3]位只有在 OVER8 位为 0 时有效,否则必须清零。

可通过状态寄存器USART_SR的第七位判断发送数据寄存器是否为空,进行下一步的发送数据。

这个函数虽然可以发送数据,但只能单个发送,如果想发送一个字符串就要多次调用这个函数,所以把这个函数再进行封装。判断要输出的数是否为‘\0’,如果是,则这个数发送结束,不再进行发送数据。这样就可以一次发送一个完整的字符串了。

主函数

usart源文件

usart头文件

最终编译后将程序烧入,STM32发送数据,电脑通过串口助手接收到数据,串口发送数据成功。这样以后就可以很方便的进行调试了。      品略图书馆 http://www.pinlue.com/ http://m.pinlue.com/

 

 

 

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

STM32串口发送数据 的相关文章

  • 如何更改闪存的起始地址?

    我正在使用 STM32F746ZG 和 FreeRTOS Flash的起始地址是0x08000000 但我想把它改成0x08040000 我通过谷歌搜索了这个问题 但没有找到解决方案 我更改了链接器脚本 如下所示 MEMORY RAM xr
  • 初始化 ST-Link 设备时出错 - 无法连接到设备

    我目前正在使用 ST Link 调试器对我的 STM32F3 Discovery 板进行编程 我使用的IDE是Atollic TrueStudio 5 5 2 现在我面临一个非常奇怪的问题 那就是我不断收到消息 初始化 ST Link 设备
  • c项目makefile多重定义错误

    这个问题是一个对应于创建的repexthis问题 在我的嵌入式 C 项目中 我有两个独立的板 我想为每个板创建两个 c 文件 master c 和 Slave c 其中包含自己的特定main 功能 我使用 stm32cumbemx 生成带有
  • 138-基于stm32单片机汽车多功能仪表盘显示系统Proteus仿真+源程序

    资料编号 138 一 功能介绍 1 采用stm32单片机 LCD1602显示屏 独立按键 DHT11传感器 ds1302时钟 LED灯 蜂鸣器 电位器 制作一个基于stm32单片机汽车多功能仪表盘显示系统Proteus仿真 2 通过DHT1
  • 137-基于stm32单片机智能保温杯控制装置Proteus仿真+源程序

    资料编号 137 一 功能介绍 1 采用stm32单片机 LCD1602显示屏 独立按键 DS18B20传感器 电机 制作一个基于stm32单片机智能保温杯控制装置Proteus仿真 2 通过DS18b20传感器检测当前保温杯水的温度 并且
  • HAL库STM32常用外设教程(二)—— GPIO输入\输出

    HAL库STM32常用外设教程 二 GPIO输入 输出 文章目录 HAL库STM32常用外设教程 二 GPIO输入 输出 前言 一 GPIO功能概述 二 GPIO的HAl库驱动 三 GPIO使用示例 1 示例功能 四 代码讲解 五 总结
  • STM32F4 通过软复位跳转到引导加载程序,无需 BOOT0 和 BOOT1 引脚

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

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

    STM32 GPIO介绍 1 STM32引脚说明 GPIO是通用输入 输出端口的简称 是STM32可控制的引脚 GPIO的引脚与外部硬件设备连接 可实现与外部通讯 控制外部硬件或者采集外部硬件数据的功能 以STM32F103ZET6芯片为例
  • SHT10温湿度传感器——STM32驱动

    实验效果 硬件外观 接线 3 3V供电 IIC通讯 代码获取 查看下方 END
  • 解决KEIL编译慢问题

    两种方案 使用v6版本的ARM Compiler 如果v6版本编译不过 必须使用v5版本的 则可以勾选掉Browse Information选项 提升很明显 1分多钟能优化到几秒 看代码量 但是这个有个弊端 在KEIL中会影响函数跳转 建议
  • STM32 暂停调试器时冻结外设

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

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

    特殊寄存器 文章目录 前言 一 背景 二 2 1 2 2 总结 前言 前期疑问 STM32特殊寄存器到底是什么 特殊寄存器怎么查看和调试代码 本文目标 记录和理解特殊寄存器 一 背景 最近在看ucosIII文章是 里面提到特殊寄存器 这就进
  • STM32 Nucleo 上的上升沿中断多次触发

    我正在使用 STM32 NUCLEO F401RE 微控制器板 我有一个扬声器 经过编程 当向上 向下推操纵杆时 可以按设定的量改变频率 我的问题是 有时 通常 当向上 向下推动操纵杆时 频率会增加 减少多次 这意味着 ISR 正在执行多次
  • 通过JTAG恢复STM32 MCU磨掉的标记

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

    我正在研究 STM32 F103x 上的 ADC 编程 并从最简单的情况 单次转换开始 测量内部温度传感器 连接到 ADC1 的值 并使用 USART 将其发送到 COM 端口 目标似乎很明确 但是当我尝试将源代码下载到闪存时 它不会向 C
  • HAL_Delay() 陷入无限循环

    我被 HAL Delay 函数困住了 当我调用此函数 HAL Delay 时 控制陷入无限循环 在寻找问题的过程中 我发现了这个 http www openstm32 org forumthread2145 threadId2146 htt
  • 使用 STM32F0 ADC 单独读取不同的输入

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

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

随机推荐

  • 用户触达方式及用户触达渠道选择

    任何用户运营过程总离不开用户触达渠道的连接 可以说 xff0c 触达渠道的组合选择 xff0c 是与你最终运营效果直接挂钩的 xff0c 用户触达方式的选择直接影响了你运营的结果 如何做精准的用户触达 如何选择不同的用户触达方式 如何最大限
  • 用户行为分析之渠道分析、转化分析、留存分析

    数据分析脱离不了业务 xff0c 不同的业务所关注的数据不同 xff0c 比如互联网 快消等 xff0c 行业不同 xff0c 关注的数据点也不同 在互联网行业普遍产品的数据分析中 xff0c 我认为用户行为分析最重要的三个点是渠道分析 转
  • 通过用户分级实现精细化运营

    10年前 xff0c pc互联网时代 xff0c 当你浏览百度的网页 xff0c 你会普遍看到各种插件推广 弹窗广告等等 xff0c 这些弹窗就好似牛皮癣一样 xff0c 想关掉都不行 用户体验极其不好 xff0c 这是一个 卖方 占绝对优
  • 如何进行流失用户召回?做到这三步!

    如果按照每天渠道投放获客1000名 xff0c 次日留存率40 来算 xff0c 每天会有60 的用户 xff0c 第二天就再也不打开我们的APP xff0c 最终成为了流失用户 平均每日损失几百到数万元不等 虽然相比动辄几百万到几千万的融
  • Spring使用到的设计模式

    Spring涉及到的设计模式 简单工厂模式工厂模式单例模式适配器装饰器模式 Decortor代理模式观察者模式策略模式模板模式 简单工厂模式 一个工厂类根据传入的参数 xff0c 动态决定创建哪一个类 public abstract cla
  • 路由协议的优先级

    对于相同的目的地 xff0c 不同的路由协议 xff08 包括静态路由 xff09 可能会发现不同的路由 xff0c 但这些路由并不都是最优的 事实上 xff0c 在某一时刻 xff0c 到某一目的地的当前路由仅能由唯一的路由协议来决定 为
  • 自己动手写操作系统 将引导程序成功写入优盘启动电脑

    原文 xff1a http freesoftman iteye com blog 629598 输入命令 xff1a nasm boot asm o boot bin 一会儿就生成了一个镜像文件boot bin 该文件就是我所谓的操作系统了
  • 关于C语言等高级语言能不能直接控制硬件的问题

    关于C语言等高级语言能不能直接控制硬件的问题 xff0c 我认为C语言等高级语言不能直接控制硬件 这里谈论的问题本质是 xff0c C语言等高级语言能不能直接对硬件进行编程 我认为 xff0c 不能 众所周知 xff0c 计算机之初的程序员
  • scanf函数输入字符 %c之前要有空格分析

    问题描述如下 xff1a test c int main void int n 61 0 char c while 1 scanf 34 c 34 amp c printf 34 c d n 34 c 43 43 i return 0 这段
  • Linux0.11内核 进程睡眠和唤醒

    当进程等待资源或者事件时 xff0c 就进入睡眠状态 有两种睡眠态 xff0c 不可中断睡眠态 xff08 TASK UNINTERRUPTIBLE xff09 和可中断睡眠态 xff08 TASK INTERRUPTIBLE xff09
  • ubuntu linux 触控板失灵的解决方案

    这几天研究内核的模块机制 xff0c 接触到了一些关于模块的操作命令 xff0c 比如lsmod命令可以列出内核中已经安装的模块 xff0c insmod命令可以安装一个指定的模块 xff0c rmmod可以删除一个指定的模块 也是处于好奇
  • Linux 安装远程桌面并设置添加分辨率

    本来想用本地的kali linux来远程登陆centos的服务器 xff0c 在远程服务器安装VM xff0c 再VM里安装Windows虚拟机 xff0c 用作工作娱乐需要 xff0c 尼玛八颗八核至强CPU xff0c 128G内存 x
  • 将数据库文件导入mysql并输出为txt文件

    大致上MySQL数据库备份可以采用两种方式 xff1a 一种就是直接导出sql语句或者易于导入的其他格式的sql存储文件 xff0c 使用sql语句或者一些可视化客户端导出 xff0c 这种方法非常简单 xff0c 无需赘述 xff1b 另
  • golang gorilla/mux设置静态目录

    发现网上都是类似下面的代码 96 96 96 s 61 34 Users golang golang 34 http Handle 34 static 34 http StripPrefix 34 static 34 http FileSe
  • ios系统removeCachedResponseForRequest无效的替代方案

    相信你能找到我这篇博客 xff0c 肯定是对URLCache缓存有了深刻的理解 xff0c 并且被ios系统api removeCachedResponse ForRequest使用起来并不能删除指定的缓存所困惑 其实也可以自己想办法来模拟
  • DHCPv6报文介绍

    摘自HUAWEI官网 DHCPv6报文格式如图11 2所示 图11 2 DHCPv6的报文格式 表11 1 DHCPv6报文中各个字段的含义 字段 长度 含义 msg type 1字节 表示报文的类型 xff0c 取值为1 xff5e 13
  • vnc服务器的搭建

    vnc服务的概述 xff1a VNC Virtual Network Computing 虚拟网络计算机的缩写 xff0c 主要是完成图形界面的远程控制使用 一个vnc系统是由客户端 服务器端和一个协议组成 服务器是分享其屏幕 xff0c
  • openwrt配置wifi桥接上级AP,再作为ap路由(可实现ip透传,例如远距离图像传输)

    第一步 上级ap配置为 接入点AP xff08 WDS xff09 xff0c 例如无人机的飞机端作为wds ap a xff0c 无线概况里点击修改 b xff0c ESSID改为你想要的名字 xff0c 要选择固定信道 xff08 非常
  • 菜鸟学Linux命令:ssh命令

    转载自品略图书馆 http www pinlue com article 2020 04 1003 1210139769049 html 1 查看SSH客户端版本 有的时候需要确认一下SSH客户端及其相应的版本号 使用ssh V命令可以得到
  • STM32串口发送数据

    串口通信经常作为开发调试的工具 xff0c 所以先介绍下串口通信 串口通讯 Serial Communication 是一种设备间非常常用的串行通讯方式 xff0c 因为它简单便捷 xff0c 大部分电子设备都支持该通讯方式 xff0c 电