利用自制的实验电路板测试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数据,发现并没有能够使得单片机内部的程序发生改变。依然具有可以执行的程序在里面。
|