stm32基于Can和uart的IAP实现

来源:互联网 发布:土地利用现状数据价格 编辑:程序博客网 时间:2024/06/07 03:41

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段执行。不能在中断函数中直接跳转!





0 0
原创粉丝点击