实现串口驱动,移植方便

This commit is contained in:
冯佳
2026-01-22 16:36:56 +08:00
parent 2ef4dac5bd
commit 51e8d79f78
151 changed files with 4064 additions and 11050 deletions

View File

@ -0,0 +1,20 @@
cmake_minimum_required(VERSION 3.22)
# Create uart library
add_library(uart STATIC)
# Add uart sources
target_sources(uart PRIVATE
${CMAKE_CURRENT_SOURCE_DIR}/src/uart.c
)
# Add uart include directories
target_include_directories(uart PUBLIC
${CMAKE_CURRENT_SOURCE_DIR}/inc
)
# Link with stm32cubemx and hal libraries
target_link_libraries(uart PRIVATE
stm32cubemx
hal
)

131
Modules/uart/README.md Normal file
View File

@ -0,0 +1,131 @@
# UART模块
## 功能描述
UART模块用于实现串口通信功能支持数据发送和接收提供了简单易用的API接口。
## 依赖关系
- HAL层hal_uart
## 接口说明
### 数据结构
#### uart_config_t
UART配置结构体用于初始化UART模块
```c
typedef struct {
uint32_t baudrate; /*!< 波特率 */
hal_uart_parity_t parity; /*!< 校验位 */
hal_uart_stopbits_t stopbits; /*!< 停止位 */
hal_uart_databits_t databits; /*!< 数据位 */
} uart_config_t;
```
#### uart_t
UART实例结构体用于管理UART状态
```c
typedef struct {
uart_config_t config; /*!< UART配置 */
uint8_t initialized; /*!< 初始化状态 */
} uart_t;
```
### 函数接口
#### uart_init
```c
void uart_init(void);
```
初始化UART模块
**参数**:无
**返回值**:无
#### uart_config
```c
void uart_config(const uart_config_t *config);
```
配置UART参数
**参数**
- config: UART配置结构体指针
**返回值**:无
#### uart_send
```c
void uart_send(const uint8_t *data, size_t length);
```
发送数据
**参数**
- data: 数据缓冲区指针
- length: 数据长度
**返回值**:无
#### uart_send_string
```c
void uart_send_string(const char *str);
```
发送字符串
**参数**
- str: 字符串指针
**返回值**:无
#### uart_receive
```c
size_t uart_receive(uint8_t *data, size_t length);
```
接收数据
**参数**
- data: 数据缓冲区指针
- length: 要接收的数据长度
**返回值**:实际接收的数据长度
#### uart_is_tx_ready
```c
uint8_t uart_is_tx_ready(void);
```
检查UART是否准备好发送
**参数**:无
**返回值**
- 1: 准备好
- 0: 未准备好
#### uart_is_rx_ready
```c
uint8_t uart_is_rx_ready(void);
```
检查UART是否有数据可读
**参数**:无
**返回值**
- 1: 有数据可读
- 0: 无数据可读
## 使用示例
```c
/* 初始化UART模块 */
uart_init();
/* 发送字符串 */
uart_send_string("Hello, UART!\r\n");
/* 发送数据 */
uint8_t data[] = {0x01, 0x02, 0x03};
uart_send(data, sizeof(data));
/* 接收数据 */
uint8_t buffer[10];
size_t len = uart_receive(buffer, sizeof(buffer));
```

79
Modules/uart/inc/uart.h Normal file
View File

@ -0,0 +1,79 @@
/* USER CODE BEGIN Header */
/**
******************************************************************************
* @file : uart.h
* @brief : UART driver module header file
******************************************************************************
*/
/* USER CODE END Header */
#ifndef UART_H
#define UART_H
#include <stdint.h>
#include <stddef.h>
#include "hal_uart.h"
/**
* @brief UART configuration structure
*/
typedef struct {
uint32_t baudrate;
hal_uart_parity_t parity;
hal_uart_stopbits_t stopbits;
hal_uart_databits_t databits;
} uart_config_t;
/**
* @brief UART instance structure
*/
typedef struct {
uart_config_t config;
uint8_t initialized;
} uart_t;
/**
* @brief Initialize UART module
*/
void uart_init(void);
/**
* @brief Configure UART parameters
* @param config: UART configuration structure
*/
void uart_config(const uart_config_t *config);
/**
* @brief Send data over UART
* @param data: Pointer to data buffer
* @param length: Data length in bytes
*/
void uart_send(const uint8_t *data, size_t length);
/**
* @brief Send string over UART
* @param str: Pointer to string
*/
void uart_send_string(const char *str);
/**
* @brief Receive data over UART
* @param data: Pointer to data buffer
* @param length: Data length to receive in bytes
* @retval Number of bytes received
*/
size_t uart_receive(uint8_t *data, size_t length);
/**
* @brief Check if UART is ready to send
* @retval 1 if ready, 0 otherwise
*/
uint8_t uart_is_tx_ready(void);
/**
* @brief Check if UART has data to receive
* @retval 1 if data available, 0 otherwise
*/
uint8_t uart_is_rx_ready(void);
#endif /* UART_H */

104
Modules/uart/src/uart.c Normal file
View File

@ -0,0 +1,104 @@
/* USER CODE BEGIN Header */
/**
******************************************************************************
* @file : uart.c
* @brief : UART driver module source file
******************************************************************************
*/
/* USER CODE END Header */
#include "uart.h"
#include <string.h>
/* UART instance */
static uart_t uart;
/**
* @brief Initialize UART module
*/
void uart_init(void) {
/* Initialize hardware abstraction layer */
hal_uart_init();
/* Set default configuration */
uart.config.baudrate = 115200;
uart.config.parity = HAL_UART_PARITY_NONE;
uart.config.stopbits = HAL_UART_STOPBITS_1;
uart.config.databits = HAL_UART_DATABITS_8;
/* Configure UART with default settings */
hal_uart_config((hal_uart_config_t *)&uart.config);
uart.initialized = 1;
}
/**
* @brief Configure UART parameters
* @param config: UART configuration structure
*/
void uart_config(const uart_config_t *config) {
if (config == NULL) {
return;
}
/* Update configuration */
uart.config = *config;
/* Configure hardware */
hal_uart_config((hal_uart_config_t *)&uart.config);
}
/**
* @brief Send data over UART
* @param data: Pointer to data buffer
* @param length: Data length in bytes
*/
void uart_send(const uint8_t *data, size_t length) {
if (data == NULL || length == 0) {
return;
}
hal_uart_send(data, length);
}
/**
* @brief Send string over UART
* @param str: Pointer to string
*/
void uart_send_string(const char *str) {
if (str == NULL) {
return;
}
hal_uart_send((const uint8_t *)str, strlen(str));
}
/**
* @brief Receive data over UART
* @param data: Pointer to data buffer
* @param length: Data length to receive in bytes
* @retval Number of bytes received
*/
size_t uart_receive(uint8_t *data, size_t length) {
if (data == NULL || length == 0) {
return 0;
}
return hal_uart_receive(data, length);
}
/**
* @brief Check if UART is ready to send
* @retval 1 if ready, 0 otherwise
*/
uint8_t uart_is_tx_ready(void) {
return hal_uart_is_tx_ready();
}
/**
* @brief Check if UART has data to receive
* @retval 1 if data available, 0 otherwise
*/
uint8_t uart_is_rx_ready(void) {
return hal_uart_is_rx_ready();
}