通讯接口的两种方式:数组
并行通讯
-传输原理:数据各个位同时传输。
-优势:速度快
-缺点:占用引脚资源多异步
串行通讯
-传输原理:数据按位顺序传输。
-优势:占用引脚资源少
-缺点:速度相对较慢函数
目前使用最多的仍是串行通讯,即使速度相对较慢,因此下面都是讲解串行通讯。ui
①串口通讯分类:3d
串口通讯按照数据传送方向,分为:
code
(1)单工:数据传输只支持数据在一个方向上传输
(2)半双工:容许数据在两个方向上传输,可是,在某一时刻,只容许数据在一个方向上传输,它其实是一种切换方向的单工通讯
(3)全双工:容许数据同时在两个方向上传输,所以,全双工通讯是两个单工通讯方式的结合,它要求发送设备和接收设备都有独立的接收和发送能力blog
②STM32的串行通讯的方式接口
同步通讯:带时钟同步信号传输。
异步通讯:不带时钟同步信号。
事件
注意:通常所说的串口是USART(通用同步异步收发器),同步异步都支持的。STM32F10x系列芯片,包含3个USART和2个UART图片
串口通讯是单片机最基本的功能,不少传感器模块与单片机的链接都会用到串口功能。串口通讯,顾名思义就是将一整条的内容,切成一“串”个体来发送或接收。发送的核心思想是:将字符串中的一个字符写到一个寄存器中(此寄存器只能存一个字符),写入后会自动经过串口发送,发送结束再写入下一个字符。接收时会直接装入单片机缓冲区的一个字符型数组中,由程序依次读这个数组。
上图是串口数据发送接收的过程作一个简单的图示。收发控制器根据寄存器配置,对数据存储转移部分的移位寄存器进行控制。当须要发送数据时,内核或DMA外设把数据从内存(变量)写入到发送数据寄存器TDR后,发送控制器将自动把数据从TDR加载到发送移位寄存器,而后经过串口线TX,把数据一位一位地发送出去,在数据从TDR转移到移位寄存器时,会产生发送寄存器TDR已空事件TXE,当数据从移位寄存器所有发送出去时,会产生数据发送完成事件TC,这些事件能够在状态寄存器中查询到。而接收数据则是一个逆过程,数据从串口线RX一位一位地输入到接收移位寄存器,而后自动地转移到接收数据寄存器RDR,最后用内核指令或DMA读取到内存(变量)中。发送完毕或者接收完毕都会有相应的状态或者事件,咱们写代码时就能够经过这些事件来判断是否接收或者发送完毕,而后作出下一步。
①USART_SR状态寄存器
这个寄存器用到了10个位,也就表明有10中状态标志,每一个标志均可以做为中断的标志位,库函数的定义以下:
#define USART_IT_PE ((uint16_t)0x0028) #define USART_IT_TXE ((uint16_t)0x0727) #define USART_IT_TC ((uint16_t)0x0626) #define USART_IT_RXNE ((uint16_t)0x0525) #define USART_IT_IDLE ((uint16_t)0x0424) #define USART_IT_LBD ((uint16_t)0x0846) #define USART_IT_CTS ((uint16_t)0x096A) #define USART_IT_ORE ((uint16_t)0x0360) #define USART_IT_NE ((uint16_t)0x0260) #define USART_IT_FE ((uint16_t)0x0160)
②USART_DR数据寄存器
发送数据寄存器是TDR,接收数据寄存器是RDR,都只用了前8位,发送和接收用到如下两个函数:
void USART_SendData(USART_TypeDef* USARTx, uint16_t Data); uint16_t USART_ReceiveData(USART_TypeDef* USARTx);
串口时钟使能,GPIO时钟使能:RCC_APB2PeriphClockCmd();
GPIO端口模式设置:GPIO_Init(); 模式设置为GPIO_Mode_AF_PP
串口参数初始化:USART_Init();
开启中断而且初始化NVIC(若是须要开启中断才须要这个步骤)
NVIC_Init();
USART_ITConfig();
使能串口:USART_Cmd();
编写中断处理函数:USARTx_IRQHandler();
串口数据收发:
void USART_SendData();//发送数据到串口,DR
uint16_t USART_ReceiveData();//接受数据,从DR读取接受到的数据
串口传输状态获取:
FlagStatus USART_GetFlagStatus(USART_TypeDef* USARTx, uint16_t USART_FLAG);
void USART_ClearITPendingBit(USART_TypeDef* USARTx, uint16_t USART_IT);
欢迎关注个人公众号:物联网技术猿 我能够帮你免费下载csdn积分资料!!