Makefile——make工具編譯STM32工程

一、Makefile相關指令
1.1、變量

符號含義
=替換
+=追加
:=恒等于

1.2、隱含規則

符號含義
%.o任意的.o文件
*.o所有的.o文件

1.3、通配符

符號含義
$^所有依賴文件
$@所有目標文件
$<所有依賴文件的第一個文件

1.4、編譯器指令常用參數功能說明

符號含義舉例
-E預處理,主要是進行宏展開等步驟gcc -E test.c -> test.i
-S編譯,生成匯編代碼gcc -S test.c -> test.S
-c匯編:生成機器碼gcc -c test.c -> test.o
-o指定文件名

二、Makefile文件

SHELL=cmd.exe
DIR = D:\LC\EE\Code\STM32F407\TEST
OBJ = OBJ
KEIL_PATH = D:\ProgramFiles\Keil_v5\Keil\ARM\ARMCC
ARMCC   = $(KEIL_PATH)\bin\armcc
ARMASM  = $(KEIL_PATH)\bin\armasm
ARMAR   = $(KEIL_PATH)\bin\armar  
ARMLINK = $(KEIL_PATH)\bin\armlink  
FROMELF = $(KEIL_PATH)\bin\fromelf  TARGET = .\$(OBJ)\TEST
# OBJMAP := .\stm32.map 
OBJHTM := .\$(OBJ)\*.htm  
OBJAXF := .\$(OBJ)\*.axf  CFLAGS := -c --cpu Cortex-M4.fp.sp -g -O1 --apcs=interwork --split_sections -D__UVISION_VERSION="541" -DSTM32F407xx -DSTM32F40_41xxx
CMACRO :=  
ASMFLAGS := --cpu Cortex-M4.fp.sp -g --apcs=interwork --pd "__UVISION_VERSION SETA 541" --pd "STM32F407xx SETA 1"
LINKFLAGS := --cpu=Cortex-M4.fp.sp
MAP := --summary_stderr --info summarysizes --map --load_addr_map_info --xref --callgraph --symbols
INFO := --info sizes --info totals --info unused --info veneersSOURCE = .\SYSTEM\delay\delay.c .\SYSTEM\sys\sys.c .\SYSTEM\usart\usart.c .\HARDWARE\LED\led.c .\USER\test.c
START  = .\USER\startup_stm32f40_41xxx.sSOURCE_OBJ = $(SOURCE:%.c=%.o)
START_OBJ  = $(START:%.s=%.o)OBJS = .\$(OBJ)\delay.o       .\$(OBJ)\sys.o     .\$(OBJ)\usart.o       .\$(OBJ)\led.o       .\$(OBJ)\test.o   .\$(OBJ)\startup_stm32f40_41xxx.oINC +=  -I .\SYSTEM\delay -I .\SYSTEM\sys -I .\SYSTEM\usart -I .\HARDWARE\LEDTEST:$(SOURCE_OBJ) $(START_OBJ) TEST1TEST1:$(OBJS)@echo $(OBJS)$(ARMLINK) $(LINKFLAGS) $^  --strict --scatter .\$(OBJ)\TEST.sct $(MAP) $(INFO) --list $(TARGET).map -o $(TARGET).axf$(FROMELF) --i32combined -o $(TARGET).hex $(TARGET).axf%.o:%.c$(ARMCC) $(CFLAGS) $(INC) $(CMACRO) -D__UVISION_VERSION="541" -DSTM32F407xx -DSTM32F40_41xxx  $< -o $@ move $@ $(DIR)\$(OBJ)%.o:%.s$(ARMASM) $(ASMFLAGS) $< -o $@ move $@ $(DIR)\$(OBJ).PHONY : clean 
clean:  -del $(OBJS) .\output\*.map .\output\*.htm .\output\*.axf .\output\*.hex

三、STM32F407工程

D:.
│  Makefile
│  README
│
├─HARDWARE
│  └─LED
│          led.c
│          led.h
│
├─OBJ
│      delay.o
│      led.o
│      startup_stm32f40_41xxx.o
│      sys.o
│      TEST.axf
│      TEST.hex
│      TEST.htm
│      TEST.map
│      test.o
│      TEST.sct
│      usart.o
│
├─SYSTEM
│  │  readme.txt
│  │
│  ├─delay
│  │      delay.c
│  │      delay.h
│  │
│  ├─sys
│  │      core_cm4.h
│  │      core_cm4_simd.h
│  │      core_cmFunc.h
│  │      core_cmInstr.h
│  │      stm32f4xx.h
│  │      sys.c
│  │      sys.h
│  │      system_stm32f4xx.h
│  │
│  └─usart
│          usart.c
│          usart.h
│
└─USERstartup_stm32f40_41xxx.stest.c

