打印
[MM32硬件]

利用SeekFree的核心板调试MM32F3277的ISP功能

[复制链接]
854|1
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
tpgf|  楼主 | 2021-12-27 12:06 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
利用自制的实验电路板测试MM32的ISP功能,结果首次进入ISP功能受到挫折。根据MindMotion SuYong的建议,可以首先使用现成的MM32F3277开否决(来自于SeekFree的开发板)进行促成为好。他自己测试过在该板上可以实现ISP功能。



▲ 图1.1 来自于SeekFree的核心板

一、进入ISP模式
  通过核心板上的BOOT0按钮以及RST按钮,可以将MM32F3277设置进入ISP功能,通过万用表测量UART1的TXD(PA9)输出为高电平。显示应该是进入了ISP模式。

1、测试握手命令
  设置波特率为9600,根据 MM32 ISP 协议 测试握手信息。

(1)发送程序
int MM32SendCommand(unsigned char * pucBuffer, int nLength, int nReceiveLength) {
    unsigned char ucSendBuffer[0x100];

    ucSendBuffer[0] = 0x50;
    int nCmdLength = nLength + 4;
    ucSendBuffer[1] = (unsigned char)(nCmdLength / 0x100);
    ucSendBuffer[2] = (unsigned char)(nCmdLength % 0x100);

    int i;
    for(i = 0; i < nLength; i ++)
        ucSendBuffer[3 + i] = *(pucBuffer + i);

    unsigned char ucCheck = 0x0;
    for(i = 0; i < nCmdLength - 1; i ++)
        ucCheck += ucSendBuffer;

    ucSendBuffer[nCmdLength - 1] = ucCheck;

    ClearPort(PORT1);
    SendCharDim(ucSendBuffer, nCmdLength, PORT1);

    for(i = 0; i < nReceiveLength; i ++) {
        unsigned char c;
        if(ReceCharL(&c, PORT1, 100) != 0) break;
        *(pucBuffer + i) = c;
    }

    return i;
}

(2)接收到信息
>> Open COM1, baud : 9600
Return:9
53 00 09 00 55 00 00 00 b1


 注意到,这个返回与ISP手册中给出返回信息并不相符。

2、波特率设置

▲ 图1.1.1 设置协议


>> Open COM1, baud : 9600
Return:9
53 00 09 00 55 00 00 00 b1
Return:12
53 00 0c 20 56 33 38 31 03 c0 00 34


问题: 设置了波特率之后,但修改上位机的波特率,并无法与下位机进行通信。这说明下位机并没有能够完成波特率的更新。

3、烧写程序(1)实现代码
int MM32SendData(unsigned char * pucData, int nLength, int nAllData, int nDataID) {
    unsigned char ucBuffer[0x1000];

    ucBuffer[0] = 0x01;

    ucBuffer[1] = (unsigned char)(nAllData >> 24);
    ucBuffer[2] = (unsigned char)(nAllData >> 16);
    ucBuffer[3] = (unsigned char)(nAllData >> 8);
    ucBuffer[4] = (unsigned char)(nAllData);

    ucBuffer[5] = (unsigned char)(nDataID>> 24);
    ucBuffer[6] = (unsigned char)(nDataID >> 16);
    ucBuffer[7] = (unsigned char)(nDataID >> 8);
    ucBuffer[8] = (unsigned char)(nDataID);

    int i;
    for(i = 0; i < 256; i ++) {
        unsigned char c;
        if(i < nLength) c = *(pucData + i);
        else c = 0xff;
        ucBuffer[i + 9] = c;
    }

    int nReturn = MM32SendCommand(ucBuffer, 0x109, 9);

    char szString[0x1000];
    sprintf(szString, "Return:%d\r\n", nReturn);

    char szTemp[1024];
    for(i = 0; i < nReturn; i ++) {
        sprintf(szTemp, "%02x ", ucBuffer);
        strcat(szString, szTemp);
    }

    MainForm->ShowInfor(szString);

    return 0;
}


(2)程序返回
Return:9
53 00 09 00 55 00 00 10 c1
Return:9
53 00 09 01 00 00 00 01 5e
Return:9
53 00 09 01 00 00 00 02 5f
Return:9
53 00 09 01 00 00 00 03 60
Return:9
53 00 09 01 00 00 00 04 61

通过这种方式写入0x100数据,发现并没有能够使得单片机内部的程序发生改变。依然具有可以执行的程序在里面。



使用特权

评论回复
沙发
七毛钱| | 2021-12-27 14:35 | 只看该作者
照片违规

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1923

主题

15596

帖子

11

粉丝