一、相關函數說明:
?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);
? }
?}
}
?