嵌入式 - ARM4

裸機實現LED閃爍

一、啟動代碼

1. 異常向量表配置

1. .global

? ? ? ? 匯編器指令,全局定義標簽_start,作為匯編程序的默認起點

2. 配置標簽

? ? ? ? 配置標簽時可以前置加_ ,以便和普通標簽或系統標簽做區分

3. 異常向量表

? ? ? ? ARM架構規定異常向量表位置固定,配置對應位置的異常向量

2. start函數

1. 操作CPSR寄存器 搭建運行環境

1. 配置irq模式

????????用于處理中斷,確保各個部分的獨立性

????????1. mrs 指令使cpsr寄存器 備份到r0中

????????2. 修改模式為irq模式
先通過bic指令對后五位清零,便于后續修改模式
手冊Label - ARM processor 查詢模式代碼,通過orr指令進行修改配置

????????3. 打開終端I位
通過bic指令對第 I 位置1,打開中斷,確保程序能響應中斷
注:整個程序中斷只用配置一次,后續修改 sys 模式時不用再次配置?

? ? ? ? 4.?msr指令將 r0 值 返回置 cpsr ,確保模式轉換

2. 配置sys模式

????????可以使C語言執行,空間大

????????1. mrs 指令使cpsr寄存器 備份到r0中

????????2. 修改模式為sys模式
sys模式代碼為11111,可以省略清零準備步驟

? ? ? ? 3. 不用再次配置中斷響應

? ? ? ? 4.?msr指令將 r0 值 返回置 cpsr ,確保模式轉換

2. CPS指令 搭建運行環境

1. 關閉中斷

????????防止初始化過程被中斷打斷,確保原子操作

2. cps

手冊376 CPS指令專用操作cpsr寄存器

