| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 嵌入式 -> STM32之USART-串口通信(含串口实验详细解析) -> 正文阅读 |
|
[嵌入式]STM32之USART-串口通信(含串口实验详细解析) |
STM32之串口通信 - USART(含串口实验详细解析)
资料参考: 【正点原子】STM32F103开发板资料(A盘);
注意:本文主要介绍 USART 异步串行模式下的收发器。 文章目录STM32F103ZE 简介https://www.keil.com/dd2/stmicroelectronics/stm32f103ze/ 内核:ARM Cortex-M3,72MHz 内存:64kB RAM,512kB ROM 时钟和电源:2.00V—3.60V,72 MHz 通信 :SPI、I2C、UART、I2S、CAN、USART、USB、Device 定时器/计数器/PWM :8 × 16 位定时器 模拟:2通道 12位DAC,21通道 12位ADC I/O 和封装: -40℃—85℃,144-QFP,144-BGA USART简介1. 串口通信串口通信是指外设和计算机间,通过数据信号线 、地线、控制线等,按位进行传输数据的一种通讯方式,如SPI通信、USART通信、EEPROM通信等。简单讲,串口通信实现了上位机(PC)与下位机(如STM32)之间的信息交互。 上位机(PC)通过串口调试助手等实现数据的接收和发送; 下位机(STM32)通过printf()、getchar()等函数实现字符或字符串的接收和发送。 2. 串口通信的分类:处理器与外部设备通信有两种方式: 2.1 串行通信:数据按位顺序依次传输,如8个数据位依次传输,速度快,但占用引脚资源多 ? 按照数据传送方向,又分为:
2.2 并行通信:数据各个位同时传输,如8个数据位同时传输,占用引脚资源少,但速度慢。 3. 串行通信串行通信按通信的方式可分为:
4.STM32的串口通信接口
STM32F103系列提供5路串口,包含3个 USART 和2个 UART 。 串口的引脚如下图所示: 数据传输的格式/通信协议 串行通信一定要有适合的通信协议。 通信协议指通信双方之间为完成信息交互所必须遵守的一种规则和约定。比如两个人约定在何时交流、用中文还是英文交流、交流什么内容。 1.起始位 ? 当未有数据发送时,数据线处于逻辑“1”状态;先发出一个逻辑“0”信号,表示开始传输字符。 2.数据位 ? 紧随起始位之后,数据位表示真正要发送或接收的信息,位数一般有8位或9位 3.奇偶校验位 ? 数据位末尾可以选择是否添加奇偶校验位,用于检测数据传输是否正确 4.停止位 ? 代表信息传输结束的标志位,可以是1位,1.5位或2位。停止位的位数越多,数据传输的速率也越慢。 5.波特率设置 波特率表示每秒钟传输码元的个数,是衡量数据传输速率的指标,单位Baud。另外有个名词叫比特率,比特率表示每秒钟传输二进制位bit的个数,单位 bit/s。 ? 比特(bit)就是指一位信息,当用二进制表示数据时,0是一位,1也是一位信息,它是固定不变的,一个比特就代表二进制下的一位。 ? 通常描述码元,我们会说M进制的码元。比如八进制,我们知道八进制包含0~7共八种数据,而计算机是只识别0,1两种的,我们若是想将这八种数据发送给计算机,可以用3个比特为一组的形式来表示,即000,001,…,111共八组,因而一个八进制的码元就表示携带了3个比特,这时的比特率也就是波特率的3倍。那么,一个M进制的码元,就携带log2 M个比特。 如果还不明白可以看一下这篇文章:波特、码元与比特的关系 6.波特率的计算 波特率是由USART_BRR波特率寄存器控制的,TR/Tx的波特率 = 串口时钟 / BRR的值。 一般我们先确定波特率,通过计算得到BRR的值,并将其赋给USART_BRR寄存器。如串口时钟72M,选用波特率115200,BRR的值为72M÷115200=625(16进制0x0271),BRR寄存器的值就为0x0271。 USART的使用步骤串口设置的一般步骤可以总结为如下几个步骤: 1)串口时钟使能 GPIO 时钟使能 2)串口复位 3)GPIO 端口模式设置 4)串口参数初始化 5)开启中断 并且初始化 NVIC(如果需要开启中断才需要这个步骤) 6)使能串口 7)编写中断处理函数 以正点原子的实例-串口实验对串口时钟的使用步骤进行详细分析。 程序功能是STM32通过 串口1 和上位机(PC)对话,STM32收到上位机发送的数据(字符串)后,将数据原原本本的返回给上位机。采用USART1的全双工异步串行收发模式。 在例程的usart.c中,引入了一段使程序支持printf函数的代码,直接复制使用即可。
1)串口时钟使能 GPIO 时钟使能GPIO口引脚复用,需要开启复用时钟;使用串口外设也要开启时钟 串口挂载、复用时钟在APB2下面的外设
2)串口复位库函数中,串口的复位通过USART_DeInit()实现,选择待复位的串口USART1 进行设置即可。
3)GPIO 端口模式设置PA9是发送引脚,需要发送数字量上表示为0,1的高低电平,若使用开漏输出要建立外部电路,接上拉电阻。故采用推挽输出模式,直接输出0V、3.3V的电压。 PA10是接收引脚,需要接收高低电平,设置上拉会将引脚电平限制在高电平,下拉会限制在低电平,模拟输入则将信号传输到其他外设,只有浮空输入能实现高低电平的接收。 同时,STM32复用功能对端口的配置也有以下三条标准(详见参考手册P107 8.1.4 复用功能(AF)):
4)串口参数初始化库函数中,使用USART_Init()对串口进行初始化 void USART_Init(USART_TypeDef* USARTx, USART_I nitTypeDef* USART_InitStruct) 第一个参数:待初始化的串口标号 第二个参数:配置串口参数的结构体指针
以上是异步模式的配置参数,同步模式还需要配置7~10。
详见固件库使用手册P346 Table707 对串口1 初始化范例:
5)开启中断 并且初始化 NVIC如果要使用中断服务,便要对中断优先级进行配置,如果只有一个中断服务,随意配置顺序即可。
6)使能串口在移植代码或自己编写的过程中,都不能忘记开启串口功能
7)编写中断处理函数其中,SYSTEM_SUPPORT_OS 的作用是实现STM32和操作系统共用STM32内部SysTick定时器,使二者拥有相同的时钟周期。 中断服务过程:
当 USART_GetITStatus读取到起始位时触发更新请求,代表数据开始接收。用USART_ReceiveData()读取当前接收的数据,如果不是0x0d,则将数据保存到BUF中,如果连续接收到了0x0d(回车),0x0a(换行)表示数据接收结束,STA的第15位置1,在主程序main()中执行相关操作并等待开启下一次的数据接收(当STA=0时表示数据可以被接收存储),详细流程图如下。 扩展:回车、换行的区别 回车 \r 本义是光标重新回到本行开头, 换行 \n 本义是光标往下一行(不一定到下一行行首)
注释:创作时处于学习初期,对程序只有能用就行的要求,若理解有误或不全面之处后续仍会改进… |
|
嵌入式 最新文章 |
基于高精度单片机开发红外测温仪方案 |
89C51单片机与DAC0832 |
基于51单片机宠物自动投料喂食器控制系统仿 |
《痞子衡嵌入式半月刊》 第 68 期 |
多思计组实验实验七 简单模型机实验 |
CSC7720 |
启明智显分享| ESP32学习笔记参考--PWM(脉冲 |
STM32初探 |
STM32 总结 |
【STM32】CubeMX例程四---定时器中断(附工 |
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年12日历 | -2024/12/28 17:51:29- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |
数据统计 |