当前位置:网站首页>【STM32】入门(五):串口TTL、RS232、RS485
【STM32】入门(五):串口TTL、RS232、RS485
2022-08-04 18:03:00 【郭老二】
1、简述
1.1 电平
TTL :全双工 ,逻辑0对应0V,逻辑1对应3.3V或者5V,一般从单片机引脚直接引出,电平3.3或5V是与IO电平兼容;
RS232:全双工,逻辑0对应+3V至+15V,逻辑1对应-15V至-3V ,TTL经过电平转换芯片后可以输出RS232。
RS485:半双工,逻辑0对应-6V至-2V,逻辑1对应+2V至+6V,这里的电平指AB两线间的电压差,即差分方式传输,因此可以长距离传输
1.2 连接方式
除了电压不同,连接方式有所区别:
TTL、RS232只能一对一连接;
RS-485在总线上是允许连接多达128个收发器。
RS232常用DB9头的定义:
1.3 传输协议
一帧数据包由起始位、有效数据、校验位以及停止位组成。
协议参数有:波特率(9600、115200等)、有效数据长度(5~8)、校验(奇、偶、0、1、无)
2、手册
2.1 功能框图
2.2 中断控制
2.3 模式配置
2.4 寄存器映射
3、代码
3.1 初始化
- 使能GPIO时钟:RCC_AHB1PeriphClockCmd
- 使能UART时钟:RCC_APB2PeriphClockCmd
- GPIO引脚复用为UART:GPIO_PinAFConfig
- GPIO配置:GPIO_InitStructure、GPIO_Init
- UART配置:USART_InitStructure、USART_Init
- 中断配置;NVIC_InitStructure、NVIC_Init
void uart1_init(u32 bound)
{
GPIO_InitTypeDef GPIO_InitStructure;
USART_InitTypeDef USART_InitStructure;
NVIC_InitTypeDef NVIC_InitStructure;
#a)使能时钟
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA,ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);
#b)引脚复用映射
GPIO_PinAFConfig(GPIOA,GPIO_PinSource9,GPIO_AF_USART1);
GPIO_PinAFConfig(GPIOA,GPIO_PinSource10,GPIO_AF_USART1);
#c)GPIO配置
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9 | GPIO_Pin_10; //GPIOA9与GPIOA10
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; //复用功能
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //速度50MHz
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; //推挽复用输出
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; //上拉
GPIO_Init(GPIOA,&GPIO_InitStructure); //初始化PA9,PA10
#d)UART配置
USART_InitStructure.USART_BaudRate = bound; //波特率设置
USART_InitStructure.USART_WordLength = USART_WordLength_8b; //字长为8位数据格式
USART_InitStructure.USART_StopBits = USART_StopBits_1; //一个停止位
USART_InitStructure.USART_Parity = USART_Parity_No; //无奇偶校验位
USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;//无硬件数据流控制
USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; //收发模式
USART_Init(USART1, &USART_InitStructure); //初始化串口1
USART_Cmd(USART1, ENABLE); //使能串口1
USART_ClearFlag(USART1, USART_FLAG_TC);
USART_ITConfig(USART1, USART_IT_RXNE, ENABLE); //开启相关中断
#e)中断配置
NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn; //串口1中断通道
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=3; //抢占优先级3
NVIC_InitStructure.NVIC_IRQChannelSubPriority =3; //子优先级3
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道使能
NVIC_Init(&NVIC_InitStructure);
}
3.2 发送
发送一个字符:版本1
void uart1SendChar(u8 ch)
{
while((USART1->SR&0x40)==0);
USART1->DR = (u8) ch;
}
发送一个字符:版本2
void uart1SendChar(uint8_t ch)
{
#a) 等待发送数据寄存器为空
while (USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET);
USART_SendData(USART1,ch);
}
发送数组
void Usart1SendArray(uint8_t *array, uint16_t num)
{
uint16_t i;
#a)循环发送每个字符
for(i=0; i<num; i++)
{
uart1SendChar(array[i]);
}
#b)等待发送完成
while (USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET);
}
USART_FLAG_TXE和USART_FLAG_TC的详细说明
USART_FLAG_TXE:发送缓冲区空标志,说明可以往数据寄存器写入数据了,但并不代码数据发送完成了。
USART_FLAG_TC:发送完成标志,这个才是代表USART在缓冲区的数据发送完成了,即从机接收到了数据。
这两个标志的区别在于,它们分别表示数据在发送过程中,在两个不同的阶段中的完成情况。
TXE 表示数据被从发送缓冲区中取走,转移到的移位寄存器中,此时发送缓冲是空的,可以向其中补充新的数据了。
TC 表示最后放入发送缓冲区的数据已经完成了从移位寄存器向发送信号线 Tx 上的转移。
所以,判定数据最终发送完成的标志是 TC,而不是 TXE.
3.3 接收
查询中断向量表,在代码文件startup_stm32f10x_hd.s中:
串口1USART1对应到中断函数为USART1_IRQHandler
对应上面的中断控制配置:NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;
__Vectors DCD __initial_sp ; Top of Stack
...
DCD USART1_IRQHandler ; USART1
...
重载中断函数 USART1_IRQHandler,实现一个回显功能,即接收啥,发送啥
void USART1_IRQHandler(void)
{
uint8_t ucTemp;
if(USART_GetITStatus(USART1, USART_IT_RXNE)!=RESET)
{
ucTemp = USART_ReceiveData(USART1);
USART_SendData(USART1, ucTemp);
}
}
边栏推荐
- Hezhou Cat1 4G module Air724UG is configured with RNDIS network card or PPP dial-up, and the development board is connected to the Internet through the RNDIS network card (taking the RV1126/1109 devel
- 动态数组底层是如何实现的
- PT100铂热电阻三种测温方法介绍
- EasyCVR调用云端录像API接口返回错误且无录像文件生成,是什么原因?
- 悦刻难回巅峰
- buuctf(探险1)
- 离线同步odps到mysql 中文乱码是因为?mysql已是utf8mb4
- OpenInfra Days China 2022 | SelectDB to share with you the Apache Doris in Internet advertising business practices
- "No title"
- CAS:385437-57-0,DSPE-PEG-Biotin,生物活性分子磷脂-聚乙二醇-生物素
猜你喜欢
开发那些事儿:如何通过EasyCVR平台获取监控现场的人流量统计数据?
Babbitt | Metaverse daily must-read: Weibo animation will recruit all kinds of virtual idols around the world and provide support for them...
A group of friends asked for help, but the needs that were not solved in a week were solved in 3 minutes?
How does EasyCVR call the double-speed playback of device recording through the interface?
阿里云国际版使用ROS搭建WordPress教程
buuctf(探险1)
Short-term reliability and economic evaluation of resilient microgrids under incentive-based demand response programs (Matlab code implementation)
Matlab drawing 1
八猴渲染器是什么?它能干什么?八猴软件的界面讲解
EasyCVR本地接入国标设备映射公网后,本地设备出现无法播放与级联的解决方法
随机推荐
2022年7月31日 暑假第三周总结
DHCP&OSPF combined experimental demonstration (Huawei routing and switching equipment configuration)
企业调查相关性分析案例
linux下Mysql的简单操作
Short-term reliability and economic evaluation of resilient microgrids under incentive-based demand response programs (Matlab code implementation)
怎么面试程序员的?傲慢与无礼,就数他牛逼
Babbitt | Metaverse daily must-read: Weibo animation will recruit all kinds of virtual idols around the world and provide support for them...
斯坦福:未来的RGB LED可以贴在你的皮肤上
DMPE-PEG-Mal,二肉豆蔻酰磷脂酰乙醇胺-聚乙二醇-马来酰亚胺简述
网页端IM即时通讯开发:短轮询、长轮询、SSE、WebSocket
Cholesterol-PEG-DBCO,CLS-PEG-DBCO,胆固醇-聚乙二醇-二苯基环辛炔科研试剂
Investigation and Research Based on the Involution Behavior of College Students
数据库SqlServer迁移PostgreSql实践
关于ETL的两种架构(ETL架构和ELT架构)
容器化 | 在 NFS 备份恢复 RadonDB MySQL 集群数据
Google Earth Engine APP——一键在线查看全球1984-至今年的影像同时加载一个影像分析
golang安装和基础配置
谁能解答?从mysql的binlog读取数据到kafka,但是数据类型有Insert,updata,
基于层次分析法的“内卷”指数分析
通俗易懂-二维数组只能省略行不能省略列-人话版本