STM32串口通信
STM32串口通信
串口常用寄存器
- USART_SR 状态寄存器
- USART_DR 数据寄存器
- USART_BRR 波特率寄存器
串口配置的步骤和函数
-
串口时钟使能,GPIO时钟使能
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);//串口时钟使能 RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);//GPIO时钟使能
-
串口复位(可省略)
USART_DeInit();
-
GPIO端口模式设置
//由于是是串口通信,所以需要实现端口复用,拿USART1来说,用到了PA9,PA10 //所以需要将这两个GPIO的模式设置为:复用推挽、浮空输入/带上拉输入 GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF_PP;//设置为复用推挽 GPIO_InitStruct.GPIO_Pin = GPIO_Pin_9; GPIO_InitStruct.GPIO_Speed = GPIO_Speed_10MHz; GPIO_Init(GPIOA,&GPIO_InitStruct); GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IN_FLOATING;//浮空输入/带上拉输入 GPIO_InitStruct.GPIO_Pin = GPIO_Pin_10; GPIO_InitStruct.GPIO_Speed = GPIO_Speed_10MHz; GPIO_Init(GPIOA,&GPIO_InitStruct);
-
串口参数初始化
//串口参数初始化主要是对串口通信的波特率等参数进行初始化 //然后使用 USART_Init() 函数对指定串口进行初始化 //参数设置 USART_InitStruct.USART_BaudRate = 115200; USART_InitStruct.USART_HardwareFlowControl = USART_HardwareFlowControl_None; USART_InitStruct.USART_Mode = USART_Mode_Rx | 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);
-
开启中断并初始化NVIC
//开启中断:开启USART1的接收中断,即在USART1接收到数据之后就会开启中断服务 USART_ITConfig(USART1,USART_IT_RXNE,ENABLE); //初始化中断 NVIC_InitStrue.NVIC_IRQChannel = USART1_IRQn; NVIC_InitStrue.NVIC_IRQChannelCmd = ENABLE; NVIC_InitStrue.NVIC_IRQChannelPreemptionPriority = 1; NVIC_InitStrue.NVIC_IRQChannelSubPriority = 1; NVIC_Init(&NVIC_InitStrue);
-
使能串口
USART_Cmd(USART1,ENABLE);
-
编写中断处理函数
//本函数是已经定义过的 void USART1_IRQHandler(void) { u8 res; //获取当前串口传输的状态 if(USART_GetITStatus(USART1,USART_IT_RXNE)){ //对接收到的数据进行赋值 res = USART_ReceiveData(USART1); //使用发送函数将接收到的数据进行返回 USART_SendData(USART1,res); } }
完整程序
#include "stm32f10x.h"
void My_USART1_Init(void)
{
GPIO_InitTypeDef GPIO_InitStruct;
USART_InitTypeDef USART_InitStruct;
NVIC_InitTypeDef NVIC_InitStrue;
//GPIO时钟使能
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
//串口时钟使能
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);
//设置GPIO端口模式
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_9;
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_10MHz;
GPIO_Init(GPIOA,&GPIO_InitStruct);
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_10;
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_10MHz;
GPIO_Init(GPIOA,&GPIO_InitStruct);
//串口初始化
USART_InitStruct.USART_BaudRate = 115200;
USART_InitStruct.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
USART_InitStruct.USART_Mode = USART_Mode_Rx | 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);
//开启中断:开启USART1的接收中断,即在USART1接收到数据之后就会开启中断服务
USART_ITConfig(USART1,USART_IT_RXNE,ENABLE);
//初始化中断
NVIC_InitStrue.NVIC_IRQChannel = USART1_IRQn;
NVIC_InitStrue.NVIC_IRQChannelCmd = ENABLE;
NVIC_InitStrue.NVIC_IRQChannelPreemptionPriority = 1;
NVIC_InitStrue.NVIC_IRQChannelSubPriority = 1;
NVIC_Init(&NVIC_InitStrue);
}
//中断服务函数
void USART1_IRQHandler(void)
{
u8 res;
//获取串口传输状态
if(USART_GetITStatus(USART1,USART_IT_RXNE)){
//接收串口数据
res = USART_ReceiveData(USART1);
//发送串口数据
USART_SendData(USART1,res);
}
}
int main(void)
{
//测试中断 设置中断优先级分组:将系统的中断优先级设置为2
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
My_USART1_Init();
while(1)
{
USART1_IRQHandler();
}
}