stm32cubeide烧写程序_STM32 Cube IDE 下实现 IAP —— (1) 程序跳转
ST 推出自家的IDE:STM32 CubeIDE 有一段时间了,现在正好有新的项目了,尝试直接把它用起来了,不用再来回去切换 CubeMX 和其他 IDE 了。
目前的项目是要做一个 IAP 的框架,那就先从 Bootloader 到 APP 的程序跳转开始。手头正好有一块 NUCLEO-F072RB,就用它了。
首先新建一个工程:IAP_Bootloader
Bootloader 的一项任务就是要跳转到用户 APP 去执行。在 main.c 中新建一个函数 go2APP
#define FLASH_APP_ADDR 0x8008000
typedef void (*pFunction)(void);
void go2APP(void) {
uint32_t JumpAddress;
pFunction Jump_To_Application;
printf("BOOTLOADER Start\n");
//Check
if (((*(__IO uint32_t*) FLASH_APP_ADDR) & 0x2FFE0000) == 0x20000000) {
printf("APP Start...\n");
HAL_Delay(100);
// Jump to user application //
JumpAddress = *(__IO uint32_t*) (FLASH_APP_ADDR + 4);
Jump_To_Application = (pFunction) JumpAddress;
// Initialize user application's Stack Pointer //
__set_MSP(*(__IO uint32_t*) FLASH_APP_ADDR);
Jump_To_Application();
} else {
printf("No APP found!!!\n");
}
}
先简单预留 32KB 给 Bootloader,所以 FLASH_APP_ADDR 就是从 0x8008000 开始。如何从串口 printf,可以参考这里 (STM32 Cube IDE 下实现串口 printf)
可以看到现在打出的 log 是:No APP found。简单说明一下判断是否有APP存在的机制,就是判断APP开头是否是合理的堆栈地址,而RAM地址是从 0x20000000 开始的。
接下里再来建立一个 IAP_APP 的工程。在 main.c 中,只是简单添加一句 printf(“APP Run\n”)。主要需要修改的生成的可以执行文件的起始地址,需要修改 STM32F072RBTX_FLASH.ld
找到 FLASH (rx) : ORIGIN = 0x8000000, LENGTH = 128K 一句,修改为 FLASH (rx) : ORIGIN = 0x8008000, LENGTH = 96K。再来编译运行一下
如果使用了中断(通常都会用),还需要修改中断向量表的偏移量。
对于 STM32F1 系列,在文件 system_stm32f1xx.c 中搜索 VECT_TAB_OFFSET,原本的值通常为:0,在本例中需要改成0x8000 即可。
对于 STM32F0 系列,由于没有中断向量偏移寄存器,需要手动复制中断向量表。在 main 函数开始处加入:
memcpy((void) 0x20000000, (void) 0x8000, 0x100);
SYSCFG->CFGR1 |= 0x03;
将中断向量复制到内存,并映射内存地址到 0x00000000 。
由于占用了系统内存的前256个字节,还需要再修改一下 STM32F072RBTX_FLASH.ld 排除这部分内存,以免被覆盖。找到 RAM (xrw) : ORIGIN = 0x20000000, LENGTH = 16K,修改为 RAM (xrw) : ORIGIN = 0x20000100, LENGTH = 16128 即可。
看到 APP Run 的 log 打出来,这样一个简单的从 bootloader 到 APP 的跳转就算完成了 ^o^
stm32cubeide烧写程序_STM32 Cube IDE 下实现 IAP —— (1) 程序跳转相关推荐
- 关于C#开发山寨操作系统,程序语言,浏览器,IDE,Office,Photoshop等大型程序的可行性歪论及意义...
首先,起这么个大标题不是为了眼球,也决非本人自大,本人对技术是很一般的也就是个普通人.不过因为受一些言论,贴子,新闻等综合思考而产生. 有些人认为C#这不行那不行,只能做做"企业管理&quo ...
- stm32cubeide烧写程序_STM32Cube工具,覆盖开发全过程(一)
STM32Cube家族的软件工具,从选型到开发/调试,到代码二进制烧录,选项字节操作,到运行监测,覆盖了全部的开发过程.它们各自有功能侧重,也有功能重叠,但是合在一起,就提供给STM32开发者,一个无 ...
- linux串口程序不能,在uclinux下编写串口通信程序,COM2只能发送数据不能接收,是怎么回事呢?...
菜鸟 2005-08-17 20:59:00 评分 3楼 嵌入式Linux开发板上NFS文件系统的使用 浏览过442次 作者:深圳远峰 近年来,随着计算技术.通信技术的飞速发展,嵌入式产品成为信 ...
- linux32位运行64位程序,32位windows下可以运行的程序在64位linux下报错
已结贴√ 问题点数:20 回复次数:3 32位windows下可以运行的程序在64位linux下报错 filt.c在32位windows code:blocks 10.05下运行无任何异样. 传到64 ...
- stm32cubeide烧写程序_stm32mp157 Cortex M4开发篇:stm32CubeIDE开发环境搭建
写在前面: 本文章为<STM32MP1系列教程之Cortex-M4开发篇>系列中的一篇,全系列总计11篇.笔者使用的开发平台为华清远见FS-MP1A开发板(STM32MP157开发板).针 ...
- stm32cubeide烧写程序_STM32CubeIDE使用入门的几个常见问题
ST公司为广大STM32用户提供了免费的集成开发工具STM32CubeIDE有一段时间了.常言道,万事开头难.这里就其入门使用的几个常见问题分享交流下. 1.STM32CubeIDE该免费工具哪里可以 ...
- stm32cubeide烧写程序_初学STM32CubeIDE
初学 STM32CubeIDE 一.关于安装 安装已经有好多人说过了,我就不重复. 二.认识界面 初初打开软件, 自动打开 " Information Center " 就是信息中 ...
- uboot模式下烧写Android分区表,xboot-Android4.0下烧录遇到的问题 001 fastboot + SD 的办法 - Powered by Discuz!...
1 方法一: ubuntu下用fastboot烧录SD卡uboot的问题: 1.1 我参照手册:x210v3 android4.0平台用户手册 20130724 的第5.6章的方法: 先用 ./mk ...
- 怎么用centos7运行c语言程序_在Linux下运行C语言程序
市面上常见的Linux都是发行版本,典型的Linux发行版包含了Linux内核.桌面环境和各种常用的必备工具,国内使用较多的是Ubuntu(乌班图).CentOS.Fedora. 我以Fedora 2 ...
最新文章
- rn+与android+交互,React native 与Android原生交互方式(一)
- java单例注册表_Spring对单例的底层实现,单例注册表
- 《I'm a Mac:雄狮训练手册》——1.12 开机快捷键
- ssl2646-线段树练习3【线段树】
- 我的第一程序语言python
- 重磅开源|AOP for Flutter开发利器——AspectD
- 配色没有灵感?最流行的配色案例!没有一个人不爱的
- 深入理解Intel Core Microarchitecture
- 程序员的每个阶段,都应该需要思考自己要什么?
- mysql 数据库和实例_mysql中数据库和数据库实例的概念区别
- 细胞生长曲线拟合matlab,绘制细胞生长曲线及细胞群体倍增时间的简化计算
- 南方cass简码识别大全_cass-简码识别详细分解.doc
- 用Java给您的图片瘦身之Thumbnailator技术
- 当你半夜失眠时,玩手机越玩越精神怎么办
- SSL证书的加密算法都有哪些?
- Java基础学习经验分享
- Debian安装redis
- 《邂逅美丽》之赏析2
- Modelsim10.5和ISE14.7安装及联合仿真
- 撸一个基于VUE的WEB管理后台(一)