13_USART串口协议

USART串口协议

通信接口

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 <stdio.h>
#include <stdarg.h>

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<Length;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 <stdio.h>

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("sadhnfoasdk\r\nksadfj\r\nsdlhfj\r\ndfgdsfgdfg");
	
	printf("Num=%d\r\n",666);
	
	char String[100];
	sprintf(String, "Num=%d\r\n", 666);
	Serial_SendString(String);
	
	Serial_Printf("Num=%d\r\n", 555);
	
	Serial_Printf("你好世界");

	while(1)
	{
		 
	}
}

串口发送+接收

代码

Serial.c

#include "stm32f10x.h"                  // Device header
#include <stdio.h>
#include <stdarg.h>

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<Length;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 <stdio.h>

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);
		}
	}
}
posted @ 2024-02-26 00:34  爱吃冰激凌的黄某某  阅读(16)  评论(0编辑  收藏  举报