Board logo

标题: STM32_IAP详解(2) [打印本页]

作者: yuyang911220    时间: 2015-7-8 10:39     标题: 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程序中,我们分别来看




欢迎光临 电子技术论坛_中国专业的电子工程师学习交流社区-中电网技术论坛 (http://bbs.eccn.com/) Powered by Discuz! 7.0.0