一、 串口的基本知识
串口的基本知识,可以参考如下文章:
a.串口基础知识文章1
b.串口基础知识文章2
二、STM32配置USART
下面是配置USART过程的思维导图,如下:
下面是各个过程的具体实现过程,并带有注释。
(1)USART对应GPIO配置
具体代码如下:
GPIO_InitTypeDef GPIO_InitStructure;//定义GPIO结构体
/*开启时钟*/
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
//UART发送端PA9引脚初始化
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;//设置为复用推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA,&GPIO_InitStructure);
//UART接收端PA10引脚初始化
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//设置为模拟输入
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA,&GPIO_InitStructure);
需要注意的是:串口发送引脚需要配置成“复用推挽输出”;串口发送引脚需要配置成“模拟输入”;
(2)USART设置(包含串口中断设置)
具体代码如下:
USART_InitTypeDef USART_InitStructure;
NVIC_InitTypeDef NVIC_InitStructure;
/*开启时钟*/
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);
//UART初始化设置
USART_InitStructure.USART_BaudRate = bound; //波特率设置,参数传递
USART_InitStructure.USART_Mode = USART_WordLength_8b; //设置帧长度为8位
USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None; //一般选择无硬件流控制
USART_InitStructure.USART_Parity = USART_Parity_No; //无奇偶校验
USART_InitStructure.USART_StopBits = USART_StopBits_1; //一位停止位
USART_InitStructure.USART_Mode = USART_Mode_Tx | USART_Mode_Rx; //收发使能
USART_Init(USART1,&USART_InitStructure);
//使能串口
USART_Cmd(USART1,ENABLE);
//清除串口中断标志
USART_ClearFlag(USART1,USART_FLAG_TC);
//使能串口中断
USART_ITConfig(USART1,USART_IT_RXNE,ENABLE);
//NVIC配置,凡是使用中断皆配置
NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn; //选择中断源,在“stm32f10x.h”文件中查找
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2; //抢占优先级为2
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; //响应优先级为0
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
需要注意的是:
a.NVIC中断控制器的设置
凡是使用中断,都需要配置NVIC,包括中断分组、抢占/响应优先级等,其中的“中断源名称”在“stm32f10x.h”文件中查找。
b.在使能串口中断时,一定要将串口中断标志清除。
(3)串口中断服务函数
具体的代码如下:功能是接送串口发送来的数据
void USART1_IRQHandler(void)
{
u8 r;
if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET) //接收中断
{
USART_ClearITPendingBit(USART1,USART_IT_RXNE);
r =USART_ReceiveData(USART1);//(USART1->DR); //读取接收到的数据
}
}
需要注意的点:
a.串口中断服务函数的名称在哪?
在STM32的启动文件里,带汇编的那块
b.获取的串口的标志如何找?
可以参考STM32固件库手册,或参考下面这篇文章:
STM32的USART发送数据时如何使用TXE和TC标志
主要是知道各个标志代表的含义是?是在什么时候置1/0?标志需要什么时候清除?例如:USART_IT_RXNE标志,是指串口接受满了,发生中断,此时标志置1,因此可以用来判断串口是否已经接受完成数据。
来源:CSDN
作者:或许改变
链接:https://blog.csdn.net/weixin_43499278/article/details/103949301