2019-07-21 06:00发布
这是程序源码
#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! "); printf("length:%dBytes ",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... "); // printf("%#x ",(*(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! "); } if(cnt == (len + 1)) { applenth=0; printf("start FLASH!! "); printf("%#x ",(*(vu32*)(FLASH_APP1_ADDR+4))); if(((*(vu32*)(FLASH_APP1_ADDR+4))&0xFF000000)==0x08000000)//判断是否为0X08XXXXXX. { iap_load_app(FLASH_APP1_ADDR);//执行FLASH APP代码 } } } applenth=0; }
} }
最多设置5个标签!
---------------------------------
已经实现了分批次接收并写入,是写flash不正确
这是程序源码
#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! ");
printf("length:%dBytes ",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... ");
// printf("%#x ",(*(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! ");
}
if(cnt == (len + 1))
{
applenth=0;
printf("start FLASH!! ");
printf("%#x ",(*(vu32*)(FLASH_APP1_ADDR+4)));
if(((*(vu32*)(FLASH_APP1_ADDR+4))&0xFF000000)==0x08000000)//判断是否为0X08XXXXXX.
{
iap_load_app(FLASH_APP1_ADDR);//执行FLASH APP代码
}
}
}
applenth=0;
}
}
}
但你的問題是出在APP那邊吧
---------------------------------
而且我就相当于把bin文件分批次写入,每次接收完就写入flash里面,当判断bin文件全部写完就跳转
Bootloader 可以寫入也可以轉跳 所以Bootloader是好的
然後你又說APP保證沒有問題
那現在有啥問題阿?
一周热门 更多>