stm32基础001(串口)

文章目录

      • 通信的基本概念
        • 串行通信和并行通信
        • 单工,半双工和全双工
          • 串口的硬件连接
      • stm32的串口
        • 原理图
        • CPU的芯片手册
        • stm32串口的库函数实现
        • 通过串口实现printf函数
        • 使用中断实现串口的接收

通信的基本概念

串行通信和并行通信

在这里插入图片描述
串行通信一个方向只有一个数据通道,一次传输一位数据,适用于传输距离较长,速度要求不是很高场合。

并行通信一个方向有多个数据通道,一次传输多位数据,适用于传输距离较短,速度要求很高的场合。

单工,半双工和全双工

在这里插入图片描述
单工:数据只能沿着一个方向传输

半双工:数据可以双向传输,但是不能影响同时进行

全双工:数据可以同时双向传输

通信速率:单位时间内传输的比特数,叫做波特率(bps)

通信协议(串口)

通信协议就是通信方事先约定好的数据格式
在这里插入图片描述

串口的硬件连接

在这里插入图片描述
UART—————通用异步收发器

USART————–通用同步/异步收发器

stm32的串口

原理图

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
USB调试串口最终连接到了CPU的PA9,PA10,这两个引脚有串口的复用功能。

CPU的芯片手册

在这里插入图片描述

stm32串口的库函数实现

在项目中添加库函数源码
在这里插入图片描述

  • 开启GPIO和USART1时钟
  • 将PA9、PA10配置成串口复用
GPPIO_PinAFConfig(...);
  • 初始化串口
