(STM32F4) IAP程式碼實現
IAP學習, 主要想了解實際上程式碼放在不同的Flash位置如何轉跳且執行。
我的應用程序只做了Pin12, Pin13 LED閃爍來分辨我的 App1 跟 App2的程式碼
App1 程式碼
int main(void)
{
Delay_Init();
LED_Config();
EXIT_GPIO_Config();
printf("\n--------------------------------------------------\n");
printf("\n STM32F4 IAP APP1 \n");
printf("\n--------------------------------------------------\n"); /* Flash unlock */
FLASH_If_FlashUnlock(); /* Test if User button on the Discovery kit is pressed */
if (GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_0) == Bit_RESET)
{
/* Check Vector Table: Test if user code is programmed starting from address
"APPLICATION_ADDRESS" */
if (((*(__IO uint32_t*)APPLICATION_ADDRESS) & 0x2FFE0000 ) == 0x20000000)
{
/* Jump to user application */
JumpAddress = *(__IO uint32_t*) (APPLICATION_ADDRESS + );
Jump_To_Application = (pFunction) JumpAddress;
/* Initialize user application's Stack Pointer */
__set_MSP(*(__IO uint32_t*) APPLICATION_ADDRESS);
Jump_To_Application();
}
} while()
{
GPIOD->ODR |= GPIO_Pin_13;
DelayMs();
GPIOD->ODR &= ~GPIO_Pin_13;
DelayMs();
} }
App2 程式碼
int main(void)
{
Delay_Init();
LED_Config();
EXIT_GPIO_Config();
printf("\n--------------------------------------------------\n");
printf("\n STM32F4 IAP APP2 \n");
printf("\n--------------------------------------------------\n"); while()
{
GPIOD->ODR |= GPIO_Pin_12;
DelayMs();
GPIOD->ODR &= ~GPIO_Pin_12;
DelayMs();
} }
App1 轉跳 App2 經過一個IO的判斷去決定是否轉跳, 在App2的程式碼內也要指定程式碼放的位置。
分別是 system_stm32f4xx.c 理頭的 VECT_TAB_OFFSET 必須修改成App2的位置

Flash 位置也要改成從0x8010000開始

轉跳代碼
/* Flash unlock */
FLASH_If_FlashUnlock(); /* Test if User button on the Discovery kit is pressed */
if (GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_0) == Bit_RESET)
{
/* Check Vector Table: Test if user code is programmed starting from address
"APPLICATION_ADDRESS" */
if (((*(__IO uint32_t*)APPLICATION_ADDRESS) & 0x2FFE0000 ) == 0x20000000)
{
/* Jump to user application */
JumpAddress = *(__IO uint32_t*) (APPLICATION_ADDRESS + );
Jump_To_Application = (pFunction) JumpAddress;
/* Initialize user application's Stack Pointer */
__set_MSP(*(__IO uint32_t*) APPLICATION_ADDRESS);
Jump_To_Application();
}
}
第9行 APPLICATION_ADDRESS必須定義成APP2 Flash 存放的Address, 這段代碼在STM官方網站理頭都下載得到
#define APPLICATION_ADDRESS (uint32_t)0x08010000
if (((*(__IO uint32_t*)APPLICATION_ADDRESS) & 0x2FFE0000 ) == 0x20000000)
在我的代碼裡頭, 在開機時只需要把 PA0 接到 GND, LED 閃爍的就是P12的LED。
App1 Code 位置從 0x8000000 開使堆疊(Stack)
App2 Code 位置從 0x8010000 開始堆疊(Stack)
(STM32F4) IAP程式碼實現的更多相关文章
- 使用Mutex實現單一程式執行個體的注意事項(转)
		相信大家都知道在.NET程式中若要實現單一程式執行個體,一般來說有幾種方法,像是去判斷是否已經有開啟的Process是相同的程式.用Mutex與Semaphore之類的技術來判斷是否程式正在開啟.但是 ... 
- JavaFX結合 JDBC, Servlet, Swing, Google Map及動態產生比例圖 (2):JavaFX建立及程式碼說明 (转帖)
		說明:就如同標題一樣,前端會用到JavaFX.Swing.Java Web Start.Google Map 的技術, 後端就是JDBC.Servlet的技術,以及我們會簽署認證jar檔案,這樣才可存 ... 