配置中斷:????????CPS<effect> <iflags>{, #<mode>}

配置模式:? ? ? ? CPS #<mode>

????????CPS用于ARMv6v7架構,keil默認目標為ARMv5架構無法編譯通過,可以使用操作CPSR寄存器的方式

3.分配空間?

? ? ? ? 硬件ROM(加載域)的起始物理地址為0x8000 0000
為 irq 模式0x12分配 32M = 32 * 1024 * 1024 = 0200 0000 大小的空間,即0x8200 0000
為 sys?模式0x1F再分配 32M大小的空間,即 0x8400 0000

3. 開啟實現目的程序

二、LED燈配置

1. led_init

1.?? 功能復用配置

GPIO引腳初始化

????????手冊C32 - IOMUXV Memory Map... - IOMUXC_SW_MUX_CTL_PAD_GPIO1_IO03 p1571
引腳的功能復用(MUX)

    // IO復用功能配置// 手冊C32 - IOMUXV Memory Map... // - IOMUXV Memory Map... - IOMUXC_SW_MUX_CTL_PAD_GPIO1_IO03 p1571ldr r0, =0x020E0068ldr r1, =0x05                   // 0101 ALT5-GPIO1_IO03str r1, [r0]     

1. 加載IOMUX控制寄存器地址
Address:20E_0000h base + 68h offset = 0x20E 0068

2. 將引腳功能從默認模式切換為GPIO
模式GPIO_IO03 gpio1模式代碼為 0101 = 0x05

3. str指令將配置寫回寄存器
將 r1 存放的內容存放在 r0 存放的地址內
即將0x05 模式存放在控制寄存器的地址,實現引腳初始化

2.? ?電氣特性配置

設置引腳的驅動能力、上下拉等電氣參數

GPIO引腳初始化

????????手冊C32 - IOMUXV Memory Map... - IOMUXC_SW_PAD_CTL_PAD_GPIO1_IO03 p1793
引腳的??電氣特性??(PAD),滯回器、上拉/下拉電阻、開漏/推挽輸出

??

    // 引腳電氣特性配置// 手冊C32 - IOMUXV Memory Map... // - IOMUXC_SW_PAD_CTL_PAD_GPIO1_IO03 p1793ldr r0, =0x020E02F4ldr r1, =0x10B0                 str r1, [r0]      

1. 加載PAD控制寄存器地址
Address:20E_0000h base + 2F4h offset = 0x20E 02F4

2. 配置電氣參數(驅動強度、壓擺率、上下拉、開漏/推挽)
配置為0x10B0 = 0001 0000 1011 0000
對應部分參數為:12位? :? ? 1:使能上拉
7-6位:??10:中速100MHZ
5-3位:110:中等驅動強度? ? ? ? ......

3. str指令將配置寫回寄存器
將 r1 存放的內容存放在 r0 存放的地址內
即將0x10B0?模式存放在PAD寄存器的地址,實現電氣配置

3. ??方向配置??

????????將引腳設置為輸出模式
手冊C28(外設) - GPIOx - GDIR

    // 引腳方向// 手冊C28(外設) - GPIOx - GDIRldr r0, =0x0209C004             ldr r1, [r0] orr r1, r1, #(1 << 3)str r1, [r0]  

1. 加載GPIO1的GDIR(方向控制寄存器)地址
Address:Base address + 4h offset?

2. 設置輸出模式
將GPIO_IO03設為輸出,即通過orr指令將第三位置1

3. str指令將配置寫回寄存器
將 r1 存放的內容存放在 r0 存放的地址內
即將結果返回寄存器地址,實現配置輸出模式

2. led_on

? ? ? ? 手冊C28(外設) - GPIOx - DR

通過bic指令將GPIO_IO03位清零,通過硬件電氣特征,此時LED點亮

3. led_off

通過orr指令將GPIO_IO03位置1,通過硬件電氣特征,此時LED熄滅

4. led_delay

????????通過執行一個??空循環??消耗CPU時間,實現??軟件延時??

三、編譯與測試

1. 編譯步驟

1. arm-linux-gnueabihf-gcc 只匯編不鏈接

????????arm-linux-gnueabihf-gcc?-c?start.S?-o?start.o?-g

? ? ? ? -o ????????只編譯不鏈接
-g ????????保留編譯信息

2. arm-linux-gnueabihf-ld 鏈接代碼到特定地址

????????(得到可執行,可連接程序 linux?executable?linkable?file)

????????arm-linux-gnueabihf-ld?-Ttext?0x87800000?start.o?-o?start.elf

? ? ? ? Ttext ????????指定代碼段加載地址
-o? ? ? ????????輸出ELF格式可執行文件

3. arm-linux-gnueabihf-objcopy?格式轉換?

????????arm-linux-gnueabihf-objcopy?-O?binary?-S -g start.elf?start.bin

? ? ? ? -O binary? ? ? ? ? ? ? ? 輸出二進制格式
-S? ? ? ? ? ? ? ? ? ? ? ? ? ?去除符號表
-g? ? ? ? ? ? ? ? ? ? ? ? ? ? 去除調試信息

4. arm-linux-gnueabihf-objdump?反匯編(可省略)

????????arm-linux-gnueabihf-objdump?-D?start.elf??>?start.dis

????????-D? ? ? ? ? ? ? ? ?反匯編所有段

5. imxdownload 燒寫程序到SD卡

./imxdownload?start.bin?/dev/sdb

????????插入SD卡后選擇連接到虛擬機Ubuntu? ? ? ?
使用 chmod?+777?imxdownload 命令賦予 imxdownload 權限
通過 ls/imxdownload /dev/sdb 命令查看dev
剛插入SD卡就執行命令可能會出錯,現象為少燒寫速率以M為單位,此時需要重啟虛擬機

6. 將SD卡插入板子觀察現象

? ? ? ? 注:
修改板子工作模式為SD模式
插入SD卡時不要上電

BOOT工作模式:

2. Makefile

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

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

相關文章

《C++ 108好庫》之2 多線程庫thread,mutex,condition_variable,this_thread

《C 108好庫》之之2 多線程庫thread&#xff0c;mutex&#xff0c;condition_variable&#xff0c;this_thread《C 108好庫》之2 多線程庫thread&#xff0c;mutex&#xff0c;condition_variable&#xff0c;this_threadstd::thread類??互斥量&#xff08;Mutex&#xff09;…

Android系統框架知識系列(二十):專題延伸:JVM vs ART/Dalvik - Android運行時演進深度解析

?關鍵詞?&#xff1a;運行時優化、AOT編譯、JIT編譯、內存管理、電池效率、性能分析一、Android運行時演進背景1. 移動環境的特殊挑戰Android運行時環境的演進源于移動設備的獨特限制&#xff1a;?移動設備約束條件?&#xff1a;?有限的內存資源?&#xff1a;早期設備僅1…

ubuntu 22 安裝輕量級桌面Xfce并使用xrdp遠程桌面連接

1.安裝Xfce:sudo apt install xubuntu-desktop -y2.安裝xrdp:sudo apt install xrdp -y3.配置xrdp&#xff0c;nano /etc/xrdp/xrdp.ini:[Globals] ... port3389 ; 遠程連接端口&#xff0c;默認是3389&#xff0c;可以改成自己喜歡的端口... ; ; Session types ;; Some sess…

【Flask】測試平臺開發,數據看板開發-第二十一篇

概述&#xff1a;在前面我們已經實現了我們的產品創建管理&#xff0c;應用管理管理&#xff0c;需求提測管理但是每周提測了多少需求&#xff0c;創建了哪些產品&#xff0c;我們是不是看著不是很直觀&#xff0c;接下來我們就需要開發一個數據看板功能&#xff0c;實現能夠看…

我是程序員,不是程序猿:請別把我當猴耍——拒絕被低估,用專業贏得尊重

摘要 本文旨在深度剖析“程序員”與“程序猿”一字之差背后所反映的職業尊嚴與身份認同問題。我們生活在一個技術驅動的時代&#xff0c;但對技術創造者的認知卻常常被“程序猿”、“碼農”等標簽簡單化、甚至矮化。本文將從正名開始&#xff0c;辨析“程序員”的專業內涵&…

C++中vector刪除操作的安全隱患與最佳實踐

std::vector 是C標準模板庫&#xff08;STL&#xff09;中最常用的動態數組容器&#xff0c;提供了高效的隨機訪問和動態擴容能力。然而&#xff0c;其刪除操作如果使用不當&#xff0c;會引入嚴重的安全隱患&#xff0c;包括未定義行為、內存泄漏和數據競爭等問題。本文將深入…

Unix/Linux 系統中的 `writev` 系統調用

<摘要> 本文對 Unix/Linux 系統中的 writev 系統調用進行了全面深入的解析。內容涵蓋了其產生的背景&#xff08;從傳統 write 的局限性到分散/聚集 I/O 概念的引入&#xff09;、核心概念&#xff08;如 struct iovec、系統調用流程&#xff09;。重點剖析了其設計意圖&…

深入理解 Android targetSdkVersion:從 Google Play 政策到依賴沖突

深入理解 Android targetSdkVersion&#xff1a;從 Google Play 政策到依賴沖突 作為 Android 開發者&#xff0c;你很可能在 Android Studio 中見過這條提示&#xff1a;Google Play requires that apps target API level 33 or higher。它像一個盡職的提醒者&#xff0c;時常…

灰匣(GrayBox)1.0.0 發布【提升系統權限APP】

灰匣是一個提升系統權限的工具&#xff0c;可以配合Root、三方軟件&#xff08;Shizuku&#xff09;以及【設備管理員】&#xff08;設備所有者&#xff09;實現一些高級功能及底層接口&#xff0c;可以自動隔離&#xff08;凍結/禁用&#xff09;不必要的應用&#xff0c;如某…

PAT 1104 Sum of Number Segments

這一題的大意就是找一個數組中的所有子數組&#xff0c;它們的累加和為多少&#xff0c; 題目上給出的數據范圍是O(n^5)那么只能遍歷一次&#xff0c;不能用暴力的方法求出。 看到這一題我有兩個思路&#xff1a; 1.試圖用雙指針和滑動窗口來把O&#xff08;n^2)的時間復雜度降…

[萬字長文]AJAX入門-常用請求方法和數據提交、HTTP協議-報文、接口文檔、案例實戰

本系列可作為前端學習系列的筆記&#xff0c;代碼的運行環境是在VS code中&#xff0c;小編會將代碼復制下來&#xff0c;大家復制下來就可以練習了&#xff0c;方便大家學習。 HTML、CSS、JavaScript系列文章 已經收錄在前端專欄&#xff0c;有需要的寶寶們可以點擊前端專欄查…

Codesy中的UDP發送信息

Codesy UDP通訊 概述 CAA Net Base Services UDP通訊的建立 發送UDP 狀態控制 效果 概述 Codesys中默認安裝的通訊支持很多,不安裝其他的軟件也可以實現TCP通訊。但是,在使用UDP通訊時,因為我們的PLC有兩個網卡,一般我們把第一個網口做編程和HMI用,把的個網口做外部通訊,…

神經網絡之深入理解偏置

&#x1f50d; 1. 表達能力&#xff1a;無偏模型不能表示全體函數族 ? 有偏線性變換&#xff1a; yWxb&#xff08;仿射變換&#xff09; y Wx b \quad \text{&#xff08;仿射變換&#xff09;} yWxb&#xff08;仿射變換&#xff09; 能表示任意線性函數 平移是仿射空間的…

小白必看:AI智能體零基礎搭建全攻略!

寫在前面&#xff1a;別怕&#xff0c;真的不需要技術背景&#xff01; 你是不是經常聽到"AI智能體"、"大模型"這些高大上的詞&#xff0c;總覺得那是技術大牛的專利&#xff1f;別擔心&#xff0c;這篇教程就是為你準備的&#xff01;我們將用最通俗的語…

React state在setInterval里未獲取最新值的問題

目錄 一、問題描述 二、解決方案 方案一&#xff0c;使用函數式更新 方案二&#xff0c;使用 useRef 保存最新值 一、問題描述 在 React 中&#xff0c;當在 setInterval或setTimeout 中使用 setState 時&#xff0c;經常會遇到狀態不是最新值的問題。這是因為閉包導致的&a…

x86 架構 Docker 鏡像遷移至 ARM 環境的詳細指南

目錄 一、問題背景與分析 二、解決步驟 &#xff08;一&#xff09;檢查 docker-compose 版本 &#xff08;二&#xff09;升級 docker-compose 1. 對于 Linux 系統 2. 對于 Windows 系統 &#xff08;三&#xff09;驗證升級 &#xff08;四&#xff09;重新運行 dock…

零代碼部署工業數據平臺:TRAE + TDengine IDMP 實踐

對于編程初學者來說&#xff0c;軟件開發流程中的開發環境配置、安裝異常或報錯往往需要花費大量時間查閱資料和反復試錯&#xff0c;才能正常安裝和啟動某些軟件工具。現在&#xff0c;在 TRAE 的幫助下&#xff0c;即使完全沒有接觸過編程&#xff0c;也能通過自然語言直接表…

史上最全Flink面試題(完整版)

1、簡單介紹一下 FlinkFlink 是一個框架和分布式處理引擎&#xff0c;用于對無界和有界數據流進行有狀態計算。并且 Flink 提供了數據分布、容錯機制以及資源管理等核心功能。Flink提供了諸多高抽象層的API以便用戶編寫分布式任務&#xff1a;DataSet API&#xff0c; 對靜態數…

C# .NET中使用log4Net日志框架指南

C# .NET中使用log4Net日志框架指南 log4Net是Apache基金會開發的一款高效、靈活的日志記錄框架&#xff0c;廣泛應用于.NET生態系統中。它支持多種日志輸出目標&#xff08;如文件、數據庫、控制臺&#xff09;&#xff0c;并提供細粒度的日志級別控制&#xff0c;幫助開發者監…

每日算法刷題Day68:9.10:leetcode 最短路6道題,用時2h30min

一. 單源最短路&#xff1a;Dijkstra 算法 1.套路 1.Dijkstra 算法介紹 (1)定義 g[i][j] 表示節點 i 到節點 j 這條邊的邊權。如果沒有 i 到 j 的邊&#xff0c;則 g[i][j]∞。 (2)定義 dis[i] 表示起點 k 到節點 i 的最短路長度&#xff0c;一開始 dis[k]0&#xff0c;其余 …