一、相关函数说明:
USART_ClockInit()和USART_ClockStructInit(); 用来配置同步时钟输出
USART_DMACmd(); 开启USART到DMA的触发通道
USART_SendData(); 发送数据
USART_ReceiveData(); 接收数据
二、程序代码
++serial.c文件++
#include "stm32f10x.h"
#include "stm32f10x_usart.h"
#include "serial.h"
#include "stdio.h"
#include <stdarg.h>
uint8_t serial_RxData;
uint8_t serival_RxFlag;
/*初始化函数*/
void serial_Init(void)
{
/*
初始化步骤:
1.开启GPIO和USART时钟
2.初始化GPIO,把TX配置为复用输出,RX配置为输入
3.初始化并配置USART
4.如果只需要发送的功能,就直接开启USART
5.如果需要接受数据,还需要配置中断(即在开启USART之前添加ITConfig和NVIC的代码)
*/
//开启时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
//初始化配置GPIO
GPIO_InitTypeDef GPIO_InitStruct;
GPIO_InitStruct.GPIO_Pin=GPIO_Pin_9;
GPIO_InitStruct.GPIO_Mode=GPIO_Mode_AF_PP;
GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init(GPIOA,&GPIO_InitStruct);
GPIO_InitStruct.GPIO_Pin=GPIO_Pin_10;
GPIO_InitStruct.GPIO_Mode=GPIO_Mode_IPU;
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
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)
{
uint8_t i;
for(i=0;String[i]!='\0';i++)
{
serial_SendByte(String[i]);
}
}
/*发送数据函数(发送一个数字)*/
uint32_t serial_Pow(uint32_t X,uint32_t Y)
{
uint32_t Result=1;
while(Y--)
{
Result*=X;
}
return Result;
}
void serial_SendNumber(uint32_t Number, uint8_t Length)
{
uint8_t i;
for(i=0;i<Length;i++)
{
serial_SendByte(Number/serial_Pow(10,Length-i-1)%10+'0');
}
}
/*重写Fputc函数*/
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);
}
/*读后清除标志位函数*/
uint8_t serial_GetRxFlag(void)
{
if(serival_RxFlag==1)
{
serival_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);
serival_RxFlag=1;
USART_ClearITPendingBit(USART1,USART_IT_RXNE);
}
}
++serial.h文件++
#ifndef _SERIAL_H
#define _SERIAL_H
#include "stdint.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_SendNumber(uint32_t Number, uint8_t Length);
void serial_Printf(char *format,...);
uint8_t serial_GetRxFlag(void);
uint8_t serial_GetRxData(void);
#endif
++main.c文件++
#include "stm32f10x.h"
#include "delay.h"
#include "OLED.h"
#include "serial.h"
uint8_t RxData;
int main (void)
{
//初始化
OLED_Init();
serial_Init();
OLED_ShowString(1,1,"RxData:");
while(1)
{
if(serial_GetRxFlag()==1)
{
RxData=serial_GetRxData();
serial_SendByte(RxData);
OLED_ShowHexNum(1,8,RxData,2);
}
}
}