四、STM32啟動過程

  1. 初始化堆棧指針 SP = _initial_sp
  2. 初始化程序計數器指針 PC = Reset_Handler
  3. 設置堆和棧的大小
  4. 初始化中斷向量表
  5. 配置外部SRAM作為數據存儲器(可選)
  6. 配置系統時鐘,通過調用SystemInit函數(可選)
  7. 調用C庫中的 _main 函數初始化用戶堆棧,最終調用 main 函數

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

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

相關文章

深入理解Linux文件系統權限:從基礎到高級應用全解析

1. 什么是文件系統權限&#xff1f;它是如何工作的&#xff1f; 文件權限的本質 想象你的電腦是一個大房子&#xff0c;每個文件和目錄都是房間里的物品。文件系統權限就像是一把鑰匙&#xff0c;決定誰能進房間、能看什么、能修改什么。 權限三要素&#xff1a; 讀&#xff…

C語言:6.22練習題數組解答

#include <stdio.h> #include <string.h> // 用于 strlen() int main() {char a[100];int j 0;// 從用戶輸入讀取字符串printf("請輸入一個字符串: ");fgets(a, sizeof(a), stdin);// 遍歷字符串中的每個字符for (int i 0; i < strlen(a); i) {if (…

一、docker的安裝

一、docker桌面 二、docker的配置文件 1、docker配置文件位置/etc/docker/daemon.json 使用json格式&#xff0c;graphdata-root {"graph":"/deploy/docker","registry-mirrors": ["https://8auvmfwy.mirror.aliyuncs.com"],"…

Matlab 多項式擬合點法線(二維)

文章目錄 一、簡介二、實現代碼三、實現效果一、簡介 這個思路其實很簡單,假設我們有一組曲線點,我們可以對其擬合曲線并計算其導數來獲取每個點的法向量,當然這一思路也可以擴展至三維。具體過程如下所示: 二、實現代碼 %% *********

DeepSeek-R1 論文閱讀總結

1. QA問答&#xff08;我的筆記&#xff09; Q1: DeepSeek如何處理可讀性問題&#xff1f; 通過構建冷啟動數據&#xff08;數千條長CoT數據&#xff09;微調基礎模型&#xff0c;結合多階段訓練流程&#xff08;RL訓練、拒絕采樣生成SFT數據&#xff09;&#xff0c;并優化輸…

Manus AI:多語言手寫識別的技術革命與未來圖景

摘要&#xff1a;在全球化浪潮下&#xff0c;跨語言溝通的需求日益迫切&#xff0c;但手寫文字的多樣性卻成為技術突破的難點。Manus AI憑借其多語言手寫識別技術&#xff0c;將潦草筆跡轉化為精準數字文本&#xff0c;覆蓋全球超百種語言。本文從技術原理、應用場景、行業價值…

Flutter——最詳細原生交互(MethodChannel、EventChannel、BasicMessageChannel)使用教程

MethodChannel&#xff08;方法通道&#xff09; 用途&#xff1a;實現 雙向通信&#xff0c;用于調用原生平臺提供的 API 并獲取返回結果。 場景&#xff1a;適合一次性操作&#xff0c;如調用相機、獲取設備信息等。 使用步驟&#xff1a; Flutter 端&#xff1a;通過 Meth…

Python控制語句-循環語句-while

1.若k為整形,下述while循環執行的次數為()。 k=1000 while k>1: print(k) k=k/2 A、9 B、10 C、11 D、100 答案:A。k=k/2意味著每循環一次,k的值就會變為原來的一半,直到k的值不大于1。 2.下面的代碼,哪些會輸出1,2,3三個數字( )。 A、 for i in range(3): print(i) …

十二天-雙指針技術:鏈表問題的高效解法

一、雙指針技術分類 1. 同速雙指針&#xff08;同向移動&#xff09; 特點&#xff1a;兩個指針以相同速度移動適用場景&#xff1a; 鏈表逆序查找倒數第 k 個元素刪除倒數第 n 個節點 2. 快慢雙指針&#xff08;異速移動&#xff09; 特點&#xff1a;一個指針每次移動 1 步…

【vllm】Qwen2.5-VL-72B-AWQ 部署記錄

