[ARM 彙編]高級部分—ARM彙編編程實戰—3.3.3 嵌入式應用程式設計實例

来源:https://www.cnblogs.com/yaoqian/archive/2023/06/25/17504204.html
-Advertisement-
Play Games

某日二師兄參加XXX科技公司的C++工程師開發崗位第25面: > 面試官:`array`熟悉嗎? > > 二師兄:你說的是原生數組還是`std::array`? > > 面試官:你覺得兩者有什麼區別? > > 二師兄:區別不是很大,原生數組(非動態數組)和std::array都在棧上開闢空間,初始化 ...


在本章節中,我們將學習如何使用ARM彙編編寫一個簡單的嵌入式應用程式。我們將以STM32F103微控制器為例,編寫一個程式,實現按下按鈕時點亮LED的功能。

  1. 硬體連接

首先,我們需要將STM32F103微控制器的一個GPIO引腳連接到LED(通過一個合適的電阻),另一個GPIO引腳連接到按鈕。假設我們使用以下連接方式:

  • LED連接到PA8引腳
  • 按鈕連接到PA0引腳
  1. 編寫彙編代碼

創建一個名為button_led.s的新文件,輸入以下彙編代碼:

.syntax unified
.cpu cortex-m3
.thumb

.global _start
_start:

// 初始化堆棧
ldr r0, =_stack_top
mov sp, r0

// 調用main函數
bl main

// 無限迴圈
loop_forever:
    b loop_forever

.section .text.main
.thumb_func
.align 2
main:
    // 設置RCC寄存器地址
    ldr r0, =0x40021000
    
    // 打開GPIOA時鐘
    ldr r1, [r0, #0x18]
    orr r1, r1, #0x00000004
    str r1, [r0, #0x18]

    // 配置LED引腳(PA8)為輸出模式
    ldr r0, =0x40010800
    ldr r1, [r0, #0x00]
    bic r1, r1, #0x000F0000
    orr r1, r1, #0x00030000
    str r1, [r0, #0x00]

    // 配置按鈕引腳(PA0)為輸入模式
    ldr r1, [r0, #0x00]
    bic r1, r1, #0x0000000F
    str r1, [r0, #0x00]

button_check:
    // 檢查按鈕狀態(讀取GPIOA的IDR寄存器)
    ldr r1, [r0, #0x08]
    tst r1, #0x00000001
    beq button_check

    // 點亮LED(設置GPIOA的ODR寄存器)
    ldr r1, [r0, #0x0C]
    orr r1, r1, #0x00000100
    str r1, [r0, #0x0C]

button_release:
    // 等待按鈕釋放(讀取GPIOA的IDR寄存器)
    ldr r1, [r0, #0x08]
    tst r1, #0x00000001
    bne button_release

    // 熄滅LED(清除GPIOA的ODR寄存器)
    ldr r1, [r0, #0x0C]
    bic r1, r1, #0x00000100
    str r1, [r0, #0x0C]

    // 返回
    bx lr

.section .stack
.align 3
_stack_top:
  1. 編譯彙編代碼

打開命令行視窗,進入到button_led.s文件所在的目錄,然後運行以下命令編譯彙編代碼:

arm-none-eabi-as -mcpu=cortex-m3 -mthumb -g -o button_led.o button_led.s
arm-none-eabi-ld -Ttext 0x08000000 -o button_led.elf button_led.o
arm-none-eabi-objcopy -O binary button_led.elf button_led.bin

這將生成一個名為button_led.bin的二進位文件,我們將把這個文件燒錄到STM32F103微控制器上。

  1. 燒錄程式

確保您的ST-Link調試器已連接到STM32F103微控制器,然後運行以下命令使用STM32燒錄工具將button_led.bin文件燒錄到微控制器上:

st-flash write button_led.bin 0x08000000
  1. 測試程式

現在,我們的嵌入式應用程式已經燒錄到STM32F103微控制器上。按下連接到PA0引腳的按鈕,您應該看到連接到PA8引腳的LED亮起;鬆開按鈕,LED熄滅。

這是一個簡單的嵌入式應用程式設計實例,通過這個例子可以學到如何用ARM彙編語言編寫一個簡單的嵌入式應用程式。在實際應用中,您可能會遇到更複雜的任務,例如使用外部中斷、定時器、串口等。在編寫這些程式時,關鍵是瞭解所使用的微控制器的寄存器和操作方式,然後編寫相應的ARM彙編代碼來實現所需的功能。

希望這個實例能幫助您理解如何使用ARM彙編編寫嵌入式應用程式。隨著您的彙編技能的提高,您將能夠編寫更複雜的程式來解決實際問題。
推薦閱讀:

https://mp.weixin.qq.com/s/dV2JzXfgjDdCmWRmE0glDA

https://mp.weixin.qq.com/s/an83QZOWXHqll3SGPYTL5g

file


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 摘要:本文將介紹如何在 Docker 環境下搭建 MS SQL Server 的主從同步,幫助讀者瞭解主從同步的原理和實現方式,進而提高數據的可靠性和穩定性。 一、前言 在當今信息化的時代,數據的安全性和穩定性顯得尤為重要。資料庫是許多企業和組織存儲和管理數據的核心,因此如何保證資料庫的高可用性和數 ...
  • ## case1(表鎖的讀-寫-讀阻塞) 上篇文檔中提到過 >WRITE locks normally have higher priority than READ locks to ensure that updates are processed as soon as possible. Thi ...
  • 很多小微型應用程式也需要一些數據處理和計算能力,如果集成一個資料庫就顯得太沉重了,這種情況下 SQLite 是一個不錯的選擇,它架構簡單,集成方便,可持久化存儲數據,並提供 SQL 實現計算能力。 但是,對於某些較複雜的場景,SQLite 仍有不足之處。 ...
  • 開心一刻 今天答應準時回家和老婆一起吃晚飯,但臨時有事加了會班,回家晚了點 回到家,本以為老婆會很生氣,但老婆卻立即從廚房端出了熱著的飯菜 老婆:還沒吃飯吧,去洗下,來吃飯吧 我洗好,坐下吃飯,內心感動十分;老婆坐旁邊深情的看著我 老婆:你知道誰最愛你嗎 我毫不猶豫道:你 老婆:誰最關心你? 我:你 ...
  • # 引言 在當今互聯網時代,數據的規模和複雜性不斷增長,傳統關係型資料庫面臨著無法滿足高併發和大規模數據存儲需求的挑戰。為瞭解決這一問題,開源社區涌現出了一系列分散式資料庫解決方案,其中TiDB作為一種新興的分散式資料庫引起了廣泛的關註。本文將介紹TiDB的基本概念、特點以及適用的應用場景。 TiD ...
  • ### 背景 在項目中有集成低代碼平臺的想法,經過多方對比最後選擇了 amis,主要是需要通過 amis 進行頁面配置,導出 json 供移動端和 PC 端進行渲染,所以接下來講一下近兩周研究 amis 的新的以及一些簡單經驗,供大家參考. ### 什麼是 amis amis 是一個低代碼前端框架, ...
  • ![](https://img2023.cnblogs.com/blog/3076680/202306/3076680-20230625162750165-109306308.png) # 1. “模式採用量”絕不是好的質量指標 ## 1.1. 應該形成一種“面向恢復”的思維模式 ## 1.2. 良 ...
  • ![](https://img2023.cnblogs.com/blog/3076680/202306/3076680-20230624223008408-1032311269.png) # 1. 無限長的結果集是導致響應緩慢的常見原因 ## 1.1. 當違反穩態模式時,就可能產生無限長的結果集 # ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...