【正點原子STM32連載】 第六十章 串口IAP實驗(Julia分形)實驗 摘自【正點原子】APM32F407最小系統板使用指南

1)實驗平臺:正點原子APM32F407最小系統板
2)平臺購買地址:https://detail.tmall.com/item.htm?id=609294757420
3)全套實驗源碼+手冊+視頻下載地址: http://www.openedv.com/thread-340252-1-1.html##

第六十章 串口IAP實驗

本章將介紹在APM32F407上使用串口進行IAP,以實現簡單的IAP功能。通過本章的學習,讀者將學習到IAP的使用。
本章分為如下幾個小節:
60.1 硬件設計
60.2 程序設計
60.3 下載驗證

60.1 硬件設計
60.1.1 例程功能

  1. 程序運行后進入等待接收APP的bin數據的狀態
  2. 接收到APP的bin數據后,先后按下KEY0按鍵和KEY_UP按鍵,可分別進行將APP的bin數據加載到Flash和跳轉到APP的位置執行APP的操作
  3. LED0閃爍,指示程序正在運行
    60.1.2 硬件資源
  4. LED
    LED0 - PF9
  5. 按鍵
    KEY0 - PE4
    KEY_UP - PA0
  6. USART1(PA9、PA10連接至板載USB轉串口芯片上)
  7. 正點原子 2.8/3.5/4.3/7/10寸TFTLCD模塊(僅限MCU屏,16位8080并口驅動)
    60.1.3 原理圖
    本章實驗使用的IAP為軟件算法,因此沒有對應的連接原理圖。
    60.2 程序設計
    60.2.1 IAP的實現
    本章實驗提供了用于IAP的驅動代碼,如下圖所示:

圖60.2.1.1 IAP驅動代碼
IAP的實現最主要分為兩個步驟,分別為加載APP固件至Flash和跳轉到APP中運行,為此本實驗實現了以上兩個函數,如下所示:
void iap_write_appbin(uint32_t appxaddr,uint8_t *appbuf,uint32_t applen);
void iap_load_app(uint32_t appxaddr);
以上兩個函數就分別實現了加載APP固件至Flash和跳轉到APP運行的功能,這兩個函數的使用示例,如下所示:

#include "apm32f4xx.h"
#include "./IAP/iap.h"#define FLASH_APP_ADDR (0x08010000)
#define APP_MAX_SIZE (120*1024)static uint8_t appbin[APP_MAX_SIZE];void example_fun(void)
{uint32_t appsize;/* 通過串口等方式獲取APP的二進制數據 */appsize = get_app_bin(appbin);/* 將APP的二進制數據寫入Flash的指定地址中 */iap_write_appbin(FLASH_APP_ADDR, appbin, appsize);/* 跳轉到APP在Flash中的起始地址運行 */iap_load_app(FLASH_APP_ADDR);
}

60.2.2 APP工程修改
APP程序要能夠在指定的Flash起始地址運行,需要編譯器在編譯APP的時候知道APP將被保存在Flash的那個位置,對于MDK軟件,可以在Options for Target窗口中設置,如下圖所示:
在這里插入圖片描述

圖60.2.2.1 配置MDK中的Flash空間
上圖中將APP程序保存在Flash中的空間配置為0x8010000~(0x8010000+0xF0000),通過這樣的配置便可以使APP被保存在指定Flash位置中執行。讀者可以自行配置“Start”和“Size”參數,但要注意不能超過Flash的范圍,并且也不要覆蓋IAP程序(Bootloader)。
上一小節中將APP保存到Flash中的操作操作的是二進制數據,因此APP也應當被編譯為二進制文件,然后MDK軟件中并沒有直接編譯出二進制文件的選項,因此需要配置MDK在編譯完成后執行指定的命令,如下圖所示:
在這里插入圖片描述

圖60.2.2.2 配置MDK生成二進制文件
完成以上配置后,便可在APP程序編譯完成后在工程的Output目錄下得到正確的二進制文件。
60.2.3 實驗應用代碼
本章實驗的應用代碼,如下所示:

int main(void)
{/* 僅保留關鍵代碼,其余代碼省略 *//* 初始化串口 */usart_init(115200);while (1){/* 串口已接收到數據 */if (g_usart_rx_cnt != 0){/* 新的一次循環串口還沒有接收到新數據,* 則斷定串口接收完畢*/if (lastcount == g_usart_rx_cnt){/* 記錄APP固件大小 */applenth = g_usart_rx_cnt;lastcount = 0;g_usart_rx_cnt = 0;}else{lastcount = g_usart_rx_cnt;}}key = key_scan(0);switch (key){case KEY0_PRES:{/* 將串口接收到的APP二進制數據寫入Flash中的指定位置 */iap_write_appbin(FLASH_APP1_ADDR, g_usart_rx_buf, applenth);break;}case WKUP_PRES:{/* 跳轉到Flash的指定位置執行APP程序 */iap_load_app(FLASH_APP1_ADDR);break;}}delay_ms(100);}
}

