STM32F103通过M26实现远程在线IAP

硬件信息:STM32F103RCT6 + M26
开发软件:MDK keil5

  1. 第一个简单测试,试下是否可以成功写进FLASH,然后成功跳转。(通过开网上的开源例程USART2通信)
    1.1. 创建1个足够大的APP缓存,测试用到的是11k的空间,这里要求硬件RAM支持
uint8_t  RI_Set2_Buffer[15 * 1024];

1.2. 程序开始,串口打印开始接受数据,等待串口接受

UART2_SendString((u8* )"USART2 accept...\r\n",strlen("USART2 accept...\r\n"));

1.3. 判断串口接受是否完整,串口接受成功后直接向对应FLASH中写上自己的APP缓存

	 	if(RI_Set2_Count && (endflag != 1))
		{
			if(recvcount==RI_Set2_Count)//新周期内,没有收到任何数据,认为本次数据接收完成.
			{
				applenth=RI_Set2_Count;
				recvcount=0;
				endflag = 1;
				RI_Set2_Count=0;
				Uart2_serial_send(USART2,(u8* )"USART2 end...%d,sizeof:%d\r\n",applenth,sizeof(RI_Set2_Buffer));
				delay_ms(1000);
				delay_ms(1000);
			}else recvcount=RI_Set2_Count;			
		}
		delay_ms(1000);

1.4. 直接用可以发送文件的串口工具,通过串口向STM32F103发送文件
1.5接受成功后,写进对应地址的FLASH,写成功后跳转

		if(applenth && endflag)
		{
			UART2_SendString((u8* )"start update...\r\n",strlen("start update...\r\n"));
			if(1)
			{	 
				iap_write_appbin(FLASH_APP1_ADDR,RI_Set2_Buffer,applenth);//更新FLASH代码   
				updataflag = 1;
				UART2_SendString((u8* )"update success ...\r\n",strlen("update success ...\r\n"));
			}else 
			{   
				UART2_SendString((u8* )"update error ...\r\n",strlen("update error ...\r\n"));
			}
		}
		
		if(updataflag)
		{
			if(((*(vu32*)(FLASH_APP1_ADDR+4))&0xFF000000)==0x08000000)//判断是否为0X08XXXXXX.
			{	 
				__disable_irq();
				iap_load_app(FLASH_APP1_ADDR);//执行FLASH APP代码
			}else 
			{
				UART2_SendString((u8* )"into error ...\r\n",strlen("into error ...\r\n"));
			}									 
		}

注,在跳转前首先要关闭所有中断,还有就是在app中一定要在SystemInit();函数之后设置跳转,我这边没有注意这两点,当下载成功并且跳转后出现app执行不了得情况。

  1. 通过串口改写对应M26的工程,整个下载过程是通过M26TCP透传实现的
    2.1对应初始化博客:M26TCP初始化
    2.2具体数据收发,根据和后台定接口,具体协议,具体实现
    2.3在透传接受过程中我是设置的M26带缓存功能的,这样可以主动提出接受
//配置M26接受模式,成功返回1,失败返回2
u8 set_recv_conf()
{
	
	if(M26_SendCmd((u8* )"AT+QINDI=1\r\n","OK",500) != 0)
	{
		Clear_Buffer2(); 
		return 0;
	}
	return 1;
}

2.4当数据发送成功后延时读取就可以,因为由于网络和后台处理速度原因,当M26发送完成后,实际只是M26TCP协议栈的数据发送到对方TCP协议栈里,具体应用层怎么实现根看具体情况

你可能感兴趣的:(STM32,物理透传)