generated from hulk/gd32e23x_template_cmake_vscode
Initial commit
This commit is contained in:
56
Inc/board_config.h
Normal file
56
Inc/board_config.h
Normal file
@@ -0,0 +1,56 @@
|
||||
#ifndef BOARD_CONFIG_H
|
||||
#define BOARD_CONFIG_H
|
||||
|
||||
/* >>>>>>>>>>>>>>>>>>>>[RS485 PHY DEFINE]<<<<<<<<<<<<<<<<<<<< */
|
||||
|
||||
// #define RS485_MAX13487 // RS485 PHY : MAX13487 (AutoDir)
|
||||
#undef RS485_MAX13487 // RS485 PHY : SP3487 (no AutoDir)
|
||||
|
||||
/* >>>>>>>>>>>>>>>>>>>>[IIC TYPE DEFINE]<<<<<<<<<<<<<<<<<<<< */
|
||||
|
||||
// #define SOFTWARE_IIC // IIC Type : Software IIC
|
||||
#undef SOFTWARE_IIC // IIC Type : Hardware IIC
|
||||
|
||||
/* >>>>>>>>>>>>>>>>>>>>[DEBUG ASSERTIONS DEFINE]<<<<<<<<<<<<<<<<<<<< */
|
||||
|
||||
// #define DEBUG_VERBOSE // Debug Assertions Status : Debug Verbose Information
|
||||
#undef DEBUG_VERBOSE // Debug Assertions Status : No Debug Verbose Information
|
||||
|
||||
/* >>>>>>>>>>>>>>>>>>>>[EDDY DRIVE CURRENT DETECTION]<<<<<<<<<<<<<<<<<<<< */
|
||||
|
||||
// #define EDDY_DRIVE_CURRENT_DETECTION // Eddy Drive Current Detection : Enable
|
||||
#undef EDDY_DRIVE_CURRENT_DETECTION // Eddy Drive Current Detection : Disable
|
||||
|
||||
/******************************************************************************/
|
||||
|
||||
#define RCU_GPIO_I2C RCU_GPIOF
|
||||
#define RCU_I2C RCU_I2C0
|
||||
#define I2C_SCL_PORT GPIOF
|
||||
#define I2C_SCL_PIN GPIO_PIN_1
|
||||
#define I2C_SDA_PORT GPIOF
|
||||
#define I2C_SDA_PIN GPIO_PIN_0
|
||||
#define I2C_GPIO_AF GPIO_AF_1
|
||||
|
||||
#define I2C_DEBUG_UART USART0
|
||||
|
||||
/******************************************************************************/
|
||||
|
||||
#define LED_PORT GPIOA
|
||||
#define LED_PIN GPIO_PIN_7
|
||||
#define LED_RCU RCU_GPIOA
|
||||
|
||||
/******************************************************************************/
|
||||
|
||||
#define RS485_RCU RCU_USART0
|
||||
#define RS485_GPIO_RCU RCU_GPIOA
|
||||
#define RS485_GPIO_PORT GPIOA
|
||||
#define RS485_TX_PIN GPIO_PIN_2
|
||||
#define RS485_RX_PIN GPIO_PIN_3
|
||||
#define RS485_PHY USART0
|
||||
#define RS485_BAUDRATE 115200U
|
||||
#define RS485_EN_PIN GPIO_PIN_1
|
||||
#define RS485_IRQ USART0_IRQn
|
||||
|
||||
/******************************************************************************/
|
||||
|
||||
#endif //BOARD_CONFIG_H
|
82
Inc/command.h
Normal file
82
Inc/command.h
Normal file
@@ -0,0 +1,82 @@
|
||||
/**
|
||||
* @file command.h
|
||||
* @brief 串口命令解析与处理模块接口声明。
|
||||
* @details 提供基于环形缓冲区的串口协议解析、命令处理及状态管理功能,
|
||||
* 支持格式为 D5 03 LEN [cmd] CRC 的命令帧解析与响应。
|
||||
*/
|
||||
#ifndef COMMAND_H
|
||||
#define COMMAND_H
|
||||
|
||||
#include <stdint.h>
|
||||
#include <stdbool.h>
|
||||
|
||||
/**
|
||||
* @defgroup Command 命令处理模块
|
||||
* @brief 串口命令解析与处理
|
||||
* @{
|
||||
*/
|
||||
|
||||
/**
|
||||
* @section Command_Protocol 协议格式
|
||||
* 接收命令帧格式:
|
||||
* @code
|
||||
* [0] HEADER = 0xD5 // 包头标识
|
||||
* [1] BOARD_TYPE = 0x03 // 板卡类型标识
|
||||
* [2] LEN = 数据区字节数 // 有效载荷长度
|
||||
* [3..(3+LEN-1)] 数据 // 命令数据
|
||||
* [last] CRC // 校验码(从索引1累加到len-2的低8位)
|
||||
* @endcode
|
||||
*
|
||||
* 响应帧格式:
|
||||
* @code
|
||||
* [0] HEADER = 0xB5 // 响应包头
|
||||
* [1] TYPE // 响应类型(0xF0=成功,0xF1..=错误类型)
|
||||
* [2] LEN // 响应数据长度
|
||||
* [3..(3+LEN-1)] 数据 // 响应数据
|
||||
* [last] CRC // 校验码
|
||||
* @endcode
|
||||
*
|
||||
* @section Command_Usage 使用说明
|
||||
* 1) 初始化环形缓冲区:
|
||||
* @code{.c}
|
||||
* uart_ring_buffer_init();
|
||||
* @endcode
|
||||
*
|
||||
* 2) 在主循环中调用命令处理:
|
||||
* @code{.c}
|
||||
* while(1) {
|
||||
* command_process(); // 处理接收到的命令
|
||||
* // 其他业务逻辑
|
||||
* }
|
||||
* @endcode
|
||||
*
|
||||
* 3) 查询传感器上报状态:
|
||||
* @code{.c}
|
||||
* if(get_sensor_report_enabled()) {
|
||||
* // 执行传感器数据上报
|
||||
* }
|
||||
* @endcode
|
||||
*/
|
||||
|
||||
/**
|
||||
* @brief 处理串口环形缓冲区中的命令数据。
|
||||
* @details 基于状态机的非阻塞协议解析器,处理完整的命令帧并自动响应。
|
||||
* 每次调用处理缓冲区中所有可用数据,遇到错误时自动重置状态机。
|
||||
* @note 使用静态变量维护解析状态,函数不可重入。
|
||||
* @warning 依赖环形缓冲区正确实现,建议在主循环中周期调用。
|
||||
* @ingroup Command
|
||||
*/
|
||||
void command_process(void);
|
||||
|
||||
/**
|
||||
* @brief 解析并处理完整的命令帧。
|
||||
* @param cmd 指向完整命令帧的缓冲区(从包头0xD5开始)。
|
||||
* @param len 命令帧总长度(字节)。
|
||||
* @note 内部函数,由 command_process() 调用,一般不直接使用。
|
||||
* @ingroup Command
|
||||
*/
|
||||
void handle_command(const uint8_t *cmd, uint8_t len);
|
||||
|
||||
/** @} */ // end of Command group
|
||||
|
||||
#endif // COMMAND_H
|
52
Inc/gd32e23x_it.h
Normal file
52
Inc/gd32e23x_it.h
Normal file
@@ -0,0 +1,52 @@
|
||||
/*!
|
||||
\file gd32e23x_it.h
|
||||
\brief the header file of the ISR
|
||||
|
||||
\version 2025-02-10, V2.4.0, demo for GD32E23x
|
||||
*/
|
||||
|
||||
/*
|
||||
Copyright (c) 2025, GigaDevice Semiconductor Inc.
|
||||
|
||||
Redistribution and use in source and binary forms, with or without modification,
|
||||
are permitted provided that the following conditions are met:
|
||||
|
||||
1. Redistributions of source code must retain the above copyright notice, this
|
||||
list of conditions and the following disclaimer.
|
||||
2. Redistributions in binary form must reproduce the above copyright notice,
|
||||
this list of conditions and the following disclaimer in the documentation
|
||||
and/or other materials provided with the distribution.
|
||||
3. Neither the name of the copyright holder nor the names of its contributors
|
||||
may be used to endorse or promote products derived from this software without
|
||||
specific prior written permission.
|
||||
|
||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
|
||||
IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
|
||||
INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
|
||||
NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
||||
PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
|
||||
WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
|
||||
OF SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
#ifndef GD32E23X_IT_H
|
||||
#define GD32E23X_IT_H
|
||||
|
||||
#include "gd32e23x.h"
|
||||
|
||||
/* function declarations */
|
||||
/* this function handles NMI exception */
|
||||
void NMI_Handler(void);
|
||||
/* this function handles HardFault exception */
|
||||
void HardFault_Handler(void);
|
||||
/* this function handles SVC exception */
|
||||
void SVC_Handler(void);
|
||||
/* this function handles PendSV exception */
|
||||
void PendSV_Handler(void);
|
||||
/* this function handles SysTick exception */
|
||||
void SysTick_Handler(void);
|
||||
|
||||
#endif /* GD32E23X_IT_H */
|
58
Inc/gd32e23x_libopt.h
Normal file
58
Inc/gd32e23x_libopt.h
Normal file
@@ -0,0 +1,58 @@
|
||||
/*!
|
||||
\file gd32e23x_libopt.h
|
||||
\brief library optional for gd32e23x
|
||||
|
||||
\version 2025-02-10, V2.4.0, demo for GD32E23x
|
||||
*/
|
||||
|
||||
/*
|
||||
Copyright (c) 2025, GigaDevice Semiconductor Inc.
|
||||
|
||||
Redistribution and use in source and binary forms, with or without modification,
|
||||
are permitted provided that the following conditions are met:
|
||||
|
||||
1. Redistributions of source code must retain the above copyright notice, this
|
||||
list of conditions and the following disclaimer.
|
||||
2. Redistributions in binary form must reproduce the above copyright notice,
|
||||
this list of conditions and the following disclaimer in the documentation
|
||||
and/or other materials provided with the distribution.
|
||||
3. Neither the name of the copyright holder nor the names of its contributors
|
||||
may be used to endorse or promote products derived from this software without
|
||||
specific prior written permission.
|
||||
|
||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
|
||||
IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
|
||||
INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
|
||||
NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
||||
PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
|
||||
WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
|
||||
OF SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
#ifndef GD32E23X_LIBOPT_H
|
||||
#define GD32E23X_LIBOPT_H
|
||||
|
||||
#include "gd32e23x_adc.h"
|
||||
#include "gd32e23x_crc.h"
|
||||
#include "gd32e23x_dbg.h"
|
||||
#include "gd32e23x_dma.h"
|
||||
#include "gd32e23x_exti.h"
|
||||
#include "gd32e23x_fmc.h"
|
||||
#include "gd32e23x_gpio.h"
|
||||
#include "gd32e23x_syscfg.h"
|
||||
#include "gd32e23x_i2c.h"
|
||||
#include "gd32e23x_fwdgt.h"
|
||||
#include "gd32e23x_pmu.h"
|
||||
#include "gd32e23x_rcu.h"
|
||||
#include "gd32e23x_rtc.h"
|
||||
#include "gd32e23x_spi.h"
|
||||
#include "gd32e23x_timer.h"
|
||||
#include "gd32e23x_usart.h"
|
||||
#include "gd32e23x_wwdgt.h"
|
||||
#include "gd32e23x_misc.h"
|
||||
#include "gd32e23x_cmp.h"
|
||||
|
||||
#endif /* GD32E23X_LIBOPT_H */
|
127
Inc/i2c.h
Normal file
127
Inc/i2c.h
Normal file
@@ -0,0 +1,127 @@
|
||||
//
|
||||
// Created by dell on 24-12-20.
|
||||
//
|
||||
|
||||
#ifndef I2C_H
|
||||
#define I2C_H
|
||||
|
||||
#include "gd32e23x_it.h"
|
||||
#include "gd32e23x.h"
|
||||
#include "systick.h"
|
||||
#include <stdbool.h>
|
||||
#include <string.h>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <math.h>
|
||||
|
||||
#include "board_config.h"
|
||||
|
||||
/******************************************************************************/
|
||||
|
||||
#define I2C_SPEED 100000U /* 100kHz */
|
||||
#define I2C_TIME_OUT 5000U /* 5000 loops timeout */
|
||||
#define I2C_MAX_RETRY 3U /* Maximum retry attempts */
|
||||
#define I2C_DELAY_10US 10U /* Delay in microseconds for bus reset */
|
||||
#define I2C_RECOVERY_CLOCKS 9U /* Clock pulses for bus recovery */
|
||||
#define I2C_MASTER_ADDRESS 0x00U /* Master address (not used) */
|
||||
|
||||
/* Legacy compatibility */
|
||||
#define I2C_OK 1
|
||||
#define I2C_FAIL 0
|
||||
#define I2C_END 1
|
||||
|
||||
/******************************************************************************/
|
||||
|
||||
/* I2C result enumeration */
|
||||
typedef enum {
|
||||
I2C_RESULT_SUCCESS = 0, /* Operation successful */
|
||||
I2C_RESULT_TIMEOUT, /* Timeout occurred */
|
||||
I2C_RESULT_NACK, /* No acknowledge received */
|
||||
I2C_RESULT_BUS_BUSY, /* Bus is busy */
|
||||
I2C_RESULT_ERROR, /* General error */
|
||||
I2C_RESULT_INVALID_PARAM, /* Invalid parameter */
|
||||
I2C_RECOVERY_OK,
|
||||
I2C_RECOVERY_SDA_STUCK_LOW,
|
||||
I2C_RECOVERY_SCL_STUCK_LOW
|
||||
} i2c_result_t;
|
||||
|
||||
/* I2C state machine enumeration */
|
||||
typedef enum {
|
||||
I2C_STATE_IDLE = 0, /* Idle state */
|
||||
I2C_STATE_START, /* Generate start condition */
|
||||
I2C_STATE_SEND_ADDRESS, /* Send slave address */
|
||||
I2C_STATE_CLEAR_ADDRESS, /* Clear address flag */
|
||||
I2C_STATE_TRANSMIT_REG, /* Transmit register address */
|
||||
I2C_STATE_TRANSMIT_DATA, /* Transmit data */
|
||||
I2C_STATE_RESTART, /* Generate restart condition */
|
||||
I2C_STATE_RECEIVE_DATA, /* Receive data */
|
||||
I2C_STATE_STOP, /* Generate stop condition */
|
||||
I2C_STATE_ERROR, /* Error state */
|
||||
I2C_STATE_END
|
||||
} i2c_state_t;
|
||||
|
||||
/******************************************************************************/
|
||||
|
||||
|
||||
/* Function declarations */
|
||||
/*!
|
||||
\brief configure the I2C interface
|
||||
\param[in] none
|
||||
\param[out] none
|
||||
\retval i2c_result_t
|
||||
*/
|
||||
i2c_result_t i2c_config(void);
|
||||
|
||||
/*!
|
||||
\brief reset I2C bus with proper recovery
|
||||
\param[in] none
|
||||
\param[out] none
|
||||
\retval i2c_result_t
|
||||
*/
|
||||
i2c_result_t i2c_bus_reset(void);
|
||||
|
||||
/*!
|
||||
\brief scan I2C bus for devices
|
||||
\param[in] none
|
||||
\param[out] none
|
||||
\retval none
|
||||
*/
|
||||
void i2c_scan(void);
|
||||
|
||||
/*!
|
||||
\brief write 16-bit data to I2C device
|
||||
\param[in] slave_addr: 7-bit slave address
|
||||
\param[in] reg_addr: register address
|
||||
\param[in] data: pointer to 2-byte data array
|
||||
\param[out] none
|
||||
\retval i2c_result_t
|
||||
*/
|
||||
i2c_result_t i2c_write_16bits(uint8_t slave_addr, uint8_t reg_addr, uint8_t data[2]);
|
||||
|
||||
/*!
|
||||
\brief read 16-bit data from I2C device
|
||||
\param[in] slave_addr: 7-bit slave address
|
||||
\param[in] reg_addr: register address
|
||||
\param[out] data: pointer to 2-byte data buffer
|
||||
\retval i2c_result_t
|
||||
*/
|
||||
i2c_result_t i2c_read_16bits(uint8_t slave_addr, uint8_t reg_addr, uint8_t *data);
|
||||
|
||||
/*!
|
||||
\brief read 16-bit data from I2C device
|
||||
\param[in] slave_addr: 7-bit slave address
|
||||
\param[in] reg_addr: register address
|
||||
\param[out] data: pointer to 2-byte data buffer
|
||||
\retval i2c_result_t
|
||||
*/
|
||||
i2c_result_t i2c_read_16bits(uint8_t slave_addr, uint8_t reg_addr, uint8_t *data);
|
||||
|
||||
/*!
|
||||
\brief get status string for debugging
|
||||
\param[in] status: i2c_result_t value
|
||||
\param[out] none
|
||||
\retval const char* status string
|
||||
*/
|
||||
const char* i2c_get_status_string(i2c_result_t status);
|
||||
|
||||
#endif //I2C_H
|
13
Inc/led.h
Normal file
13
Inc/led.h
Normal file
@@ -0,0 +1,13 @@
|
||||
#ifndef LED_H
|
||||
#define LED_H
|
||||
|
||||
#include "gd32e23x.h"
|
||||
#include "board_config.h"
|
||||
|
||||
void led_init(void);
|
||||
void led_on(void);
|
||||
void led_off(void);
|
||||
void led_toggle(void);
|
||||
void led_heart_beat(void);
|
||||
|
||||
#endif // LED_H
|
36
Inc/systick.h
Normal file
36
Inc/systick.h
Normal file
@@ -0,0 +1,36 @@
|
||||
/**
|
||||
* ************************************************************************
|
||||
*
|
||||
* @file systick.h
|
||||
* @author GD32
|
||||
* @brief
|
||||
*
|
||||
* ************************************************************************
|
||||
* @copyright Copyright (c) 2024 GD32
|
||||
* ************************************************************************
|
||||
*/
|
||||
#ifndef SYS_TICK_H
|
||||
#define SYS_TICK_H
|
||||
|
||||
#include <stdint.h>
|
||||
|
||||
/* function declarations */
|
||||
/* configure systick */
|
||||
void systick_config(void);
|
||||
|
||||
/* delay a time in 10 microseconds */
|
||||
void delay_10us(uint32_t count);
|
||||
|
||||
/* delay a time in milliseconds */
|
||||
void delay_ms(uint32_t count);
|
||||
|
||||
/* decrement delay counters */
|
||||
void delay_decrement(void);
|
||||
|
||||
// /* delay function that doesn't interfere with SysTick interrupt */
|
||||
// void delay_ms_safe(uint32_t count);
|
||||
|
||||
// /* delay a time in microseconds (safe version) */
|
||||
// void delay_us_safe(uint32_t count);
|
||||
|
||||
#endif /* SYS_TICK_H */
|
8
Inc/uart.h
Normal file
8
Inc/uart.h
Normal file
@@ -0,0 +1,8 @@
|
||||
#ifndef UART_H
|
||||
#define UART_H
|
||||
|
||||
#include "gd32e23x.h"
|
||||
|
||||
void rs485_init(void);
|
||||
|
||||
#endif // UART_H
|
119
Inc/uart_ring_buffer.h
Normal file
119
Inc/uart_ring_buffer.h
Normal file
@@ -0,0 +1,119 @@
|
||||
/**
|
||||
* @file uart_ring_buffer.h
|
||||
* @brief 简单高效的环形接收缓冲区(字节队列)接口声明。
|
||||
* @details 提供字节写入/读取、可读长度查询、清空与丢弃统计等 API,
|
||||
* 适用于中断接收(写)与主循环解析(读)的典型嵌入式串口场景。
|
||||
*/
|
||||
#ifndef UART_RING_BUFFER_H
|
||||
#define UART_RING_BUFFER_H
|
||||
|
||||
#include <stdint.h>
|
||||
#include <stdbool.h>
|
||||
|
||||
/**
|
||||
* @def UART_RX_BUFFER_SIZE
|
||||
* @brief 接收环形缓冲区容量(单位:字节)。
|
||||
* @note 采用“预留一格”区分空/满策略,最大可用容量为 UART_RX_BUFFER_SIZE-1。
|
||||
*/
|
||||
#define UART_RX_BUFFER_SIZE 64
|
||||
|
||||
/**
|
||||
* @defgroup RingBuffer 环形缓冲区
|
||||
* @brief 字节环形缓冲区(接收端)
|
||||
* @{
|
||||
*/
|
||||
|
||||
/**
|
||||
* @section RingBuffer_Usage 使用说明
|
||||
* 典型用法:中断接收(写入环形缓冲)、主循环解析(读取环形缓冲)。
|
||||
*
|
||||
* 1) 初始化
|
||||
* @code{.c}
|
||||
* uart_ring_buffer_init();
|
||||
* @endcode
|
||||
*
|
||||
* 2) 使能串口接收非空中断(RBNE)并开启中断(以 USART0 为例)
|
||||
* @code{.c}
|
||||
* usart_interrupt_enable(USART0, USART_INT_RBNE);
|
||||
* nvic_irq_enable(USART0_IRQn, 2, 0); // 根据工程需要设置优先级
|
||||
* @endcode
|
||||
*
|
||||
* 3) 在中断服务函数中写入环形缓冲(参考你当前工程的写法)
|
||||
* @code{.c}
|
||||
* void USART0_IRQHandler(void) {
|
||||
* if (RESET != usart_interrupt_flag_get(USART0, USART_INT_FLAG_RBNE)) {
|
||||
* uint8_t data = usart_data_receive(USART0);
|
||||
* (void)uart_ring_buffer_put(data); // 缓冲满时丢弃并计数
|
||||
* }
|
||||
* }
|
||||
* @endcode
|
||||
*
|
||||
* 4) 在主循环中读取处理
|
||||
* @code{.c}
|
||||
* while (uart_ring_buffer_available() > 0) {
|
||||
* int b = uart_ring_buffer_get();
|
||||
* if (b >= 0) {
|
||||
* // 处理字节 b
|
||||
* }
|
||||
* }
|
||||
* @endcode
|
||||
*
|
||||
* @note 缓冲区满时新字节会被丢弃,可用 uart_ring_buffer_drop_count() 查看累计丢弃数。
|
||||
* @note 采用“预留一格”区分空/满,最大可用容量为 UART_RX_BUFFER_SIZE-1。
|
||||
*/
|
||||
|
||||
/**
|
||||
* @brief 初始化环形缓冲区。
|
||||
* @details 复位读/写索引与丢弃计数,准备接收数据。
|
||||
* @note 若在中断环境使用,初始化前建议关闭相关接收中断以避免并发竞争。
|
||||
* @ingroup RingBuffer
|
||||
*/
|
||||
void uart_ring_buffer_init(void);
|
||||
|
||||
/**
|
||||
* @brief 获取当前可读的字节数。
|
||||
* @details 返回范围为 [0, UART_RX_BUFFER_SIZE-1]。
|
||||
* @return 可读字节数(uint8_t)。
|
||||
* @note 预留一个空槽区分“空/满”,因此满时返回 UART_RX_BUFFER_SIZE-1。
|
||||
* @ingroup RingBuffer
|
||||
*/
|
||||
uint8_t uart_ring_buffer_available(void);
|
||||
|
||||
/**
|
||||
* @brief 从环形缓冲区读取一个字节。
|
||||
* @details 若缓冲区非空,返回队头字节并推进读指针;若为空,返回 -1。
|
||||
* @return 读取到的字节(0..255),或 -1 表示缓冲区为空。
|
||||
* @retval -1 缓冲区为空,无数据可读。
|
||||
* @ingroup RingBuffer
|
||||
*/
|
||||
int uart_ring_buffer_get(void);
|
||||
|
||||
/**
|
||||
* @brief 向环形缓冲区写入一个字节。
|
||||
* @param data 待写入的字节。
|
||||
* @return 是否写入成功。
|
||||
* @retval true 写入成功。
|
||||
* @retval false 写入失败(缓冲区已满,数据被丢弃并计数)。
|
||||
* @note 如需改为“覆盖写入”策略,可在满时先推进读指针再写入。
|
||||
* @ingroup RingBuffer
|
||||
*/
|
||||
bool uart_ring_buffer_put(uint8_t data);
|
||||
|
||||
/**
|
||||
* @brief 清空环形缓冲区。
|
||||
* @details 复位读/写索引与丢弃计数,相当于逻辑上丢弃所有已接收数据,不擦除数据区内容。
|
||||
* @ingroup RingBuffer
|
||||
*/
|
||||
void uart_ring_buffer_clear(void);
|
||||
|
||||
/**
|
||||
* @brief 获取因缓冲区满而被丢弃的字节累计数量。
|
||||
* @details 该计数在 init/clear 时清零。
|
||||
* @return 丢弃的累计字节数。
|
||||
* @ingroup RingBuffer
|
||||
*/
|
||||
uint32_t uart_ring_buffer_drop_count(void);
|
||||
|
||||
/** @} */
|
||||
|
||||
#endif // UART_RING_BUFFER_H
|
Reference in New Issue
Block a user