STM32八股【1】-----啟動流程和startup文件理解

啟動流程

知識點

  • MCU 上電復位。
  • MSP從向量表第0個地址讀取一個32位(2字節)的值并保存,該值為棧頂地址
  • PC計數器從第1個地址讀取一個兩字節的值并保存,該值為程序入口,一般是Reset_Handler
  • 想了解FLASH地址映射可以看STM32八股【4】-----AHB地址映射
__Vectors       DCD     __initial_sp               ; Top of StackDCD     Reset_Handler              ; Reset HandlerDCD     NMI_Handler                ; NMI HandlerDCD     HardFault_Handler          ; Hard Fault Handler
  • 執行Reset_Handler,初始化中斷向量表。
    Reset_Handler為[WEAK],可以自定義修改。
Reset_Handler    PROCEXPORT  Reset_Handler             [WEAK]IMPORT  __mainIMPORT  SystemInitLDR     R0, =SystemInitBLX     R0LDR     R0, =__mainBX      R0ENDP

在Reset_Handler中執行:

  1. SystemInit():
    初始化系統時鐘、PLL、外設時鐘、Flash 延時等。
  2. C 運行時環境初始化:
    • 調用__main
    • 初始化 .data 段、具體來講就是把FLASH已初始化的數據拷貝到RAM對應的.data段區域。
    • RAM .bss段未初始化的全部清零
    • 不熟悉FLASH和RAM構成的可以看STM32八股【3】------RAM和片上FLASH
  3. 進入 main():
    完成上述初始化后,調用 main() 進入用戶程序。
  4. 程序運行,
    如果發生中斷,CPU 根據矢量表跳轉到對應中斷服務函數 (xxx_IRQHandler) 處理。

問題

  • 請解釋STM32微控制器的啟動過程,從上電到用戶主程序的執行,包括主堆棧指針(MSP)和程序計數器(PC)的初始化。

  • 在STM32的啟動文件中,向量表的作用是什么?它通常位于存儲器的哪個區域,為什么?

  • 啟動文件中定義了堆棧和堆的大小。請解釋它們在嵌入式系統中的作用,以及如何根據應用需求確定它們的大小。

  • 在啟動文件中,Reset_Handler的作用是什么?它通常執行哪些關鍵任務來準備系統運行?

歡迎指錯、交流和補充。

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

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

相關文章

詳解c++20的協程,自定義可等待對象,生成器詳解

協程 c20的協程三大標簽:“性能之優秀”,“開發之靈活”,“門檻之高” 在講解c的協程使用前,我們需要先明白協程是什么,協程可以理解為用戶態的線程,它需要由程序來進行調度,如上下文切換與調…

JavaEE企業級開發 延遲雙刪+版本號機制(樂觀鎖) 事務保證redis和mysql的數據一致性 示例

提醒 要求了解或者熟練掌握以下知識點 spring 事務mysql 臟讀如何保證緩存和數據庫數據一致性延遲雙刪分布式鎖并發編程 原子操作類 前言 在起草這篇博客之前 我做了點功課 這邊我寫的是一個示例代碼 數據層都寫成了 mock 的形式(來源于 JUnit5) // Dduo import java.u…

A2 最佳學習方法

記錄自己想法的最好理由是發現自己的想法,并將其組織成可傳播的形式 (The best reason for recording what one thinks is to discover what one thinks and to organize it in transmittable form.) Prof Ackoff 經驗之談: 做培訓或者寫文章&#xff…

嵌入式硬件工程師從小白到入門-PCB繪制(二)

PCB繪制從小白到入門:知識點速通與面試指南 一、PCB設計核心流程 需求分析 明確電路功能(如電源、信號處理、通信)。確定關鍵參數(電壓、電流、頻率、接口類型)。 原理圖設計 元器件選型:匹配封裝、電壓、…

vue創建子組件步驟及注意事項

在 Vue 中創建子組件需要遵循組件化開發的核心原則,并注意數據流、通信機制、復用性等關鍵點。以下是詳細步驟和注意事項,結合代碼示例說明: 一、創建子組件的步驟 1. 定義子組件 創建一個 .vue 文件(單文件組件)&am…

Cocos Creator版本發布時間線

官網找不到,DeepSeek給的答案,這里做個記錄。 Cocos Creator 1.x 系列 發布時間:2016 年 - 2018 年 1.0(2016 年 3 月): 首個正式版本,基于 Cocos2d-x 的 2D 游戲開發工具鏈,集成可…

【Spring AI】基于專屬知識庫的RAG智能問答小程序開發——功能優化:用戶鑒權主體功能開發

系列文章目錄 【Spring AI】基于專屬知識庫的RAG智能問答小程序開發——完整項目(含完整前端后端代碼)【Spring AI】基于專屬知識庫的RAG智能問答小程序開發——代碼逐行精講:核心ChatClient對象相關構造函數【Spring AI】基于專屬知識庫的R…

【AI神經網絡】深度神經網絡(DNN)技術解析:從原理到實踐

