| |
|
开发:
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—串口通信 |
目录 一、串口通信协议物理层电平标准:1.RS232标准:RS-232 标准主要规定了信号的用途、通讯接口以及信号的电平标准。 设备A、B两者的电平不同,要把两者的TTL电平都转换为RS-232标准的电平。 1、RS232标准串口主要用于工业设备直接通信 2、电平转换芯片一般有MAX3232, SP3232 2.USB转串口通讯(常用)结构图: 1、USB转串口主要用于设备跟电脑通信 2、电平转换芯片一般有CH340、PL2303,CP2102,FT232 3、使用的时候电脑端需要安装电平转换芯片的驱动 3.原生的串口到串口1、原生的串口通信主要是控制器跟串口的设备或者传感器通信,不需要经过电平转换芯片来转换电平,直接就用TTL电平通信。 2、GPS模块、GSM模块、串口转WIFI模块、HC04蓝牙模块。 二、串口通信协议软件层:? 起始位:由1个逻辑0的数据位表示。 结束位:由0.5、1、1.5或2个逻辑1的数据位表示。 有效数据:在起始位后紧接着的就是有效数据,有效数据的长度常被约定为5、6、7或8位长。 ?校验位:可选,为的是数据的抗干扰性。 校验方法分为:奇校验(odd)、偶校验(even)、0校验(space)、1校验(mark)、无校验(noparity)。 奇校验要求有效数据和校验位中“1”的个数为奇数,比如一个8位长的有效数据为:01101001,此时总共有4个“1”,为达到奇校验效果,校验位为“1”,最后传输的数据将是8位的有效数据加上1位的校验位总共9位。偶校验与奇校验要求刚好相反,要求帧数据和校验位中“1”的个数为偶数,比如数据帧:11001010,此时数据帧“1”的个数为4个,所以偶校验位为“0”。0校验是不管有效数据中的内容是什么,校验位总为“0”,1校验是校验位总为“1”。 通常配置无校验位,数据位8,停止位1. 三、串口功能框图1:引脚 2:数据寄存器 3:控制器 4:波特率 1.引脚功能引脚 TX:发送数据输出引脚。 RX:接收数据输入引脚。 nRTS:请求以发送 (Request To Send),n 表示低电平有效。如果使能 RTS 流控制,当 USART 接 收器准备好接收新数据时就会将 nRTS 变成低电平;当接收寄存器已满时,nRTS 将被设置为高 电平。该引脚只适用于硬件流控制。 nCTS:清除以发送 (Clear To Send),n 表示低电平有效。如果使能 CTS 流控制,发送器在发送下 一帧数据之前会检测 nCTS 引脚,如果为低电平,表示可以发送数据,如果为高电平则在发送完 当前数据帧之后停止发送。该引脚只适用于硬件流控制。 SCLK:发送器时钟输出引脚。这个引脚仅适用于同步模式。 后面3个都不常用 ?? 2.数据寄存器USART_DR9-31位:保留为0,0-8位:包含了发送或接收的数据。由于它是由两个寄存器组成的,一个给发送用(TDR),一个给接收用(RDR),该寄存器兼具读和写的功能。 当使能校验位(USART_CR1中PCE位被置位)进行发送时,写到MSB(最高有效位)的值(根据数据的长度不同,MSB是第7位或者第8位)会被后来的校验位取代。当使能校验位进行接收时,读到的MSB位是接收到的校验位。 3.字符帧组成介绍? 一个字符帧发送需要三个部分:起始位+数据帧+停止位。起始位是一个位周期的低电平,位周期就是每一位占用的时间;数据帧就是我们要发送的8位或9位数据,数据是从最低位开始传输的;停止位是一定时间周期的高电平。 第9位数据是否有效要取决于USART控制寄存器1(USART_CR1) 的M位设置,当M位为0时表示8位数据字长,当M位为1表示9位数据字长,我们一般使用8位数据字长。 停止位时间长短是可以通过USART控制寄存器2(USART_CR2)的 STOP[1:0]位控制,可选0.5个、1个、1.5个和2个停止位。默认使用 1个停止位。2个停止位适用于正常USART模式、单线模式和调制解调器模式。0.5个和1.5个停止位用于智能卡模式。 将USART_CR1寄存器的PCE位置1就可以启动奇偶校验控制,PS位进行校验选择。接收数据时如果出现奇偶校验位验证失败,会见 USART_SR寄存器的PE位置1,并可以产生奇偶校验中断。 4.发送与接收数据发送:将USART_CR1寄存器的UE、TE、RE位都要置1(3个使能)。 USART_SR : TXE位置1,表示要发送的数据已经全部从发送数据寄存器(TDR)转移到了发送移位寄存器。 USART_CR1 : USART_SR的TXE位置1后,CR1的TXEIE位置1,产生USART中断。 USART_SR : TC位置1,表示数据已经通过TX引脚成功发送。 USART_CR1: 当USART_SR中的TC为’1’时,CR1的TCIE位置1,产生USART中断。 接受:USART_SR RXNE位置1,数据已接受完成 USART CR1:RXNEIE 5.串口的通信速率串口通信里面,波特率是等于比特率的。USART_BRR:波特率寄存器 Tx / Rx 波特率 = Fck/16* ( USARTDIV ) 这里的Fck是给外设的时钟(PCLK1用于USART2、3、4、5 36M,PCLK2用于USART1 72M) USARTDIV是一个无符号的定点数。这12位的值设置在USART_BRR寄存器。 四、代码讲解1.USART初始化结构体:波特率:115200/9600 字长:0(8位) 模式选择:接收还是发送 2.同步时钟初始化结构体:同步模式,我们经常用不到。 3.编程时常用到的固件库函数:1-串口初始化函数 Void USART_Init (USART_TypeDef* USARTx, USART_InitTypeDef* USART_InitStruct) 2-中断配置函数 Void USART_ITConfig(USART_TypeDef* USARTx, uint16_t USART_IT,FunctionalState NewState) 3-串口使能函数 void USART_Cmd(USART_TypeDef* USARTx, FunctionalState NewState) 4-数据发送函数 void USART_SendData (USART_TypeDef*USARTx,uint16_t Data) 5-数据接收函数 uint16_t USART_ReceiveData(USART_TypeDef*USARTx) 6-中断状态位获取函数 ???? ITStatus USART GetITStatus (USART_TypeDef*USARTx,uint16_t USART_IT) 五、程序实验【1】单片机给电脑发送数据,电脑上位机把数据打印出来;电脑上位机给单片机发数据,单片机接收到数据之后立马发回给电脑,并打印出来(注意这是两个要求)。 ?编程要点: ??单片机接收数据选择中断接收 1-初始化串口需要用到的GPIO(跟之前讲的一样) 2-初始化串口,配置串口的初始化结构体USART_InitTypeDef 3-中断配置(接收中断,中断优先级) ??接收数据我们采用中断的形式,首先配置串口中断优先级,注意这个函数也要复制到该c文件下;然后使能串口接收中断;
最后别忘了写中断服务函数:接收数据
这样就可以向单片机发送数据并返回到接收区。但是,如果我们发送的数据较多(比如发送“好好学习天天向上”,8个字符就要产生8次中断,这对于单片机CPU负荷很大,所以我们可以先把发送的数据放在一个缓冲区,等电脑端不发送了,全部缓存好了一起给单片机发送过去。这就是“队列机制”,这个应用十分广泛)。 4-使能串口 USART_Cmd()函数 5-编写发送和接收函数(应用官网写好的发送字符、字符串函数,除此之外,还可以用printf函数来发送数据) 对 printf函数发送数据的解释(较为重要): 我们不能直接调用printf函数来对串口进行发送数据,printf 函数里面会调用 fputc 这个函数(这个函数是真正发送数据的函数);而通过串口把数据发送到电脑的上位机是用 USART_SendData这个函数,所以需要在fputc这个函数里面调用USART_SendData这个函数。因此,我们都写了两个函数放在 bsp_uart.c 文件下:重定向c库函数printf到串口,重定向后可使用printf函数(发送数据);重定向c库函数scanf到串口,重写向后可使用scanf、getchar等函数(接收数据)
6-编写中断服务函数 拓展:如果换成串口2的话,软件部分只更改.h文件里的宏定义即可;硬件注意接线连接正确。 【2】电脑给单片机发命令,用于控制开发板上的灯。
getchar 会调用int fgetc(FILE *f)函数,那个函数里面在一直循环判断时候接收完毕,这与中断产生冲突,所以我们取消用中断来接收数据,在while循环里面接收数据。用switch语句来判断接收到的数据,来执行对灯的指令。 |
|
嵌入式 最新文章 |
基于高精度单片机开发红外测温仪方案 |
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 2:15:03- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |
数据统计 |