OpenEdv-开源电子网

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

IAP升級,内部FLASH标志位怎么修改不了?

[复制链接]

11

主题

36

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
257
金钱
257
注册时间
2017-8-9
在线时间
90 小时
发表于 2020-8-11 18:40:57 | 显示全部楼层 |阅读模式
30金钱
本帖最后由 日落不眠 于 2020-8-11 18:52 编辑

程序是借鉴网上的思路:APP里下载固件到备份区域后,在FLASH里做一个升级标志,上电检查这个标志,若正确则将备份区域的程序COPY到APP区域,修改升级标志,再执行APP程序。
用F103ZET开发板测试后,怎么无法对FLASH里的升级标志位进行修改?  就是  printf(" 标志位的值为:%X \r\n",*(u16 *)STM32_FLAG_ADDR);  的值还是0xA5A5,没有改成我想要的0x6969。

程序和截图在下面,麻烦大佬指点一下,谢谢。

//FLASH起始地址
#define STM32_FLASH_BASE 0x08000000   //BOOT区域    0x08000000—0x08004000   16K
#define STM32_APP1_ADDR  0x08004000   //应用区域      0x08004000—0x08040000   240K
#define STM32_APP2_ADDR  0x08040000   //备份区域      0x08040000—0x0807C000   240K
#define STM32_FLAG_ADDR  0x0807C800   //标志区域      0x0807C000—0x08080000   16K        

#include "stm32f10x.h"
#include "bsp_usart1.h"
#include "iap.h"
#include "flash.h"
#include "bsp_led.h"
#include "bsp_key.h"

void delay(u32 x)
{
        while(x--);
}

u16 WRITE_Buffer = 0x6969;
/**
  * @brief  主函数
  * @param  无
  * @retval 无
  */
int main(void)
{
    uint16_t Ret;
        /* LED的配置 */
        LED_GPIO_Config();

        /* 串口中断接收NVIC配置 */
        NVIC_Configuration();

        /* USART1 配置模式为 115200 8-N-1,中断接收 */
        USART1_Config();

        printf("\r\n复位OK!\r\n");

        while(1)
        {
                /* 此APP原有程序,即没有更新之前为一个LED的闪烁*/
                GPIO_SetBits(GPIOD, GPIO_Pin_13);
                GPIO_ResetBits(GPIOD, GPIO_Pin_14);         
                delay(2000000);  
        GPIO_ResetBits(GPIOD, GPIO_Pin_13);
        GPIO_SetBits(GPIOD, GPIO_Pin_14);        
                delay(2000000);  

        Ret = STMFLASH_ReadHalfWord(STM32_FLAG_ADDR);//读取2个字节.

        printf(" Ret的值为:%X \r\n",Ret);

       if(Ret == 0xA5A5)
       {
           printf("Updata App...\r\n");
           Updata_New_Program();
           printf("Updata App Succeed...\r\n");

           FLASH_Unlock();                  
           FLASH_ErasePage(STM32_FLAG_ADDR);//擦除这个扇区           
           FLASH_ProgramHalfWord(STM32_FLAG_ADDR,WRITE_Buffer);
           FLASH_Lock();               

           printf(" 标志位的值为:%X \r\n",*(u16 *)STM32_FLAG_ADDR);
       }
       printf("\n 跳转至APP程序 \r\n");  
       if(((*(vu32*)(STM32_APP1_ADDR+4))&0xFF000000)==0x08000000)//判断是否为0X08XXXXXX.
       {         
           iap_load_app(STM32_APP1_ADDR);//执行FLASH APP代码
       }        
    }
}

BOOT和APP里的地址设置。









BOOT地址设置

BOOT地址设置

APP的地址设置

APP的地址设置
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

11

主题

36

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
257
金钱
257
注册时间
2017-8-9
在线时间
90 小时
 楼主| 发表于 2020-8-11 18:45:10 | 显示全部楼层
帖子里地址设置标错了。

BOOT地址设置是:0x8000000   0x4000
   APP地址设置是:0x8004000   0x3C000
回复

使用道具 举报

2

主题

582

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2690
金钱
2690
注册时间
2014-5-23
在线时间
188 小时
发表于 2020-8-12 09:15:48 | 显示全部楼层
本帖最后由 awsawzj 于 2020-8-12 09:24 编辑

加点状态判断等待,参考下hal是怎么写的
回复

使用道具 举报

5

主题

152

帖子

0

精华

高级会员

Rank: 4

积分
777
金钱
777
注册时间
2016-7-15
在线时间
119 小时
发表于 2020-8-12 14:10:24 | 显示全部楼层
不要16位取,取32,写32,
好好学习,天天向上。
回复

使用道具 举报

11

主题

36

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
257
金钱
257
注册时间
2017-8-9
在线时间
90 小时
 楼主| 发表于 2020-8-12 14:53:44 | 显示全部楼层
小程序员 发表于 2020-8-12 14:10
不要16位取,取32,写32,


Ret = STMFLASH_ReadHalfWord(STM32_FLAG_ADDR);//读取2个字节.
修改成
Ret = STMFLASH_ReadWord(STM32_FLAG_ADDR);//读取4个字节.

你的意思这样吗?
我看网上也是16位读写的,我先试试哈,谢谢。
回复

使用道具 举报

11

主题

36

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
257
金钱
257
注册时间
2017-8-9
在线时间
90 小时
 楼主| 发表于 2020-8-12 14:55:54 | 显示全部楼层
awsawzj 发表于 2020-8-12 09:15
加点状态判断等待,参考下hal是怎么写的

加延时?FLASH读写函数好像有状态位的,我手上没HAL的程序,找找看试下,谢谢。
回复

使用道具 举报

11

主题

36

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
257
金钱
257
注册时间
2017-8-9
在线时间
90 小时
 楼主| 发表于 2020-8-13 08:27:26 | 显示全部楼层
有老哥帮忙看下不?
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-30 17:02

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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