- ASP.NET MVC 4.0 学习2-留言板實現
		新增專案實現留言板功能,瞭解MVC的運行機制 1,新增專案 2,添加數據庫文件message.mdf Ctrl+W,L 打開資料庫連接,添加存放留言的Atricle表 添加字段,後點擊&quo ... 
- 開玩樹莓派(二):配置IP,實現無顯示器局域網內Putty連接和RDP遠程
		目錄: 開玩樹莓派(一):安裝Raspbian系統 開玩樹莓派(二):配置IP,實現無顯示器局域網內Putty連接和RDP遠程 開玩樹莓派(三):Python編程 開玩樹莓派(四):GPIO控制和遠程 ... 
- C# 實現文件壓縮-- 背景:服務器Log.txt 過多,佔用過多硬盤空間,壓縮備份后節省空間資源
		1.壓縮實現代碼如下: 調用ICSharpCode.SharpZipLib.dll(free software,可以搜到源碼). 轉移指定目錄文件夾轉移到目標文件夾 壓縮目標文件夾 刪除目標文件夾 u ... 
- css 實現微信聊天類似的氣泡
		要實現這樣的效果 代碼如下: --------------------------------------- <style> .test{width:300px; padding:30px ... 
- Neo4j中實現自定義中文全文索引
		資料庫檢索效率時,一般首要優化途徑是從索引入手,然後根據需求再考慮更復雜的負載均衡.讀寫分離和分散式水平/垂直分庫/表等手段:索引通過資訊冗餘來提高檢索效率,其以空間換時間並會降低資料寫入的效率,因此 ... 
- Jquery scrollTop animate 實現動態滾動到頁面頂部
		這個方法之前都是用的錨點實現的,但是效果僵硬,動感不足! 之後參考了一些網站,發現都是用的js,於是自己想到用jquery 來做一個插件也來實現以下這個小功能. $.fn.backTop = func ... 
- linux下c++實現簡單的生產者消費者隊列模式
		引言 生產者消費者是一個經典的模式 利用生產者,消費者和緩衝區降低了生產者和消費者之間的的耦合度 便於對生產者和消費者的修改 下面記錄的是一個經典的單一生產者多消費者的模式 設計思路 以隊列做為緩衝區 ... 
随机推荐
- 以女朋友为例讲解 TCP/IP 三次握手与四次挥手
			背景 和女朋友异地恋一年多,为了保持感情我提议每天晚上视频聊天一次. 从好上开始,到现在,一年多也算坚持下来了. 问题 有时候聊天的过程中,我的网络或者她的网络可能会不好,视频就会卡住,听不到对方的声 ... 
- Java Persistence with MyBatis 3(中文版) 第二章 引导MyBatis
			MyBatis最关键的组成部分是SqlSessionFactory,我们可以从中获取SqlSession,并执行映射的SQL语句.SqlSessionFactory对象可以通过基于XML的配置信息或者 ... 
- functions函数插件的定义和使用
			创建Smarty插件:在插件目录(plugins)里新建文件 类型.插件名.php文件,然后插件方法名字书写规范: smarty_类型_插件名([...]){}在模板(tpl文件)中调用插件时格式{插 ... 
- [GO]接口的定义和实现
			package main import "fmt" type Humaner interface { SayHi() } type Student struct { name st ... 
- dd命令使用
			一.dd命令的解释 dd:用指定大小的块拷贝一个文件,并在拷贝的同时进行指定的转换. 注意:指定数字的地方若以下列字符结尾,则乘以相应的数字:b=512:c=1:k=1024:w=2 参数注释: 1. ... 
- form action 相对路径出问题
			http://www.w3chtml.com/html5/tag/base.html <base> 标签为页面上的所有链接规定默认地址或默认目标. 通常情况下,浏览器会从当前文档的 URL ... 
- Enum , Enum Class ?
			使用Enum还是Enum Class? 根据Enum和Enum Class的特点,我们可以根据对常量类型的要求决定使用Enum还是Enum Class. 以下场景适合使用Enum: 常量类型用于内部表 ... 
- docker 进入容器
- Spring Boot - Spring Async
			除了使用Thread.Runnable.TimerTask.FeatureTask.CompletableFuture等类,在Spring Boot中还可以使用注解创建异步任务,可以减少线程处理的代码 ... 
- hihocoder1580 Matrix
			题目链接:(vjudge)戳我 从今天开始不咕咕地填坑啦 考虑一般的求最大子矩阵和...我们一般都是DP,或者直接上悬线法递推. 下面附一个DP的代码: #include<iostream> ... 
