STM32F407VET6学习笔记14:Bootloader程序笔记

之前的文章有说过Bootloader程序,现在补充之前没提到的一些细节:

之前文章讲到过flash分区,boot和app的工程文件的不同处理,这里会全部重新描述一遍

STM32F407VET6学习笔记7:Bootloader跳转APP程序_stm32 app跳转到bootloader-CSDN博客


目录

[Flash 分区的管理:](#Flash 分区的管理:)

分区安排:

Bootloader工程的一些必要设定:

boot地址:

boot跳转:

写标志的注意项:

先擦flash再写:

APP工程的一些设定:

APP地址:

APP固化bin文件:


Flash 分区的管理:

首先查阅芯片手册,了解一下芯片的内存分区:

其中的扇区7~11 都是128k

512k的芯片 只有扇区0~7,1024的芯片就有扇区11了

这里扇区0适合放bootloader程序

扇区1~2适合放一些 掉电存储的标志位,

但有些频繁需要读写的数据,基于寿命因素 还是考虑使用eeprom为好

扇区4往后就可以考虑放app应用程序了,因为基本都足够大

分区安排:

为了

Bootloader工程的一些必要设定:

boot地址:

在魔棒这设定好boot的下载地址:

然后注意下载不能全擦:

boot跳转:

跳转代码:

cpp 复制代码
__asm void MSR_MSP (uint32_t ulAddr)
{
    MSR MSP, r0 //set Main Stack value
    BX r14
}
 
void app_jump()
{
    uint32_t JumpAddress;
    __disable_irq();// 禁用所有中断
    JumpAddress = *(__IO uint32_t*)(ApplicationAddress + 4);
    /* Jump to user application */
    Jump_To_Application = (pFunction) JumpAddress;
    MSR_MSP(*(__IO uint32_t*) ApplicationAddress);
    Jump_To_Application();
}

读取标志和跳转:

cpp 复制代码
	#define FMC_UPDATE_INFO_ADDR    0x08004000 //标志
    unsigned int update_flag = 0; //升级标志位



	//读取标志
	update_flag = *(__IO uint32_t*)FMC_UPDATE_INFO_ADDR; 
	
	//update_flag = 0x06;
	if(update_flag == 0x06)
	{
		
	}
	else if(update_flag == 0x08)//跳转app
	{
		HAL_Delay(2000);
		app_jump();
	}

写标志的注意项:

先擦flash再写:

因为标志位写在flash,所以需要先擦再写,不然写不进去:

cpp 复制代码
 #define FMC_UPDATE_INFO_ADDR 0x08004000 //升级标志位                         





                         HAL_FLASH_Unlock();
						
// 写入更新标志到Flash
											    __HAL_FLASH_CLEAR_FLAG((FLASH_FLAG_OPERR | FLASH_FLAG_WRPERR
														| FLASH_FLAG_PGAERR | FLASH_FLAG_PGPERR | FLASH_FLAG_PGSERR));
														FLASH_EraseInitTypeDef FLASH_EraseInitType;
														FLASH_EraseInitType.TypeErase = FLASH_TYPEERASE_SECTORS;
														FLASH_EraseInitType.Sector = FLASH_SECTOR_1;
														FLASH_EraseInitType.NbSectors = 1;
														FLASH_EraseInitType.VoltageRange = FLASH_VOLTAGE_RANGE_3;
														if (HAL_FLASHEx_Erase(&FLASH_EraseInitType, &SectorError) != HAL_OK)
														{
														}
														
						HAL_FLASH_Program(FLASH_TYPEPROGRAM_WORD, FMC_UPDATE_INFO_ADDR, 0x06);
						HAL_FLASH_Lock();	

APP工程的一些设定:

APP地址:

1

APP固化bin文件:

fromelf --bin --output="$L@L.bin" "#L"

相关推荐
宵时待雨5 小时前
C++笔记归纳13:map & set
开发语言·数据结构·c++·笔记·算法
1104.北光c°6 小时前
滑动窗口HotKey探测机制:让你的缓存TTL更智能
java·开发语言·笔记·程序人生·算法·滑动窗口·hotkey
默默开发7 小时前
完整版:本地电脑 + WiFi 搭建 AI 自动炒股 + 自我学习系统
人工智能·学习·电脑
for_ever_love__7 小时前
Objective-C学习 NSSet 和 NSMutableSet 功能详解
开发语言·学习·ios·objective-c
盐水冰15 小时前
【烘焙坊项目】后端搭建(12) - 订单状态定时处理,来单提醒和顾客催单
java·后端·学习
Hello小赵15 小时前
视频压缩编码学习(一)—— 基础知识大集合
学习
左左右右左右摇晃15 小时前
计算机网络笔记整理
笔记·计算机网络
不吃西红柿的8515 小时前
[职场] 内容运营求职简历范文 #笔记#职场发展
笔记·职场和发展·内容运营
逐步前行16 小时前
STM32_TIM_寄存器操作
stm32·单片机·嵌入式硬件
似水明俊德16 小时前
02-C#.Net-反射-学习笔记
开发语言·笔记·学习·c#·.net