网站首页 > 技术文章 正文
通用同步异步收发器(USART)提供了一种灵活的方法与使用工业标准NRZ异步串行数据格式的 外部设备之间进行全双工数据交换。USART利用分数波特率发生器提供宽范围的波特率选择。 它支持同步单向通信和半双工单线通信,也支持LIN(局部互联网),智能卡协议和IrDA(红外数据 组织)SIR ENDEC规范,以及调制解调器(CTS/RTS)操作。它还允许多处理器通信。 使用多缓冲器配置的DMA方式,可以实现高速数据通信。
物理层
1.通讯结构
串口通讯的物理层的主要标准是RS-232标准,其规定了信号的用途、通讯接口及信号的电平标准,其通讯结构如下:
在设备内部信号是以TTL电平标准传输的,设备之间是通过RS-232电平标准传输的,而且TTL电平需要经过电平转换芯片才能转化为RS-232电平,RS-232电平转TTL电平也是如此。
2.电平标准
根据使用的电平标准不同,串口通讯可分为 RS-232标准 及TTL标准,具体标准如下:
在电子电路中常使用TTL的电平标准,但其抗干扰能力较弱,为了增加串口的通讯距离及抗干扰能力,使用RS-232电平标准在设备之间传输信息,经常使用MA3232芯片对TTL电平及RS-232电平进行相互转换。
协议层--RS232协议
开始位 +数据位 +奇偶检验位 +停止
位数: 1 5~8 0~1 1~2
电平: 0 0/1 0/1 1
开始位:产生 1 个下降沿,通知接收设备,准备接收数据。
数据位:7/8 位 -- 存储字节为单位/ascii 码 -- 8 位为主
奇偶校验位:奇偶校验 -- 判断数据在发送过程中是否出现错误 -- 一般不使用(现在使用 CRC 校验) ,判断数据位中 1 的个数+奇偶位中 1 的个数。
奇校验:位数必须为奇数
偶校验:位数必须为偶
停止位:1~2 位,高电
波特率的计算公式:
PCLK2 -- APB2 时钟 -- 72MHz
公式中已知量:fck 和波特率
求得USARTDIV = fck/(波特率*16)
例如:假设波特率为 9600
USARTDIV = 468.75
波特率寄存器:
电脑连接串口需要用到usb转串口模块,带闹闹需要安装CH340的驱动
实现串口通信的基本步骤:
1,配置 GPIO 口模式
2,配置 USART1
2.1 打开 USART1 的时钟
2.2 USART1:全双工、RS232 协议+波特率
2.3 使能串口
3,编写数据收发函数
oid Usart_Config(void)
{
//配置端口 PA9 PA10
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
//2.配置端口
GPIO_InitTypeDef GPIO_PortA;//定义结构体变量
GPIO_PortA.GPIO_Speed = GPIO_Speed_50MHz;//速度
GPIO_PortA.GPIO_Mode = GPIO_Mode_IN_FLOATING;//模式
GPIO_PortA.GPIO_Pin = GPIO_Pin_10; //引脚
GPIO_Init(GPIOA,&GPIO_PortA);
GPIO_PortA.GPIO_Mode = GPIO_Mode_AF_PP;//模式
GPIO_PortA.GPIO_Pin = GPIO_Pin_9;//引脚
GPIO_Init(GPIOA,&GPIO_PortA);
//USART配置
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);
USART_InitTypeDef USART_InitStructure;//定义结构体
USART_InitStructure.USART_BaudRate = 115200; //定义波特率
USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
USART_InitStructure.USART_Mode = USART_Mode_Tx | USART_Mode_Rx;
USART_InitStructure.USART_Parity = USART_Parity_No;
USART_InitStructure.USART_StopBits = USART_StopBits_1;
USART_InitStructure.USART_WordLength = USART_WordLength_8b;
USART_Init(USART1, &USART_InitStructure);//初始化
USART_Cmd(USART1, ENABLE);//使能
}
//发送函数
void Usart1_Tx(uint16_t data)
{
//发送数据时,确保前面的数据发送完成
while(USART_GetFlagStatus(USART1, USART_FLAG_TC)==0) {};
USART_SendData(USART1,data);
}
//接受数据
uint16_t Ustart1_Rx(void)
{
uint16_t data;
//接受数据时,确保前面的数据接受完成
while(USART_GetFlagStatus(USART1, USART_FLAG_RXNE)==0) {};
data = USART_ReceiveData(USART1);
return data;
}
int fputc(int c, FILE * str)
{
Usart1_Tx(c);
return c;
}
重写fputc函数可以实现像串口输出数据的功能,同时需要在设置中进行以下配置,然后我们就可以在程序中使用printf函数像串口调试软件输出数据。
- 上一篇: 如何在STM32上配置和使用UART串口通信
- 下一篇: 跟着小白学STM32,啰嗦的串口程序是这样的
猜你喜欢
- 2024-10-12 STM32单片机-多串口printf()问题与ASCII码解析
- 2024-10-12 stm32F0 串口的几个特殊功能 stm32f1串口引脚
- 2024-10-12 STM32串口发送用哪个中断? stm32f4串口发送数据
- 2024-10-12 STM32F103编程学习——USB虚拟串口篇
- 2024-10-12 STM32F4入坑日记——串口发送数据(非中断)
- 2024-10-12 STM32 HAL库串口中断发送过程 stm32f4串口中断
- 2024-10-12 在货物监控设备研发时,STM32串口第一个字节丢失解怎么解决?
- 2024-10-12 STM32单片机采用环形缓冲区实现串口中断数据接收管理
- 2024-10-12 基于STM32的串口与DMA的完美组合(上)
- 2024-10-12 STM32下载程序新思路--使用串口下载STM32程序
你 发表评论:
欢迎- 最近发表
- 标签列表
-
- oraclesql优化 (66)
- 类的加载机制 (75)
- feignclient (62)
- 一致性hash算法 (71)
- dockfile (66)
- 锁机制 (57)
- javaresponse (60)
- 查看hive版本 (59)
- phpworkerman (57)
- spark算子 (58)
- vue双向绑定的原理 (68)
- springbootget请求 (58)
- docker网络三种模式 (67)
- spring控制反转 (71)
- data:image/jpeg (69)
- base64 (69)
- java分页 (64)
- kibanadocker (60)
- qabstracttablemodel (62)
- java生成pdf文件 (69)
- deletelater (62)
- com.aspose.words (58)
- android.mk (62)
- qopengl (73)
- epoch_millis (61)
本文暂时没有评论,来添加一个吧(●'◡'●)