×
单片机 > 单片机程序设计 > 详情

通过串口实现stm32的IAP功能

发布时间:2020-05-29 发布时间:
|

感觉stm32官方的IAP例程写的太乱了,于是自己写了个串口IAP,希望可以帮助到正在或者即将学习IAP的童鞋们!


用的MCU是stm32f103ze,编译工具室IAR 5.4,仅仅用了USART1,不需要按键来,即仅仅使用了2个管脚,就实现了串口IAP的功能。


大概思路如下:


IAP部分:IAP地址如下


#define StartAddr               ((u32)0x08000000)

#define EndAddr               ((u32)0x08010000)  


IAP 程序部分大概思路:


              1.将 通过串口接收的APP文件利用数组先保存下来存储到USART_Buffer中


              2.if(USART_RX_BUF[0]==0xAF)// WRITE APP TO FLASH


                  当串口接收到AF时,将APP文件写入到flash中


              3.   if (USART_RX_BUF[0]==0xAC)// RUN APP


                  当串口接收到AC时,开始运行APP文件,不返回!


APP部分:APP地址如下


#define StartAddr               ((u32)0x08010000)

#define EndAddr                 ((u32)0x0807ffff)   


将APP的中断向量表定位到  ((u32)0x08010000)   ,具体可以参见我上传的程序!




IAP部分程序如下:


 while(1) 

  {

     if(USART_RX_CNT)

       {

         if(oldcount==USART_RX_CNT)//新周期内,没有收到任何数据,认为本次数据接收完成.

           {

              applenth=USART_RX_CNT;

              oldcount=0;

              USART_RX_CNT=0;

           }

         else  oldcount=USART_RX_CNT;

         RFID_SendString("IAP   Receive OK!");

       }    

      if(applenth==5648)//5648为APP文件的长度,通过丁丁串口助手实际测试得到。

       {

         for(USART_CNT=0;USART_CNT

          {

             USART_Buffer[USART_CNT]=USART_RX_BUF[USART_CNT]; 

          } 

          break;       

       }        

  }

Clear_RX_buffer();

  while(1)

  {     

        if(USART_RX_BUF[0]==0xAF)//WRITE APP TO FLASH

         {         

             int i,j=0;

             u8 temp[1024];

             RX_CNT_Write=0;

             u32 fwaddr=FLASH_APP1_ADDR;//当前写入的地址

             for(i=0;i

               { 

                 temp[j++]=USART_Buffer[i];

                 if(j==1024) { j=0; IAP_Flash_Program(fwaddr,temp,1024); fwaddr+=1024; }                                                                                                                    

               }

             if(i)IAP_Flash_Program(fwaddr,temp,j);//把剩下的写完

      

             RFID_SendString("IAP   WRITE !");

             Clear_RX_buffer();                 

         }

        if (USART_RX_BUF[0]==0xAC)// RUN APP

         {

            RX_CNT_Run=0;

            RFID_SendString("IAP   RUN!");

            IAP_Runing();            

            Clear_RX_buffer() ;    

         }     

    }

}


关键字:串口实现  stm32  IAP功能 


『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
浅谈AVR中定时器几种工作模式