这是程序源码
#include "led.h"
#include "delay.h"
#include "sys.h"
#include "usart.h"
#include "stmflash.h"
#include "iap.h"
//ALIENTEK战舰STM32开发板实验48
//IAP实验 Bootloader V1.0 代码
//技术支持:www.openedv.com
//广州市星翼电子科技有限公司
int main(void)
{
u8 cnt=0;
u8 len=0;
u16 oldcount=0; //老的串口接收数据值
u16 applenth=0; //接收到的app代码长度
uart_init(115200); //串口初始化为256000
delay_init(); //延时初始化
LED_Init(); //初始化与LED连接的硬件接口
CFG = 1;
while(1)
{
if(USART_RX_CNT)
{
if(oldcount==USART_RX_CNT)//新周期内,没有收到任何数据,认为本次数据接收完成.
{
applenth=USART_RX_CNT;
oldcount=0;
USART_RX_CNT=0;
cnt++;
printf("receive done!\r\n");
printf("length:%dBytes\r\n",applenth);
}else oldcount=USART_RX_CNT;
}
delay_ms(10);
if(applenth)
{
if(cnt == 1)
{
len = USART_RX_BUF[0];
}
else if(cnt>1)
{
printf("start gengxin...\r\n");
// printf("%#x\r\n",(*(vu32*)(0X20001000+4)));
// if(((*(vu32*)(0X20001000+4))&0xFF000000)==0x08000000)//判断是否为0X08XXXXXX.
{
iap_write_appbin((FLASH_APP1_ADDR + (cnt - 2)*2048),USART_RX_BUF,applenth);//更新FLASH代码
delay_ms(100);
printf("gengxin done!\r\n");
}
if(cnt == (len + 1))
{
applenth=0;
printf("start FLASH!!\r\n");
printf("%#x\r\n",(*(vu32*)(FLASH_APP1_ADDR+4)));
if(((*(vu32*)(FLASH_APP1_ADDR+4))&0xFF000000)==0x08000000)//判断是否为0X08XXXXXX.
{
iap_load_app(FLASH_APP1_ADDR);//执行FLASH APP代码
}
}
}
applenth=0;
}
}
}
|