使用ISP中的"收到用户命令后复位到ISP监控程序区"时也只是单片机重启.失败.(已解决)
使用ISP中的"收到用户命令后复位到ISP监控程序区"时单片机会重启,然后又跑起了代码.只是重启,STCISP软件一直是在检测中.工程环境:8H8K64U ,30MHZ,使用了stc_usb_cdc_8h_xdata.LIB 库实现的CDC,
请问这个是什么问题造成的? 单片机没有控制电源断电,电源是直通模式, 这一点不用考虑.
注:已选择上电复位使用较长延时
因为使用了官方USB库,所以不能直接使用官方默认的命令"@STCISP#",要使用一个自定义的命令("@ABCDEF#"),并在数据接收处理函数中加入自定义命令处理的过程
if(bUsbOutReady)
{
if(UsbOutBuffer=='@')
{
if(UsbOutBuffer=='A')
{
if(UsbOutBuffer=='B')
{
if(UsbOutBuffer=='C')
{
if(UsbOutBuffer=='D')
{
if(UsbOutBuffer=='E')
{
if(UsbOutBuffer=='F')
{
if(UsbOutBuffer=='#')
{
USBCON = 0x00; //清除USB设置
USBCLK = 0x00;
IRC48MCR = 0x00;
P30 = 0; //端口设置为低电平不然有概率不能复位成功
P31 = 0; //端口设置为低电平不然有概率不能复位成功
delay_ms(100);//加个延时
IAP_CONTR = 0x60; //复位到系统区 不管P32的状态,
}
}
}
}
}
}
}
}
usb_OUT_done();
}
复位到ISP监控程序区
IAP_CONTR=0x60 STCISP 点击 下载按钮后,用硬件按钮进行ISP复位::::::依然不行.
当KEY(P32)按下时holdkey_time计时变量在定时器中断中进行计时;当到达时间后,使用软件复位 IAP_CONTR = 0x60;//复位到系统区. 结果单片机只是重启后又跑起了代码.
while(!KEY)
{
if(holdkey_time>=20)
{
//有没有这三句,结果一样↓
USBCON = 0x00; //清除USB设置
USBCLK = 0x00;
IRC48MCR = 0x00;
//有没有这三句,结果一样↑
delay_ms(10); //检测到正确的命令序列后复位到系统区,此处的延时可省去
IAP_CONTR = 0x60; //复位到系统区
while (1);
}
}
holdkey_time = 0;
手册中也是这样给出的用法,为什么就是不行呢,单片机只是重启.
用什么板子? 手动复位到系统区(按键是P32,代码中检测长按P32),添加了P30 P31置0后,使MCU重启时P30 P31 P32为低电平,符合手册中的提示,,,,,,可以正常使用了,,,,软件复位到系统区的还没有找到更可靠的办法
页:
[1]