閱讀屋>輔助設計與工程計算> 嵌入式課程設計報告

嵌入式課程設計報告

嵌入式課程設計報告

  最近幾年,幾乎所有的IT 企業對應屆畢業生都有抱怨:動手能力太差,程式設計水平低下。下面和小編一起來看看報告吧!

  嵌入式課程設計報告

  Cortex-M3 是 ARM 公司基於 ARM V7 架構的新型晶片核心。 STM32V100-II 型是英蓓特 公司新推出的一款基於 ST 意法半導體 STM32 系列處理器(Cortex-M3 核心)的全功能 評估板。STM103V100-II 評估板有 USB,Motor Control,CAN,SD 卡,Smart 卡, UART,Speaker,LCD,LED,BNC,耳塞插孔等豐富的外設,有助於使用者輕鬆開發 STM32 的強大功能。STM32 系列使用了 ARM 最新的、先進架構 Cortex-M3 核心,本文論述 了在 Keil Realview 開發環境上開發基於組合語言的 LED 控制程式, 基於對 STM32 的 GPIO 暫存器寫值配置思想, 控制 EduKit-M3 實驗平臺的發光二極體 LED1、 LED2、 LED3、 LED4, 使它們有規律地點亮。

  一、 設計概述

  1.1、 設計需求

  Keil Realview 開發環境上,全部採用組合語言程式設計,實現對 EduKit-M3 實驗平臺的發 光二極體 LED1、LED2、LED3、LED4 的亮滅控制,使它們有規律地點亮。 這裡採用例程提供的順序點亮方式,按照 LED1 亮 LED2 亮 LED3 亮 LED4 亮,如此反覆,要求每個 LED 亮滅之間延時一段時間,以增強可觀性。需要說明的是,這 僅僅作為程式控制 LED 的一種控制方式,基於點亮 LED 的控制原理,可以程式設計實現各種顯 示 LED 的亮滅模式,並提供一種通用的控制方法,要求程式可讀性強,易於修改。

  1.2、 設計原理

  (1)STM32 通用 GPIO 埠概述 STM32F10x 處理器上共有 7 個 I/O 埠:A、B、C、D、E、F、G,每個 16 個管腳 每組埠(暫存器必須以 32 位字形式訪問) 每組埠有以下暫存器: , 32 位配置暫存器: GPIOx_CRL、GPIOx_CRH 32 為資料暫存器: GPIOx_IDR、GPIOx_ODR 32 位置位/復位暫存器: GPIOx_BSRR 16 位復位暫存器: GPIOx_BRR 32 為鎖定暫存器: GPIOx_LCKR I/O 口通用輸入、輸出埠配置為輸入時,每個 APB2 時鐘週期將埠資料送輸入寄存 器(GPIOx_IDR),在輸入模式下,輸出是斷開的。輸出模式時:寫到輸出暫存器(GPIOx_ODR) 的值被傳給對應的 I/O 引腳。在輸出模式下,輸入是允許的 (2)程式設計原理 EduKit-M3 實驗平臺上,透過寫值配置埠資料輸出暫存器 GPIOC_ODR[15:0]值,可 以實現對四個 LED 的亮滅控制, 因為 C 口[9:6]位和四個 LED 燈連通。 而這裡主要是透過對 時鐘控制暫存器以及埠 C 的各配置暫存器和輸出暫存器寫值, 以達到配置埠, 控制 LED 的目的。 組合語言與 C 語言相比,要求更加貼近硬體,瞭解 M3 核心的內部結構和暫存器地址。 基於組合語言的程式設計控制, 只需要找出需要配置的埠基地址, 然後弄清楚各暫存器的偏移 地址,以及各暫存器每位的含義,按照要求寫 1 或寫 0 即可。

  2

  二、 硬體設計:

  2.1 硬體電路

  2.2 硬體電路描述

  本設計是基於 EduKit-M3 實驗平臺的嵌入式開發例項, EduKit-M3 實驗平臺有四個 LED 燈,分別為 LED1、LED2、LED3、LED4,對應的連線到 I/O 的 C 口 PC.6、PC.7、PC.8、 PC.9 四位輸出位上,不需要外擴電路或者額外接線,簡單易行。

  三、 軟體設計

  3.1 程 序 流 程 圖

  3.2 軟 件 設 計 描 述

  (1)整個工程包含 3 個原始檔:STM32F10x.s、和 my led.s,stm32f10x_lib.c 其中3STM32F10x.s 為啟動程式碼, 。啟動程式碼作用是:1)堆和棧的初始化;2)向量表定義;3)地 址重對映及中斷向量表的轉移;4)設定系統時鐘頻率;5)中斷暫存器的初始化;6)進入 彙編主程式。my led.s 是彙編主程式,完成所有控制功能。

  (2)程式工作原理概述: 對於 LED 的控制,主要透過對 I/O 埠的配置,將對應的暫存器相應的位寫 1 寫 0 控 制。程式首先要經過啟動程式碼段進行相關的啟動配置,然後跳轉到彙編主程式。 彙編主程式完成了時鐘、埠配置以及 LED 點亮的所有功能。首先需要對於系統時鐘進 行配置,已獲得系統所用頻率。 然後進行埠配置低、高暫存器配置,獲得輸入輸出模式以及最大速度。將時鐘和埠 配置完成後,就可以對輸出暫存器進行對應位的寫值控制了,從而達到控制 LED 的目的,高 電平點亮,低電平熄滅。 點亮 LED 後,轉入延時子程式,延時子程式寫值 0X000FFFFF,做暫存器值減法,減到 0 後,過程所需時間即是延時時間,即單個 LED 點亮時間。本程式設定迴圈點亮模式,即 LED1 到 LED4 順序迴圈點亮,將對應位逐次寫 1,如果需要修改點亮模式,只需修改暫存器的值以 及寫值順序即可。

  (3)暫存器配置描述 埠配置低暫存器(GPIOC_CRL) C口基地址:0X40011000 偏移地址:0x00 復位值:0x44444444 暫存器配置:0X22222222 功能含義: 口配置低暫存器為模擬輸入模式, 端 通用推輓輸出模式, 輸出模式, 最大速? 2MHz

  埠配置高暫存器(GPIOC_CRH) C口基地址:0X40011000 偏移地址:0x04 復位值:0x44444444 暫存器配置:0X22222222 功能含義: 口配置高暫存器為模擬輸入模式, 端 通用推輓輸出模式, 輸出模式, 最大速? 2MHz 埠輸出資料暫存器(GPIOC_ODR) C口基地址:0X40011000 地址偏移:0Ch 暫存器配置 0xfffffc4f 0xfffffc8f 復位值:00000000h 功能含義 PC.6 位寫 1,對應點亮 LED1 PC.7 位寫 1,對應點亮 LED2

  40xfffffd0f 0xfffffe0fPC.8 位寫 1,對應點亮 LED3 PC.9 位寫 1,對應點亮 LED4

  時鐘控制暫存器(RCC_CR) 復位和時鐘基地址:0X40021000 偏移地址: 0x00 復位值: 0x000 XX83 暫存器配置:0X00000003 功能含義:PLL 未鎖定,PLL 關閉,時鐘監測器關閉,外部 1-25MHz 振盪器沒有旁?,外部 1-25MHz 時鐘沒有就緒,HSE 振盪器關閉內部 8MHz 時鐘就緒,內部 8MHz 時鐘開啟。 時鐘配置暫存器(RCC_CFGR) 復位和時鐘基地址:0X40021000 偏移地址: 0x04 復位值: 0x0000 0000 暫存器配置:0X00000000 功能含義:沒有時鐘輸出,PLL 時鐘 1.5 倍分頻作為 USB 時鐘,PLL 2 倍頻輸出,HSE 不分 頻,HSI 時鐘 2 分頻後作為 PLL 輸入時鐘,PCLK2 2 分頻後作為 ADC 時鐘,HCLK 不分頻, HCLK 不分頻,SYSCLK 不分頻,HSI 作為系統時鐘,HSI 作為系統時鐘。 AHB外設時鐘使能暫存器 (RCC_AHBENR) 復位和時鐘基地址:0X40021000 偏移地址:0x14 復位值:0x0000 0014 暫存器配置:0X00000014 功能含義:睡眠模式時快閃記憶體介面電路時鐘開啟,睡眠模式時 SRAM 時鐘開啟,DMA 時鐘關 閉 APB2 外設時鐘使能暫存器(RCC_APB2ENR) 復位和時鐘基地址:0X40021000 偏移地址:0x18 復位值:0x0000 0000 暫存器配置:0XFFFFFFFF 功能含義:USART1 時鐘開啟,SPI1 時鐘開啟,TIM1 時鐘開啟,ADC2 時鐘開啟,ADC1 時鐘開啟,IO 口 E 時鐘開啟,IO 口 D 時鐘開啟,IO 口 C 時鐘開啟,IO 口 B 時鐘開啟,IO 口 A 時鐘開啟,輔助功能 IO 時鐘開啟

  3.2 主 要 程 序 說 明

  (1)啟動程式碼轉入彙編主程式的設定: 【啟動程式碼段設定: 】 Reset_Handler PROC EXPORT Reset_Handler [WEAK] IMPORT MAIN ;宣告外部函式,匯入符號 LDR R0, =MAIN ;等待工作呼叫 BX R0 ;跳轉到彙編主程式 MAIN 函式 ENDP ;過程段結束 【彙編主程式設定: 】 AREA MYCODE,CODE,READONLY ;定義一個程式碼段,屬性為只讀 EXPORT MAIN MAIN PROC (主程式功能段開始) EndP END (2)彙編主程式 ;配置時鐘

  5LDR R1,=0X40021000 LDR R0,=0X00000003 STR R0,[R1,#0X00] LDR R0,=0X00000000 STR R0,[R1,#0X004] LDR R0,=0X00000014 STR R0,[R1,#0X14]

  時鐘控制暫存器入口

  配置時鐘控制暫存器(RCC_CR)

  配置時鐘配置暫存器(RCC_CFGR)

  配置 AHB 外設時鐘使能暫存器 RCC_AHBENR

  LDR R0,=0XFFFFFFFF STR R0,[R1,#0X18] ;配置 APB2 外設時鐘使能暫存器(RCC_APB2ENR) ;----------------------------------------------------------------------------------------------------;配置埠 MOVS R0,#0X22222222 LDR R1,=0X40011000 STR R0,[R1,#0X00] ;配置埠配置暫存器 GPIOC_CRL MOVS R0,#0X22222222 LDR R1,=0X40011000 STR R0,[R1,#0X04] ;配置埠配置暫存器 GPIOC_CRH ;---------------------------------------------------------------------------------------------------;點 亮 LED LDR R0,=0xfffffc4f STR R0,[R1,#0X0C] ;將 0xfffffc4f 寫進 GIPOC_ODR, 點亮 LED1 BL DELAY ;延時 --------------------------------------------------------------------------------------------------------LDR R0,=0xfffffc8f STR R0,[R1,#0X0C] ;將 0xfffffc8f 寫進 GIPOC_ODR, 點亮 LED2 BL DELAY ;延時 -------------------------------------------------------------------------------------------------------LDR R0,=0xfffffd0f STR R0,[R1,#0X0C] ;將 0xfffffd0f 寫進 GIPOC_ODR, 點亮 LED3 BL DELAY ;延時 -------------------------------------------------------------------------------------------------------LDR R0,=0xfffffe0f STR R0,[R1,#0X0C] ;0xfffffe0f 寫進 GIPOC_ODR, 點亮 LED4 BL DELAY ;延時 -------------------------------------------------------------------------------------------------------B MAIN ;跳到 MAIN 函式 ;------------------------------------------------------------------------(2)延時子程式 DELAY

  6LDR R3,=0X000FFFFF ;延時控制字 DELAY_1 SUBS R3,R3,#0X01 ;延時控制字自減 BEQ DELAY_OUT ;為 0 跳出返回 B DELAY_1 ;不為 0 迴轉繼續做減法 DELAY_OUT BX LR ;程式返回

  四、 除錯與結果

  4.1 調 試 過 程

  (1) 使用 Keil uVision3 透過 ULINK 2 模擬器連線 EduKit-M3 實驗平臺,開啟建立的' my led controler 工程,點選子目錄下的 my led.s 檔案,編譯連結工程。 設定 Flash——Debug, 選擇 Cortex-M3 J-LINK, Flash——Utilities, 同樣選擇 Cortex-M3 J-LINK,效果如下

  點選編譯連結,生成 HEX 檔案

  點選 Load,下載源程式到 STM32,執行程式 (2) 選擇軟體除錯模式,點選 MDK 的 Debug 選單,選擇 Start/Stop Debug Session 項或 Ctrl+F5 鍵。

  7在邏輯分析儀中新增 GPIOC_ODR.6、GPIOC_ODR.7、GPIOC_ODR.8、GPIOC_ODR.9, 點選 Run 按鈕即可在邏輯分析儀中看波形。

  4.2 測 試

  本程式由於大量的涉及到原理簡單,測試方便,只需要單步執行,檢視暫存器的值,就 可以測試程式的正確性。

  (1) 程式開始時各暫存器的值

  (2)將時鐘控制暫存器入口基地址賦值給 R1

  (3)R1 既已經被賦值了時鐘控制暫存器入口地址,利用偏移地址將時鐘各控制暫存器的地 址賦值給(R1+偏移量) 達到配置 RCC_CR、RCC_CFGR、RCC_AHBENR、RCC_APB2ENR 的目的, , 集體暫存器值變化如下:

  8(4)埠配置情況測試:I/O C 口入口地址寫進通用暫存器 R1,利用基地址加偏移地址找 到埠配置暫存器 GPIOC_CRL、GPIOC_CRH,然後將控制字 0X22222222 寫進該暫存器。

  (5)埠輸出資料暫存器(GPIOx_ODR) 的值的變化,直接反映了外部 LED 的亮滅變化, 採用逐位寫 1 的方式,實現迴圈點亮,此時通用 R1 已經被寫進了 C 口的入口基地址,只需 加上偏移地址#0X0C,便是 GPIOx_ODR 的地址,每次寫值控制 LED 點亮後,程式跳轉到延 時子程式,所測試結果如下: 【將 0xfffffc4f 寫進 GIPOC_ODR 點亮 LED1】 【延時子程式執行暫存器變化情況】

  當轉入延時子程式後,暫存器 R3 值做減 1 演算法,從 0X000FFFFF 迴圈減至 0,是為延時 時間,然後繼續跳轉至埠輸出暫存器配置,點亮 LED2,接著再次跳轉到延時子程式,R39再次做減 1 運算,如此控制 LED 迴圈點亮。 【轉入延時子程式】

  【退出延時子程式對 LED2 對應位寫 1 況】

  4.3 結 果 及 描 述

  (1)邏輯分析儀中波形:

  GPIOC_ODR.6、 GPIOC_ODR.7、 GPIOC_ODR.8、 GPIOC_ODR.9 的波形即對應的 LED1、 LED2、LED3、LED4 高低電平波形,由此可以驗證程式的正確性,即 LED 確實按照程式的 思想迴圈順序點亮。

  (2)當將程式下載到 STM32 中後,EduKit-M3 實驗平臺上四個 LED 確實迴圈點亮,進一 步驗證控制程式的正確性。

  五、總結

  本設計是基於 STM32 的組合語言編寫的 LED 迴圈順序點亮控制程式,原理簡單易行, 程式可修改性和可讀性強, 件電路也很簡單, 需要外擴電路, 接利用試驗檯內部接線, 硬 不 直 透過對 GPIO 的控制來相應地點亮 LED 燈。 整個控制程式只需要找到相應的時鐘、埠、輸出暫存器的地址,以及各控制暫存器的 偏移地址,直接定址寫值控制,這是與 C 語言程式最大的不同點,即彙編程式設計更加的貼近硬 件,要求熟悉內部暫存器的地址,熟悉如何配置各位,這就要求對暫存器每位的含義非常清 楚。 透過用匯編語言編寫 I/O 控制程式, 進一步熟悉瞭解了 STM32 GPIO 操作, 以及 CORTEX M3 的內部架構和優點,學會了如何使用 KEIL Realview 開發 STM32,以及如何進行程式單 步除錯,暫存器值檢視。瞭解了 EduKit-M3 實驗平臺內部結構和優良的功能。

【嵌入式課程設計報告】相關文章: