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





  • 3
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值