revert Merge pull request 'dev' (#1) from dev into main

Reviewed-on: #1
This commit is contained in:
2025-08-25 17:34:39 +08:00
parent 3ad18bf1f1
commit 3e42b474d1
12 changed files with 174 additions and 241 deletions

View File

@@ -18,7 +18,6 @@
#include "board_config.h"
#include "gd32e23x_usart.h"
#include "ultrasonic_analog.h"
#include "systick.h"
/* ============================================================================
* 协议格式说明
@@ -30,7 +29,7 @@
* @details
* Host -> Device 命令帧格式:
* [0] HEADER = 0xD5 // 包头标识
* [1] BOARD_TYPE = 0x04 // 板卡类型标识
* [1] BOARD_TYPE = 0x03 // 板卡类型标识
* [2] LEN = 数据区字节数 // 有效载荷长度
* [3..(3+LEN-1)] 数据 // 命令数据,如 "M1", "M2S123"
* [last] CRC = 校验码 // 从索引1到(last-1)的累加和低8位
@@ -155,6 +154,13 @@ static void send_response(uint8_t type, const uint8_t *payload, uint8_t len)
// 等待发送完成
while (usart_flag_get(RS485_PHY, USART_FLAG_TC) == RESET) {}
// // 使用printf发送通过重定向到串口
// for (uint8_t i = 0; i < buf_len; i++) {
// printf("%c", buf[i]);
// }
// // 刷新缓冲区
// fflush(stdout);
}
/**
@@ -247,25 +253,20 @@ void handle_command(const uint8_t *frame, uint8_t len) {
if (cmd_index == cmd_len) {
// 仅基础命令,如 M1, M2, M3
switch (base_cmd) {
case 1u: // M1: send ultrasonic driver single and respon raw data
// 启动超声波PWM发送
case 1u: // M1: enable sensor report
// g_ultrasonic_measure_done = false;
ultrasonic_pwm_out_cycles();
uint16_t timeout_count = 0;
const uint16_t max_timeout = 150;
while (!g_ultrasonic_measure_done && timeout_count < max_timeout) {
delay_10us(1); // 延时 10us
timeout_count++;
}
gpio_bit_toggle(GPIOA, GPIO_PIN_0);
// 根据等待结果发送不同的响应
if (g_ultrasonic_measure_done) {
ultrasonic_distance_raw_value_report();
} else {
static const uint8_t timeout_error_data[] = {0xFF, 0xFF };
send_response(RESP_TYPE_OK, timeout_error_data, sizeof(timeout_error_data));
while (g_ultrasonic_measure_done)
{
g_ultrasonic_measure_done = false;
send_response(RESP_TYPE_OK, s_report_status_err, sizeof(s_report_status_err));
return;
}
return;
case 2u: // M2: disable sensor report
send_response(RESP_TYPE_OK, s_report_status_ok, sizeof(s_report_status_ok));
@@ -309,6 +310,7 @@ void handle_command(const uint8_t *frame, uint8_t len) {
{
// case 100u:
// // set_pwm(param_value);
// printf("Set PWM to %u\n", param_value);
// return;
default:
@@ -416,32 +418,3 @@ void command_process(void) {
}
}
}
/**
* @brief 超声波测距原始值上报函数
* @details 读取超声波测距的定时器计数值,计算距离并按协议格式发送响应包
* 距离计算公式:距离(0.1mm) = 定时器计数值(us) * 17
* 响应数据格式4字节32位无符号整数单位为0.1mm
* @note 定时器配置为1us计数最大计时2000us对应距离340mm
* @ingroup Command
*/
void ultrasonic_distance_raw_value_report(void) {
uint8_t raw_result[2];
uint16_t raw_distance = 0;
// 读取定时器计数值(微秒)
uint16_t timer_count_us = timer_counter_read(US_ECHO_TIMER);
// 计算距离:定时器计数值 * 17 = 距离(0.1mm)
// 声速340m/s往返距离时间单位us
// 距离(mm) = (timer_count_us * 340) / (2 * 1000) = timer_count_us * 0.17
// 距离(0.1mm) = timer_count_us * 1.7 ≈ timer_count_us * 17 / 10
raw_distance = (uint16_t)timer_count_us * 17;
// 将16位距离值分解为2个字节大端序
raw_result[0] = (uint8_t)(raw_distance >> 8);
raw_result[1] = (uint8_t)(raw_distance & 0xFF);
// 发送响应包
send_response(RESP_TYPE_OK, raw_result, sizeof(raw_result));
}