记录一下学习过程
串口设置的一般步骤可以总结为如下几个步骤:
1) 串口时钟使能, GPIO 时钟使能
2) 串口复位
3) GPIO 端口模式设置
4) 串口参数初始化
5) 开启中断并且初始化 NVIC(如果需要开启中断才需要这个步骤)
6) 使能串口
7) 编写中断处理函数
代码部分
#include "MyUSART.h"
u8 ReceiveData ;
void MyUSART_Init(u32 bound)
{
GPIO_InitTypeDef GPIO_InitStructure; //定义GPIO初始化结构体
USART_InitTypeDef USART_InitStructure; //定义USART初始化结构体
NVIC_InitTypeDef NVIC_InitStructure; //定义NVIC初始化结构体
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE); //开启GPIOA的时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE); //开启USART1的时钟
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP; //配置为复用推挽输出
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_9; //PA9为TX
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init(GPIOA,&GPIO_InitStructure); //GPIO初始化
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IN_FLOATING;
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_10; //PA10为RX
GPIO_Init(GPIOA,&GPIO_InitStructure);
USART_InitStructure.USART_BaudRate=bound; //设置串口的波特率
USART_InitStructure.USART_WordLength=USART_WordLength_8b; //设置字长为8位数据格式
USART_InitStructure.USART_Mode=USART_Mode_Tx | USART_Mode_Rx; //设置串口模式为发送和接受
USART_InitStructure.USART_StopBits=USART_StopBits_1; //设置停止位为1位
USART_InitStructure.USART_Parity=USART_Parity_No; //无奇偶校验位
USART_InitStructure.USART_HardwareFlowControl=USART_HardwareFlowControl_None; // 无硬件流控制
USART_Init(USART1,&USART_InitStructure); //初始化USART1
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置中断分组这个最好放在main函数里,确保所有中断都是采用同一分组
NVIC_InitStructure.NVIC_IRQChannel=USART1_IRQn;//设置中断来源
NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE; //IRQ中断使能
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=3; //设置抢占优先级
NVIC_InitStructure.NVIC_IRQChannelSubPriority=3; //设置响应优先级
NVIC_Init(&NVIC_InitStructure); //初始化NVIC
USART_ITConfig(USART1,USART_IT_RXNE,ENABLE); //开启USART1的接收中断
USART_Cmd(USART1,ENABLE); //使能USART1
}
void MyUSART_SendByte(u8 Byte)
{
USART_SendData(USART1,Byte);
while(USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET);//防止发送过快,前一个数据还没发送出去就别覆盖的情况
}
void MyUSART_SendArray(u8* Array,u16 Length)//发送数组,最长长度为2^16
{
u16 i;
for(i=0;i<Length;i++)
{
MyUSART_SendByte(Array[i]);
}
}
void MyUSART_SendString(char* str)//发送字符串
{
u16 i;
for(i=0;str[i]!='\0';i++)
{
MyUSART_SendByte(str[i]);
}
}
void USART1_IRQHandler(void) //串口1中断服务程序
{
if(USART_GetITStatus(USART1, USART_IT_RXNE) == SET) //接收中断
{
ReceiveData =USART_ReceiveData(USART1); //读取接收到的数据
MyUSART_SendByte(ReceiveData);//发送接收到的数据
}
}
头文件
#ifndef __MYUSART_H
#define __MYUSART_H
#include "sys.h"
#include "OLED.h"
#include "Delay.h"
void MyUSART_Init(u32 bound);
extern u8 ReceiveData ;
void MyUSART_SendByte(u8 Byte);
void MyUSART_SendArray(u8* Array,u16 Length);
void MyUSART_SendString(char* str);
#endif