STM32將外部SDRAM空間作為系統堆(Heap)空間

概述

stm32可以外擴很大的sram,常見外部sram的初始化函數一般是c語言寫的,默認寫在main函數里面。stm32初始化首先進入匯編代碼startup_stm32f429xx.s,在匯編代碼中Reset_Handler(復位中斷服務程序)里面先調用了SystemInit,然后調用__main進行堆棧的初始化,最后才會跳轉到用戶main函數。調用SystemInit涉及到局部變量和函數調用,需要用到stack棧空間,如果我們簡單的將系統堆棧配置到外部sram,執行SystemInit時外部sram還沒有初始化,運行到這里程序就會進入hardfault卡死。
為了解決這個問題,首先可以將外部sram的初始化函數提前,放到SystemInit函數中調用,cube生成的stm32代碼已經為我們提供了這樣的接口,這樣__main就可以正確運行,然而這還沒有解決SystemInit本身執行的問題,我們需要保證SystemInit執行時使用STM32內部RAM。

具體步驟

(1).修改啟動代碼堆棧指針
在startup_stm32f429xx.s中,找到 __initial_sp這一行,改為如下內容
在這里插入圖片描述
注意這里0x20000400 =內部主內存地址0x20000000+棧大小0x400,也就是說這個地址和Stack_Size有關,需要根據自己Stack_Size的設置來修改,這樣就強制指定了系統初始化的棧頂指針在內部內存,保證進入main函數之前的其它初始化函數調用堆棧正常使用。

(2).修改啟動代碼中堆的空間大小
在這里插入圖片描述
注意這里的0x02000000的大小為32M,因為這里我們采用的SDRAM的芯片大小是32M,將此32M的空間全部用作堆(Heap)空間,也可以只用SDRAM芯片的一部分空間作為堆空間。

(3).添加宏定義使能DATA_IN_ExtSDRAM
在Keil軟件中的option,c/c++選項卡 define后面添加 DATA_IN_ExtSDRAM
在這里插入圖片描述
(4).修改外部內存初始化代碼

假定外部內存初始化函數為SDRAM_Init(),修改system_stm32f4xx.c文件
找到如下內容,英文說明這個函數將在跳轉到main之前執行,可以讓外部內存被系統當做程序數據內存使用,包括堆棧,這就是關鍵了,接下來修改SystemInit_ExtMemCtl(void)函數,直接注釋掉里面的所有內容,改為如下內容
在這里插入圖片描述
SystemInit_ExtMemCtl()函數是被SystemInit函數調用的,這樣執行完SystemInit后,再進入__main就可以初始化配置在外部內存的堆棧了。
在這里插入圖片描述
(5).配置和使用外部內存空間

方式1
如果讓mdk自動分配內存,則打開option,target選項卡,右下角 read/write memory areas 添加內存塊,勾選RAM1,填入外部內存起始地址和大小即可
在這里插入圖片描述
方式2
修改自定義的sct文件,添加如下字段,即可將系統堆(Heap),系統堆通過malloc函數申請容量,以及通過attribute標記為EXRAM的數據都放在外部內存
在這里插入圖片描述
(6).編寫測試代碼查看申請系統堆的地址

cp = (char *)malloc(sizeof(char)*n);
memset(cp,0x36,sizeof(char)*n);
printf("\r\ncp_Addr=0x%x",cp);

查詢申請的堆空間的地址

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

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

相關文章

線上書店訂購系統小組作業匯總

1、數據庫模型圖、er圖1、數據庫模型圖、er圖-CSDN博客 2、網上圖書訂購2、網上圖書訂購-CSDN博客 3、簡單查詢與多表聯合復雜查詢MySQL周內訓參照3、簡單查詢與多表聯合復雜查詢-CSDN博客 4、觸發器-插入-修改-刪除MySQL周內訓參照4、觸發器-插入-修改-刪除-CSDN博客 5、存…

亮相夏季達沃斯論壇天津之夜,國窖1573展現國際化新表達

執筆 | 姜 姜 編輯 | 揚 靈 6月25日-27日,以“未來增長的新前沿”為主題的第十五屆新領軍者年會,即2024年夏季達沃斯論壇盛大舉行。26日晚,在2024年夏季達沃斯論壇天津之夜上,國窖1573作為中國民族品牌的代表,以唯一攜…

vue + Lodop 制作可視化設計頁面 實現打印設計功能(二)

歷史: vue2 Lodop 制作可視化設計頁面 實現打印設計功能(一) 前言: 之前本來打算用直接拿之前做的vue2版本改改就發的,但考慮到現在主流都是vue3了,所以從這篇文章開始使用vue3來寫,以及最后…

速盾:cdn加速js

CDN加速是一種將網站內容分布到全球各地的服務器上來提高網站訪問速度和穩定性的技術手段。CDN即內容分發網絡,其核心原理是將靜態資源(例如圖片、CSS、JavaScript文件等)緩存到離用戶最近的服務器節點上,使用戶可以更快地獲取網站…

三相LCL濾波型PWM逆變器仿真設計

參考并網電流外環電容電流前饋內環的雙閉環控制結構,在光伏和風力發電網側變換器中的應用,可以顯著提高系統的穩定性和效率。在并網電流外環中,通過檢測電網電流并與其參考值進行比較,可以得到一個電流誤差信號。這個電流誤差信號…

MySQL基礎查詢與復雜查詢

