feat: 完善Mesh继电器OTA升级闭环
This commit is contained in:
+50
-23
@@ -16,7 +16,24 @@ static volatile uint8_t rx_write_index;
|
||||
/** 环形缓存读取位置,由上层协议任务推进。 */
|
||||
static volatile uint8_t rx_read_index;
|
||||
|
||||
/** 初始化 UART1;后续接入 JDY-28M 的 9600 baud 配置。 */
|
||||
/**
|
||||
* 将一个字节写入接收环形缓冲区。
|
||||
*
|
||||
* 该函数只由 UART1 接收中断调用。缓冲区满时丢弃新字节,绝不覆盖尚未
|
||||
* 被主循环读取的数据,避免破坏正在解析的 Mesh 帧。
|
||||
*/
|
||||
static void Uart1_RxPush(uint8_t value)
|
||||
{
|
||||
uint8_t next_index = (uint8_t)((rx_write_index + 1u) &
|
||||
(UART1_RX_BUFFER_SIZE - 1u));
|
||||
if (next_index != rx_read_index)
|
||||
{
|
||||
rx_buffer[rx_write_index] = value;
|
||||
rx_write_index = next_index;
|
||||
}
|
||||
}
|
||||
|
||||
/** 初始化 UART1,并开启 UART1 接收寄存器非空中断。 */
|
||||
void Uart1_Init(void)
|
||||
{
|
||||
/* 先关闭 UART,再配置 9600 baud@16 MHz:BRR=0x0683。 */
|
||||
@@ -25,36 +42,21 @@ void Uart1_Init(void)
|
||||
REG8(UART1_BRR1_ADDR) = 0x68u;
|
||||
REG8(UART1_CR1_ADDR) = 0x00u;
|
||||
REG8(UART1_CR3_ADDR) = 0x00u;
|
||||
/* RE=1、TE=1、接收中断暂不打开,环形缓冲区接入后再开启。 */
|
||||
REG8(UART1_CR2_ADDR) = 0x0Cu;
|
||||
rx_write_index = 0u;
|
||||
rx_read_index = 0u;
|
||||
/* RE=1、TE=1、RIEN=1:接收数据由UART1中断保存到环形缓冲区。 */
|
||||
REG8(UART1_CR2_ADDR) = 0x2Cu;
|
||||
}
|
||||
|
||||
/**
|
||||
* 轮询 UART1 接收状态并保存字节。
|
||||
* UART1接收任务入口。
|
||||
*
|
||||
* 本阶段先采用轮询方式,避免在尚未建立中断向量表前引入中断链接问题。
|
||||
* 后续如果业务帧速率提高,可将同一环形缓冲区写入逻辑迁移到 UART RX 中断。
|
||||
* 接收字节已经由 UART1 接收中断写入环形缓冲区,因此主循环不再轮询UART
|
||||
* 硬件寄存器。保留该接口是为了维持主循环结构和后续扩展接口兼容性。
|
||||
*/
|
||||
void Uart1_Task(void)
|
||||
{
|
||||
uint8_t next_index;
|
||||
|
||||
while ((REG8(UART1_SR_ADDR) & 0x20u) != 0u)
|
||||
{
|
||||
next_index = (uint8_t)((rx_write_index + 1u) & (UART1_RX_BUFFER_SIZE - 1u));
|
||||
|
||||
/* 缓冲区满时丢弃当前字节,避免覆盖尚未处理的完整帧。 */
|
||||
if (next_index == rx_read_index)
|
||||
{
|
||||
(void)REG8(UART1_DR_ADDR);
|
||||
continue;
|
||||
}
|
||||
|
||||
rx_buffer[rx_write_index] = REG8(UART1_DR_ADDR);
|
||||
rx_write_index = next_index;
|
||||
}
|
||||
/* UART硬件接收由Uart1_InterruptHandler()完成,此处无需执行任何操作。 */
|
||||
}
|
||||
|
||||
/** 发送一个字节;当前阶段不连接真实 UART 寄存器。 */
|
||||
@@ -85,7 +87,32 @@ uint8_t Uart1_Available(void)
|
||||
return (uint8_t)((rx_write_index - rx_read_index) & (UART1_RX_BUFFER_SIZE - 1u));
|
||||
}
|
||||
|
||||
/** UART1 接收中断入口占位。 */
|
||||
/**
|
||||
* UART1接收中断处理函数。
|
||||
*
|
||||
* STM8S003F3 UART1接收中断向量为19。中断中只读取状态和数据寄存器,
|
||||
* 将无错误字节快速放入环形缓冲区;协议解析、CRC和业务控制全部放在主循环。
|
||||
*/
|
||||
void Uart1_InterruptHandler(void)
|
||||
{
|
||||
uint8_t status = REG8(UART1_SR_ADDR);
|
||||
uint8_t value;
|
||||
|
||||
if ((status & 0x0Fu) != 0u)
|
||||
{
|
||||
/* STM8 UART错误标志需要先读SR再读DR清除;错误字节不送入协议层。 */
|
||||
value = REG8(UART1_DR_ADDR);
|
||||
(void)value;
|
||||
}
|
||||
else if ((status & 0x20u) != 0u)
|
||||
{
|
||||
value = REG8(UART1_DR_ADDR);
|
||||
Uart1_RxPush(value);
|
||||
}
|
||||
}
|
||||
|
||||
/** UART1接收寄存器非空中断向量,IRQ号19。 */
|
||||
void Uart1_RX_IRQHandler(void) __interrupt(19)
|
||||
{
|
||||
Uart1_InterruptHandler();
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user