单片机
返回首页

13_USART串口协议

2025-09-03 来源:cnblogs

通信接口

image-20240218173921686

串口通信

image-20240218231824367

硬件电路

image-20240219001809141

电平标准

image-20240219132214707

串口参数及时序

image-20240219182035655

串口时序

image-20240219230136140

USART简介

image-20240219225919706

USART框图

image-20240220161841173

USART基本结构

image-20240220205953649

数据帧

image-20240220210647656

image-20240220210717561

起始位侦测

image-20240220211014858

数据采样

image-20240220211451363

波特率发生器

image-20240220211828495

image-20240220211638498

数据模式

image-20240221201630077

image-20240221201657125

image-20240221201903794

串口发送

接线图

image-20240220222456040

引脚定义

image-20240221123756259

代码

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);

}

}

}


进入单片机查看更多内容>>
相关视频
  • 【TI MSPM0 应用实战】智能小车+工业角度编码器+血氧仪+烟雾探测器!硬核参考设计详解!

  • 2022 Digi-Key KOL 系列: 你见过1GHz主频的单片机吗?Teensy 4.1开发板介绍

  • TI 新一代 C2000™ 微控制器:全方位助力伺服及马达驱动应用

  • MSP430电容触摸技术 - 防水Demo演示

  • 直播回放: Microchip Timberwolf™ 音频处理器在线研讨会

  • 基于灵动MM32W0系列MCU的指夹血氧仪控制及OTA升级应用方案分享

精选电路图
  • 1瓦四级调频发射机

  • 500W MOS场效应管电源逆变器,12V转110V/220V

  • 12V 转 28V DC-DC 变换器(基于 LM2585)

  • 红外开关

  • 12V转110V/220V 500W逆变器

  • DS1669数字电位器

    相关电子头条文章