版本&#xff1a;0.7.2 注意事項&#xff1a; export LD_LIBRARY_PATH/home/xxxxx/anaconda3/envs/xxxxx/lib/python3.10/site-packages/nvidia/nvjitlink/lib:$LD_LIBRARY_PATH # 如果報錯可能需要Also pip install --force-reinstall githttps://github.com/huggingface/tra…

深度學習與大模型-張量

大家好&#xff01;今天我們來聊聊張量&#xff08;Tensor&#xff09;。別被這個詞嚇到&#xff0c;其實它沒那么復雜。 什么是張量&#xff1f; 簡單來說&#xff0c;張量就是一個多維數組。你可以把它看作是一個裝數據的容器&#xff0c;數據的維度可以是一維、二維&#…

【前端面試題】Vu3常見的面試題

1.Vue3與 Vue2的核心區別有哪些&#xff1f; ? 響應式系統 ?&#xff1a; ? Vue2&#xff1a;通過Object.defineProperty 實現響應式。這種方式在處理對象屬性的添加和刪除時存在局限性&#xff0c;且無法直接監控數組的變化 ?;?Vue3&#xff1a;采用Proxy 實現響應式&…

Android 粘包與丟包處理工具類:支持多種粘包策略的 Helper 實現

在Android開發中&#xff0c;處理TCP/UDP通信時&#xff0c;粘包和丟包是常見的問題。粘包是指多個數據包被接收方一次性接收&#xff0c;導致數據包之間的界限不清晰&#xff1b;丟包則是指數據包在傳輸過程中丟失。為了處理這些問題&#xff0c;我們可以編寫一個幫助類 Packe…

【C++11】移動語義

回顧 const int c的c是可以被取地址的&#xff0c;盡管是常量。所以以是否為常量來判斷是否為右值是錯誤的。 左值與右值正確的區分方法是是否能夠被取地址。&#xff08;能被取地址也就代表著是一個持久狀態&#xff0c;即有持久的存儲空間的值&#xff09; 常見的左值有我們…

LangChain教程 - Agent -之 ZERO_SHOT_REACT_DESCRIPTION

在構建智能 AI 助手時&#xff0c;我們希望模型能夠智能地調用工具&#xff0c;以便提供準確的信息。LangChain 提供了 AgentType.ZERO_SHOT_REACT_DESCRIPTION&#xff0c;它結合了 ReAct&#xff08;Reasoning Acting&#xff09;策略&#xff0c;使得 LLM 可以基于工具的描…

移動Android和IOS自動化中常見問題

APP測試邏輯 在app編寫自動化測試用例時&#xff0c;通常會出現只是簡單的點點點過程&#xff0c;然而卻忽略了在實際的自動化實現過程中&#xff0c;軟件是對app元素的判斷來執行測試腳本。所以會出現在后期已經寫好自動化腳本之后還會對測試用例的更新。 App在測試時&#…

python高效試用17---兩個字符串組成一個新的字符串和兩個字符串組成元組作為key哪個更高效

在 Python 中&#xff0c;使用字符串連接 (str1 str2) 作為 key 和使用元組 ((str1, str2)) 作為 key 的效率差異&#xff0c;主要受以下因素影響&#xff1a; 哈希計算速度&#xff1a; 字符串連接 (str1 str2)&#xff1a;會創建一個新的字符串對象&#xff0c;并計算哈希…

深入淺出Java try-with-resources:告別資源泄漏的煩惱

一、為什么需要try-with-resources&#xff1f; 在Java開發中&#xff0c;我們經常需要處理各種資源&#xff1a;文件流、數據庫連接、網絡套接字等。這些資源都有一個共同特點——必須在使用后正確關閉。傳統的資源管理方式存在三大痛點&#xff1a; 代碼臃腫&#xff1a;每…

Python+DeepSeek:開啟AI編程新次元——從自動化到智能創造的實戰指南

文章核心價值 技術熱點:結合全球最流行的編程語言與國產頂尖AI模型實用場景:覆蓋代碼開發/數據分析/辦公自動化等高頻需求流量密碼:揭秘大模型在編程中的創造性應用目錄結構 環境搭建:5分鐘快速接入DeepSeek場景一:AI輔助代碼開發(智能補全+調試)場景二:數據分析超級助…

Linux tcpdump -any抓的包轉換成標準的pcap

在 Linux 中使用 tcpdump -any 抓包并轉換為標準 pcap 文件時出現額外字段,通常與 鏈路層協議頭部的差異 以及 pcap 文件格式的兼容性 有關。以下是詳細原因和解決方案: 一、問題原因分析 -any 選項的局限性 tcpdump -any 會自動猜測鏈路層協議類型(如 Ethernet、IEEE 802…