基礎查詢 1、查詢用戶信息,僅顯示用戶的姓名與手機號,用中文顯示列名。中文顯示姓名列與手機號列。 2、根據商品名稱進行模糊查詢,模糊查詢需要可以走索引,需要給出explain語句。使用explain測試給出的查詢語句,需要顯…

程序員職業發展指南,如何選擇適合自己的就業方向?

隨著科技的發展和數字化時代的到來,程序員是IT行業中的熱門職業。尤其是近幾年移動互聯網的迅速發展,IT人才更是緊缺,越來越多的人加入程序員這個行列。 從事程序員工作,如何接項目呢?YesPMP是一個專注于互聯網外包的平…

【知識學習】闡述Unity3D中動畫渲染的概念及使用方法示例

Unity3D中的卡通渲染(Cartoon Rendering)是一種渲染技術,它模仿傳統手繪動畫或漫畫的視覺效果。這種渲染風格通常具有鮮明的顏色、清晰的輪廓線和簡化的光影效果,常用于制作動畫、游戲和其他視覺媒體。 卡通渲染的基本概念 輪廓…

<sa8650>QCX ISP Tuning 使用詳解 — Tuning前置條件

<sa8650>QCX ISP Tuning 使用詳解 — Tuning前置條件 一 如何安裝 Qualcomm Chromatix? 攝像頭校準工具二 如何使用 Qualcomm Chromatix? tuning工具創建tuning項目2.1 創建工程前提依賴2.2 創建工程2.3 添加場景2.4 編輯區域觸發器三 如何創建Tuning 樹一 如何安裝 Qualco…

postman教程-22-Newman結合Jenkins執行自動化測試

上一小節我們學習了Postman Newman運行集合生成測試報告的方法,本小節我們講解一下Postman Newman結合Jenkins執行自動化測試的方法。 在軟件開發過程中,持續集成(CI)是一種實踐,旨在通過自動化的測試和構建過程來頻繁…

【高等數學】一元函數積分及其應用:定積分與反常積分

文章目錄 第一節. 定積分一. 定積分的概念1. 定義2. 定積分存在定理3. 定積分的幾何意義與求解 二. 定積分的性質1. 不等式2. 中值定理 三. 積分上限(為x)函數1. 積分上限函數定義2. 積分函數求導3. 積分函數的奇偶性變化 四. 定積分的計算 第二節. 反常…

multiprocessing.Queue 多個進程生產和多個進程消費怎么處理

在這個示例中,我們創建了一個隊列 q,并通過 multiprocessing.Manager().Queue() 來確保隊列可以在多個進程之間共享。我們定義了 consumer 和 producer 函數,分別用于從隊列中獲取數據和向隊列中放入數據。 在主進程中,我們創建了…

IPython的使用技I巧整理

IPython 是一個強大的交互式 Python 解釋器,它提供了許多增強 Python 編程體驗的特性。以下是一些 IPython 的使用技巧: 自動補全: 按下 Tab 鍵可以自動完成代碼。 自動縮進: IPython 會自動縮進代碼,保持代碼格式整潔…

vue的ESLint 4格縮進 筆記

https://chatgpt.com/share/738c8560-5271-45c4-9de0-511fad862109 一,代碼4格縮進設置 .eslintrc.js文件 module.exports { "rules": { "indent": ["error", 4] } }; 自動修復命令 npx eslint --fix "src/**/*.{…

作為圖形渲染API,OpenGL和Direct3D的全方位對比。

當你在網頁看到很多美輪美奐的圖形效果,3D交互效果,你知道是如何實現的嗎?當然是借助圖形渲染API了,說起這個不就不得說兩大陣營,OpenGL和Direct3D,貝格前端工場在本文對二者做個詳細對比。 一、什么是圖形…

springboot實習管理系統的設計與實現 LW +PPT+源碼+講解

第三章系統分析與設計 3.1 可行性分析 一個完整的系統,可行性分析是必須要有的,因為他關系到系統生存問題,對開發的意義進行分析,能否通過本系統來補充線下實習管理模式中的缺陷,去解決其中的不足等,通過對…

專業技術!最新氧化物異質結納米制備技術

網盤 https://pan.baidu.com/s/1vjO2yLxm638YpnqDQmX7-g?pwd3at5 MOF衍生的B_A_B結構氧化物異質結及其制備方法和應用.pdf 二硫化鉬-硫化鎘納米復合材料及其制備方法和應用.pdf 具有異質界面的耐輻照復合薄膜及其制備方法與應用.pdf 基于異質結雙界面層納米材料的復合介電薄膜…

MyBatis(10)實現一個簡單的MyBatis插件

MyBatis是一款優秀的持久層框架,它支持自定義插件,通過插件可以攔截在MyBatis核心代碼執行的某些點的方法調用,以實現特定功能,如查詢數據的性能分析、修改SQL語句等。MyBatis 插件是基于Java動態代理實現的,主要通過實…

Linux系統安裝桌面

適用于常見的Linux發行版,如CentOS和Ubuntu: 對于CentOS 7/8 安裝X Window系統和桌面環境(如MATE或GNOME) 連接到ECS實例:首先,確保您已通過SSH客戶端連接到您的ECS實例。 更新系統: sudo yu…

最新手動遷移WordPress方法

手動遷移WordPress網站主要步驟有:遷移文件、遷移數據庫、修復數據庫連接。 對于WordPress Installations,只有兩個主要組件,您需要訪問手動將安裝遷移到新主機:文件和數據庫。 遷移文件 將文件從舊主機遷移到新的最簡單方法之…