OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 2437|回复: 9

Bootloader程序,检查APP地址时总是错误

[复制链接]

4

主题

37

帖子

0

精华

初级会员

Rank: 2

积分
155
金钱
155
注册时间
2023-2-14
在线时间
51 小时
发表于 2023-7-17 12:57:50 | 显示全部楼层 |阅读模式
10金钱
本帖最后由 wyp010123 于 2023-7-17 13:08 编辑

我的BootLoader程序中,为什么总是在检查FLASH APP的地址时,总是不对呢


int main(void)
{
//        u8 t;
        FIL files;
//        FILINFO file;
        FRESULT res;
        HAL_NVIC_SetPriorityGrouping(NVIC_PRIORITYGROUP_2);//设置系统中断优先级分组2
        delay_init(72);        //初始化延时函数
        LED_Init();
        //uart_init(9600);                //初始化串口波特率为115200
        while(SD_Init())//检测不到SD卡
        {
                //LCD_ShowString(30,150,200,16,16,"SD Card Error!");
                //delay_ms(500);                                       
                //LCD_ShowString(30,150,200,16,16,"Please Check! ");
                delay_ms(100);
                LED0=!LED0;//DS0闪烁
                //iap_load_app(FLASH_APP1_ADDR);//执行FLASH APP代码
        }
        mem_init();                //初始化内部内存池
    exfuns_init();                        //为fatfs相关变量申请内存
       
    f_mount(fs[0],"0:",1);          //挂载SD卡
        //res=f_stat("2.bin",&file);
        //LED0=0;
        res= f_open(&files,"0:/2/2.bin",FA_READ);
       
        if(res==0)
        {           
                FirmwareUpdate();       //进行固件升级 // printf("固件升级失败!\r\n");
                if(((*(vu32*)(FLASH_APP1_ADDR+4))&0xFF000000)==0x08000000)//判断是否为0X08XXXXXX.
                {         
                        f_close(&files);
                        f_unlink("0:/2/2.bin");
                        iap_load_app(FLASH_APP1_ADDR);//执行FLASH APP代码
                }
               
                //iap_load_app(FLASH_APP1_ADDR);
                          
        }
        else
        {          
        iap_load_app(FLASH_APP1_ADDR);//执行FLASH APP代码
        }//执行FLASH APP代码
                //LED0=0;
}







#define FLASH_APP1_ADDR                0x08020000          //第一个应用程序起始地址(存放在FLASH)
                                                                                        //保留0X08000000~0X0800FFFF的空间为IAP使用


2.jpg
3.jpg
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

31

主题

1951

帖子

3

精华

论坛元老

Rank: 8Rank: 8

积分
4418
金钱
4418
注册时间
2018-5-11
在线时间
923 小时
发表于 2023-7-17 13:00:43 | 显示全部楼层
不贴程序,
谁知道你什么情况
我的开源链接 https://github.com/ShuifaHe/STM32.git  请关注,点赞支持哦。
回复

使用道具 举报

4

主题

37

帖子

0

精华

初级会员

Rank: 2

积分
155
金钱
155
注册时间
2023-2-14
在线时间
51 小时
 楼主| 发表于 2023-7-17 13:01:34 | 显示全部楼层
warship 发表于 2023-7-17 13:00
不贴程序,
谁知道你什么情况

我想发图片,还没找到怎么发。。。
回复

使用道具 举报

4

主题

37

帖子

0

精华

初级会员

Rank: 2

积分
155
金钱
155
注册时间
2023-2-14
在线时间
51 小时
 楼主| 发表于 2023-7-17 13:12:43 | 显示全部楼层
warship 发表于 2023-7-17 13:00
不贴程序,
谁知道你什么情况

好了大佬,这个问题困惑我好几天了,一直不明白是怎么回事。。。
回复

使用道具 举报

70

主题

6698

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
12692
金钱
12692
注册时间
2012-11-26
在线时间
3711 小时
发表于 2023-7-17 13:17:45 | 显示全部楼层
要么是生成的bin有问题,要么是写入flash的时候有问题

先用二进制查看工具查看你生成的bin是不是正确的吧
学无止境
回复

使用道具 举报

4

主题

37

帖子

0

精华

初级会员

Rank: 2

积分
155
金钱
155
注册时间
2023-2-14
在线时间
51 小时
 楼主| 发表于 2023-7-17 13:24:07 | 显示全部楼层
jermy_z 发表于 2023-7-17 13:17
要么是生成的bin有问题,要么是写入flash的时候有问题

先用二进制查看工具查看你生成的bin是不是正确的 ...

080201CD,这个是APPbin文件的起始地址
回复

使用道具 举报

4

主题

37

