1.公司的某个产品的结构是
1.公司的某个产品的结构是
工业主板(uart)->控制板(can)->节点(大于1个)
2.实现目的
要实现不拆壳定点升级某一个节点或控制板的应用程序
3.单片机硬件平台
stm32F103C8T6
4.IAP协议
Ymode协议
5.移植过程
1>进入IAP的过程
上位机向节点发送升级命令,往flash写升级标志,软件重启后,节点进入IAP,一直在发送'C',等待有效数据。
上位机向控制板发送升级命令,控制板把将要升级的地址写入flash,软件重启后,进入IAP,配置Can过滤器为将要升级的地址。
2>Ymode转发
Ymode协议移植的ST官方例程,基于UART的IAP。Ymode每包数据为1K+5Byte,由于Ymode可以允许很久的延时,所以我把每包数据完整的接受后,计算出CAN转发的帧数,再由CAN进行转发。如果发生丢帧,IAP注定失败,所以我死循环判断CAN发送成功的标志。代码如下
uint8_t MocaCanSend(uint8_t c)
{
CanTxMsg GateWay;
uint8_t TransmitMailbox = 0;
uint32_t timeout = 0x100000;
uint8_t i;
GateWay.ExtId = (1<<28) | (add<<20);
GateWay.RTR = CAN_RTR_DATA; //设置为数据帧
GateWay.IDE = CAN_ID_EXT; //标识符的类型为扩展帧格式
GateWay.DLC = 8; //帧的长度
for(i=0; i<8; i++)
{
GateWay.Data[i] = c;
}
TransmitMailbox = CAN_Transmit(CAN1,&GateWay);
SenPoint += 8;
while((CAN_TransmitStatus(CAN1,TransmitMailbox)==CAN_TxStatus_Failed))//通过检查CANTXOK位来确认发送是否成功
{
}
return 0;
}
<strong>3>Ymode应答</strong>
节点收到完整的Ymode数据包后,会通过CAN发送应答信号,控制板接在CAN中断函数接收后,直接通过UART发送给上位机。
</pre><pre code_snippet_id="601224" snippet_file_name="blog_20150209_6_7095820" name="code" class="cpp"><strong>4>退出IAP模式</strong>
节点更新成功后,连续通过CAN发送一包0xFE标志后,跳转到APP段执行,控制板在CAN中断里面收到0xFE后,置结束标志,在其他位置判断结束标志,跳转到APP段执行。不能在中断函数中直接跳转!