网站首页 > 技术文章 正文
串口是USART(通用同步/异步收发器)的俗称。实际上,串行总线并不只有USART,还包含IIC、SPI、CAN、K线、单总线、USB、485等等总线,只是因为UART用得较多,习惯上叫做“串口”。
首先来看下UART的通信模型,
设备1与设备2进行通信
TXD:发送端,负责发送数据
RXD:接收端,负责接收数据
GND:地线,保证设备1与设备2有相同的参考电压,保证通信的正常进行。
从模型上我们可以看出UART(USART是同步通信,在这个模型的基础上都一条始终控制总线,但不常用)是一个异步、全双工、串行通信。既然是异步的,那么就需要控制设备1与设备2数据收发的速度一致性,也就是两设备要有相同的波特率(bit/s一秒钟能传的),否则通信会出现数据传输错误。
现在我们配置stm32的串口1,实现与PC端上的串口助手实现通信。首先查看串口的引脚、查看芯片手册上各引脚对用的复用功能等。
以下是实现代码,主要是实现Uart1数据的收发。
void USART1_Config(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
USART_InitTypeDef USART_InitStructure;
//配置时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1 | RCC_APB2Periph_GPIOA, ENABLE);
/* USART1 GPIO config */
/* Configure USART1 Tx (PA.09) as alternate function push-pull */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
/* Configure USART1 Rx (PA.10) as input floating */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_Init(GPIOA, &GPIO_InitStructure);
/* USART1 mode config */
USART_InitStructure.USART_BaudRate = 115200;
USART_InitStructure.USART_WordLength = USART_WordLength_8b;
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);
//使能串口中断
USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);
//清空发送完成标志位
USART_ClearFlag(USART1,USART_FLAG_TC);
//使能串口
USART_Cmd(USART1, ENABLE);
}
//定义printf函数接口(printf重定向)
int fputc(int ch, FILE *f)
{
USART_SendData(USART1, (uint8_t) ch);
while (USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET);
return (ch);
}
//定义scanf函数接口(scanf重定向)
int fgetc(FILE *f)
{
while (USART_GetFlagStatus(USART1, USART_FLAG_RXNE) == RESET);
return (int)USART_ReceiveData(USART1);
}
//发送字符
char usart1_putc(char ch)
{
USART_SendData(USART1, (uint8_t) ch);
while (USART_GetFlagStatus(USART1, USART_FLAG_TXE) != SET);
return (ch);
}
//发送字符串
int usart1_putstr(unsigned char* buff,int len)
{
int i = 0;
for(i = 0;i < len;i++)
{
usart1_putc(buff[i]);
}
return len;
}
//接收字符
char usart1_getc(void)
{
char temp = 0;
while(USART_GetFlagStatus(USART1,USART_FLAG_RXNE)!= SET);
temp = USART_ReceiveData(USART1);
return temp;
}
//接收字符串
int usart1_getstr(unsigned char* buff,int len)
{
int i = 0;
for(i = 0;i < len;i++)
{
buff[i] = usart1_getc();
}
return len;
}
配置好之后,将这些函数放到头文件中申明,并放到主函数中去初始化及调用,就可以实现数据的收发功能。
嵌入式物联网需要学的东西真的非常多,千万不要学错了路线和内容,导致工资要不上去!
无偿分享大家一个资料包,差不多150多G。里面学习内容、面经、项目都比较新也比较全!某鱼上买估计至少要好几十。加微信领取资料
猜你喜欢
- 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)
本文暂时没有评论,来添加一个吧(●'◡'●)