找回密码
 立即注册
查看: 51|回复: 4

请教bootloader问题

[复制链接]

7

主题

7

回帖

107

积分

注册会员

积分
107
发表于 昨天 08:50 | 显示全部楼层 |阅读模式
为了学习bootloader做了个简单的ISP和APP,设计目标是通电先进入ISP 串口收到0X0A就跳到APP, APP串口收到0X0B就重启回到ISP.两个hex用HexMerge合并,一起刷入单片机 ,单片机是STC32G12K128。但是刷进去后,直接就进入APP,发0X0B重启还是APP。
ISP代码如下



#include "stc32g.h"   
#include "intrins.h"

#define FOSC 11059200UL
#define BRT (65536 - (FOSC / 115200+2) / 4)

bit busy;
char wptr;
char rptr;
char buffer[16];

void UartIsr() interrupt 4  
{
if (TI)
{
  TI = 0;
  busy = 0;
}
if (RI)
{
  RI = 0;
  buffer[wptr++] = SBUF;
  wptr &= 0x0f;
}
}

void UartInit()
{
SCON = 0x50;
T2L = BRT;
T2H = BRT >> 8;
S1BRT = 1;
T2x12 = 1;
T2R = 1;
wptr = 0x00;
rptr = 0x00;
busy = 0;
}

void UartSend(char dat)
{
while (busy);
busy = 1;
SBUF = dat;
}

void UartSendStr(char *p)
{
while (*p)
{
  UartSend(*p++);
}
}

void main()
{
char GetVa;
EAXFR = 1;
CKCON = 0x00;
WTST = 0x00;

P0M0 = 0x00;
P0M1 = 0x00;
P1M0 = 0x00;
P1M1 = 0x00;
P2M0 = 0x00;
P2M1 = 0x00;
P3M0 = 0x00;
P3M1 = 0x00;
P4M0 = 0x00;
P4M1 = 0x00;
P5M0 = 0x00;
P5M1 = 0x00;

UartInit();
ES = 1;
EA = 1;
UartSendStr("ISP Star !\r\n");
while (1)
{
  if (rptr != wptr)
  {
                GetVa=buffer[rptr++];
                if(GetVa==0x0A)
                {
                        UartSendStr("Go APP !\r\n");
                        EA = 0;         //?????
    ES = 0;         //??????
    AUXR &= ~(1<<2);//??T2???
    TI = 0;
    RI = 0;
    busy = 0;
    //????APP
    ((void (far *)())(0xff2000))();
    //??????,?????????????
    while(1);
                }
   UartSend(GetVa);
   rptr &= 0x0f;
  }
}
}


keil 设置如下

APP 代码如下

#include "stc32g.h"   //????????
#include "intrins.h"

#define FOSC 11059200UL //?????????,??????
#define BRT (65536 - (FOSC / 115200+2) / 4)
    //?2??????Keil???
    //??????????

bit busy;
char wptr;
char rptr;
char buffer[16];

void UartIsr() interrupt 4  
{
if (TI)
{
  TI = 0;
  busy = 0;
}
if (RI)
{
  RI = 0;
  buffer[wptr++] = SBUF;
  wptr &= 0x0f;
}
}

void UartInit()
{
SCON = 0x50;
T2L = BRT;
T2H = BRT >> 8;
S1BRT = 1;
T2x12 = 1;
T2R = 1;
wptr = 0x00;
rptr = 0x00;
busy = 0;
}

void UartSend(char dat)
{
while (busy);
busy = 1;
SBUF = dat;
}

void UartSendStr(char *p)
{ while (*p)
{
  UartSend(*p++);
}
}

void main()
{
         char GetVa;
EAXFR = 1; //????XFR,????????
CKCON = 0x00; //?????????????
WTST = 0x00;  //??????????,

P0M0 = 0x00;
P0M1 = 0x00;
P1M0 = 0x00;
P1M1 = 0x00;
P2M0 = 0x00;
P2M1 = 0x00;
P3M0 = 0x00;
P3M1 = 0x00;
P4M0 = 0x00;
P4M1 = 0x00;
P5M0 = 0x00;
P5M1 = 0x00;

UartInit();
ES = 1;
EA = 1;
UartSendStr("APP Strar !\r\n");
  
while (1)
{
  if (rptr != wptr)
  {
                GetVa=buffer[rptr++];
                if(GetVa==0x0B)
                {
                        IAP_CONTR = 0x20;        
                }
                 UartSend(0x01);
   UartSend(GetVa);
   rptr &= 0x0f;
  }
}
}
keil 设置如下


截图202609220846509511.jpg
截图202609220848222908.jpg
截图202609220848414440.jpg
截图202609220849358861.jpg
截图202609220849522078.jpg
回复

使用道具 举报 送花

已绑定手机

51

主题

2744

回帖

9547

积分

论坛元老

积分
9547
发表于 昨天 09:12 | 显示全部楼层
建议先用官方的在线升级例子测试,官方例子功能验证正常后,在例子基础上根据自身需要添加/修改功能。
例如添加串口收到指定数据进行跳转功能。
注意:STC32G12K128没有专用的用户ISP空间,所以用户ISP跟用户APP只能在其中一处使用中断。
例子是在用户ISP空间使用查询模式,用户APP空间使用中断模式。

官方在线升级例子下载页面:https://www.stcai.com/zxsj
截图202609220912543244.jpg
回复

使用道具 举报 送花

7

主题

7

回帖

107

积分

注册会员

积分
107
 楼主| 发表于 昨天 09:48 | 显示全部楼层
乘风*** 发表于 2026-9-22 09:12
建议先用官方的在线升级例子测试,官方例子功能验证正常后,在例子基础上根据自身需要添加/修改功能。
例如 ...

例子已经试过没问题,想自己一步步搭建bootlaoder。
回复

使用道具 举报 送花

已绑定手机

51

主题

2744

回帖

9547

积分

论坛元老

积分
9547
发表于 昨天 10:21 | 显示全部楼层
watlq*** 发表于 2026-9-22 09:48
例子已经试过没问题,想自己一步步搭建bootlaoder。

在例子框架上进行修改,避免设置出问题。
例子也是使用串口通信升级,修改串口指令判断处理函数就可以实现跳转功能。
回复

使用道具 举报 送花

7

主题

7

回帖

107

积分

注册会员

积分
107
 楼主| 发表于 昨天 11:50 | 显示全部楼层
乘风*** 发表于 2026-9-22 10:21
在例子框架上进行修改,避免设置出问题。
例子也是使用串口通信升级,修改串口指令判断处理函数就可以实 ...

我想自己一步步搭建平台,这个也是按照例子的设置来的
回复

使用道具 举报 送花

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

GMT+8, 2026-9-23 16:03 , Processed in 0.072707 second(s), 63 queries .

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表