stm32基于Can和uart的IAP实现

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;	
}
3>Ymode应答
节点收到完整的Ymode数据包后,会通过CAN发送应答信号,控制板接在CAN中断函数接收后,直接通过UART发送给上位机。
4>退出IAP模式
节点更新成功后,连续通过CAN发送一包0xFE标志后,跳转到APP段执行,控制板在CAN中断里面收到0xFE后,置结束标志,在其他位置判断结束标志,跳转到APP段执行。不能在中断函数中直接跳转!





你可能感兴趣的:(单片机,stm32,IAP)