引言 深度神經網絡(Deep Neural Network, DNN)作為人工智能領域的核心技術,近年來在計算機視覺、自然語言處理、醫療診斷等領域取得了突破性進展。與傳統機器學習模型相比,DNN通過多層非線性變換自動提取數據特征,解決…

目標跟蹤——deepsort算法詳細闡述

deepsort 算法詳解 Unmatched Tracks(未匹配的軌跡) 本質角色: 是已存在的軌跡在當前幀中“失聯”的狀態,即預測位置與檢測結果不匹配。 生命周期階段: 已初始化: 軌跡已存在多幀,可能攜帶歷史信息(如外觀特征、運動模型)。 未被觀測到: 當前幀中未找到對應的檢測框…

Vue-admin-template安裝教程

#今天配置后臺管理模板發現官方文檔的鏡像網站好像早失效了,自己稍稍總結了一下方法# 該項目環境需要node17及以下,如果npm install這一步報錯可能是這個原因 git clone https://github.com/PanJiaChen/vue-admin-template.git cd vue-admin-template n…

Rust從入門到精通之進階篇:14.并發編程

并發編程 并發編程允許程序同時執行多個獨立的任務,充分利用現代多核處理器的性能。Rust 提供了強大的并發原語,同時通過類型系統和所有權規則在編譯時防止數據競爭和其他常見的并發錯誤。在本章中,我們將探索 Rust 的并發編程模型。 線程基…

算法訓練營第二十三天 | 貪心算法(一)

文章目錄 一、貪心算法理論基礎二、Leetcode 455.分發餅干二、Leetcode 376. 擺動序列三、Leetcode 53. 最大子序和 一、貪心算法理論基礎 貪心算法是一種在每一步選擇中都采取當前狀態下的最優決策,從而希望最終達到全局最優解的算法設計技術。 基本思想 貪心算…

css基礎-display 常用布局

CSS display 屬性詳解 屬性設置元素是否被視為塊級或行級盒子以及用于子元素的布局,例如流式布局、網格布局或彈性布局。 一、基礎顯示模式 1. block 作用: 元素獨占一行可設置寬高和內外邊距默認寬度撐滿父容器 應用場景: 布局容器&a…

速賣通API數據清洗實戰:從原始JSON到結構化商品數據庫

下面將詳細介紹如何把速賣通 API 返回的原始 JSON 數據清洗并轉換為結構化商品數據庫。 1. 數據獲取 首先要借助速賣通 API 獲取商品數據,以 Python 為例,可使用requests庫發送請求并得到 JSON 數據。 import requests# 替換為你的 API Key 和 Secret …

【零基礎入門unity游戲開發——2D篇】2D物理系統 —— 2D剛體組件(Rigidbody2D)

考慮到每個人基礎可能不一樣,且并不是所有人都有同時做2D、3D開發的需求,所以我把 【零基礎入門unity游戲開發】 分為成了C#篇、unity通用篇、unity3D篇、unity2D篇。 【C#篇】:主要講解C#的基礎語法,包括變量、數據類型、運算符、流程控制、面向對象等,適合沒有編程基礎的…

Collectors.toMap / list 轉 map

前言 略 Collectors.toMap List<User> userList ...; Map<Long, User> userMap userList.stream().collect(Collectors.toMap(User::getUserId, Function.identity()));假如id存在重復值&#xff0c;則會報錯Duplicate key xxx, 解決方案 兩個重復id中&#…

熱門面試題第13天|Leetcode 110.平衡二叉樹 257. 二叉樹的所有路徑 404.左葉子之和 222.完全二叉樹的節點個數

222.完全二叉樹的節點個數&#xff08;優先掌握遞歸&#xff09; 需要了解&#xff0c;普通二叉樹 怎么求&#xff0c;完全二叉樹又怎么求 題目鏈接/文章講解/視頻講解&#xff1a;https://programmercarl.com/0222.%E5%AE%8C%E5%85%A8%E4%BA%8C%E5%8F%89%E6%A0%91%E7%9A%84%E8…

關于Object.assign

Object.assign 基本用法 Object.assign() 方法用于將所有可枚舉屬性的值從一個或者多個源對象source復制到目標對象。它將返回目標對象target const target { a: 1, b: 2 } const source { b: 4, c: 5 }const returnedTarget Object.assign(target, source)target // { a…

GitHub高級篩選小白使用手冊

GitHub高級篩選小白使用手冊 GitHub 提供了強大的搜索功能&#xff0c;允許用戶通過高級篩選器來精確查找倉庫、Issues、Pull Requests、代碼等。下面是一些常用的高級篩選用法&#xff0c;幫助你更高效地使用 GitHub 搜索功能。 目錄 搜索倉庫搜索Issues搜索Pull Requests搜…

手動集成sqlite的方法

注意到sqlite有backup方法&#xff08;https://www.sqlite.org/backup.html&#xff09;。 也注意到android中sysroot下&#xff0c;沒有sqlite3的庫&#xff0c;也沒有相關頭文件。 如果要使用 sqlite 的backup&#xff0c;那么就需要手動集成sqlite代碼到項目中。可以如下操…