STM32 USART串口封装(含注释)

功能:通过串口助手发送数据到单片机,单片机收到后用printf()发送到电脑。

使用时新建serial.c和serial.h文件。复制代码主函数在初始化后可以用串口回传数据到电脑。

通过usart与 电脑进行通信。注意usart的比特率、数据位、停止位、校验位要与单片机内部定义一致。

 

serial.c

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

uint8_t Serial_RxData;
uint8_t Serial_RxFlag;

uint8_t Serial_RxData2;
uint8_t Serial_RxFlag2;

void Serial_Init(void)
{
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);		//打开RCC
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
	
	GPIO_InitTypeDef GPIO_InitStructure;		//打开GPIO	TX	发送
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9 ;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOA, &GPIO_InitStructure);
	
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;		//打开GPIO	RX	接收
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10 ;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOA, &GPIO_InitStructure);
	
	USART_InitTypeDef USART_InitStructure;		
	USART_InitStructure.USART_BaudRate = 9600;		//设置了 USART 传输的波特率
	USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;		//指定了硬件流控制模式使能还是失能
	USART_InitStructure.USART_Mode = USART_Mode_Tx | USART_Mode_Rx;		//指定了使能或者失能发送和接收模式
	USART_InitStructure.USART_Parity = USART_Parity_No;		//定义了奇偶模式
	USART_InitStructure.USART_StopBits = USART_StopBits_1;		//定义了发送的停止位数目
	USART_InitStructure.USART_WordLength = USART_WordLength_8b;		//提示了在一个帧中传输或者接收到的数据位数
	USART_Init(USART1, &USART_InitStructure);		//根据 USART_InitStruct 中指定的参数初始化外设 USARTx 寄存器
		
	USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);		//使能或者失能指定的 USART 中断	USART_IT_RXNE 接收中断
	
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);		//设置优先级分组:先占优先级和从优先级,2,2
	
	NVIC_InitTypeDef NVIC_InitStructure;		
	NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;		//该参数用以使能或者失能指定的 IRQ 通道
	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;		//该参数指定了在成员 NVIC_IRQChannel 中定义的 IRQ 通道被使能还是失能
	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;		//该参数设置了成员 NVIC_IRQChannel 中的先占优先级
	NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;		//该参数设置了成员 NVIC_IRQChannel 中的从优先级
	NVIC_Init(&NVIC_InitStructure);		//根据 NVIC_InitStruct 中指定的参数初始化外设 NVIC 寄存器
	
	USART_Cmd(USART1, ENABLE);		//使能或者失能 USART 外设
}

void Serial_SendByte(uint8_t Byte)
{
	USART_SendData(USART1, Byte);		//通过外设 USARTx 发送单个数据
	while (USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET);		//检查指定的 USART 标志位设置与否
}



void Serial_SendString(char *String)
{
	uint8_t i;
	for (i = 0; String[i] != '\0'; i ++)
	{
		Serial_SendByte(String[i]);
	}
}

int fputc(int ch, FILE *f)		//printf的底层文件
{
	Serial_SendByte(ch);
	return ch;
}

//多个printf的输出
void Serial_Printf(char *format, ...)		//封装sprint
{
	char String[100];
	va_list arg;
	va_start(arg, format);
	vsprintf(String, format, arg);
	va_end(arg);
	Serial_SendString(String);
}

uint8_t Serial_GetRxFlag(void)
{
	if (Serial_RxFlag == 1)
	{
		Serial_RxFlag = 0;
		return 1;
	}
	return 0;
}

uint8_t Serial_GetRxData(void)
{
	return Serial_RxData;
}

void USART1_IRQHandler(void)		//中断程序
{
	if (USART_GetITStatus(USART1, USART_IT_RXNE) == SET)
	{
		Serial_RxData = USART_ReceiveData(USART1);		//返回 USARTx 最近接收到的数据
		Serial_RxFlag = 1;
		USART_ClearITPendingBit(USART1, USART_IT_RXNE);
	}
}

serial.h

#ifndef __SERIAL_H
#define __SERIAL_H

#include <stdio.h>

void Serial_Init(void);
void Serial_SendByte(uint8_t Byte);
void Serial_SendString(char *String);
void Serial_Printf(char *format, ...);

uint8_t Serial_GetRxFlag(void);
uint8_t Serial_GetRxData(void);

#endif

主函数内初始化oled和serial。通过调用printf()可以将电脑串口发送给单片机的数据通过单片机回传到电脑。

main.c

#include "stm32f10x.h"                  // Device header
#include "OLED.h"
#include "Serial.h"

uint8_t RxData;

int main(void)
{
	OLED_Init();
	OLED_ShowString(1, 1, "RxData:");
	Serial_Init();
	
	while (1)
	{
		if (Serial_GetRxFlag() == 1)
		{
			RxData = Serial_GetRxData();
			Serial_Printf("数据:%d\r\n",RxData);
			OLED_ShowHexNum(1, 8, RxData, 2);
		}
	}
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值