STM32——串口通信

STM32——串口通信


宗旨:技术的学习是有限的,分享的精神是无限的。


一、异步串口通信协议

        STM32 的串口非常强大,它不仅支持最基本的通用串口同步、异步通信,还具有 LIN 总线功能(局域互联网)、IRDA 功能(红外通信)、SmartCard 功能。一般我们利用串口打印调试信息。

 

二、串口工作过程分析

        我们只需要大概了解串口发送的过程即可。从下至上,我们看到串口外设主要由三个部分组成,分别是波特率控制、收发控制和数据存储转移。

1、 波特率

        波特率,即每秒传输的二进制位数,用 b/s (bps)表示,通过对时钟的控制可以改变波特率。在配置波特率时,我们向波特比率寄存器 USART_BRR 写入参数,修改了串口时钟 的分 频 值USARTDIV 。USART_BRR 寄存 器 包括 两 部分 , 分别 是 DIV_Mantissa(USARTDIV 的整数部分)和 DIV_Fraction(USARTDIV 的小数)部分,最终,计算公式为 USARTDIV=DIV_Mantissa+(DIV_Fraction/16)。

USARTDIV 是对串口外设的时钟源进行分频的,对于 USART1,由于它挂载在 APB2总线上,所以它的时钟源为 f PCLK2 ;而 USART2、3 挂载在 APB1 上,时钟源则为 fPCLK1,串口的时钟源经过 USARTDIV 分频后分别输出作为发送器时钟及接收器时钟,控制发送和接收的时序。

2、 收发控制

        寄存器 :CR1、CR2、CR3 和 SR,即USART 的三个控制寄存器(Control Register)及一个状态寄存器(Status Register)。通过向寄存器写入各种控制参数来控制发送和接收,如奇偶校验位、停止位等,还包括对USART 中断的控制;串口的状态在任何时候都可以从状态寄存器中查询得到。具体的控制和状态检查,我们都是使用库函数来实现的。

3、 数据存储转移

        收发控制器根据我们的寄存器配置,对数据存储转移部分的移位寄存器进行控制。当我们需要发送数据时,内核或 DMA 外设(一种数据传输方式,在后面介绍)把数据从内存(变量)写入到发送数据寄存器 TDR 后,发送控制器将适时地自动把数据从 TDR 加载到发送移位寄存器,然后通过串口线 Tx,把数据一位一位地发送出去,当数据从 TDR转移到移位寄存器时,会产生发送寄存器 TDR 已空事件 TXE,当数据从移位寄存器全部发送出去时,会产生数据发送完成事件 TC,这些事件可以在状态寄存器中查询到。

而接收数据则是一个逆过程,数据从串口线 Rx 一位一位地输入到接收移位寄存器,然后自动地转移到接收数据寄存器 RDR,最后用内核指令或 DMA

 

三、UART

串口配置流程:

(1)      使能串口1的时钟

(2)      配置串口1的I/O

(3)      配置串口1的工作模式,具体为波特率为 115200 、8 个数据位、1 个停止位、无硬件流控制。即 115200 8-N-1。

void USART1_Config(void)
{GPIO_InitTypeDef GPIO_InitStructure; // 串口IO结构体USART_InitTypeDef USART_InitStructure;/* 配置串口时钟 */RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1 | RCC_APB2Periph_GPIOA, ENABLE);/* TX --PA9 -- 通用推挽式输出 -- 50MHZ */GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOA, &GPIO_InitStructure);/* RX --PA10 -- 输入*/GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;GPIO_Init(GPIOA, &GPIO_InitStructure);/* 串口初始化 -- 115200-8-1 */USART_InitStructure.USART_BaudRate = 115200; // 波特率115200USART_InitStructure.USART_WordLength = USART_WordLength_8b; // 8位数据位USART_InitStructure.USART_StopBits = USART_StopBits_1; // 1位停止位USART_InitStructure.USART_Parity = USART_Parity_No ; // 无奇偶校验位USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowC ontrol_None; // 无硬件流USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; // 配置串口的模式。为了配置双线全双工通信,需要把 Rx 和 Tx 模式都开启。USART_Init(USART1, &USART_InitStructure); // 填充完结构体, 向寄存器写入配置参数USART_Cmd(USART1, ENABLE); // 使能 USART1 外设
}<span style="font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);"> </span>

        要想 printf() 函数工作的话,我们需要把 printf() 重新定向到串口中。为了实现重定向 printf() 函数,我们需要重写 fputc() 这个 C 标准库函数,因为 printf()在C 标准库函数中实质是一个宏,最终是调用了 fputc() 这个函数。

