一、串口通信简介
串口通信,顾名思义,就是通过串行方式传输数据。在STM32F103C8T6中,串口通信由USART(Universal Synchronous/Asynchronous Receiver/Transmitter)模块负责。简单来说,USART就是一个可以发送和接收数据的“通道”,通过这个通道,STM32F103C8T6可以与PC、其他微控制器或外设进行通信。
二、STM32F103C8T6串口通信实现步骤
要实现STM32F103C8T6的串口通信,其实并不难,只需按照以下步骤操作即可:
步骤1:配置USART
首先,我们需要对USART进行配置。这包括设置波特率(数据传输速率)、数据位长度、停止位数量、奇偶校验等参数。这些参数决定了串口通信的规则和方式。幸运的是,STM32的HAL库为我们提供了方便的函数来配置USART,只需几行代码就能轻松搞定。
步骤2:编写发送和接收函数
配置好USART后,我们需要编写发送和接收函数。发送函数负责将数据从STM32F103C8T6发送出去,而接收函数则负责接收来自外部设备的数据。这些函数可以根据具体的通信协议和需求进行编写。同样地,HAL库也为我们提供了相应的函数来简化这一过程。
步骤3:处理中断和错误
在实际应用中,我们还需要处理串口通信中的中断和错误。例如,当接收到数据时,USART会产生一个中断请求,我们可以通过编写中断处理函数来处理这些数据。此外,还需要考虑数据传输中的错误情况,如奇偶校验错误、帧错误等。对于这些错误的处理,HAL库同样提供了相应的函数和机制。
三、具体实现代码
#include "stm32f10x.h"
void uart1_init(u32 bound)
{
//GPIO端口设置
GPIO_InitTypeDef GPIO_InitStructure; //IO配置结构体
USART_InitTypeDef USART_InitStructure;//串口配置结构体
NVIC_InitTypeDef NVIC_InitStructure; //中断优先级配置结构体
//使能USART1,GPIOB时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1|RCC_APB2Periph_GPIOA, ENABLE);
USART_DeInit(USART1);//复位串口1
//USART1_TX PA.9
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; //PA.9
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //复用推挽输出
GPIO_Init(GPIOA, &GPIO_InitStructure); //初始化PA9
//USART1_RX PA.10
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//浮空输入
GPIO_Init(GPIOA, &GPIO_InitStructure); //初始化PA10
//USART 初始化设置
USART_InitStructure.USART_BaudRate = bound;//一般设置为9600;
USART_InitStructure.USART_WordLength = USART_WordLength_8b; //字长为8位数据格式
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; //收发模式
//Usart1 NVIC 配置
NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=2 ;//抢占优先级3
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2; //子优先级3
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道使能
NVIC_Init(&NVIC_InitStructure); //根据指定的参数初始化VIC寄存器
USART_Init(USART1, &USART_InitStructure); //初始化串口
USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);//关闭中断
USART_Cmd(USART1, ENABLE); //使能串口
}
//发送一个字节
void UARTX_Send_Byte(USART_TypeDef* USARTx, u8 byte) //串口发送一个字节
{
USART_SendData(USARTx,byte);
while(USART_GetFlagStatus(USARTx,USART_FLAG_TC) != SET); //发送完成标志
}
//发送字符串
void USARTX_Sens_Str(USART_TypeDef* USARTx, unsigned char *s)
{
u8 i=0;
while(s[i] != '\0')
{
USART_SendData(USARTx,s[i]);
while(USART_GetFlagStatus(USARTx,USART_FLAG_TC) != SET);
i++;
}
}
//发送数组
void USARTX_Sens_Array(USART_TypeDef* USARTx, u8 array[],u8 num)
{
u8 i=0;
while(i<num)
{
USART_SendData(USARTx,array[i]);
while(USART_GetFlagStatus(USARTx,USART_FLAG_TC) != SET);
i++;
}
}
void USART1_IRQHandler(void) //串口1中断服务程序
{
u8 Uart1_temp;
if(USART_GetFlagStatus(USART1,USART_IT_RXNE))
{
Uart1_temp=USART_ReceiveData(USART1); //读取接收到的数据
//进行自己接收到数据的逻辑 尽量不要有太复杂的逻辑
}
}
int main(void){
uart1_init(9600);//初始化
while(true){
//逻辑处理
}
}
四、如何快速上手STM32F103C8T6串口通信?
对于STM32的初学者来说,想要快速上手STM32F103C8T6的串口通信,可以参考以下建议:
- 学习基础知识:首先了解串口通信的基本原理和概念,包括异步通信、数据帧格式等。这将为你后续的学习打下坚实的基础。
- 利用标准库简化开发:STM32的标准库提供了丰富的函数和示例代码,可以帮助你快速实现串口通信。通过学习和使用HAL库,你可以更加高效地开发串口通信程序。
- 参考官方文档和示例代码:STM32官方提供了详细的文档和示例代码,这些资源对于初学者来说非常宝贵。你可以通过查阅文档和参考示例代码来学习串口通信的实现方法和技巧。
- 实践是检验真理的唯一标准:理论知识的学习是必要的,但实践才是检验学习成果的最好方法。你可以尝试使用STM32F103C8T6的USART模块与PC或其他外设进行通信,例如实现一个简单的串口通信协议来传输数据。通过实践,你将更加深入地理解串口通信的原理和实现方法。
- 加入STM32社区交流学习:在学习过程中,难免会遇到问题和困难。这时,你可以加入STM32的社区和论坛,与其他开发者交流和学习。在社区中,你可以找到许多有用的资源和经验分享,帮助你更快地成长和进步。