首页 > 其他分享 >STM32 HAL开发完全指南

STM32 HAL开发完全指南

时间:2023-05-25 19:23:17浏览次数:48  
标签:指南 HAL DFU APP ADD STM32 DEFAULT USBD 0x20000000

关于STM32 IAP升级之为什么APP执行要&0x2FFE0000这个数值的原因

关于STM32 IAP升级之为什么APP执行要&0x2FFE0000这个数值的原因

嵌入式软件开发 嵌入式软件开发 Carroll University 工商管理硕士  

如下图所示,这是我目前用的一款CPU:STM32F446RET6,大小是512KB

我的bootloader编译完以后占用了26KB的FLASH内存。 我的APP占用了363K的FLASH内存,主要是因为LCD显示,刷的图片很多,很占内存。 为了给以后的Bootloader扩展更多的功能需求,我给我的Bootloader栈顶占用FLASH 0x10000的大小,也就是64k。 所以,目前Bootloader占用了从Sector0-Sector3三个扇区,剩下的区域就分给APP吧。

APP从FLASH的0x8010000开始运行,也就是从扇区4Sector-4开始,STM32F446RET6的FLASH的大小是512KB,由于Bootloader占用了64KB,所以还剩余448KB,这一部分给我的APP用。我们可以将448KB * 1024 => 458752B =>再换算成十六进制>0x70000,所以上面这个0x70000是这么得出来的。 再来看看我的这款CPU的SRAM,先简单了解下SRAM:

然后打开Keil以及芯片数据手册查看。

从下面文档看出,我的这款CPU的SRAM是0x20000,也就是128KB

在写针对DFU固件更新程序时候,这里有一段跳转到APP的代码:

#define USBD_DFU_APP_DEFAULT_ADD     0x08010000U
static void JumpToApp(void)
{
	//如果按键没有按下,则启动APP
    if(HAL_GPIO_ReadPin(KEY2_GPIO_Port, KEY2_Pin) == 1)
    {
        /* Test if user code is programmed starting from USBD_DFU_APP_DEFAULT_ADD * address */
		if(((*(__IO uint32_t*)USBD_DFU_APP_DEFAULT_ADD) & 0x2FFE0000 ) == 0x20000000)
        {
            /* Jump to user application */
            JumpAddress = *(__IO uint32_t *) (USBD_DFU_APP_DEFAULT_ADD + 4);
            JumpToApplication = (pFunction) JumpAddress;

            /* Initialize user application's Stack Pointer */
            __set_MSP((*(__IO uint32_t *) USBD_DFU_APP_DEFAULT_ADD));
            JumpToApplication();
        }
    }
}

我之前一直没搞明白为什么对APP的地址简引用,然后得出的数值 & 0x2FFE0000等于0x20000000就认为有APP,可以跳转到对应的地址去执行我的APP程序了,那我&上别的什么乱七八糟的数据它不香吗??为何呢??

原因如下:

程序在运行过程中,0x20000000是我们SRAM运行的起始地址,空间是128KB,也就是0x20000000-0X2001FFFF这个范围。 所以*(__IO uint32_t*)USBD_DFU_APP_DEFAULT_ADD) ,这句话的意思是取得用户地址空间存放的数据,这个空间就是0x08010000,当APP运行的程序栈顶指针落在SRAM区域时,也就是0x20000000到0X2001FFFF这个区间时候,这个时候即是有效的栈顶指针,由于开始的地址是0x20000000,而结束的地址是0X2001FFFF,我们只要判断它的高16位,即是确定这个地址范围在从0x2000开始。

转发:https://zhuanlan.zhihu.com/p/105109753

标签:指南,HAL,DFU,APP,ADD,STM32,DEFAULT,USBD,0x20000000
From: https://www.cnblogs.com/dreamboy2000/p/17432626.html

