當前位置: 妍妍網 > 碼農

從零開始:在ARM Cortex-M微控制器上實作裸機編程

2024-04-30碼農

從零開始:在ARM Cortex-M微控制器上實作裸機編程

裸機編程通常指在沒有作業系統的情況下直接編寫程式來控制硬體裝置的過程。對於嵌入式系統開發者來說,這是一項基礎且重要的技能。今天,我將帶領大家了解如何在ARM Cortex-M系列微控制器上實施裸機編程。從開發環境的搭建開始,到理解基本輸入輸出操作,再到掌握中斷處理,我們將一步步深入。

開發環境的搭建

搭建適合裸機編程的開發環境是首要任務,其中最關鍵的元件是編譯器、連結器和偵錯程式。對於ARM Cortex-M系列微控制器,我們通常選擇ARM Keil MDK、IAR Embedded Workbench或者是免費開源的GCC ARM工具鏈。

選用GCC ARM工具鏈

考慮到開源且免費的優點,我們這次選擇GCC ARM工具鏈作為開發工具。安裝步驟如下:

  1. 1. 存取 官方網站 下載適用於您作業系統的工具鏈版本。

  2. 2. 解壓下載的檔,並將其路徑添加到系統的環境變量中,確保在任何目錄下都能呼叫到工具鏈中的命令。

接下來,選擇一個適合自己的IDE或文字編輯器來編寫程式碼,Visual Studio Code是一個不錯的選擇,它支持透過擴充套件來增加對ARM開發的支持。

Visual Studio Code

基本輸入輸出操作

編寫裸機程式的一個基本需求是能夠進行輸入和輸出操作。這通常涉及到對微控制器上的GPIO(通用輸入輸出)埠的讀寫操作。

控制LED燈

一個經典的例子是透過編程控制微控制器上的LED燈的閃爍。對於大多數ARM Cortex-M微控制器而言,實作此功能需要進行以下幾個步驟:

  1. 1. 初始化GPIO埠,包含設定特定針腳作為輸出模式。

  2. 2. 迴圈開關LED,通常透過設定和清除GPIO針腳的電平實作。

以STM32F103C8T6微控制器為例,下面是實作LED閃爍的程式碼片段:

#include"stm32f10x.h"voiddelay(unsignedint time){while(time--);}intmain(void){ GPIO_InitTypeDef GPIO_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOC, &GPIO_InitStructure);while (1) { GPIO_SetBits(GPIOC, GPIO_Pin_13); delay(500000); GPIO_ResetBits(GPIOC, GPIO_Pin_13); delay(500000); }}

這段程式碼首先初始化了GPIOC的第13腳為推挽輸出模式,隨後進入一個永久迴圈,迴圈中透過GPIO_SetBits和GPIO_ResetBits函式控制LED的開關,延時函式用於調整閃爍頻率。

中斷處理

中斷是裸機編程中不可或缺的部份,它使得微控制器能夠在特定事件發生時暫停當前任務,去處理更為緊急的任務。ARM Cortex-M系列微控制器擁有一個靈活的中斷和例外處理機制。

實作按鍵中斷

以實作一個簡單的按鍵中斷為例,當外部按鍵被按下時,微控制器中斷服務程式被呼叫,執行特定的操作,例如反轉LED的狀態。

首先,需要配置按鍵針腳作為外部中斷輸入,並設定中斷優先級和使能中斷。然後,編寫中斷服務程式(Interrupt Service Routine, ISR)來處理中斷事件。

#include"stm32f10x.h"voidEXTI0_IRQHandler(void){if (EXTI_GetITStatus(EXTI_Line0) != RESET) { GPIOC->ODR ^= GPIO_Pin_13; // Toggle LED EXTI_ClearITPendingBit(EXTI_Line0); }}intmain(void){// 初始化程式碼略// 配置EXTI Line0 中斷 EXTI_InitTypeDef EXTI_InitStructure; EXTI_InitStructure.EXTI_Line = EXTI_Line0; EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt; EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling; // 降沿觸發 EXTI_InitStructure.EXTI_LineCmd = ENABLE; EXTI_Init(&EXTI_InitStructure);// 啟用中斷和配置優先級略while (1) {// 主迴圈程式碼 }}

當外部按鈕連線到EXTI Line0上,並且被按下時(假設配置為降沿觸發), EXTI0_IRQHandler 會被自動呼叫,執行其中反轉LED狀態的程式碼。

透過以上介紹,你已經了解了在ARM Cortex-M微控制器上進行裸機編程的基本步驟和關鍵技術。這只是冰山一角,微控制器編程的世界廣闊而深奧,涵蓋了低電平硬體操作、高效能演算法實作乃至即時作業系統等領域。

課程推薦

在這篇文章的最後,我想向大家推薦一個非常優秀的嵌入式開發輔導團隊。他們提供 C++/Linux/STM32/ARM 開發、 驅動 開發、 套用 開發等一系列嵌入式開發的 一對一會議輔導 服務。無論你是嵌入式領域的新手,還是希望提升自己的專業技能,他們都能提供個人化的教學方案,幫助你實作從 入門到就業 的目標。

他們的服務包括但不限於:

  • • 多位碩士工程師學長的一對一輔導

  • • 可按階段支付,學多少付多少

  • • 個人化教學、每周作業、面向就業

  • • 從入門到就業,騰訊會議上課

  • 計畫輔導 簡歷指導 模擬面試

  • 教學大綱參考:

    如果你對此感興趣,可以透過下面的圖片了解更多資訊,並添加微信獲取 完整教學大綱 ,添延長請備註: 伯伯公眾號 ,另外本公眾號粉絲報課有 專屬優惠 哦~(找 客服咨詢)

    如果喜歡我的內容,不妨點贊關註,我們下次再見!

    大家註意:因為微信最近又改了推播機制,經常有小夥伴說錯過了之前被刪的文章,或者一些限時福利,錯過了就是錯過了。所以建議大家加個 星標 ,就能第一時間收到推播。

    點個喜歡支持我吧,點個 在看 就更好了