13_USART串口协议
2025-09-03 来源:cnblogs
通信接口

串口通信

硬件电路

电平标准

串口参数及时序

串口时序

USART简介

USART框图

USART基本结构

数据帧


起始位侦测

数据采样

波特率发生器


数据模式



串口发送
接线图

引脚定义

代码
Serial.c
#include 'stm32f10x.h' // Device header
#include #include void Serial_Init(void) { //开启USART1时钟 RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE); //开启GPIOA时钟 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE); //初始化GPIO引脚 GPIO_InitTypeDef GPIO_InitStruct; GPIO_InitStruct.GPIO_Mode=GPIO_Mode_AF_PP; //复用推挽输出 GPIO_InitStruct.GPIO_Pin=GPIO_Pin_9; GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz; GPIO_Init(GPIOA,&GPIO_InitStruct); //初始化USART USART_InitTypeDef USART_InitStruct; USART_InitStruct.USART_BaudRate=9600; //波特率 USART_InitStruct.USART_HardwareFlowControl=USART_HardwareFlowControl_None; //硬件流控制 USART_InitStruct.USART_Mode=USART_Mode_Tx; //发送模式 USART_InitStruct.USART_Parity=USART_Parity_No; //校验位 USART_InitStruct.USART_StopBits=USART_StopBits_1; //停止位 USART_InitStruct.USART_WordLength=USART_WordLength_8b; //字长 USART_Init(USART1,&USART_InitStruct); USART_Cmd(USART1,ENABLE); } void Serial_SendByte(uint8_t Byte) { USART_SendData(USART1,Byte); while(USART_GetFlagStatus(USART1,USART_FLAG_TXE)==RESET); } void Serial_SendArray(uint8_t *Array,uint16_t Length) { uint16_t i; for(i=0;i Serial_SendByte(Array[i]); } } void Serial_SendString(char *String) { uint16_t i; for(i=0;String[i];i++) { Serial_SendByte(String[i]); } } int fputc(int ch, FILE *f) { Serial_SendByte(ch); return ch; } void Serial_Printf(char *format, ...) { char String[100]; va_list arg; va_start(arg,format); vsprintf(String,format,arg); va_end(arg); Serial_SendString(String); } Serial.h #ifndef __SERIAL_H__ #define __SERIAL_H__ #include void Serial_Init(void); void Serial_SendByte(uint8_t Byte); void Serial_SendArray(uint8_t *Array,uint16_t Length); void Serial_SendString(char *String); void Serial_Printf(char *format, ...); #endif main.c #include 'stm32f10x.h' // Device header #include 'Delay.h' #include 'OLED.h' #include 'Serial.h' int main(void) { OLED_Init(); Serial_Init(); Serial_SendByte(0x41); uint8_t MyArray[]={0x41,0x42,0x43,0x44}; Serial_SendArray(MyArray,sizeof(MyArray)); Serial_SendString('sadhnfoasdkrnksadfjrnsdlhfjrndfgdsfgdfg'); printf('Num=%drn',666); char String[100]; sprintf(String, 'Num=%drn', 666); Serial_SendString(String); Serial_Printf('Num=%drn', 555); Serial_Printf('你好世界'); while(1) { } } 串口发送+接收 代码 Serial.c #include 'stm32f10x.h' // Device header #include #include uint8_t Serial_RxData; uint8_t Serial_RxFlag; void Serial_Init(void) { //开启USART1时钟 RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE); //开启GPIOA时钟 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE); //初始化GPIO引脚 GPIO_InitTypeDef GPIO_InitStruct; GPIO_InitStruct.GPIO_Mode=GPIO_Mode_AF_PP; //复用推挽输出 GPIO_InitStruct.GPIO_Pin=GPIO_Pin_9; GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz; GPIO_Init(GPIOA,&GPIO_InitStruct); GPIO_InitStruct.GPIO_Mode=GPIO_Mode_IPU; //上拉输入模式 GPIO_InitStruct.GPIO_Pin=GPIO_Pin_10; GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz; GPIO_Init(GPIOA,&GPIO_InitStruct); //初始化USART USART_InitTypeDef USART_InitStruct; USART_InitStruct.USART_BaudRate=9600; //波特率 USART_InitStruct.USART_HardwareFlowControl=USART_HardwareFlowControl_None; //硬件流控制 USART_InitStruct.USART_Mode=USART_Mode_Tx | USART_Mode_Rx; //发送模式 USART_InitStruct.USART_Parity=USART_Parity_No; //校验位 USART_InitStruct.USART_StopBits=USART_StopBits_1; //停止位 USART_InitStruct.USART_WordLength=USART_WordLength_8b; //字长 USART_Init(USART1,&USART_InitStruct); //中断配置 USART_ITConfig(USART1,USART_IT_RXNE,ENABLE); //配置NVIC NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); NVIC_InitTypeDef NVIC_InitStruct; NVIC_InitStruct.NVIC_IRQChannel=USART1_IRQn; NVIC_InitStruct.NVIC_IRQChannelCmd=ENABLE; NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority=1; NVIC_InitStruct.NVIC_IRQChannelSubPriority=1; NVIC_Init(&NVIC_InitStruct); USART_Cmd(USART1,ENABLE); } uint8_t Serial_GetRxFlag(void) { if(Serial_RxFlag) { Serial_RxFlag=0; return 1; } else { return 0; } } uint8_t Serial_GetRxData(void) { return Serial_RxData; } //中断函数 void USART1_IRQHandler(void) { if(USART_GetFlagStatus(USART1,USART_FLAG_RXNE)==SET) { Serial_RxData=USART_ReceiveData(USART1); Serial_RxFlag=1; USART_ClearITPendingBit(USART1,USART_FLAG_RXNE); } } void Serial_SendByte(uint8_t Byte) { USART_SendData(USART1,Byte); while(USART_GetFlagStatus(USART1,USART_FLAG_TXE)==RESET); } void Serial_SendArray(uint8_t *Array,uint16_t Length) { uint16_t i; for(i=0;i Serial_SendByte(Array[i]); } } void Serial_SendString(char *String) { uint16_t i; for(i=0;String[i];i++) { Serial_SendByte(String[i]); } } int fputc(int ch, FILE *f) { Serial_SendByte(ch); return ch; } void Serial_Printf(char *format, ...) { char String[100]; va_list arg; va_start(arg,format); vsprintf(String,format,arg); va_end(arg); Serial_SendString(String); } Serial.h #ifndef __SERIAL_H__ #define __SERIAL_H__ #include void Serial_Init(void); void Serial_SendByte(uint8_t Byte); void Serial_SendArray(uint8_t *Array,uint16_t Length); void Serial_SendString(char *String); void Serial_Printf(char *format, ...); uint8_t Serial_GetRxFlag(void); uint8_t Serial_GetRxData(void); #endif main.c #include 'stm32f10x.h' // Device header #include 'Delay.h' #include 'OLED.h' #include 'Serial.h' int main(void) { OLED_Init(); Serial_Init(); while(1) { if(Serial_GetRxFlag()) { OLED_ShowHexNum(1,1,Serial_GetRxData(),2); } } }
上一篇:12_DMA直接存储器存取
下一篇:14_USART串口数据包
- 六大全新产品系列推出,MCX A微控制器家族迎来创新
- 意法半导体全新STM32C5系列,重新定义入门级微控制器性能与价值,赋能万千智能设备
- 从控制到系统:TI利用边缘AI重塑嵌入式MCU的边界
- 模组复用与整机重测在SRRC、CCC、CTA/NAL认证中的实践操作指南
- 有源晶振与无源晶振的六大区别详解
- 英飞凌持续巩固全球微控制器市场领导地位
- 使用 Keil Studio for Visual Studio Code开发 STM32 设备
- 蓝牙信道探测技术原理与开发套件实践
- LoRa、LoRaWAN、NB-IoT与4G DTU技术对比及工业无线方案选型分析
- Microchip 推出生产就绪型全栈边缘 AI 解决方案,赋能MCU和MPU实现 智能实时决策