void USART_Init(USART_TypeDef* USARTx, USART_InitTypeDef* USART_InitStruct);
参数:
USARTx - 哪个串口USART_InitStruct - 串口初始化结构
typedef struct{uint32_t USART_BaudRate;     //波特率     uint16_t USART_WordLength;   //数据位长度    uint16_t USART_StopBits;     //停止位长度  uint16_t USART_Parity;      //校验方式uint16_t USART_Mode;         //发送/接收模式  uint16_t USART_HardwareFlowControl;  //硬件流控制} USART_InitTypeDef;
  • 使能串口
USART_Cmd(....);
  • 串口数据的发送和接收

发送(轮询)

void USART_SendData(USART_TypeDef* USARTx, uint16_t Data)
//传入哪个串口发什么数据
FlagStatus USART_GetFlagStatus(USART_TypeDef* USARTx, uint16_t USART_FLAG)
参数:USARTx - 哪个串口USART_FLAG - 哪个标志 发送完成标志 - USART_FLAG_TXE
返回SET表示有该标志    
通过串口实现printf函数

stm32的项目中可以直接使用C标准库函数,其中printf函数没有完全实现。预留了一个后门fputc,可以通过fputc往串口打印来实现printf函数。

fputc函数格式:

int fputc(int ch,FILE* f)
{while(USART_GetFlagStatus(USART1,USART_FLAG_TXE)!= SET);USART_SendData(USART1,ch);return ch;
}

注意:

  • stm32芯片上运行程序,如果主机运行了调试器,程序就会使用主机的输入输出设备,这种模式叫半主机模式,printf如果通过串口打印,必须关闭半主机模式

  • #pragma import(__use_no_semihosting)

    
    //重定义
    int fputc(int ch,FILE* f)
    {while(USART_GetFlagStatus(USART1,USART_FLAG_TXE)!= SET);USART_SendData(USART1,ch);return ch;
    }
    
使用中断实现串口的接收

由于串口合适发数据由自己决定,不存在无效等待的问题,无需使用中断,但是串口何时接收数据不由自己决定,如果还使用轮询会存在大量无效等待,此时要是使用中断提高效率。

串口中断和定时器中断类似,需要配置中断源开关和NVIC

NVIC_Init(...);
USART_ITConfig(USART1,USART_IT_RXNE,ENABLE);

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/79060.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【验证技能】文档要求和好文档注意点

项目文档 产品场景分析; 产品规格需求:OR; 项目设计需求:DR; 业务文档:学发材料; 计划 项目执行计划,设计计划,验证计划,一~四级计划; 一级计…

使用 CarrierWave 通过 AWS S3上传文件到阿里云 OSS

虽然阿里云 OSS 与 AWS S3 兼容,但需要使用阿里云的特定端点进行配置。CarrierWave 是一个流行的 Ruby 文件上传库,可以方便地与 AWS S3 集成。以下是配置和使用方法: 1. 安装必要的 gem 首先,在 Gemfile 中添加以下 gem&#x…

上位机知识篇---流水线执行

文章目录 前言前言 本文简单介绍了流水线. 基本概念 流水线(Pipeline) 是一种通过将任务分解为多个子任务(阶段),并让不同子任务并行执行以提高效率的技术。其灵感来源于工业流水线,每个阶段专注于特定操作,多任务在不同阶段重叠执行,从而提升整体吞吐率(Throughput)…

第三部分:赋予网页灵魂 —— JavaScript(下)

目录 7 DOM 操作:控制网页的"智能面板7.1 小例子:点击按钮时改变段落文字,根据用户输入改变图片7.2 练习:实现一个简单的 Tab 切换效果 8 事件处理:响应用户的"指令"8.1 小例子:实现点击按钮…

芯片软错误概率探究:基于汽车芯片安全设计视角

摘要: 本文深入剖析了芯片软错误概率问题,结合 AEC-Q100 与 IEC61508 标准,以 130 纳米工艺 1Mbit RAM 芯片为例阐述其软错误概率,探讨汽车芯片安全等级划分及软错误对汽车关键系统的影响,分析先进工艺下软错误变化趋势…

嵌入式AI还是一片蓝海

发现其实还是挺多人关注嵌入式和人工智能交叉领域的,随便一个问题,浏览量就27万了,但是这方面的内容确实少得可怜……所以干脆我自己来补点干货。 推荐一本最近很热门的新书——《边缘人工智能:用嵌入式机器学习解决现实问题》。 …

Linux 怎么安装 Oracle Java 8

在 Linux 系统上安装 Oracle Java 8 的步骤如下: 1. 下载 Oracle Java 8 访问 Oracle 官方网站的 Java 下载页面: 下载链接:Oracle Java 8 下载页面选择适合 Linux x64 的安装包(通常是 .tar.gz 格式)。需要登录 Or…

nginx配置集群服务器中的tcp负载均衡器

文章目录 前言1. Ubuntu下nginx安装2. nginx的tcp负载配置 前言 假设一台机器支持两万的并发量,现在我们需要保证八万的并发量。首先想到的是升级服务器的配置,比如提高 CPU 执行频率,加大内存等提高机器的物理性能来解决此问题。但是单台机…

【音视频】RTMP流媒体服务器搭建、推流拉流

服务器:SRS(Simple RTMP Server,⽀持RTMP、HTTP-FLV,HLS) 推流端:ffmpeg OBS 拉流端:ffplay VLC srs播放器 1 安装和测试srs流媒体服务器 1.1 安装srs流媒体服务器 srs官⽹:https://github.com/ossrs/…

数据治理与数据管理:定义之辩和责任外包的边界

数据治理与数据管理:定义之辩和责任外包的边界 最近,在数据领域的技术交流中,一位朋友探讨了两个很有意思的问题。这两个问题非常典型,也反映了大家在实际工作和学习中常会遇到的困惑:一是关于“数据管理”和“数据治…

Linux 命令如何同时支持文件参数与管道输入?

文章目录 Linux 命令如何同时支持文件参数与管道输入?命令输入方式与管道机制概述常见输入控制方式常见使用示例程序实现思路:统一处理输入的方式判定输入来源的基本模式为何命令应支持参数与标准输入? GNU Coreutils wc 源码解析&#xff1a…

flutter开发音乐APP(简单的音乐播放demo)

效果如下: 音乐播放界面 锁屏音乐播放展示 主要使用的插件如下 just_audio : 是一个功能丰富的音频播放器,适用于Android、iOS、macOS、Web、Linux和Windows平台。它提供了多种功能,包括从URL、文件、资产或字节流读取音频,支持D…

css中盒模型有哪些

标准盒模型(w3c盒模型) 在标准盒模型中,元素的width和height只包括内容区域,不包括内边距、边框、外边距。也就是元素的实际宽高是内容区域加上内边距、边框、外边距。 例如:一个元素的宽度设置为100px,内…

第3篇:请求参数处理与数据校验

在 Web 开发中,请求参数处理与数据校验是保障系统稳定性的第一道防线。本文将深入探讨 Egg.js 框架中参数处理的完整解决方案,涵盖常规参数获取、高效校验方案、文件流处理等核心功能,并分享企业级项目中的最佳实践。 一、多场景参数获取策略…

2025年-redis(p1-p10)

1.redis介绍 (1)基础:常见的数据结构及命令、jedis的应用和优化、springDataRedis的应用和优化 (2)企业实战的应用场景:共享session、缓存解决问题、秒杀中的redis应用、社交app中的redis应用、redis特殊结…

【AI模型学习】GPT——从v1到v3

文章目录 GPT-1GPT vs BERTGPT-2GPT-3Ai代码 GPT-1 GPT-1(Generative Pretrained Transformer 1)是 OpenAI 在2018年发布的第一个大规模预训练生成模型。它开创了基于 Transformer 的 预训练-微调 (pretraining-finetuning) 框架,在自然语言…

数字智慧方案6178丨智慧医院医疗信息化建设之以评促建(61页PPT)(文末有下载方式)

资料解读:智慧医院医疗信息化建设之以评促建 详细资料请看本解读文章的最后内容。 在当今数字化时代,医疗行业正经历着深刻变革,智慧医院的建设成为提升医疗服务质量、优化医疗资源配置的关键所在。这份智慧医院医疗信息化建设之以评促建的资…

浅谈C# record关键字

环境:.net8控制台 init关键字 通常我们会有一个常见的需求就是需要实现一个实例化后不可变的类型. 我通常会如下实现,将类的属性的set设为私有,这样只能使用构造函数来实例一个不可变对象. 但是如果内部再声明一个public的方法还是有可能会将我这个对象改变. internal class…

实时数仓dim层设计的一些疑惑点

0.dim层组件的选择 dim层存储要求:需要满足永久存储(需要长期保存历史数据)和支持根据主键查询单条数据明细,所以排除Kafka(时效短); 候选框架:MySQL、Redis、Hive、Doris、HBase …

模型之FIM(Fill-In-the-Middle)补全

文章目录 模型之FIM(Fill-In-the-Middle)补全什么是FIM(Fill-In-the-Middle)FIM 的工作原理FIM 示例:代码补全场景常见模型fim 测试deepseek fim阿里completions 接口要判断模型是否支持特定的特殊标记**1. 模型可以自动推断生成区域****2. `suffix` 是可选的****3. 模型的…