硬件信息:STM32F103RCT6 + M26
开发软件:MDK keil5
- 第一个简单测试,试下是否可以成功写进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执行不了得情况。
- 通过串口改写对应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协议栈里,具体应用层怎么实现根看具体情况