29aH 发表于 2024-12-31 15:25:01

我做了一套OTA的工具,包含固件及上位机

jwd 发表于 2025-3-2 15:20:45

{:4_174:}

xwecbdob 发表于 2025-7-2 22:07:14

求教一下各位大佬,ota刷机过程中断电了。主程序不全丢失,官方说必须要将p3.3链接gnd!有没有别的办法解决!刷机失败,程序不完整 就从新进入刷机模式,如何实现!我现在有时候 AP程序没有刷完,断电,在插电,并没有进入刷机模式!

ercircle 发表于 2025-7-2 22:13:43

xwecbdob 发表于 2025-7-2 22:07
求教一下各位大佬,ota刷机过程中断电了。主程序不全丢失,官方说必须要将p3.3链接gnd!有没有别的办法解决 ...

强制进ISP的办法也是自定义的,可以自己更改引脚。
刷一半问题,例程里只校验前几个字节,可以更改逻辑:
可以刷完了ISP给EEPROM某个地址置位,刷前清除置位。
可以ISP里自定义加完整的CRC校验。

uqutbtpx 发表于 2025-10-7 22:23:54

神农鼎 发表于 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]
查看完整版本: 32G可以做 ISP / OTA 升级么?