// 重定向到串口
int fputc(int ch, FILE *f)
{/* 发送一个字节数据到 串口 */USART_SendData(USART1, (uint8_t) ch);/* 等待发送完毕 */while (USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET);return (ch);
}

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

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

相关文章

操作系统——经典同步问题

1、概念 1.1 进程同步与互斥 在多道程序环境下&#xff0c;进程是并发执行的&#xff08;并发执行是指两个或多个事件在某段时间间隔内并发&#xff09;&#xff0c;不同进程之间存在着不同的相互制约关系。为了协调进程之间的相互制约关系&#xff0c;引入了进程同步的概念。…

JavaScript权威指南(第5版)pdf

下载地址&#xff1a;网盘下载内容简介编辑第5版针对Ajax和Web 2.0技术进行了全新的改版。和上一版相比&#xff0c;更新的内容较多&#xff0c;总体上接近整个篇幅的1/2&#xff0c;而这也正是本书姗姗来迟的原因之一。具体来说&#xff0c;第5版在以下部分有所更新&#xff1…

操作系统——死锁(银行家算法)

1、概述 1.1 死锁 死锁是多个进程因竞争资源而造成的一种僵局&#xff08;互相等待&#xff09;&#xff0c;若无外力作用&#xff0c;这些进程都将无法向前推进。 1.2 死锁产生的原因和条件 原因&#xff1a;&#xff08;1&#xff09;竞争资源&#xff1b;&#xff08;2&…

STM32——库函数开发小结

STM32——库函数开发小结 宗旨&#xff1a;技术的学习是有限的&#xff0c;分享的精神是无限的。 基本上所有外设都有以下几类寄存器&#xff1a;【CR/DR/SR】 &#xff08;1&#xff09;控制寄存器 xxx_CR(Control/Configuration Register)&#xff1a;这类寄存器是用来配置…

过年不回家,难受不

看电视&#xff0c;特别怕看到离别的情节&#xff0c;最近看「山海情」&#xff0c;也刚好看到。本着剧情不透露原则&#xff0c;我就不说里面的内容了。小时候&#xff0c;经历的都只能算是小别离了。小时候喜欢去外婆家&#xff0c;在外婆家不用干繁重的农活&#xff0c;父母…

lodap问题集锦

1、分页打印时&#xff0c;同一行显示在不同页内 &#xff0c;调整行分页粒度 LODOP.SET_PRINT_STYLEA(0, "TableRowThickNess", 40); 转载于:https://www.cnblogs.com/feihusurfer/p/8482180.html

系统管理员节日 网民的感恩日

11月8日 “记者节"、 9月10日“教师节”、 5月12日“国际护士节”&#xff0c;职业节日的设立会提升公众对该职业的关注程度&#xff0c;该职业的形象也往往因节日而凸显&#xff0c;而作为让这个世界变平的&#xff0c;在幕后默默付出的系统管理者的心声又有谁听到了呢&a…

操作系统——内存管理

1、内存基本概念 1.1 主要功能 内存空间的分配与回收&#xff1b;地址转换内存保护&#xff1a;使用上下限寄存器或者重定位寄存器和界地址寄存器内存扩充&#xff1a;交换和覆盖内容共享 2、内存的分配与回收 2.1 连续分配方式 连续分配方式是指为一个用户程序分配一个连续…

解决一个驱动代码解耦合问题

之前解决的项目LCD设备兼容问题&#xff0c;在 a.c 文件里面定义了一个变量&#xff0c;然后在 b.c 里面使用 extern声明引用这个变量&#xff0c;通过这种方法可以在b.c中使用在a.c 里面初始化的变量。但是这中情况就会引起一个问题&#xff0c;就是驱动代码之间耦合了&#x…

