转眼间天亮了...... 然后就想起了一个朋友QQ的个性签名:年轻人总是要为一些自己认为有意义的事情而废寝忘食,通宵达旦,直至白发方休........ 对了这篇文章一定会介绍的很详细,请细嚼慢咽.......嗯,我是这样认为的,,,,,,
上面是昨天写的,应该说是今天写的,,今天发现发现博客又不能复制粘贴图片了!!!!然后就睡了一觉,,麻烦。。。。是不是因为我写的博客有太多的图片而把我屏蔽了。能让人一目了然的就是图片。。。。
说一下自己是如何做的,,,
先说一下实现的功能 IAP程序的功能 再看自己的用户程序--用户程序自己也做了些设置
对了关于我为什么拷贝到Flash里面------自己用的单片机的RAM不够用,存不了用户程序,所以自己就定义了一个小点的数组(环形队列),串口一边接收,一边往Flash里面写,环形队列可是帮了大忙了,,,
单片机源程序如下:
- #include "include.h"
- #include "main.h"
- int main(void)
- {
- u32 i=0;
- u8 UpdaFlage = 0;//是否有更新程序
- __IO u32 UpdaCnt=0;//程序的大小
- u16 ReadDat16=0;//读数据间接变量
- __IO u32 addr1 = FLASH_APP1_ADDR;//APP程序地址
- __IO u32 addr2 = FLASH_APP2_ADDR;//存储用户程序地址
- __IO u32 UserDataAddr = FLASH_DATA_ADDR;//用户数据地址
-
- NVIC_Configuration();
- Led_Gpio_Init();
- Timer2_Config();
- uart_init(57600); //串口初始化为115200
-
- STMFLASH_Read(UserDataAddr,&ReadDat16,1);//判断是否有更新程序
- if(ReadDat16 == 0x55)
- {
- UpdaFlage = 1;//有更新程序
- UserDataAddr +=2;
- STMFLASH_Read(UserDataAddr,&ReadDat16,1);//程序数据个数高位
- UpdaCnt = (u32)ReadDat16<<16;
- UserDataAddr +=2;
- STMFLASH_Read(UserDataAddr,&ReadDat16,1);//程序数据个数低位
- UpdaCnt = UpdaCnt + ReadDat16;
- printf("有更新程序,数据大小=%d\r\n",UpdaCnt);
- }
- else
- {
- printf("擦除存储用户程序地址Flash\r\n");
- for(i=0;i<40;i++)
- {
- STMFLASH_Erase(addr2,512);//擦除addr2地址以及以上40页
- addr2 +=1024;
- }
- }
- addr2 = FLASH_APP2_ADDR;//存储用户程序地址
- rbCreate(&pRb,ReceBuff,USART_REC_LEN);//创建接收环形队列
- DelayInit();
- printf("开始进入主函数\r\n");
- while(1)
- {
- if(UpdaFlage == 1)//有更新程序
- {
- addr1 = FLASH_APP1_ADDR;//APP程序地址
- for(i=0;i<40;i++)
- {
- STMFLASH_Erase(addr1,512);//擦除FLASH_APP1_ADDR地址以及以上40页
- addr1 +=1024;
- }
- printf("擦除了FLASH_APP1_ADDR....\r\n");
-
- addr1 = FLASH_APP1_ADDR;//APP程序地址
- addr2 = FLASH_APP2_ADDR;//存储用户程序地址
- printf("正在拷贝程序....\r\n");
- for(i=0;i<UpdaCnt/2;i++)
- {
- STMFLASH_Read(addr2,&ReadDat16,1);
- STMFLASH_Write(addr1,&ReadDat16,1);
- addr1+=2;
- addr2+=2;
- }
- printf("程序已经拷贝....\r\n");
-
- printf("擦除存储用户程序地址Flash\r\n");
- addr2 = FLASH_APP2_ADDR;//存储用户程序地址
- for(i=0;i<40;i++)
- {
- STMFLASH_Erase(addr2,512);//擦除addr2地址以及以上40页
- addr2 +=1024;
- }
-
- if(((*(vu32*)(FLASH_APP1_ADDR+4))&0xFF000000)==0x08000000)//判断是否为0X08XXXXXX.
- {
- printf("准备执行新的APP代码!!\r\n");
- iap_load_app(FLASH_APP1_ADDR);//执行FLASH APP代码
- }
- else
- {
- UserDataAddr = FLASH_DATA_ADDR;//存储其余的数据地址
- ReadDat16 = 0x00;//写入标志告诉IAP程序有可更新的用户程序
- STMFLASH_Write(UserDataAddr,&ReadDat16,1);
- UserDataAddr+=2;
-
- STMFLASH_Write(UserDataAddr,&ReadDat16,1);
- UserDataAddr+=2;
- STMFLASH_Write(UserDataAddr,&ReadDat16,1);
- UserDataAddr+=2;
- printf("拷贝的程序非FLASH应用程序,无法执行!RstMCU\r\n");
- Reset_MCU();//复位重启CPU
- }
- UpdaFlage = 0;
- }
- else
- {
- if(((*(vu32*)(FLASH_APP1_ADDR+4))&0xFF000000)==0x08000000)//判断是否为0X08XXXXXX.
- {
- printf("准备执行自带的APP代码!!\r\n");
- iap_load_app(FLASH_APP1_ADDR);//执行FLASH APP代码
- }
- else
- {
- if(SysTickCnt2>=1000)
- {
- SysTickCnt2 = 0;
- printf("等待接收用户程序!!!!\r\n");
- PCout(13) = ~PCout(13);
- }
- }
- }
- /***************************************/
- /***************************************/
- /***************************************/
-
-
- if(rbCanRead(&pRb)>1)
- {
- rbRead(&pRb, &ReadDat, 2);//读取两个数据
- ReadDat16 = (u16)ReadDat[1]<<8;
- ReadDat16 = ReadDat16|ReadDat[0];
- STMFLASH_Write(addr2,&ReadDat16,1);
- addr2+=2;
- }
-
- if(Usart1Flage == 1)//数据接收完成
- {
- addr2 = FLASH_APP2_ADDR;//存储数据的地址
- Usart1Flage =0;//清零
- if(Overflow==1)//如果中途溢出了
- {
- printf("程序中途溢出,准备复位重启!!");
-
- UserDataAddr = FLASH_DATA_ADDR;//存储其余的数据地址
- ReadDat16 = 0x00;//写入标志告诉IAP程序有可更新的用户程序
- STMFLASH_Write(UserDataAddr,&ReadDat16,1);
- UserDataAddr+=2;
-
- STMFLASH_Write(UserDataAddr,&ReadDat16,1);
- UserDataAddr+=2;
- STMFLASH_Write(UserDataAddr,&ReadDat16,1);
- UserDataAddr+=2;
-
- Reset_MCU();//复位重启CPU
- }
- if(((*(vu32*)(FLASH_APP2_ADDR+4))&0xFF000000)==0x08000000)//判断是否为0X08XXXXXX.
- {
- printf("准备执行APP代码!!\r\n");
-
- UserDataAddr = FLASH_DATA_ADDR;//存储其余的数据地址
- ReadDat16 = 0x55;//写入标志告诉IAP程序有可更新的用户程序
- STMFLASH_Write(UserDataAddr,&ReadDat16,1);
- UserDataAddr+=2;
-
- printf("写入0x55标志!!\r\n");
-
- ReadDat16 = (u16)((Usart1RecCntCopy>>16)&0xffff);//存储接收到多少数据高位
- STMFLASH_Write(UserDataAddr,&ReadDat16,1);
- UserDataAddr+=2;
-
- ReadDat16 = (u16)(Usart1RecCntCopy&0xffff);//存储接收到多少数据低位
- STMFLASH_Write(UserDataAddr,&ReadDat16,1);
- UserDataAddr+=2;
- Usart1RecCntCopy = 0;
-
- printf("开始复位重启!!\r\n");
-
- Reset_MCU();
- }
- else
- {
- printf("非FLASH应用程序,无法执行!\r\n");
- Reset_MCU();
- }
-
- // printf("Cnt=%d\r\n",Usart1RecCntCopy);
- // for(i=0;i<Usart1RecCntCopy/2;i++)
- // {
- // STMFLASH_Read(addr1,&ReadDat16,1);
- // addr1+=2;//偏移2048 16=2*8.所以要乘以2.
- // if((ReadDat16&0x00ff)<=15)
- // {
- // printf("0%x ",ReadDat16&0x00ff);
- // }
- // else
- // {
- // printf("%x ",ReadDat16&0x00ff);
- // }
- //
- // if((ReadDat16>>8)<=15)
- // {
- // printf("0%x ",ReadDat16>>8);
- // }
- // else
- // {
- // printf("%x ",ReadDat16>>8);
- // }
- // }
- // addr1 = FLASH_APP1_ADDR;
- // for(i=0;i<40;i++)
- // {
- // STMFLASH_Erase(addr1,1024);//擦除FLASH_APP1_ADDR地址以及以上40页
- // addr1 +=2048;
- // }
- // addr1 = FLASH_APP1_ADDR;
- }
- }
- }
复制代码
所有资料51hei提供下载:
IAP升级2.zip
(4.76 MB, 下载次数: 73)
|