當前位置:學問谷 >

行業範例 >工程 >

嵌入式課程設計報告

嵌入式課程設計報告

最近幾年,幾乎所有的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 實驗平台內部結構和優良的功能。

  • 文章版權屬於文章作者所有,轉載請註明 https://xuewengu.com/flhy/gongcheng/ow1w30.html