STM32——DMA

STM32——DMA 宗旨&#xff1a;技术的学习是有限的&#xff0c;分享的精神是无限的。 DMA 是为CPU分担数据转移的工作。因为DMA的存在CPU才被解放出来&#xff0c;它可以在 DMA 转移数据的过程中同时进行数据运算、响应中断&#xff0c;大大提高效率。 1、DMA工作分析 数据传…

YOLOv8改进 | 主干篇 | 利用SENetV1改进网络结构 (ILSVRC冠军得主)

一、本文介绍 本文给大家带来的改进机制是SENet&#xff08;Squeeze-and-Excitation Networks&#xff09;其是一种通过调整卷积网络中的通道关系来提升性能的网络结构。SENet并不是一个独立的网络模型&#xff0c;而是一个可以和现有的任何一个模型相结合的模块(可以看作是一…

如何进入保护模式?

IA-32为操作系统及其软件的发展提供了大量的支持&#xff0c;它提供了4种操作模式&#xff1a; 1,Real Mode,汇编书中的实模式&#xff0c;工作方式相当于8086。 2,Protected Mode,保护模式&#xff0c;提供支持多任务环境的工作形式。 3,Virtual 8086 Mode,虚拟8086模式&#…

搭建Servlet在线视频

这个视频flash上传及在线播放&#xff0c;搞了我一天了&#xff0c;总算有点成果&#xff0c;但还有一些疑问没有解决&#xff0c;现在发这篇随笔&#xff0c;为的就是交流视频在线上传和观看的一些问题。 在线编辑器使用FCKEditor&#xff0c;首先是修改FCKEditor的配置文件&a…

操作系统——内存管理例题

1、关于分配策略例题 case1&#xff1a;某系统的空闲分区见下表&#xff0c;如有下列作业&#xff1a;96KB&#xff0c;20KB&#xff0c;200KB&#xff0c;分别采用首次适应算法和最佳适应算法来处理这些作业序列&#xff0c;哪种算法能满足该作业序列请求&#xff1f; 分区号…

STM32中C语言知识点:初学者必看,老鸟复习(长文总结)

说在前面的话一位初学单片机的小伙伴让我推荐C语言书籍&#xff0c;因为C语言基础比较差&#xff0c;想把C语言重新学一遍&#xff0c;再去学单片机&#xff0c;我以前刚学单片机的时候也有这样子的想法。其实C语言是可以边学单片机边学的&#xff0c;学单片机的一些例程中&…

STM32——ADC

STM32——ADC 宗旨&#xff1a;技术的学习是有限的&#xff0c;分享的精神是无限的。 一、ADC指标 有 18 个通道&#xff0c;可测量 16 个外部和 2 个内部信号源。各通道的 A/D 转换可以单次、连续、扫描或间断模式执行 &#xff1b;ADC的结果可以左对齐或右对齐方式存储在 16…

时间复杂度和空间复杂度,一看就懂,面试前必过一遍

一、定义时间和空间是程序的一个硬性指标&#xff0c;一个用来衡量 代码执行的速度 &#xff0c;一个用来衡量 存储空间的大小程序 数据结构 算法时间复杂度&#xff1a;就是执行程序的快慢&#xff0c;速度越快&#xff0c;时间复杂度就越好。空间复杂度&#xff1a;就是执…

Oracle数据库自动存储管理(ASM)

关于ASM的讨论很多&#xff0c;但是到底什么是ASM?ASM是一个有效的抽象层&#xff0c;使你的Oracle数据库可以与叫做diskgroups的抽象空间一起使用&#xff0c;而不是直接使用datafiles。这带来了很多好处&#xff0c;但是也要求学习一些新的概念、命令、使用和管理任务。所以…

数据结构——排序【仅用于考试】

1、简介 排序&#xff0c;是重新排列表中的元素&#xff0c;使表中的元素满足按关键字有序的过程 稳定性&#xff1a;选取两个元素Ri<Rj&#xff0c;经过排序算法之后&#xff0c;仍为Ri<Rj 不稳定的排序&#xff1a;【简单选择排序&#xff0c;快速排序&#xff0c;堆…