相关文章

  • express开发api指南--服务器发布
    8.1Linux服务器linux服务器相对简单。一般都自带node环境。没有的话apt-get或者yum安装一下。//查看node版本node-v//把文件除了node-modules文件夹都上传到服务器//以放在opt/express为例cd/opt/expressnpminstall//使用pm2包npminstall-gpm2//在项目文件夹下执......
  • express开发api指南--记录日志
    败笔,目前还是我的败笔。没有找到好的方法去记录。现在只能记录请求的记录,api的返回记录没有记录下来。用的morgan中间件。这个在项目创建时已安装。//首先安装轮询文件流插件和时间处理插件cnpminstall--saverotating-file-streamdayjs//修改app.js//引入插件varrfs=......
  • 走进Linux世界,学习Linux系统的必备指南
    随着计算机技术的不断发展,Linux操作系统已成为IT行业中备受关注的操作系统之一。Linux以其安全性、稳定性和开放性,受到了广泛的认可和欢迎。学习Linux系统对于IT行业的从业者来说是非常重要的。但是,对于初学者来说,学习Linux可能会感到有些困难。所以,我今天我打算给初学者们答疑解惑......
  • Oracle中读取JSON格式数据实战指南(oracle中读json)
    Oracle中读取JSON格式数据实战指南 随着大数据、云计算等技术的快速发展,JSON(JavaScriptObjectNotation)格式的数据越来越广泛应用于数据交互和存储中。Oracle数据库支持JSON格式数据的存储和查询,本篇文章将介绍如何在Oracle中读取JSON格式数据,并提供相关代码示例。 1.创建......
  • MobPush 合规指南
    确保APP有《隐私政策》您需要确保App有《隐私政策》,并且在用户首次启动App时就弹出《隐私政策》取得用户同意。添加MobTech隐私协议MobPushSDK隐私政策您务必告知用户您选择MobSDK服务,请在《隐私政策》中增加如下参考条款:MobPushSDK 我们使用了第三方(上海掌之淘信息技术有限公司,......
  • STM32H5移植zbar记录
    ZBar是一种流行的二维码扫描和解码工具,它在嵌入式系统中拥有广泛的应用。在嵌入式系统中,我们面临着有限的资源和更严格的性能要求,因此,选择适当的库来完成特定的任务非常重要。ZBar适用于各种嵌入式平台,包括ARM、x86和MIPS等处理器架构。它可以轻松地整合到各种嵌入式系统中,如智能......
  • stm32 编译出的bin文件一定是4字节的倍数吗?
    最近在研究固件升级,在烧写内部FLASH时突然产生一个问题编译出的bin文件一定是4字节的倍数吗?如果不是那么以bin文件总长度除以4的方式写入flash就有可能舍掉了最后的余数。在stackoverflow上得到的答案是:正常情况下编译产生的bin文件是4的倍数,但是并不一定是4字节的倍数,4字节对齐......
  • 走进Linux世界,学习Linux系统的必备指南
    随着计算机技术的不断发展,Linux操作系统已成为IT行业中备受关注的操作系统之一。Linux以其安全性、稳定性和开放性,受到了广泛的认可和欢迎。学习Linux系统对于IT行业的从业者来说是非常重要的。但是,对于初学者来说,学习Linux可能会感到有些困难。 所以,我今天我打算给初学者们答......
  • Eclipse快速上手指南之使用JUnit
    [url]http://www.chinaitpower.com/A/2004-12-01/142029.html[/url]在Eclipse中使用JUnit测试对于保证软件开发质量有着非常重要的作用,单元测试更是必不可少,JUnit是一个非常强大的单元测试包,可以对一个/多个类的单个/多个方法测试,还可以将不同的TestCas......
  • 界面控件DevExtreme使用指南 - 如何自定义上下文菜单和工具栏
    DevExtreme FileManager(文件管理器)小部件现在支持自定义内置的工具栏和上下文菜单,用户可以使用标准和定义的命令项填充项目集合,并配置设置来更改其外观和操作。DevExtreme拥有高性能的HTML5/JavaScript小部件集合,使您可以利用现代Web开发堆栈(包括React,Angular,ASP.NETCore,jQu......