目录
一、串口简介
串口通讯是一种设备间非常常用的串行通讯方式,因为它简单便捷,大部分电子设备都支持该通讯方式,调试设备的时候也经常使用该通讯输出调试信息。
二、产品两个USART的作用
1、USART1的作用
产品总共用到两个串口,串口1是用于产品Debug功能,主要用于监控串口2和Wifi模块的通讯数据,方便调试,目前做物联网产品基本是通过串口来接收和发送数据,而这种一般有一个复杂的通讯协议,在调试过程中肯定会有很多问题,如果能把MCU和WIFI模组的交互数据通过别的别的串口打印出来,那将大大提高开发效率。
2、USART2的作用
串口2我们是用来跟WIFI模块通讯,用来远程和数据交互。
三、USART和UART的区别
USART:通用同步异步收发器
UART:通用异步收发器
简单来说就是USART和UART的加强版,增加了同步功能,USART除了可以串口通讯以外,还能支持和ISO7816(用于接触式IC卡)、LIN总线(用于汽车CAN总线)、IrDA(红外通讯)协议接口通讯。而UART就只能单纯使用串口通讯协议。
四、USART1和USART2代码实现
需要实现的功能:USART1用于Debug,主要用来打印usart2接收到的数据,usart2接的式wifi模组,所以usart1的作用就是用来监控mcu和WiFi模组之间的交互数据用的。
usart配置流程
1、开启复用功能、IO口、USART时钟。
2、配置IO口,USART结构体变量
GPIO_InitTypeDef GPIO_InitStructure;
USART_InitTypeDef USART_InitStructure;
NVIC_InitTypeDef NVIC_InitStructure; // 定义结构体
RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOA,ENABLE); // 开端口时钟
RCC_APB2PeriphClockCmd( RCC_APB2Periph_USART1,ENABLE); // 开Usart时钟
RCC_APB1PeriphClockCmd( RCC_APB1Periph_USART2,ENABLE);
/*
* USART1_TX -> PA9 , USART1_RX -> PA10
*/
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; // Tx配置为推挽复用模式
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; // Rx 配置为上拉输入模式
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
USART_InitStructure.USART_BaudRate = 115200; // 波特率
USART_InitStructure.USART_WordLength = USART_WordLength_8b; // 一帧数据字长
USART_InitStructure.USART_StopBits = USART_StopBits_1; // 停止位
USART_InitStructure.USART_Parity = USART_Parity_No; // 无校验位
USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None; // 无硬件控制流
USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; // 收发模式
USART_Init(USART1, &USART_InitStructure); // 完成初始化
USART_ITConfig(USART1, USART_IT_RXNE, ENABLE); // 使能串口接收中断
USART_ITConfig(USART1, USART_IT_TXE, DISABLE); // 失能串口发送中断
USART_Cmd(USART1, ENABLE); // 使能串口
//USART1 INT Cofig
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);
NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 3;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
3、完善USART中断回调函数
// 串口发送函数
static void hal_DebugSendByte(unsigned char Dat)
{
USART_SendData(USART1, Dat); // 往串口1发送数据
USART_ITConfig(USART1, USART_IT_TXE, ENABLE); // 开启串口一发送中断
}
// 串口中断回调函数
void USART1_IRQHandler(void)
{
unsigned char dat;
if(USART_GetITStatus(USART1,USART_IT_RXNE) != RESET) // 判断串口是否接收到数据
{
dat = USART_ReceiveData(USART1); // 把接收到的数据赋值给dat
//hal_DebugSendByte(dat);
USART_ClearITPendingBit(USART1,USART_IT_RXNE); // 清除中断标志位
}
if(USART_GetITStatus(USART1,USART_IT_TXE) != RESET) // 判断串口是否有数据发送
{
USART_ClearITPendingBit(USART1, USART_IT_TXE); // 清楚中断标志位
USART_ITConfig(USART1, USART_IT_TXE, DISABLE); // 关闭串口中断
}
}
版权声明:本文为CSDN博主「刘远远」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_45806510/article/details/120848939
暂无评论