首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

STM32_IAP详解(2)

STM32_IAP详解(2)

 该函数可以实现flash的写入操作,接下来我们需要定义一套通讯协议用于串口数据传输

//串口接收缓冲区

u8 serial_Buffer[SERIAL_MAX_LENGTH] = {0};

//串口接收数据长度

u16 serial_Buffer_Length = 0;


u8 receiveMode = 0;//接收参数的中断处理模型,为0的时候是命令模式,为1的时候为下载模式

u8 receiveExpectCount = 0;//串口期望接收长度



//串口中断处理

static void SerialRecv(u8 ch)

{

    if(receiveMode == 0)

    {

       if((serial_Buffer_Length&0x8000)== 0x8000)//已经接收完成,系统还没处理

       {

           serial_Buffer_Length |=0x8000;//退出

       }

       elseif((serial_Buffer_Length&0x4000) == 0x4000)//接收到回车还没接收到换行

       {

           if(ch ==‘\n‘)serial_Buffer_Length |= 0x8000;

           else

           {

              //一帧接受失败

              serial_Buffer_Length =0;

           }

       }

       else

       {

           if((serial_Buffer_Length&0xff)< SERIAL_MAX_LENGTH)

           {

              if(ch ==‘\r‘)serial_Buffer_Length |= 0x4000;

              else

              {

                  serial_Buffer[(serial_Buffer_Length&0xff)] = ch;

                  serial_Buffer_Length++;

              }

           }

           else

           {

              //一帧接受失败

              serial_Buffer_Length =0;

           }

       }

    }

    else

    {

       //下载模式,只控制字符串的量,数据的第一位是该数据包的长度,接收到这么多长度,接收完成位置一

       //注意,在这种模式下,清除serial_Buffer_Length之前应当清除receiveExpectCount的值

       if(receiveExpectCount == 0)//期望下载为0,第一个数就是期望下载数

       {

           receiveExpectCount = ch;

       }

       else

       {

           if((serial_Buffer_Length&0x8000)== 0x8000)//已经接收完成,系统还没处理,此时不接收数据

           {

              serial_Buffer_Length |=0x8000;//退出

           }

           else

           {

              serial_Buffer[(serial_Buffer_Length&0xff)]= ch;//接收数据并保存

              serial_Buffer_Length++;

              if((serial_Buffer_Length&0xff)== receiveExpectCount)//接收到了期望长度的数据

              {

                  serial_Buffer_Length|= 0x8000;//一包接收完成标志

              }

           }

       }


    }

}

  这样系统就能接收数据了,接下来定义五个命令

  "iap_down"

  "iap_jump_app"

  "iap_over"

  "iap_set_flag"

  "iap_clear_flag"
第一个命令为系统开始下载,在这个命令之后上位机就能够将程序数据发下来了,
第二个命令为iap跳转到app的跳转指令
第三个命令是指示iap完成,将系统缓冲区清空的指令
第四个指令为设置app标志,当iap检测到该标志的时候直接跳转到app程序中
第五个指令为清除app标志,让iap程序不自动跳转到app程序中,我们分别来看
继承事业,薪火相传
返回列表