從上面的代碼中可以看出,程序是通過串口接收APP的二進制數據的,因此串口驅動中的串口接收緩存因該設置的足夠大,以能夠容納APP的二進制數據,本實驗中串口接收緩存的配置如下所示:
/* 定義最大接收120KB數據 */
#define USART_REC_LEN (120 * 1024)
在判斷APP二進制數據接收完畢后,便可通過KEY0按鍵調用函數iap_write_appbin()將APP的二進制數據寫入Flash中的FLASH_APP1_ADDR位置中,FLASH_APP1_ADDR是一個宏,該宏的定義如下所示:
#define FLASH_APP1_ADDR 0x08010000
需要注意的是,APP寫入的位置應當與上一小節中配置MDK軟件的指定Flash位置相同。
將APP的二進制數據寫入到Flash中后,此時運行的依舊是IAP(Bootloader)程序,此時可以按下KEY_UP按鍵來跳轉到Flash中APP的位置執行APP程序。
60.3 下載驗證
在完成編譯和燒錄操作后,可以看到LCD上顯示了本實驗的相關實驗信息,此時程序正在等待串口接收APP的二進制數據,此時便可通過串口調試助手將實現編譯生成的APP二進制文件發送給MCU,待發送完畢后按下KEY0按鍵,將APP的二進制數據寫入到Flash中,若寫入成功,LCD上將會有相應的提示,此時便可按下KEY_UP按鍵將程序跳轉到APP的保存位置中運行,若指定的Flash位置保存了正確的APP固件,那么便可看到MCU正在運行APP程序,而非IAP(Bootloader)程序。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/167224.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/167224.shtml
英文地址,請注明出處:http://en.pswp.cn/news/167224.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

CMake使用file(GLOB ...)需要注意的問題

文章目錄 基本語法使用例子潛在的問題大型項目中推薦的用法 file(GLOB ...) 命令用于獲取匹配指定模式的文件列表。在 CMake 中,file(GLOB ...) 命令的一種常見用法是用于收集源文件列表,例如 C 源文件(.cpp)和 C 源文件&#xff…

html頁面加載json數據,在html中顯示JSON數據的方法

