STM32——串口通信(发送/接收数据与中断函数应用)
在嵌入式系统中,串口通信是一种非常基本和常用的通信方式。STM32微控制器提供了多个USART(通用同步异步接收发射器)接口,用于实现串口通信。本文将介绍STM32串口通信的基本概念、配置步骤,并提供发送、接收数据的示例代码,以及中断函数的应用。
一、USART简介
USART是通用同步/异步收发器,支持同步和异步模式的串行通信。在异步模式下,数据通过RX和TX引脚以串行方式发送和接收,波特率、字长、停止位和奇偶校验位等参数可以配置。
二、USART配置步骤
- 使能串口时钟和GPIO时钟:需要为USART和其对应的GPIO端口提供时钟。
- GPIO端口模式设置:设置为推挽输出或浮空输入。
- 串口参数初始化:包括波特率、字长、停止位、奇偶校验等。
- 开启中断并初始化NVIC:如果需要使用中断方式接收数据,则需要配置。
- 使能串口:通过
USART_Cmd(USARTx, ENABLE)
函数使能串口。 - 编写中断处理函数:处理接收中断和其他可能的中断。
三、代码示例
3.1 USART初始化
void USART1_Init(u32 bound) {
GPIO_InitTypeDef GPIO_InitStructure;
USART_InitTypeDef USART_InitStructure;
NVIC_InitTypeDef NVIC_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1 | RCC_APB2Periph_GPIOA, ENABLE);
// TX on PA9, RX on PA10
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_Init(GPIOA, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_Init(GPIOA, &GPIO_InitStructure);
// USART1 configuration
USART_InitStructure.USART_BaudRate = bound;
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);
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 3;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
USART_Cmd(USART1, ENABLE);
}
3.2 数据发送
void USART1_SendData(u8 *buf, u16 len) {
for (u16 t = 0; t < len; t++) {
while (USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET);
USART_SendData(USART1, buf[t]);
}
while (USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET);
}
3.3 中断处理函数
void USART1_IRQHandler(void) {
if (USART_GetITStatus(USART1, USART_IT_RXNE) != RESET) {
u8 r = USART_ReceiveData(USART1);
// 处理接收到的数据
}
}
四、总结
STM32的USART提供了灵活的配置选项,可以满足不同的通信需求。通过初始化USART,配置GPIO,使能中断并编写中断处理函数,可以实现数据的发送和接收。在实际应用中,还可以通过重定向fputc
函数来支持printf
等标准库函数。
在开发过程中,可以参考STM32的官方文档和库函数手册,以获取更详细的配置信息和使用示例。通过实际编码和调试,可以更好地理解和掌握STM32的串口通信功能。
✅作者简介:热爱科研的嵌入式开发者,修心和技术同步精进
❤欢迎关注我的知乎:对error视而不见
代码获取、问题探讨及文章转载可私信。
☁ 愿你的生命中有够多的云翳,来造就一个美丽的黄昏。
🍎获取更多嵌入式资料可点击链接进群领取,谢谢支持!👇