{:4_174:} 求教一下各位大佬,ota刷机过程中断电了。主程序不全丢失,官方说必须要将p3.3链接gnd!有没有别的办法解决!刷机失败,程序不完整 就从新进入刷机模式,如何实现!我现在有时候 AP程序没有刷完,断电,在插电,并没有进入刷机模式!
xwecbdob 发表于 2025-7-2 22:07
求教一下各位大佬,ota刷机过程中断电了。主程序不全丢失,官方说必须要将p3.3链接gnd!有没有别的办法解决 ...
强制进ISP的办法也是自定义的,可以自己更改引脚。
刷一半问题,例程里只校验前几个字节,可以更改逻辑:
可以刷完了ISP给EEPROM某个地址置位,刷前清除置位。
可以ISP里自定义加完整的CRC校验。 神农鼎 发表于 2022-12-18 10:36
如下,拿去简单改下通信协议就行了,STC 是ISP/IAP的全球领导者
深圳国芯人工智能有限公司-在线升级 (stca ...
#include "stc.h"
#include "uart.h"
BOOL bUartRxReady;
BYTE UartrecvIndex;
BYTE UartRecvStep;
BYTE UartRecvSum;
BYTE edata UartTxBuffer;
BYTE edata UartRxBuffer;
void uart_init()
{
// UART3引脚配置 - P5.0(RXD3), P5.1(TXD3)
// 设置P5.0为高阻输入(RXD3) - 只保留一次配置
P5M0 &= ~(1 << 0);// P5M0.0 = 0
P5M1 |= (1 << 0); // P5M1.0 = 1 → 高阻输入
// 添加P5.1为推挽输出(TXD3) - 之前缺失的配置
P5M0 |= (1 << 1); // P5M0.1 = 1
P5M1 &= ~(1 << 1);// P5M1.1 = 0 → 推挽输出
// UART3初始化
S3CON = 0x10; // 8位数据,可变波特率
S3CON &= 0xBF; // 串口3选择定时器2为波特率发生器
AUXR |= 0x04; // 定时器时钟1T模式
// 统一使用BAUD宏,移除固定的0xCC,0xFF
T2L = BAUD; // 设置定时初始值低位
T2H = BAUD >> 8; // 设置定时初始值高位
AUXR |= 0x10; // 定时器2开始计时
// 使能UART3接收(轮询方式,不使能中断)
S3CON |= 0x01; // 使能接收 (REN3=1)
uart_recv_done();
}
// 建议将函数名改为uart_poll以明确是轮询方式
void uart_isr()// 考虑改为 uart_poll()
{
BYTE dat;
// 检查UART3接收中断标志(轮询方式)
if (S3CON & 0x01) // 检查RI3标志
{
S3CON &= ~0x01; // 清除RI3标志
dat = S3BUF; // 读取接收数据
UartRecvSum += dat;
switch (UartRecvStep)
{
case 0:
L_CheckHead:
UartRecvStep = ((UartRecvSum = dat) == '#');
break;
case 1:
UartRxBuffer = dat;
UartrecvIndex = 0;
UartRecvStep++;
break;
case 2:
UartRxBuffer = dat;
if (UartrecvIndex >= UartRxBuffer)
UartRecvStep++;
break;
case 3:
if (dat != '$') goto L_CheckHead;
UartRecvStep++;
break;
case 4:
if (UartRecvSum != 0) goto L_CheckHead;
bUartRxReady = 1;
UartRecvStep++;
break;
default:
break;
}
}
}
static BYTE send(BYTE dat)
{
// 等待UART3发送缓冲区空
while (!(S3CON & 0x02));// 等待TI3标志
S3CON &= ~0x02; // 清除TI3标志
S3BUF = dat; // 发送数据
return dat;
}
void uart_send(BYTE status, BYTE size)
{
BYTE sum;
BYTE i;
sum = send('@');
sum += send(status);
sum += send(size);
if (size)
{
for (i = 0; i < size; i++)
{
sum += send(UartTxBuffer);
}
}
sum += send('$');
send(-sum);
// 等待发送完成
while (!(S3CON & 0x02));
}
void uart_recv_done()
{
bUartRxReady = 0;
UartrecvIndex = 0;
UartRecvStep = 0;
UartRecvSum = 0;
}
我把STC32的ISP代码改成串口3下载,然后通过蓝牙下载,发现下载不了,并且波特率设置没问题,连接无问题,可以给我看看问题在哪吗
页:
1
[2]