帖子

0

精华

初级会员

Rank: 2

积分
155
金钱
155
注册时间
2023-2-14
在线时间
51 小时
 楼主| 发表于 2023-7-17 13:40:31 | 显示全部楼层
jermy_z 发表于 2023-7-17 13:17
要么是生成的bin有问题,要么是写入flash的时候有问题

先用二进制查看工具查看你生成的bin是不是正确的 ...

typedef  void (*fun)(void);                                //定义一个函数类型的参数.   
fun AppStart;

u8 Receive_dat_buffer[STM_PAGE_SIZE];                                          //数据接收缓存数组
/****************************
函数名  :Jump2App
功    能:从Bootloader跳转到用户APP程序地址空间
入口参数:Addr,用户APP的起始执行地址
出口参数:无
返回值  :无
*****************************/
void Jump2App(u32 Addr)
{
        if(((*(vu32*)Addr)&0x2FFE0000) == 0x20000000)        //检查栈顶地址是否合法.
        {
                AppStart = (fun)(*(vu32*)(Addr+4));                        //用户代码区第二个字为程序开始地址(复位地址)               
                AppStart();                                                                        //跳转到APP.
        }
}

/******************************
函数名  :FirmwareUpdate
功    能:固件升级函数
入口参数:无
出口参数:无
返回值  :无
*******************************/
void FirmwareUpdate(void)
{
    FIL file_bin;
    u8 i=0;
    u8 res;
    u16 br;
    u16 readlen;
    u32 addrx;
    u32 Receive_data=0; //计算接收的总数据数
   // u32 file_size=0;    //文件size
   
//    u8 percent=0;       //固件升级的百分比
        /*查找是否存在要升级的BIN文件*/
//    res = f_open(&file_bin, "RTC.bin", FA_OPEN_EXISTING | FA_READ);
    res = f_open(&file_bin, "0:/2/2.bin", FA_OPEN_EXISTING | FA_READ);
   // file_size=f_size(&file_bin);    //读取的文件大小Byte
    //printf("读取的文件大小为:%dByte\r\n",file_size);

        if(res!=FR_OK) return;
    addrx=FLASH_APP1_ADDR;
   
        /*执行主要的IAP功能*/
   // printf("开始更新固件...\r\n");
        while(1)
        {
                /*每次读取2K的数据到内存缓冲区buffer*/
            res = f_read(&file_bin, Receive_dat_buffer, STM_PAGE_SIZE, (UINT*)&br);
        i++;
        readlen=br;
        Receive_data+=br;   //读取的总字节数
        if (res || br == 0)
        {
            break;
        }
        
        iap_write_appbin(addrx,Receive_dat_buffer,readlen);//将读取的数据写入Flash中
        addrx+=STM_PAGE_SIZE;//偏移2048  512*4=2048
                //iap_load_app(FLASH_APP1_ADDR);
        
       // percent=(Receive_data*100)/file_size;   //写入的进度
      
     
    }
        //iap_load_app(FLASH_APP1_ADDR);
    //delay_ms(1500);
}
回复

使用道具 举报

4

主题

37

帖子

0

精华

初级会员

Rank: 2

积分
155
金钱
155
注册时间
2023-2-14
在线时间
51 小时
 楼主| 发表于 2023-7-17 13:42:12 | 显示全部楼层
jermy_z 发表于 2023-7-17 13:17
要么是生成的bin有问题,要么是写入flash的时候有问题

先用二进制查看工具查看你生成的bin是不是正确的 ...

写入flash和原子哥例程里面差不多一样
回复

使用道具 举报

4

主题

37

帖子

0

精华

初级会员

Rank: 2

积分
155
金钱
155
注册时间
2023-2-14
在线时间
51 小时
 楼主| 发表于 2023-7-17 13:43:24 | 显示全部楼层
本帖最后由 wyp010123 于 2023-7-17 13:45 编辑

回复

使用道具 举报

4

主题

37

帖子

0

精华

初级会员

Rank: 2

积分
155
金钱
155
注册时间
2023-2-14
在线时间
51 小时
 楼主| 发表于 2023-7-17 13:50:48 | 显示全部楼层
jermy_z 发表于 2023-7-17 13:17
要么是生成的bin有问题,要么是写入flash的时候有问题

先用二进制查看工具查看你生成的bin是不是正确的 ...

.ARM.Collect$$rtexit$$00000004           0x080201c4   Section        6  rtexit2.o(.ARM.Collect$$rtexit$$00000004)
    .text                                    0x080201cc   Section       64  startup_stm32f103xe.o(.text)
    .text                                    0x0802020c   Section        2  use_no_semi_2.o(.text)
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-11-24 05:01

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表