该函数可以实现flash的写入操作,接下来我们需要定义一套通讯协议用于串口数据传输
//串口接收缓冲区 u8 serial_Buffer[SERIAL_MAX_LENGTH] = {0}; //串口接收数据长度 u16 serial_Buffer_Length = 0;
u8 receiveMode = 0;//接收参数的中断处理模型,为0的时候是命令模式,为1的时候为下载模式 u8 receiveExpectCount = 0;//串口期望接收长度
//串口中断处理 static void SerialRecv(u8 ch) { if(receiveMode == 0) { if((serial_Buffer_Length&0x8000)== 0x8000)//已经接收完成,系统还没处理 { serial_Buffer_Length |=0x8000;//退出 } elseif((serial_Buffer_Length&0x4000) == 0x4000)//接收到回车还没接收到换行 { if(ch ==‘\n‘)serial_Buffer_Length |= 0x8000; else { //一帧接受失败 serial_Buffer_Length =0; } } else { if((serial_Buffer_Length&0xff)< SERIAL_MAX_LENGTH) { if(ch ==‘\r‘)serial_Buffer_Length |= 0x4000; else { serial_Buffer[(serial_Buffer_Length&0xff)] = ch; serial_Buffer_Length++; } } else { //一帧接受失败 serial_Buffer_Length =0; } } } else { //下载模式,只控制字符串的量,数据的第一位是该数据包的长度,接收到这么多长度,接收完成位置一 //注意,在这种模式下,清除serial_Buffer_Length之前应当清除receiveExpectCount的值 if(receiveExpectCount == 0)//期望下载为0,第一个数就是期望下载数 { receiveExpectCount = ch; } else { if((serial_Buffer_Length&0x8000)== 0x8000)//已经接收完成,系统还没处理,此时不接收数据 { serial_Buffer_Length |=0x8000;//退出 } else { serial_Buffer[(serial_Buffer_Length&0xff)]= ch;//接收数据并保存 serial_Buffer_Length++; if((serial_Buffer_Length&0xff)== receiveExpectCount)//接收到了期望长度的数据 { serial_Buffer_Length|= 0x8000;//一包接收完成标志 } } }
} }
这样系统就能接收数据了,接下来定义五个命令
"iap_down" "iap_jump_app" "iap_over" "iap_set_flag" "iap_clear_flag"
第一个命令为系统开始下载,在这个命令之后上位机就能够将程序数据发下来了,
第二个命令为iap跳转到app的跳转指令
第三个命令是指示iap完成,将系统缓冲区清空的指令
第四个指令为设置app标志,当iap检测到该标志的时候直接跳转到app程序中
第五个指令为清除app标志,让iap程序不自动跳转到app程序中,我们分别来看 |