html頁面加載json數據,在html中顯示JSON數據的方法 export const mixin {methods: {syntaxHighlight(json) {if (typeof json ! string) {json JSON.stringify(json, undefined, 2);}json json.replace(/&/g, &).replace(/</g, <).replace(/>/g, >);re…

實例分割12篇頂會論文及代碼合集,含2023最新

同學們&#xff0c;你們覺得視覺經典四個任務中哪個最難&#xff1f;我個人覺得是實例分割。 因為它既具備語義分割的特點&#xff0c;需要做到像素層面上的分類&#xff0c;也具備目標檢測的一部分特點&#xff0c;即需要定位出不同實例&#xff0c;即使它們是同一種類。 但…

LangChain的函數,工具和代理(一):OpenAI的函數調用

一、什么是函數調用功能 幾個月前OpenAI官方發布了其API的函數調用功能(Function calling), 在 API 調用中&#xff0c;您可以描述函數&#xff0c;并讓模型智能地選擇輸出包含調用一個或多個函數的參數的 JSON 對象。API函數“ChatCompletion” 雖然不會實際調用該函數&#…

C語言變量和常量

變量和常量 標識符 在計算機高級語言中&#xff0c;用來對變量、符號常量、函數、數組、類型等命名的有效字符序列統稱為標識符&#xff08;identifier&#xff09;。 C語言規定標識符&#xff1a; 只能由字母&#xff0c;數字和下劃線組成。不能以數字開頭。字母區分大小寫…

一站式企業快遞管理平臺使用教程

因公寄件在企業中重要性的提升&#xff0c;催生出了企業快遞管理平臺。為什么這么說呢&#xff1f; 隨著經濟和快遞行業的發展&#xff0c;因公寄件在企業中成了一件“常事”&#xff0c;寄文件合同、發票、節假日慰問品、樣品等等&#xff0c;這種情況之下&#xff0c;因公寄件…

Vue3 設置點擊后滾動條移動到固定的位置

需求&#xff1a; 點擊不通過按鈕&#xff0c;顯示紅框中表單&#xff0c;且滾動條滾動到底部 &#xff08;顯示紅框中表單默認不顯示&#xff09; <el-button click"onApprovalPass">不通過</el-button> <div class"item" v-if"app…

vue打包優化

vue.config.js文件中 module.exports defineConfig({ productionSourceMap: false,//去掉mapjs文件 });

pwn:[SWPUCTF 2021 新生賽]nc簽到

題目 linux環境下顯示為 配合題目的下載附件&#xff0c;發現過濾了一些&#xff0c;一旦輸入這些會自動關閉程序 ls被過濾了&#xff0c;可以使用l\s cat和空格都被過濾了&#xff0c;cat可以換成c\at ,空格可以換成$IFS$9

<HarmonyOS第一課>1·運行Hello World【課后考核】

【習題】運行Hello World工程 判斷題 1.DevEco Studio是開發HarmonyOS應用的一站式集成開發環境。 正確(True) 2.main_pages.json存放頁面page路徑配置信息。 正確(True) 單選題 1.在stage模型中&#xff0c;下列配置文件屬于AppScope文件夾的是&#xff1f;&#xff08;…

Youtube0播放?運營教你需要的技巧、策略與工具!

對于有跨境意向的內容創作者或者品牌企業來說&#xff0c;YouTube是因其巨大的潛在受眾群和商業價值成為最值得投入變現與營銷計劃的平臺。 據統計&#xff0c;98% 的美國人每月訪問 YouTube&#xff0c;近三分之二的人每天訪問。但是&#xff0c;YouTube還遠未達到過度飽和的…

酵母雙雜交服務專題(一)

酵母雙雜交系統是一種在酵母這種真核生物模型中執行的實驗方法&#xff0c;用于探索活細胞內部蛋白質間的相互作用。這種技術能夠敏感地捕捉蛋白質間的細微和短暫相互作用&#xff0c;通過檢測報告基因的表達產物來實現。作為一種高度靈敏的技術&#xff0c;酵母雙雜交系統被廣…

Spring Cloud LoadBalancer 簡單介紹與實戰

前言 本文為SpringCloud的學習筆記&#xff0c;如有錯誤&#xff0c;希望各位高手能指出&#xff0c;主要介紹SpringCloudLoadBalancer的基本概念和實戰 文章目錄 前言什么是LoadBalancer負載均衡分類服務端負載均衡客戶端負載均衡服務端負載均衡和客戶端負載均衡的優缺點 常見…

評測|PolarDB MySQL 版 Serverless

評測&#xff5c;PolarDB MySQL 版 Serverless 目錄 一、測試背景 1.1、云原生數據庫 PolarDB Serverless新架構概念 1.2、Serverless資源彈性擴縮觸發條件 二、PolarDB的Serverless能力與同類型產品進行對比 三、動態彈性升降資源的能力測試 3.1、測試資源 3.2、測試一…

ubuntu22.04在線安裝redis,可選擇版本

安裝腳本7.0.5版本 在線安裝腳本&#xff0c;默認版本號是7.0.5&#xff0c;可以根據需要選擇需要的版本進行下載編譯安裝 sudo apt-get install gcc -y sudo apt-get install pkg-config -y sudo apt-get install build-essential -y#安裝redis rm -rf ./tmp.log systemctl …

freeRTOS下載鏈接(sourceForge)

FreeRTOS Real Time Kernel (RTOS) download | SourceForge.net 文件名&#xff1a;FreeRTOSv202212.00.exe 雙擊后會自動變成這個樣子的&#xff1a; 文件夾大小&#xff1a;506M 可以看到跟那個教程里面的文件結構是一模一樣的&#xff0c;所以很可能是同一個最新版本的文件…

Linux(Centos)上使用crontab實現定時任務(定時執行腳本)

場景 Windows中通過bat定時執行命令和mysqldump實現數據庫備份&#xff1a; Windows中通過bat定時執行命令和mysqldump實現數據庫備份_mysqldump bat-CSDN博客 上面講windows中使用bat實現定時任務的方式&#xff0c;如果是在linux上可以通過crontab實現。 cron是服務名稱。…

高斯DB數據庫添加字段并添加字段注釋

個人網站 公眾號小肖學數據分析 可以使用以下SQL語句向高斯DB數據庫添加字段并添加字段注釋&#xff1a; ALTER TABLE 表名 ADD COLUMN 列名 數據類型 COMMENT 字段注釋; "表名"替換為要添加字段的表名&#xff0c;"列名"替換為要添加的字段名&#xf…

怎樣提升倫敦銀買賣技巧?

如果投資者想提升倫敦銀的買賣技巧&#xff0c;可以學習一些有用的技術分析方法。所謂技術分析&#xff0c;就是通過對行情過往價格和相關交易數據進行收集&#xff0c;用圖表的方式解讀白銀市場&#xff0c;進而預測行情未來主線走勢、判斷價格細節變化、尋找重要支撐點阻力點…