中级会员
 
- 积分
- 257
- 金钱
- 257
- 注册时间
- 2017-8-9
- 在线时间
- 90 小时
|
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地址设置
-
APP的地址设置
|