STM32串口通信程序详解

本篇博客将带你深入解析一段基于STM32的串口通信程序源码,该程序实现了串口1和串口2的初始化、数据接收和发送等功能。

代码功能:

  • 初始化串口1和串口2,设置波特率、数据位、停止位等参数。
  • 开启串口1的接收中断,并在中断服务程序中处理接收到的数据。
  • 提供发送字符串函数,方便用户向串口发送数据。

代码解析:

  1. 头文件包含:
#include 'sys.h'  
#include 'usart.h'	
#include 'led.h'
#if SYSTEM_SUPPORT_UCOS
#include 'includes.h'					//ucos 使用	  
#endif
  • sys.husart.hled.h 分别包含了系统配置、串口操作、LED控制相关的函数和定义。
  • includes.h 是ucos实时操作系统的头文件,如果使用ucos,则需要包含该头文件。
  1. 全局变量定义:
unsigned char firstin =0;
unsigned char tab[25];
unsigned char Count=0;
unsigned char  uartbusy =0;
  • firstintabCount 共同配合用于接收数据,当接收到完整数据包时,将数据存储在 tab 中。
  • uartbusy 用于指示串口是否正在忙碌。
  1. 标准库函数重定义 (可选):
#if 1
#pragma import(__use_no_semihosting)             
struct __FILE 
{ 
	int handle; 
}; 

FILE __stdout;       
_sys_exit(int x) 
{ 
	x = x; 
} 
int fputc(int ch, FILE *f)
{      
	while((USART1->SR&0X40)==0);
    USART1->DR = (u8) ch;      
	return ch;
}
#endif 
  • 这部分代码用于重定义标准库函数 fputc,将其指向串口1,使得程序可以使用 printf 函数将信息打印到串口1。
  1. 串口1初始化函数 uart_init():
void uart_init(u32 bound){
  // ... 代码省略 ...
}
  • 该函数用于初始化串口1,具体操作包括:
    • 配置串口1的GPIO引脚。
    • 配置串口1的参数,例如波特率、数据位、停止位等。
    • 使能串口1的中断,并配置中断优先级。
  1. 串口1中断服务程序 USART1_IRQHandler():
void USART1_IRQHandler(void)
{
  // ... 代码省略 ...
} 
  • 当串口1接收到数据时,会进入该中断服务程序。
  • 程序会读取接收到的数据,并将其存储到 tab 数组中。
  • 当接收到完整数据包时,程序会进行相应处理。
  1. 串口2初始化函数 uart2_init():
void uart2_init(u32 bound)
{
  // ... 代码省略 ...
} 
  • 该函数用于初始化串口2,与串口1的初始化过程类似。
  1. 串口2中断服务程序 USART2_IRQHandler():
void USART2_IRQHandler(void)
{
  // ... 代码省略 ...
} 
  • 当串口2接收到数据时,会进入该中断服务程序,程序会读取接收到的数据。
  1. 串口发送字符串函数 UART_SendStr():
void UART_SendStr(USART_TypeDef* USARTx, char* str, u16 legth)
{
  // ... 代码省略 ...
}
  • 该函数用于向指定的串口发送字符串,参数 USARTx 指定要使用的串口,str 为要发送的字符串,legth 为字符串长度。

总结:

该程序提供了一个完整的STM32串口通信解决方案,包括串口初始化、中断处理、数据发送等功能。用户可以根据自身需求修改该程序,例如修改波特率、数据位等参数,或添加自定义的串口数据处理逻辑。


原文地址: https://www.cveoy.top/t/topic/jueh 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录