第一篇:江蘇科技大學(xué)嵌入式實(shí)驗(yàn)報(bào)告
實(shí)驗(yàn)一 熟悉嵌入式系統(tǒng)開發(fā)環(huán)境
一、實(shí)驗(yàn)?zāi)康模?/p>
1.熟悉嵌入式系統(tǒng)硬件實(shí)驗(yàn)平臺(tái) 2.掌握超級(jí)終端配置方法。
3.掌握嵌入式系統(tǒng)開發(fā)環(huán)境配置,ARM-Linux下NFS服務(wù)器的配置方法 4.掌握常用的 Linux下shell命令
二、實(shí)驗(yàn)設(shè)備及工具 :
硬件:UP-NETARM2410-S嵌入式實(shí)驗(yàn)儀、PC機(jī)pentumn500以上、硬盤40G以上、內(nèi)存大于256M。
軟件:PC機(jī)操作系統(tǒng)REDHAT LINUX 9.0、MINICOM、AMRLINUX開發(fā)環(huán)境
三、實(shí)驗(yàn)內(nèi)容 :(1)掌握嵌入式系統(tǒng)實(shí)驗(yàn)平臺(tái)上的各類借接口的位置;
(2)配置windows的超級(jí)終端,熟悉vivi的命令行,bootload、kernel、root和用戶程序的介紹;
(3)配置linux的終端,配置網(wǎng)絡(luò)服、Ip地址,開發(fā)目錄共享,掛載等。
四、實(shí)驗(yàn)步驟:
1.掌握嵌入式系統(tǒng)實(shí)驗(yàn)平臺(tái)上的各類接口的位置
UP-TECH S2410/P270 DVP 的硬件配置如表 1.2.1 所示
實(shí)物如圖 1.2.1 所示:
2.配置windows的超級(jí)終端,熟悉vivi的命令行,bootload、kernel、root和用戶程序的介紹;
1)配置windows的超級(jí)終端:
a)用串口線將 PC 機(jī)與 ARM 開發(fā)板連接好后,將 UP-TECH S2410、P270 DVP 開發(fā)板開機(jī),然后點(diǎn)擊 PC 機(jī)上的開始“菜單”然后找到“附件”中“通訊”選項(xiàng)中的“超級(jí)終端”,b)然后在超級(jí)終端里進(jìn)行配置,在“名稱”中輸入要建立的超級(jí)終端的名字。c)在“連接時(shí)使用”一欄選擇可用的串口號(hào),(這里根據(jù)自己的實(shí)際情況進(jìn)行選擇)。d)在“每秒位數(shù)”中選擇“115200”,“數(shù)據(jù)流控制”選擇“無”,然后點(diǎn)擊“確定”按鈕,設(shè)置完畢。
2)學(xué)習(xí)并掌握如下命令:
ls,cd,pwd,cat,more,less,mkdir,rmdir,rm,mv,cp,tar,ifconfig 3.Linux下minicom的使用與程序掛載
a)打開虛擬機(jī),啟動(dòng)linux;
b)新建終端,輸入minicom來啟動(dòng)實(shí)驗(yàn)箱;
c)配置IP地址——輸入ifconfig,查看實(shí)驗(yàn)箱IP地址。新建終端,配置主機(jī)IP地址與實(shí)驗(yàn)箱IP在同一網(wǎng)段。
1.ifconfig eth0 192.168.0.3 d)用前一終端輸入ping 192.168.0.3,測(cè)試是否ping通。
4.在主機(jī)的創(chuàng)建開發(fā)目錄,編寫程序用arm編譯器編譯。
vi編輯器,編寫代碼,并使用armv4l-unknown-linux-gcc編譯器進(jìn)行編譯
Hello.c源代碼為5.掛載程序至實(shí)驗(yàn)箱
1)主機(jī)設(shè)置NFS共享
選中NFS->
設(shè)置共享文件夾
2)實(shí)驗(yàn)箱終端輸入:Mount-t nfs 192.168.0.3:/lx /mnt/nfs 運(yùn)行編譯后程序
五、實(shí)驗(yàn)結(jié)果分析:
在實(shí)驗(yàn)室里我沒能熟悉并掌握Linux的開發(fā)環(huán)境,但是在課后通過查閱書籍資料,最終熟悉了Linux 開發(fā)環(huán)境,也學(xué)會(huì)了基于S3C2410 的Linux 開發(fā)環(huán)境的配置和使用。以及使用armv4l-unknown-linux-gcc 進(jìn)行編譯,使用基于NFS 方式的下載調(diào)試,實(shí)驗(yàn)中出現(xiàn)的問題是編譯的文件必須掛載到開發(fā)板才能在ARM中找到我們需要運(yùn)行的文件,以及使用gcc編譯時(shí)需要注意的事項(xiàng)。
實(shí)驗(yàn)
二、嵌入式Linux程序設(shè)計(jì)
一、實(shí)驗(yàn)?zāi)康模?/p>
1.掌握嵌入式Linux軟件設(shè)計(jì)方法原理 2.掌握Makefile文件設(shè)計(jì)方法。
3.熟悉Linux下靜態(tài)庫(kù)和共享庫(kù)的設(shè)計(jì)
二、實(shí)驗(yàn)設(shè)備及工具:
硬件:UP-NETARM2410-S嵌入式實(shí)驗(yàn)儀、PC機(jī)pentumn500以上、硬盤40G以上、內(nèi)存大于256M。
軟件:PC機(jī)操作系統(tǒng)REDHAT LINUX 9.0、MINICOM、AMRLINUX開發(fā)環(huán)境
三、實(shí)驗(yàn)內(nèi)容:
(1)編寫一個(gè)帶輸入、輸出的由5個(gè)文件組成的嵌入式軟件;(2)寫好makefile文件,并上機(jī)調(diào)試;(3)用變量指明兩種編譯器。
四、實(shí)驗(yàn)步驟:
1.在宿主機(jī)(PC)上建立用戶開發(fā)目錄,編寫嵌入式程序文件,3個(gè)C文件+2個(gè)頭文件。
cd /
mkdir shiyan input.h
#define N 10
Void input(char *s)input.c
#include
Void input(char *s){
Printf(“input your name please:”);Scanf(“%s”, s);
} output.h #define M 5
Void output(char *s)output.c
#include
Void output(char *s){
Printf(“hello %s!n”,s);
} main.c #include
#include
#include “input.h”
#include “output.h”
Int main(){
int i=0;
char name[N];
input(name);
for(i=0;i return 0; } 2.編寫Makefile文件,要求Makefile文件實(shí)現(xiàn)這5個(gè)文件的編譯,有clean 和intall 選項(xiàng),用變量選擇86和arm編譯器指明 CC= gcc或 CC= armv4l-unknown-linux-gcc。 #makefile #cc=arm4vl-unknown-linux-gcc cc=gcc main:main.o input.o output.o $(cc)–o main main.o input.o output.o main.o:main.c input.h output.h $(cc)–c main.c input.o:input.c $(cc)–c input.c output.o:output.c $(cc)–c output.c Clean: rm main main.o input.o output.o 3.編譯程序,并下載到實(shí)驗(yàn)箱上執(zhí)行 mount –t nfs 主機(jī)ip:/開發(fā)目錄 /host。在主機(jī)上運(yùn)行: 掛載到目標(biāo)板上運(yùn)行: 五、實(shí)驗(yàn)結(jié)果分析 通過本次實(shí)驗(yàn),學(xué)會(huì)了如何使用makefile進(jìn)行多文件的編譯。在實(shí)驗(yàn)過程中復(fù)習(xí)了如何實(shí)現(xiàn)主機(jī)上文件的掛載,使用基于NFS方式的下載調(diào)試,通過本次實(shí)驗(yàn),初步了解嵌入式開發(fā)的基本過程。像第一次實(shí)驗(yàn)一樣,在本機(jī)上運(yùn)行要使用gcc編譯,要掛載在開發(fā)板上運(yùn)行時(shí)需要使用armv4l-unknown-linux-gcc 進(jìn)行編譯。 實(shí)驗(yàn)三 嵌入式驅(qū)動(dòng)程序設(shè)計(jì) 一、實(shí)驗(yàn)?zāi)康模?/p> 1.學(xué)習(xí)在LINUX 下進(jìn)行驅(qū)動(dòng)設(shè)計(jì)的原理 2.掌握使用模塊方式進(jìn)行驅(qū)動(dòng)開發(fā)調(diào)試的過程 二、實(shí)驗(yàn)設(shè)備及工具: 硬件:UP-NETARM2410-S嵌入式實(shí)驗(yàn)儀、PC機(jī)pentumn500以上、硬盤40G以上、內(nèi)存大于256M。 軟件:PC機(jī)操作系統(tǒng)REDHAT LINUX 9.0、MINICOM、AMRLINUX開發(fā)環(huán)境 三、實(shí)驗(yàn)內(nèi)容: 在PC 機(jī)上編寫簡(jiǎn)單的虛擬硬件驅(qū)動(dòng)程序并進(jìn)調(diào)試,實(shí)驗(yàn)驅(qū)動(dòng)的各個(gè)接口函數(shù)的實(shí)現(xiàn),分析并理解驅(qū)動(dòng)與應(yīng)用程序的交互過程。在PC(宿主機(jī))上編譯調(diào)試驅(qū)動(dòng)程序。 1、閱讀和理解源代碼 進(jìn)入/arm2410cl/exp/drivers/01_demo,使用vi 編輯器或其他編輯器閱讀理解源代碼。 2、編譯驅(qū)動(dòng)模塊及測(cè)試程序 上面介紹了在Makefile 中有兩種編譯方法,可以在本機(jī)上使用gcc 也可以使用交叉編 確定 # KERNELDIR = /arm2410cl/kernel/linux-2.4.18-2410cl KERNELDIR = /usr/src/linux 3、測(cè)試驅(qū)動(dòng)程序 如果使用gcc 編譯的話,需要通過下面的命令來建立設(shè)備節(jié)點(diǎn),如果使用交叉編譯器的話,不需要建立設(shè)備節(jié)點(diǎn)。#mknod /dev/demo c 254 0 首先要插入驅(qū)動(dòng)模塊demo.o,然后可以用lsmod 命令來查看模塊是否已經(jīng)被插入,在不使用該模塊的時(shí)候還可以用rmmod 命令來將模塊卸載。insmod demo.o lsmod demo.o./test_demo 四、實(shí)驗(yàn)結(jié)果分析: 實(shí)驗(yàn)心得: 通過本次實(shí)驗(yàn),我發(fā)現(xiàn)實(shí)驗(yàn)時(shí)要將驅(qū)動(dòng)程序復(fù)制出來,否則如果運(yùn)行不當(dāng)?shù)脑挄?huì)破壞系統(tǒng)。同時(shí)初略學(xué)習(xí)了在LINUX 下進(jìn)行驅(qū)動(dòng)設(shè)計(jì)的原理,基本掌握使用模塊方式進(jìn)行驅(qū)動(dòng)開發(fā)調(diào)試的過程。 實(shí)驗(yàn)四 S3C2410處理器硬件電路設(shè)計(jì) 一、實(shí)驗(yàn)?zāi)康模?/p> 1.熟悉硬件電路設(shè)計(jì) 2.掌握簡(jiǎn)單的S3c2410處理器的電路設(shè)計(jì)。3.掌握protel軟件的使用 二、實(shí)驗(yàn)設(shè)備及工具: 硬件:UP-NETARM2410-S嵌入式實(shí)驗(yàn)儀、PC機(jī)pentumn500以上、硬盤40G以上、內(nèi)存大于256M。 軟件:PC機(jī)操作系統(tǒng)REDHAT LINUX 9.0、MINICOM、AMRLINUX開發(fā)環(huán)境 三、實(shí)驗(yàn)內(nèi)容: 使用protel 99se 做s3c2410處理器最小系統(tǒng)電路設(shè)計(jì),A/D數(shù)據(jù)采集模塊電路設(shè)計(jì)。 四、實(shí)驗(yàn)結(jié)果分析: 實(shí)驗(yàn)心得: 通過本次實(shí)驗(yàn)我初步熟悉了硬件電路設(shè)計(jì),掌握簡(jiǎn)單的S3c2410處理器的電路設(shè)計(jì)以及掌握protel軟件的使用,觀察到了模數(shù)轉(zhuǎn)換的變化(處理器上小燈閃爍)。 目錄 實(shí)驗(yàn)一 跑馬燈實(shí)驗(yàn).........................................................................1 實(shí)驗(yàn)二 按鍵輸入實(shí)驗(yàn).....................................................................3 實(shí)驗(yàn)三 串口實(shí)驗(yàn).............................................................................5 實(shí)驗(yàn)四 外部中斷實(shí)驗(yàn).....................................................................8 實(shí)驗(yàn)五 獨(dú)立看門狗實(shí)驗(yàn)................................................................11 實(shí)驗(yàn)七 定時(shí)器中斷實(shí)驗(yàn)................................................................13 實(shí)驗(yàn)十三 ADC實(shí)驗(yàn)........................................................................15 實(shí)驗(yàn)十五 DMA實(shí)驗(yàn)........................................................................17 實(shí)驗(yàn)十六 I2C實(shí)驗(yàn)........................................................................21 實(shí)驗(yàn)十七 SPI實(shí)驗(yàn)........................................................................24 實(shí)驗(yàn)二十一 紅外遙控實(shí)驗(yàn)............................................................27 實(shí)驗(yàn)二十二 DS18B20實(shí)驗(yàn).............................................................30 實(shí)驗(yàn)一 跑馬燈實(shí)驗(yàn) 一.實(shí)驗(yàn)簡(jiǎn)介 我的第一個(gè)實(shí)驗(yàn),跑馬燈實(shí)驗(yàn)。 二.實(shí)驗(yàn)?zāi)康?/p> 掌握STM32開發(fā)環(huán)境,掌握從無到有的構(gòu)建工程。 三.實(shí)驗(yàn)內(nèi)容 熟悉MDK KEIL開發(fā)環(huán)境,構(gòu)建基于固件庫(kù)的工程,編寫代碼實(shí)現(xiàn)跑馬燈工程。通過ISP下載代碼到實(shí)驗(yàn)板,查看運(yùn)行結(jié)果。使用JLINK下載代碼到目標(biāo)板,查看運(yùn)行結(jié)果,使用JLINK在線調(diào)試。 四.實(shí)驗(yàn)設(shè)備 硬件部分:PC計(jì)算機(jī)(宿主機(jī))、亮點(diǎn)STM32實(shí)驗(yàn)板、JLINK。軟件部分:PC機(jī)WINDOWS系統(tǒng)、MDK KEIL軟件、ISP軟件。 五.實(shí)驗(yàn)步驟 1.熟悉MDK KEIL開發(fā)環(huán)境 2.熟悉串口編程軟件ISP 3.查看固件庫(kù)結(jié)構(gòu)和文件 4.建立工程目錄,復(fù)制庫(kù)文件 5.建立和配置工程 6.編寫代碼 7.編譯代碼 8.使用ISP下載到實(shí)驗(yàn)板 9.測(cè)試運(yùn)行結(jié)果 10.使用JLINK下載到實(shí)驗(yàn)板 11.單步調(diào)試 12.記錄實(shí)驗(yàn)過程,撰寫實(shí)驗(yàn)報(bào)告 六.實(shí)驗(yàn)結(jié)果及測(cè)試 源代碼: 兩個(gè)燈LED0與LED1實(shí)現(xiàn)交替閃爍的類跑馬燈效果,每300ms閃爍一次。 七.實(shí)驗(yàn)總結(jié) 通過本次次實(shí)驗(yàn)我了解了STM32開發(fā)板的基本使用,初次接觸這個(gè)開發(fā)板和MDK KEILC軟件,對(duì)軟件操作不太了解,通過這次實(shí)驗(yàn)了解并熟練地使用MDK KEIL軟件,用這個(gè)軟件來編程和完成一些功能的實(shí)現(xiàn)。作為 STM32 的入門第一個(gè)例子,詳細(xì)介紹了STM32 的IO口操作,同時(shí)鞏固了前面的學(xué)習(xí),并進(jìn)一步介紹了MDK的軟件仿真功能。 實(shí)驗(yàn)二 按鍵輸入實(shí)驗(yàn) 一.實(shí)驗(yàn)簡(jiǎn)介 在實(shí)驗(yàn)一的基礎(chǔ)上,使用按鍵控制流水燈速度,及使用按鍵控制流水燈流水方向。 二.實(shí)驗(yàn)?zāi)康?/p> 熟練使用庫(kù)函數(shù)操作GPIO,掌握中斷配置和中斷服務(wù)程序編寫方法,掌握通過全局變量在中斷服務(wù)程序和主程序間通信的方法。 三.實(shí)驗(yàn)內(nèi)容 實(shí)現(xiàn)初始化GPIO,并配置中斷,在中斷服務(wù)程序中通過修改全局變量,達(dá)到控制流水燈速度及方向。 使用JLINK下載代碼到目標(biāo)板,查看運(yùn)行結(jié)果,使用JLINK在線調(diào)試。 四.實(shí)驗(yàn)設(shè)備 硬件部分:PC計(jì)算機(jī)(宿主機(jī))、亮點(diǎn)STM32實(shí)驗(yàn)板、JLINK、示波器。軟件部分:PC機(jī)WINDOWS系統(tǒng)、MDK KEIL軟件、ISP軟件。 五.實(shí)驗(yàn)步驟 1在實(shí)驗(yàn)1代碼的基礎(chǔ)上,編寫中斷初始化代碼 2在主程序中聲明全局變量,用于和中斷服務(wù)程序通信,編寫完成主程序 3編寫中斷服務(wù)程序 4編譯代碼,使用JLINK下載到實(shí)驗(yàn)板 5.單步調(diào)試 6記錄實(shí)驗(yàn)過程,撰寫實(shí)驗(yàn)報(bào)告 六.實(shí)驗(yàn)結(jié)果及測(cè)試 源代碼: 我們將通過MiniSTM32 板上載有的3個(gè)按鈕,來控制板上的2個(gè)LED,其中KEY0控制LED0,按一次亮,再按一次,就滅。KEY1 控制LED1,效果同KEY0。KEY_2(KEY_UP),同時(shí)控制LED0 和LED1,按一次,他們的狀態(tài)就翻轉(zhuǎn)一次。 七.實(shí)驗(yàn)總結(jié) 通過本次實(shí)驗(yàn),我學(xué)會(huì)了如何使用STM32 的IO 口作為輸入用。TM32 的IO 口做輸入使用的時(shí)候,是通過讀取IDR 的內(nèi)容來讀取IO 口的狀態(tài)的。這里需要注意的是 KEY0 和KEY1 是低電平有效的,而WK_UP 是高電平有效的,而且要確認(rèn)WK_UP 按鈕與DS18B20 的連接是否已經(jīng)斷開,要先斷開,否則DS18B20 會(huì)干擾WK_UP按鍵!并且KEY0 和KEY1 連接在與JTAG 相關(guān)的IO 口上,所以在軟件編寫的時(shí)候要先禁用JTAG 功能,才能把這兩個(gè)IO 口當(dāng)成普通IO 口使用。 實(shí)驗(yàn)三 串口實(shí)驗(yàn) 一.實(shí)驗(yàn)簡(jiǎn)介 編寫代碼實(shí)現(xiàn)串口發(fā)送和接收,將通過串口發(fā)送來的數(shù)據(jù)回送回去。 二.實(shí)驗(yàn)?zāi)康?/p> 掌握STM32基本串口編程,進(jìn)一步學(xué)習(xí)中斷處理。 三.實(shí)驗(yàn)內(nèi)容 編寫主程序,初始化串口1,設(shè)置波特率為9600,無校驗(yàn),數(shù)據(jù)位8位,停止位1位。編寫中斷服務(wù)程序代碼實(shí)現(xiàn)將發(fā)送過來的數(shù)據(jù)回送。 四.實(shí)驗(yàn)設(shè)備 硬件部分:PC計(jì)算機(jī)(宿主機(jī))、亮點(diǎn)STM32實(shí)驗(yàn)板、JLINK、示波器。 軟件部分:PC機(jī)WINDOWS系統(tǒng)、MDK KEIL軟件、ISP軟件、串口調(diào)試助手。 五.實(shí)驗(yàn)步驟 1編寫串口初始化代碼 2編寫中斷服務(wù)程序代碼 3編譯代碼,使用JLINK或ISP下載到實(shí)驗(yàn)板 4記錄實(shí)驗(yàn)過程,撰寫實(shí)驗(yàn)報(bào)告 六.實(shí)驗(yàn)結(jié)果及測(cè)試 源代碼: 把代碼下載到 MiniSTM32 開發(fā)板,可以看到板子上的LED0 開始閃爍,說明程序已經(jīng)在跑了。接著我們打開串口調(diào)試助手,看到如下信息: 證明串口數(shù)據(jù)發(fā)送沒問題。接著,我們?cè)诎l(fā)送區(qū)輸入上面的文字,輸入完后按回車鍵。然后單擊發(fā)送,可以得到如下結(jié)果: 七.實(shí)驗(yàn)總結(jié) 通過本次實(shí)驗(yàn),我進(jìn)一步了解了串口的使用,學(xué)會(huì)了通過串口發(fā)送和接收數(shù)據(jù),將通過串口發(fā)送來的數(shù)據(jù)回送回去。該實(shí)驗(yàn)的硬件配置不同于前兩個(gè)實(shí)驗(yàn),串口 1 與USB 串口默認(rèn)是分開的,并沒有在PCB上連接在一起,需要通過跳線帽來連接一下。這里我們把P4 的RXD 和TXD 用跳線帽與P3 的PA9 和PA10 連接起來。 實(shí)驗(yàn)四 外部中斷實(shí)驗(yàn) 一.實(shí)驗(yàn)簡(jiǎn)介 STM32 的 IO 口在本章第一節(jié)有詳細(xì)介紹,而外部中斷在第二章也有詳細(xì)的闡述。這里我們將介紹如何將這兩者結(jié)合起來,實(shí)現(xiàn)外部中斷輸入。 二.實(shí)驗(yàn)?zāi)康?/p> 進(jìn)一步掌握串口編程,進(jìn)一步學(xué)習(xí)外部中斷編程,提高編程能力。 三.實(shí)驗(yàn)內(nèi)容 初始化IO口的輸入,開啟復(fù)用時(shí)鐘,設(shè)置IO與中斷的映射關(guān)系,從而開啟與IO口相對(duì)應(yīng)的線上中斷事件,設(shè)置觸發(fā)條件。配置中斷分組(NVIC),并使能中斷,編寫中斷服務(wù)函數(shù)。 四.實(shí)驗(yàn)設(shè)備 硬件部分:PC計(jì)算機(jī)(宿主機(jī))、亮點(diǎn)STM32實(shí)驗(yàn)板、JLINK、示波器。 軟件部分:PC機(jī)WINDOWS系統(tǒng)、MDK KEIL軟件、ISP軟件、串口調(diào)試助手。 五.實(shí)驗(yàn)步驟 1.2.3.4.編寫中斷服務(wù)程序代碼 使用ISP下載到實(shí)驗(yàn)板 測(cè)試運(yùn)行結(jié)果 記錄實(shí)驗(yàn)過程,撰寫實(shí)驗(yàn)報(bào)告 六.實(shí)驗(yàn)結(jié)果及測(cè)試 源代碼: 打開串口助手。 七.實(shí)驗(yàn)總結(jié) 首先需要將IO設(shè)置為中斷輸入口: 1)初始化 IO 口為輸入。 2)開啟 IO 口復(fù)用時(shí)鐘,設(shè)置 IO 口與中斷線的映射關(guān)系。 3)開啟與該 IO口相對(duì)的線上中斷/事件,設(shè)置觸發(fā)條件。 4)配置中斷分組(NVIC),并使能中斷。 5)編寫中斷服務(wù)函數(shù)。 這一節(jié),使用的是中斷來檢測(cè)按鍵,通過 WK_UP 按鍵實(shí)現(xiàn)按一次 LED0 和 LED 1 同時(shí)翻轉(zhuǎn),按 KEY0 翻轉(zhuǎn) LED0,按 KEY1 翻轉(zhuǎn) LED1。 試驗(yàn)中外部中斷函數(shù)不能進(jìn)入的原因分析 : 1)GPIO或者AFIO的時(shí)鐘沒有開啟。2)GPIO和配置的中斷線路不匹配。3)中斷觸發(fā)方式和實(shí)際不相符合。 4)中斷處理函數(shù)用庫(kù)函數(shù)時(shí),寫錯(cuò),經(jīng)常可能出現(xiàn)數(shù)字和字母之間沒有下劃線。5)外部中斷是沿觸發(fā),有可能不能檢測(cè)到沿,比如 中斷線是低電平(浮空輸入),觸發(fā)是下降沿觸發(fā),可能會(huì)出現(xiàn)一直是低電平,高電平的時(shí)候是一樣的情況,電平持續(xù)為高電平。 6)沒有用軟件中斷來觸發(fā)外部中斷,調(diào)用函數(shù)EXTI_GenerateSWInterrupt;,因?yàn)檐浖袛嘞扔谶呇刂袛嗵幚怼?/p> 實(shí)驗(yàn)五 獨(dú)立看門狗實(shí)驗(yàn) 一. 實(shí)驗(yàn)簡(jiǎn)介 獨(dú)立看門狗(IWDG)由專用的低速時(shí)鐘(LSI)驅(qū)動(dòng),即使主時(shí)鐘發(fā)生故障它也仍然有效。窗口看門狗由從APB1時(shí)鐘分頻后得到的時(shí)鐘驅(qū)動(dòng),通過可配置的時(shí)間窗口來檢測(cè)應(yīng)用程序非正常的過遲或過早的操作。 二.實(shí)驗(yàn)?zāi)康?/p> 通過編程,編寫一個(gè)獨(dú)立看門狗驅(qū)動(dòng)程序 三.實(shí)驗(yàn)內(nèi)容 啟動(dòng) STM32 的獨(dú)立看門狗,從而使能看門狗,在程序里面必須間隔一定時(shí)間喂狗,否則將導(dǎo)致程序復(fù)位。利用這一點(diǎn),我們本章將通過一個(gè) LED 燈來指示程序是否重啟,來驗(yàn)證 STM32 的獨(dú)立看門狗。 四.實(shí)驗(yàn)設(shè)備 硬件部分:PC計(jì)算機(jī)(宿主機(jī))、亮點(diǎn)STM32實(shí)驗(yàn)板、JLINK。 軟件部分:PC機(jī)WINDOWS系統(tǒng)、MDK KEIL軟件、ISP軟件、串口調(diào)試助手。 五.實(shí)驗(yàn)步驟 1.2.3.4.參考教材獨(dú)立看門狗部分,編寫?yīng)毩⒖撮T狗驅(qū)動(dòng)程序。建立和配置工程 編寫代碼 使用ISP下載到實(shí)驗(yàn)板 記錄實(shí)驗(yàn)過程,撰寫實(shí)驗(yàn)報(bào)告 六.實(shí)驗(yàn)結(jié)果及測(cè)試 源代碼: 在配置看門狗后,看到LED0 不停的閃爍,如果WK_UP 按鍵按下,就喂狗,只要WK_UP 不停的按,看門狗就一直不會(huì)產(chǎn)生復(fù)位,保持LED0 的常亮,一旦超過看門狗定溢出時(shí)間(Tout)還沒按,那么將會(huì)導(dǎo)致程序重啟,這將導(dǎo)致LED0 熄滅一次。 七.實(shí)驗(yàn)總結(jié) 通過本次實(shí)驗(yàn),我掌握了啟動(dòng)獨(dú)立看門狗的步驟: 1)向 IWDG_KR 寫入 0X5555。2)向 IWDG_KR 寫入 0XAAAA。3)向 IWDG_KR 寫入 0XCCCC。 通過上面 3個(gè)步驟,啟動(dòng) STM32 的看門狗,從而使能看門狗,在程序里面就必須間隔一定時(shí)間喂狗,否則將導(dǎo)致程序復(fù)位。利用這一點(diǎn),本章通過一個(gè)LED 燈來指示程序是否重啟,來驗(yàn)證 STM32 的獨(dú)立看門狗。在配置看門狗后,LED0 將常亮,如果 WK_UP 按鍵按下,就喂狗,只要 WK_UP 不停的按,看門狗就一直不會(huì)產(chǎn)生復(fù)位,保持 LED 0 的常亮,一旦超過看門狗溢出時(shí)間(Tout)還沒按,那么將會(huì)導(dǎo)致程序重啟,這將導(dǎo)致 LED 0 熄滅一次。 實(shí)驗(yàn)七 定時(shí)器中斷實(shí)驗(yàn) 一. 實(shí)驗(yàn)簡(jiǎn)介 STM32 的定時(shí)器是一個(gè)通過可編程預(yù)分頻器(PSC)驅(qū)動(dòng)的 16 位自動(dòng)裝載計(jì)數(shù)器(CNT)構(gòu)成。STM32 的通用定時(shí)器可以被用于:測(cè)量輸入信號(hào)的脈沖長(zhǎng)度(輸入捕獲)或者產(chǎn)生輸出波形(輸出比較和 PWM)等。使用定時(shí)器預(yù)分頻器和 RCC 時(shí)鐘控制器預(yù)分頻器,脈沖長(zhǎng)度和波形周期可以在幾微秒到幾毫秒間調(diào)整。STM32 的每個(gè)通用定時(shí)器都是完全獨(dú)立的,沒有互相共享的任何資源。 二.實(shí)驗(yàn)?zāi)康?/p> 熟練掌握定時(shí)器中斷,學(xué)會(huì)對(duì)定時(shí)器中斷的編程操作。 三.實(shí)驗(yàn)內(nèi)容 使用定時(shí)器產(chǎn)生中斷,然后在中斷服務(wù)函數(shù)里面翻轉(zhuǎn) LED1 上的電平,來指示定時(shí)器中斷的產(chǎn)生,修改中斷時(shí)間。 四.實(shí)驗(yàn)設(shè)備 硬件部分:PC計(jì)算機(jī)(宿主機(jī))、亮點(diǎn)STM32實(shí)驗(yàn)板、JLINK。 軟件部分:PC機(jī)WINDOWS系統(tǒng)、MDK KEIL軟件、ISP軟件、串口調(diào)試助手。 五.實(shí)驗(yàn)步驟 1.參考教材定時(shí)器中斷部分,編寫定時(shí)器中斷的驅(qū)動(dòng)程序。2.編寫主程序 3.編譯代碼,使用JLINK或ISP下載到實(shí)驗(yàn)板 4.記錄實(shí)驗(yàn)過程,撰寫實(shí)驗(yàn)報(bào)告 六.實(shí)驗(yàn)結(jié)果及測(cè)試 源代碼: 七.實(shí)驗(yàn)總結(jié) 通過本次實(shí)驗(yàn),認(rèn)識(shí)到時(shí)間中斷來控制LED燈的閃爍,同時(shí)也可以將時(shí)間中斷應(yīng)用到控制其他的程序塊。 以TIME3為例產(chǎn)生中斷的步驟為 1)TIM3 時(shí)鐘使能。 2)設(shè)置 TIM3_ARR 和 TIM3_PSC 的值。 3)設(shè)置 TIM3_DIER 允許更新中斷。 4)允許 TIM3 工作。 5)TIM3 中斷分組設(shè)置。6)編寫中斷服務(wù)函數(shù)。 在中斷產(chǎn)生后,通過狀態(tài)寄存器的值來判斷此次產(chǎn)生的中斷屬于什么類型。然后執(zhí)行相關(guān)的操作,我們這里使用的是更新(溢出)中斷,所以在狀態(tài)寄存器 SR 的最低位。在處理完中斷之后應(yīng)該向 TIM3_SR 的最低位寫 0,來清除該中斷標(biāo)志。 實(shí)驗(yàn)十三 ADC實(shí)驗(yàn) 一.實(shí)驗(yàn)簡(jiǎn)介 通過DAC將STM32系統(tǒng)的數(shù)字量轉(zhuǎn)換為模擬量。使用ADC將模擬量轉(zhuǎn)換為數(shù)字量。 二.實(shí)驗(yàn)?zāi)康?/p> 掌握DAC和ADC編程。 三.實(shí)驗(yàn)內(nèi)容 編寫代碼實(shí)現(xiàn)簡(jiǎn)單的DAC單次發(fā)送 編寫代碼實(shí)現(xiàn)ADC采集DAC發(fā)送的數(shù)據(jù),并發(fā)送到串口 四.實(shí)驗(yàn)設(shè)備 硬件部分:PC計(jì)算機(jī)(宿主機(jī))、亮點(diǎn)STM32實(shí)驗(yàn)板、JLINK。 軟件部分:PC機(jī)WINDOWS系統(tǒng)、MDK KEIL軟件、ISP軟件、串口調(diào)試助手。 五.實(shí)驗(yàn)步驟 1編寫主程序 2編譯代碼,使用JLINK或ISP下載到實(shí)驗(yàn)板,使用串口調(diào)試助手觀察數(shù)據(jù) 3記錄實(shí)驗(yàn)過程,撰寫實(shí)驗(yàn)報(bào)告 六.實(shí)驗(yàn)結(jié)果及測(cè)試 源代碼: 七.實(shí)驗(yàn)總結(jié) 本節(jié)將利用 STM32的 ADC1 通道 0 來采樣外部電壓值,并在串口調(diào)試助手中顯示出來。步驟如下: 1)開啟 PA 口時(shí)鐘,設(shè)置 PA0 為模擬輸入。 2)使能 ADC1 時(shí)鐘,并設(shè)置分頻因子。 3)設(shè)置 ADC1 的工作模式。 4)設(shè)置 ADC1 規(guī)則序列的相關(guān)信息。 5)開啟 AD 轉(zhuǎn)換器,并校準(zhǔn)。 6)讀取 ADC 值。 在上面的校準(zhǔn)完成之后,ADC 就算準(zhǔn)備好了。接下來我們要做的就是設(shè)置規(guī)則序列 0 里面的通道,然后啟動(dòng) ADC 轉(zhuǎn)換。在轉(zhuǎn)換結(jié)束后,讀取 ADC1_DR 里面的值。 通過以上幾個(gè)步驟的設(shè)置,可以正常的使用 STM32 的 ADC1 來執(zhí)行 AD 轉(zhuǎn)換操作。 通過本次實(shí)驗(yàn)的學(xué)習(xí),我們了解了STM32 ADC的使用,但這僅僅是STM32強(qiáng)大的ADC 功能的一小點(diǎn)應(yīng)用。STM32 的ADC 在很多地方都可以用到,其ADC 的DMA 功能是很不錯(cuò)的,實(shí)驗(yàn)十五 DMA實(shí)驗(yàn) 一. 實(shí)驗(yàn)簡(jiǎn)介 直接存儲(chǔ)器存取(DMA)用來提供在外設(shè)和存儲(chǔ)器之間或者存儲(chǔ)器和存儲(chǔ)器之間的高速數(shù)據(jù)傳輸。無須CPU干預(yù),數(shù)據(jù)可以通過DMA快速地移動(dòng),這就節(jié)省了CPU的資源來做其他操作。 二.實(shí)驗(yàn)?zāi)康?/p> 熟練掌握DMA編程,學(xué)會(huì)對(duì)EPC02的讀寫操作,學(xué)習(xí)雙緩沖兵乓操作,理解互斥資源。提高編程能力。 三.實(shí)驗(yàn)內(nèi)容 利用外部按鍵KEY0 來控制DMA 的傳送,每按一次KEY0,DMA 就傳送一次數(shù)據(jù) 到USART1,然后在串口調(diào)試助手觀察進(jìn)度等信息。LED0 還是用來做為程序運(yùn)行的指示燈。 這里我們使用到的硬件資源如下: 1)按鍵KEY0。2)指示燈LED0。 3)使用串口調(diào)試助手觀察數(shù)據(jù) 四.實(shí)驗(yàn)設(shè)備 硬件部分:PC計(jì)算機(jī)(宿主機(jī))、亮點(diǎn)STM32實(shí)驗(yàn)板、JLINK。 軟件部分:PC機(jī)WINDOWS系統(tǒng)、MDK KEIL軟件、ISP軟件、網(wǎng)絡(luò)調(diào)試助手。 五.實(shí)驗(yàn)步驟 1編寫主程序 2編譯代碼,使用JLINK或ISP下載到實(shí)驗(yàn)板,使用串口調(diào)試助手觀察數(shù)據(jù) 3記錄實(shí)驗(yàn)過程,撰寫實(shí)驗(yàn)報(bào)告 六.實(shí)驗(yàn)結(jié)果及測(cè)試 源代碼: 伴隨 LED0 的不停閃爍,提示程序在運(yùn)行。我們打開串口調(diào)試助手,然后按KEY0,可以看到串口顯示如下內(nèi)容: 七.實(shí)驗(yàn)總結(jié) 本節(jié)利用 STM32 的 DMA 來實(shí)現(xiàn)串口數(shù)據(jù)傳送,DMA通道的配置需要: 1)設(shè)置外設(shè)地址。 2)設(shè)置存儲(chǔ)器地址。 3)設(shè)置傳輸數(shù)據(jù)量。 4)設(shè)置通道 4 的配置信息。 5)使能 DMA1 通道 4,啟動(dòng)傳輸。 通過以上 5 步設(shè)置,我們就可以啟動(dòng)一次 USART1 的 DMA 傳輸了。 DMA控制器對(duì)DMA請(qǐng)求判別優(yōu)先級(jí)及屏蔽,向總線裁決邏輯提出總線請(qǐng)求。當(dāng)CPU執(zhí)行完當(dāng)前總線周期即可釋放總線控制權(quán)。此時(shí),總線裁決邏輯輸出總線應(yīng)答,表示DMA已經(jīng)響應(yīng),通過DMA控制器通知I/O接口開始DMA傳輸。 DMA控制器獲得總線控制權(quán)后,CPU即刻掛起或只執(zhí)行內(nèi)部操作,由DMA控制器輸出讀寫命令,直接控制RAM與I/O接口進(jìn)行DMA傳輸。 在DMA控制器的控制下,在存儲(chǔ)器和外部設(shè)備之間直接進(jìn)行數(shù)據(jù)傳送,在傳送過中不需要中央處理器的參與。開始時(shí)需提供要傳送的數(shù)據(jù)的起始位置和數(shù)據(jù)長(zhǎng)度。 當(dāng)完成規(guī)定的成批數(shù)據(jù)傳送后,DMA控制器即釋放總線控制權(quán),并向I/O接口發(fā)出結(jié)束信號(hào)。當(dāng)I/O接口收到結(jié)束信號(hào)后,一方面停 止I/O設(shè)備的工作,另一方面向CPU提出中斷請(qǐng)求,使CPU從不介入的狀態(tài)解脫,并執(zhí)行一段檢查本次DMA傳輸操作正確性的代碼。最后,帶著本次操作結(jié)果及狀態(tài)繼續(xù)執(zhí)行原來的程序。 由此可見,DMA傳輸方式無需CPU直接控制傳輸,也沒有中斷處理方式那樣保留現(xiàn)場(chǎng)和恢復(fù)現(xiàn)場(chǎng)的過程,通過硬件為RAM與I/O設(shè)備開辟一條直接傳送數(shù)據(jù)的通路,使CPU的效率大為提高。 實(shí)驗(yàn)十六 I2C實(shí)驗(yàn) 一.實(shí)驗(yàn)簡(jiǎn)介 編程實(shí)現(xiàn)對(duì)使用I2C接口的EPC02芯片進(jìn)行寫和讀操作。 二.實(shí)驗(yàn)?zāi)康?/p> 熟練掌握I2C編程,學(xué)會(huì)對(duì)EPC02的讀寫操作。 三.實(shí)驗(yàn)內(nèi)容 編寫I2C驅(qū)動(dòng)程序,使用驅(qū)動(dòng)程序初始化EPC02,判斷設(shè)備正確性。 寫256個(gè)0x5A到EPC02,讀出并發(fā)送給串口,通過串口調(diào)試助手判別是否讀到的都是0x5A.四.實(shí)驗(yàn)設(shè)備 硬件部分:PC計(jì)算機(jī)(宿主機(jī))、亮點(diǎn)STM32實(shí)驗(yàn)板、JLINK。 軟件部分:PC機(jī)WINDOWS系統(tǒng)、MDK KEIL軟件、ISP軟件、串口調(diào)試助手。 五.實(shí)驗(yàn)步驟 1參考教材I2C部分,編寫I2C驅(qū)動(dòng)程序。2編寫主程序 3編譯代碼,使用JLINK或ISP下載到實(shí)驗(yàn)板 4記錄實(shí)驗(yàn)過程,撰寫實(shí)驗(yàn)報(bào)告 六.實(shí)驗(yàn)結(jié)果及測(cè)試 伴隨 LED0 的不停閃爍,提示程序在運(yùn)行。我們先按下KEY0,可以看到如下所示的內(nèi)容,證明數(shù)據(jù)已經(jīng)被寫入到24C02了。 接著我們按KEY2,可以看我們剛剛寫入的數(shù)據(jù)被顯示出來了,如下圖所示: 源代碼: 七.實(shí)驗(yàn)總結(jié) IIC是由數(shù)據(jù)線 SDA 和時(shí)鐘 SCL 構(gòu)成的串行總線,可發(fā)送和接收數(shù)據(jù)。在 CPU 與被控 IC 之間、IC 與 IC 之間進(jìn)行雙向傳送,高速 IIC 總線一般可達(dá) 400kbps 以上。 IIC總線在傳送數(shù)據(jù)過程中共有三種類型信號(hào),它們分別是:開始信號(hào)、結(jié)束信號(hào)和應(yīng)答信號(hào)。這些信號(hào)中,起始信號(hào)是必需的,結(jié)束信號(hào)和應(yīng)答信號(hào),都可以不要。程序在開機(jī)的時(shí)候會(huì)檢測(cè) 24C02 是否存在,如果不存在則會(huì)在TFTLCD 模塊上顯示錯(cuò)誤信息,同時(shí)LED0 慢閃。大家可以通過跳線帽把PC11 和PC12 短接就可以看到報(bào)錯(cuò)了。通過本次實(shí)驗(yàn),我掌握了如何使用IIC寫入與讀出數(shù)據(jù),學(xué)習(xí)了編寫I2C驅(qū)動(dòng)程序,使用驅(qū)動(dòng)程序初始化EPC02,判斷設(shè)備正確性,以及如何在助手上顯示。 實(shí)驗(yàn)十七 SPI實(shí)驗(yàn) 一.實(shí)驗(yàn)簡(jiǎn)介 編程實(shí)現(xiàn)對(duì)SPI接口的W25Q64進(jìn)行讀寫操作。 二.實(shí)驗(yàn)?zāi)康?/p> 熟練掌握SPI編程,學(xué)會(huì)對(duì)的W25Q64讀寫操作。 三.實(shí)驗(yàn)內(nèi)容 1.2.3.4.5.編寫SPI驅(qū)動(dòng)程序 初始化SPI接口 讀取SPIFLASH的ID,如果正確繼續(xù),否則報(bào)錯(cuò) 向SPIFALSH地址0x12AB00開始寫一串字符,再讀出比較判斷是否與寫入的一致 向SPIFALSH地址0x12AB00開始寫連續(xù)256個(gè)字節(jié)的0x5A,然后讀出并發(fā)送給串口,通過串口調(diào)試助手判別是否讀到的都是0x5A.四.實(shí)驗(yàn)設(shè)備 硬件部分:PC計(jì)算機(jī)(宿主機(jī))、亮點(diǎn)STM32實(shí)驗(yàn)板、JLINK。 軟件部分:PC機(jī)WINDOWS系統(tǒng)、MDK KEIL軟件、ISP軟件、串口調(diào)試助手。 五.實(shí)驗(yàn)步驟 1參考SPI及SPI FLASH部分,編寫SPI及SPI FLASH驅(qū)動(dòng)程序(可參考書上代碼)。2編寫主程序 3編譯代碼,使用JLINK或ISP下載到實(shí)驗(yàn)板 4記錄實(shí)驗(yàn)過程,撰寫實(shí)驗(yàn)報(bào)告 六.實(shí)驗(yàn)結(jié)果及測(cè)試 源代碼: 伴隨 LED0 的不停閃爍,提示程序在運(yùn)行。我們先按下KEY0,可以看到如圖13.17.4.2 所示的內(nèi)容,證明數(shù)據(jù)已經(jīng)被寫入到W25X16了。 接著我們按KEY2,可以看我們剛剛寫入的數(shù)據(jù)被顯示出來了,如下圖所示: 七.實(shí)驗(yàn)總結(jié) SPI 接口主要應(yīng)用在EEPROM,F(xiàn)LASH,實(shí)時(shí)時(shí)鐘,AD 轉(zhuǎn)換器,還有數(shù)字信號(hào)處理器和數(shù)字信號(hào)解碼器之間。SPI,是一種高速的,全雙工,同步的通信總線,并且在芯片的管腳上只占用四根線,節(jié)約了芯片的管腳,同時(shí)為 PCB 的布局上節(jié)省空間,提供方便,正是出于這種簡(jiǎn)單易用的特性,現(xiàn)在越來越多的芯片集成了這種通信協(xié)議,STM32 也有 SPI 接口。 SPI 的設(shè)置步驟: 1)配置相關(guān)引腳的復(fù)用功能,使能 SPI時(shí)鐘。 2)設(shè)置 SPI 工作模式。 3)使能 SPI。 程序在開機(jī)的時(shí)候會(huì)檢測(cè) W25X16 是否存在,如果不存在則會(huì)在TFTLCD 模塊上顯示錯(cuò)誤信息,同時(shí)LED0 慢閃。大家可以通過跳線帽把PA5 和PA6 短接就可以看到報(bào)錯(cuò)了。通過本實(shí)驗(yàn),我掌握了編寫SPI程序?qū)懭牒妥x取FLASH的方法,掌握了對(duì)學(xué)會(huì)對(duì)的W25Q64讀寫操作。對(duì)STM32開發(fā)板有了進(jìn)一步的了解。 實(shí)驗(yàn)二十一 紅外遙控實(shí)驗(yàn) 一. 實(shí)驗(yàn)簡(jiǎn)介 編程實(shí)現(xiàn)通過在 ALIENTEK MiniSTM32 開發(fā)板上實(shí)現(xiàn)紅外遙控器的控制。 二.實(shí)驗(yàn)?zāi)康?/p> 掌握編程實(shí)現(xiàn)紅外遙控控制開發(fā)板的方法。 三.實(shí)驗(yàn)內(nèi)容 1.編寫紅外遙控驅(qū)動(dòng)程序 2.編寫紅外遙控程序代碼 3.使用紅外遙控控制開發(fā)板 四.實(shí)驗(yàn)設(shè)備 硬件部分:PC計(jì)算機(jī)(宿主機(jī))、亮點(diǎn)STM32實(shí)驗(yàn)板、JLINK。軟件部分:PC機(jī)WINDOWS系統(tǒng)、MDK KEIL軟件、ISP軟件。 五.實(shí)驗(yàn)步驟 4.編寫紅外遙控驅(qū)動(dòng)程序 5.編寫紅外遙控程序代碼 6.編譯代碼,使用JLINK或ISP下載到實(shí)驗(yàn)板 7.記錄實(shí)驗(yàn)過程,撰寫實(shí)驗(yàn)報(bào)告 六.實(shí)驗(yàn)結(jié)果及測(cè)試 源代碼: 使用串口調(diào)試助手觀察數(shù)據(jù) 七.實(shí)驗(yàn)總結(jié) 紅外遙控是一種無線、非接觸控制技術(shù),具有抗干擾能力強(qiáng),信息傳輸可靠,功耗低,成本低,易實(shí)現(xiàn)等顯著優(yōu)點(diǎn),被諸多電子設(shè)備特別是家用電器廣泛采用,并越來越多的應(yīng)用到計(jì)算機(jī)系統(tǒng)中。 通過本節(jié)實(shí)驗(yàn),我學(xué)習(xí)到了如何編程使用紅外遙控控制,在本程序中只是簡(jiǎn)單地輸出一個(gè)數(shù)值,在以后的應(yīng)用中可以實(shí)現(xiàn)更強(qiáng)大的功能,比如用紅外遠(yuǎn)程輸入控制開發(fā)板進(jìn)行一些操作。對(duì)STM32有了進(jìn)一步的認(rèn)識(shí)。 實(shí)驗(yàn)二十二 DS18B20實(shí)驗(yàn) 一. 實(shí)驗(yàn)簡(jiǎn)介 一. 在ALIENTEK MiniSTM32 開發(fā)板上,通過 DS18B20 來讀取環(huán)境溫度值。 二.實(shí)驗(yàn)?zāi)康?/p> 鞏固SPI編程。掌握使用感應(yīng)器獲取環(huán)境溫度的方法。 三.實(shí)驗(yàn)內(nèi)容 1.復(fù)位脈沖和應(yīng)答脈沖 2.寫時(shí)序 3.讀時(shí)序 四.實(shí)驗(yàn)設(shè)備 硬件部分:PC計(jì)算機(jī)(宿主機(jī))、亮點(diǎn)STM32實(shí)驗(yàn)板、JLINK。軟件部分:PC機(jī)WINDOWS系統(tǒng)、MDK KEIL軟件、ISP軟件。 五.實(shí)驗(yàn)步驟 1.2.3.4.參考教材DS18B20編程部分,編寫DS18B20驅(qū)動(dòng)程序 編寫主程序 編譯代碼,使用JLINK或ISP下載到實(shí)驗(yàn)板 記錄實(shí)驗(yàn)過程,撰寫實(shí)驗(yàn)報(bào)告 六.實(shí)驗(yàn)結(jié)果及測(cè)試 源代碼: 使用串口調(diào)試助手觀察數(shù)據(jù): 七.實(shí)驗(yàn)總結(jié) DS18B20 是由 DALLAS 半導(dǎo)體公司推出的一種的“一線總線”接口的溫度傳感器。與傳統(tǒng)的熱敏電阻等測(cè)溫元件相比,它是一種新型的體積小、適用電壓寬、與微處理器接口簡(jiǎn)單的數(shù)字化溫度傳感器。 通過本次實(shí)驗(yàn),我認(rèn)識(shí)到STM32的強(qiáng)大,在開發(fā)板上可以添加其他感應(yīng)器從而實(shí)現(xiàn)更強(qiáng)大的功能。添加了DS18B20后的開發(fā)板可以感應(yīng)外界的溫度,通過公式計(jì)算顯示出來。 嵌入式系統(tǒng)及應(yīng)用課 程設(shè)計(jì)報(bào)告 姓名:陳宥祎 班級(jí):14級(jí)計(jì)算機(jī)01班 學(xué)號(hào):1255010116 指導(dǎo)老師:黃衛(wèi)紅 按鍵輸入實(shí)驗(yàn) 一.實(shí)驗(yàn)簡(jiǎn)介 在實(shí)驗(yàn)一的基礎(chǔ)上,使用按鍵控制流水燈速度,及使用按鍵控制流水燈流水方向。 二.實(shí)驗(yàn)?zāi)康?/p> 熟練使用庫(kù)函數(shù)操作GPIO,掌握中斷配置和中斷服務(wù)程序編寫方法,掌握通過全局變量在中斷服務(wù)程序和主程序間通信的方法。 三.實(shí)驗(yàn)內(nèi)容 實(shí)現(xiàn)初始化GPIO,并配置中斷,在中斷服務(wù)程序中通過修改全局變量,達(dá)到控制流水燈速度及方向。 使用JLINK下載代碼到目標(biāo)板,查看運(yùn)行結(jié)果,使用JLINK在線調(diào)試。 四.實(shí)驗(yàn)設(shè)備 硬件部分:PC計(jì)算機(jī)(宿主機(jī))、亮點(diǎn)STM32實(shí)驗(yàn)板、JLINK、示波器。軟件部分:PC機(jī)WINDOWS系統(tǒng)、MDK KEIL軟件、ISP軟件。 五.實(shí)驗(yàn)步驟 1在實(shí)驗(yàn)1代碼的基礎(chǔ)上,編寫中斷初始化代碼 2在主程序中聲明全局變量,用于和中斷服務(wù)程序通信,編寫完成主程序 3編寫中斷服務(wù)程序 4編譯代碼,使用JLINK下載到實(shí)驗(yàn)板 5.單步調(diào)試 6記錄實(shí)驗(yàn)過程,撰寫實(shí)驗(yàn)報(bào)告 六.實(shí)驗(yàn)結(jié)果及測(cè)試 源代碼: 我們將通過MiniSTM32 板上載有的3個(gè)按鈕,來控制板上的2個(gè)LED,其中KEY0控制LED0,按一次亮,再按一次,就滅。KEY1 控制LED1,效果同KEY0。KEY_2(KEY_UP),同時(shí)控制LED0 和LED1,按一次,他們的狀態(tài)就翻轉(zhuǎn)一次。 七.實(shí)驗(yàn)總結(jié) 通過本次實(shí)驗(yàn),我學(xué)會(huì)了如何使用STM32 的IO 口作為輸入用。TM32 的IO 口做輸入使用的時(shí)候,是通過讀取IDR 的內(nèi)容來讀取IO 口的狀態(tài)的。這里需要注意的是 KEY0 和KEY1 是低電平有效的,而WK_UP 是高電平有效的,而且要確認(rèn)WK_UP 按鈕與DS18B20 的連接是否已經(jīng)斷開,要先斷開,否則DS18B20 會(huì)干擾WK_UP按鍵!并且KEY0 和KEY1 連接在與JTAG 相關(guān)的IO 口上,所以在軟件編寫的時(shí)候要先禁用JTAG 功能,才能把這兩個(gè)IO 口當(dāng)成普通IO 口使用。 串口通信 一.實(shí)驗(yàn)簡(jiǎn)介 編寫代碼實(shí)現(xiàn)串口發(fā)送和接收,將通過串口發(fā)送來的數(shù)據(jù)回送回去。 二.實(shí)驗(yàn)?zāi)康?/p> 掌握STM32基本串口編程,進(jìn)一步學(xué)習(xí)中斷處理。 三.實(shí)驗(yàn)內(nèi)容 編寫主程序,初始化串口1,設(shè)置波特率為9600,無校驗(yàn),數(shù)據(jù)位8位,停止位1位。編寫中斷服務(wù)程序代碼實(shí)現(xiàn)將發(fā)送過來的數(shù)據(jù)回送。 四.實(shí)驗(yàn)設(shè)備 硬件部分:PC計(jì)算機(jī)(宿主機(jī))、亮點(diǎn)STM32實(shí)驗(yàn)板、JLINK、示波器。 軟件部分:PC機(jī)WINDOWS系統(tǒng)、MDK KEIL軟件、ISP軟件、串口調(diào)試助手。 五.實(shí)驗(yàn)步驟 1編寫串口初始化代碼 2編寫中斷服務(wù)程序代碼 3編譯代碼,使用JLINK或ISP下載到實(shí)驗(yàn)板 4記錄實(shí)驗(yàn)過程,撰寫實(shí)驗(yàn)報(bào)告 六.實(shí)驗(yàn)結(jié)果及測(cè)試 源代碼: 把代碼下載到 MiniSTM32 開發(fā)板,可以看到板子上的LED0 開始閃爍,說明程序已經(jīng)在跑了。接著我們打開串口調(diào)試助手,看到如下信息: 證明串口數(shù)據(jù)發(fā)送沒問題。接著,我們?cè)诎l(fā)送區(qū)輸入上面的文字,輸入完后按回車鍵。然后單擊發(fā)送,可以得到如下結(jié)果: 七.實(shí)驗(yàn)總結(jié) 通過本次實(shí)驗(yàn),我進(jìn)一步了解了串口的使用,學(xué)會(huì)了通過串口發(fā)送和接收數(shù)據(jù),將通過串 口發(fā)送來的數(shù)據(jù)回送回去。該實(shí)驗(yàn)的硬件配置不同于前兩個(gè)實(shí)驗(yàn),串口 1 與USB 串口默認(rèn)是分開的,并沒有在PCB上連接在一起,需要通過跳線帽來連接一下。這里我們把P4 的RXD 和TXD 用跳線帽與P3 的PA9 和PA10 連接起來。 外部中斷 一.實(shí)驗(yàn)簡(jiǎn)介 STM32 的 IO 口在本章第一節(jié)有詳細(xì)介紹,而外部中斷在第二章也有詳細(xì)的闡述。這里我們將介紹如何將這兩者結(jié)合起來,實(shí)現(xiàn)外部中斷輸入。 二.實(shí)驗(yàn)?zāi)康?/p> 進(jìn)一步掌握串口編程,進(jìn)一步學(xué)習(xí)外部中斷編程,提高編程能力。 三.實(shí)驗(yàn)內(nèi)容 初始化IO口的輸入,開啟復(fù)用時(shí)鐘,設(shè)置IO與中斷的映射關(guān)系,從而開啟與IO口相對(duì)應(yīng)的線上中斷事件,設(shè)置觸發(fā)條件。配置中斷分組(NVIC),并使能中斷,編寫中斷服務(wù)函數(shù)。 四.實(shí)驗(yàn)設(shè)備 硬件部分:PC計(jì)算機(jī)(宿主機(jī))、亮點(diǎn)STM32實(shí)驗(yàn)板、JLINK、示波器。 軟件部分:PC機(jī)WINDOWS系統(tǒng)、MDK KEIL軟件、ISP軟件、串口調(diào)試助手。 五.實(shí)驗(yàn)步驟 1.2.3.4.編寫中斷服務(wù)程序代碼 使用ISP下載到實(shí)驗(yàn)板 測(cè)試運(yùn)行結(jié)果 記錄實(shí)驗(yàn)過程,撰寫實(shí)驗(yàn)報(bào)告 六.實(shí)驗(yàn)結(jié)果及測(cè)試 源代碼: 打開串口助手。 七.實(shí)驗(yàn)總結(jié) 首先需要將IO設(shè)置為中斷輸入口: 1)初始化 IO 口為輸入。 2)開啟 IO 口復(fù)用時(shí)鐘,設(shè)置 IO 口與中斷線的映射關(guān)系。 3)開啟與該 IO口相對(duì)的線上中斷/事件,設(shè)置觸發(fā)條件。 4)配置中斷分組(NVIC),并使能中斷。 5)編寫中斷服務(wù)函數(shù)。 這一節(jié),使用的是中斷來檢測(cè)按鍵,通過 WK_UP 按鍵實(shí)現(xiàn)按一次 LED0 和 LED 1 同時(shí)翻轉(zhuǎn),按 KEY0 翻轉(zhuǎn) LED0,按 KEY1 翻轉(zhuǎn) LED1。試驗(yàn)中外部中斷函數(shù)不能進(jìn)入的原因分析 : 1)GPIO或者AFIO的時(shí)鐘沒有開啟。2)GPIO和配置的中斷線路不匹配。3)中斷觸發(fā)方式和實(shí)際不相符合。 4)中斷處理函數(shù)用庫(kù)函數(shù)時(shí),寫錯(cuò),經(jīng)常可能出現(xiàn)數(shù)字和字母之間沒有下劃線。5)外部中斷是沿觸發(fā),有可能不能檢測(cè)到沿,比如 中斷線是低電平(浮空輸入),觸發(fā)是下降沿觸發(fā),可能會(huì)出現(xiàn)一直是低電平,高電平的時(shí)候是一樣的情況,電平持續(xù)為高電平。 6)沒有用軟件中斷來觸發(fā)外部中斷,調(diào)用函數(shù)EXTI_GenerateSWInterrupt;,因?yàn)檐浖袛嘞扔谶呇刂袛嗵幚怼?/p> 獨(dú)立看門狗實(shí)驗(yàn) 一. 實(shí)驗(yàn)簡(jiǎn)介 獨(dú)立看門狗(IWDG)由專用的低速時(shí)鐘(LSI)驅(qū)動(dòng),即使主時(shí)鐘發(fā)生故障它也仍然有效。窗口看門狗由從APB1時(shí)鐘分頻后得到的時(shí)鐘驅(qū)動(dòng),通過可配置的時(shí)間窗口來檢測(cè)應(yīng)用程序非正常的過遲或過早的操作。 二.實(shí)驗(yàn)?zāi)康?/p> 通過編程,編寫一個(gè)獨(dú)立看門狗驅(qū)動(dòng)程序 三.實(shí)驗(yàn)內(nèi)容 啟動(dòng) STM32 的獨(dú)立看門狗,從而使能看門狗,在程序里面必須間隔一定時(shí)間喂狗,否則將導(dǎo)致程序復(fù)位。利用這一點(diǎn),我們本章將通過一個(gè) LED 燈來指示程序是否重啟,來驗(yàn)證 STM32 的獨(dú)立看門狗。 四.實(shí)驗(yàn)設(shè)備 硬件部分:PC計(jì)算機(jī)(宿主機(jī))、亮點(diǎn)STM32實(shí)驗(yàn)板、JLINK。 軟件部分:PC機(jī)WINDOWS系統(tǒng)、MDK KEIL軟件、ISP軟件、串口調(diào)試助手。 五.實(shí)驗(yàn)步驟 1.2.3.4.參考教材獨(dú)立看門狗部分,編寫?yīng)毩⒖撮T狗驅(qū)動(dòng)程序。建立和配置工程 編寫代碼 使用ISP下載到實(shí)驗(yàn)板 記錄實(shí)驗(yàn)過程,撰寫實(shí)驗(yàn)報(bào)告 六.實(shí)驗(yàn)結(jié)果及測(cè)試 源代碼: 在配置看門狗后,看到LED0 不停的閃爍,如果WK_UP 按鍵按下,就喂狗,只要WK_UP 不停的按,看門狗就一直不會(huì)產(chǎn)生復(fù)位,保持LED0 的常亮,一旦超過看門狗定溢出時(shí)間(Tout)還沒按,那么將會(huì)導(dǎo)致程序重啟,這將導(dǎo)致LED0 熄滅一次。 七.實(shí)驗(yàn)總結(jié) 通過本次實(shí)驗(yàn),我掌握了啟動(dòng)獨(dú)立看門狗的步驟: 1)向 IWDG_KR 寫入 0X5555。2)向 IWDG_KR 寫入 0XAAAA。3)向 IWDG_KR 寫入 0XCCCC。 通過上面 3個(gè)步驟,啟動(dòng) STM32 的看門狗,從而使能看門狗,在程序里面就必須間隔一定時(shí)間喂狗,否則將導(dǎo)致程序復(fù)位。利用這一點(diǎn),本章通過一個(gè)LED 燈來指示程序是否重啟,來驗(yàn)證 STM32 的獨(dú)立看門狗。在配置看門狗后,LED0 將常亮,如果 WK_UP 按鍵按下,就喂狗,只要 WK_UP 不停的按,看門狗就一直不會(huì)產(chǎn)生復(fù)位,保持 LED 0 的常亮,一旦超過看門狗溢出時(shí)間(Tout)還沒按,那么將會(huì)導(dǎo)致程序重啟,這將導(dǎo)致 LED 0 熄滅一次。 西安郵電大學(xué) 嵌入式處理器及應(yīng)用實(shí)驗(yàn)報(bào)告書 學(xué)院名稱學(xué)生姓名專業(yè)名稱班 級(jí) : : : : 實(shí)驗(yàn)一 ADS 1.2 集成開發(fā)環(huán)境練習(xí) 一、實(shí)驗(yàn)?zāi)康模?/p> 了解ADS 1.2 集成開發(fā)環(huán)境的使用方法。 二、實(shí)驗(yàn)內(nèi)容: 1.建立一個(gè)新的工程。 2.建立一個(gè)C源文件,并添加到工程中。3.設(shè)置文本編輯器支持中文。4.編譯鏈接工程。5.調(diào)試工程。 三、實(shí)驗(yàn)步驟: 1.啟動(dòng)ADS 1.2 IDE集成開發(fā)環(huán)境,選擇File—New,使用ARM Executable Image工程模板建立一個(gè)工程,工程名稱為ADS。 2.選擇File—New建立一個(gè)新的文件TEST1.S,設(shè)置直接添加到項(xiàng)目中,輸入程序代碼。3.由于ADS安裝后默認(rèn)字體是Courier New,對(duì)于中文支持不完善,因此建議修改字體。選擇Edit—Perferences,在Font選項(xiàng)設(shè)置字體為Fixedsys,Script為CHINESE_GB2312。建議在Tab Inserts Spaces前打勾,使Tab鍵插入的是多個(gè)空格。 4.選擇Edit—DebugRel Settings,在DebugRel Settings對(duì)話框的左邊選擇ARM Linker項(xiàng),然后在Output頁(yè)設(shè)置連接地址ROBase 為0x40000000,RW Base 為0x40003000,在Options頁(yè)設(shè)置調(diào)試入口地址Image entry point 為 0x40000000。5.選擇Project—Make,將編譯鏈接整個(gè)工程。 6.選擇Project—Debug,或單擊快捷鍵F5,IDE環(huán)境就會(huì)啟動(dòng)AXD調(diào)試軟件。 四、程序清單: AREA Example1,CODE,READONLY ;聲明代碼段Example1 ENTRY ;標(biāo)識(shí)程序入口 CODE32 ;聲明32 位ARM 指令 START MOV R0,#15 ;設(shè)置參數(shù) MOV R1,#8 ADDS R0,R0,R1 ;R0 = R0 + R1 B START END 五、心得體會(huì): 通過本次實(shí)驗(yàn),我熟悉了ADS 1.2 集成開發(fā)環(huán)境,學(xué)會(huì)了怎樣建立工程,在工程里面建立文件和進(jìn)行最基本的運(yùn)行操作。我感觸最深的是每次軟件的開始使用是最關(guān)鍵的,想要掌握一個(gè)軟件的使用必須進(jìn)行多次的練習(xí),多練幾遍自然而然的會(huì)熟練的操作。 實(shí)驗(yàn)二 存儲(chǔ)器訪問指令練習(xí)實(shí)驗(yàn) 一、實(shí)驗(yàn)?zāi)康模?/p> 1.了解ADS 1.2 集成開發(fā)環(huán)境及ARMulator軟件仿真。 2.掌握ARM7TDMI匯編指令的用法,并能編寫簡(jiǎn)單的匯編程序。3.掌握指令的條件執(zhí)行以及使用LDR/STR指令完成存儲(chǔ)器的訪問。 二、實(shí)驗(yàn)內(nèi)容: 1.使用LDR指令讀取0x40003100上的數(shù)據(jù),將數(shù)據(jù)加1,若結(jié)果小于10,則使用STR指令把結(jié)果回寫原地址;若結(jié)果大于或等于10,則把0寫回原地址。 2.使用ADS 1.2軟件仿真,單步、全速運(yùn)行程序,設(shè)置斷點(diǎn),打開寄存器窗口(Processor Registers)監(jiān)視R0和R1的值,打開存儲(chǔ)器觀察窗口(Memory)監(jiān)視0x40003100上的值。 三、實(shí)驗(yàn)步驟: 1.啟動(dòng)ADS 1.2,使用ARM Executable Image工程模板建立一個(gè)工程Instruction2。2.建立匯編源文件TEST2.S,編寫實(shí)驗(yàn)程序,然后添加到工程中。 3.設(shè)置工程鏈接地址ROBase 為0x40000000,RW Base 為0x40003000。設(shè)置調(diào)試入口地址Image entry point 為 0x40000000。 4.編譯鏈接工程,選擇Project —Debug,啟動(dòng)AXD進(jìn)行軟件仿真調(diào)試。 5.打開寄存器窗口(Processor Registers),選擇Current 項(xiàng)監(jiān)視R0和R1的值。打開存儲(chǔ)器觀察窗口(Memory)設(shè)置觀察地址為0x40003100,顯示方式Size為32Bit,監(jiān)視0x40003100地址上的值。 四、程序清單: COUNT EQU 0x40003100 ;定義一個(gè)變量,地址為0x40003100 AREA Example2,CODE,READONLY;聲明代碼段Example2 ENTRY ;標(biāo)識(shí)程序入口 CODE32 ;聲明32 位ARM 指令 START LDR R1,=COUNT ;R1 <= COUNT MOV R0,#0 ;R0 <= 0 STR R0,[R1] ;[R1] <= R0,即設(shè)置COUNT 為0 LOOP LDR R1,=COUNT LDR R0,[R1] ;R0 <= [R1] ADD R0,R0,#1 ;R0 <= R0 + 1 CMP R0,#10 ;R0 與 10 比較,影響條件碼標(biāo)志 MOVHS R0,#0 ;若R0 大于等于 10,則此指令執(zhí)行,R0 <= 0 STR R0,[R1] ;[R1] <= R0,即保存COUNT B LOOP END 五、心得體會(huì):通過本次實(shí)驗(yàn),讓我更深一步的了解了ADS 1.2 集成開發(fā)環(huán)境及ARMulator軟件仿真。通過對(duì)程序的解讀,我掌握一些匯編指令的寫法,同時(shí)也提高了我的讀程序的能力。本次實(shí)驗(yàn)中我遇到了一個(gè)問題,在工程里加載文件的時(shí)候,沒注意文件的后綴應(yīng)為“。S”,結(jié)果造成文件加載失敗。 實(shí)驗(yàn)三 數(shù)據(jù)處理指令練習(xí)實(shí)驗(yàn) 一、實(shí)驗(yàn)?zāi)康模?/p> 1.掌握ARM數(shù)據(jù)處理指令的使用方法。2.了解ARM指令靈活的第2個(gè)操作數(shù)。 二、實(shí)驗(yàn)內(nèi)容: 1.使用MOV和MVN指令訪問ARM通用寄存器。 2.使用ADD、SUB、AND、ORR、CMP和TST等指令完成數(shù)據(jù)加減運(yùn)算及邏輯運(yùn)算。 三、實(shí)驗(yàn)步驟: 1)啟動(dòng)ADS1.2,使用ARM Executable Image 工程模板建立一個(gè)工程Instruction3。2)建立匯編源文件TEST3.S ,編寫實(shí)驗(yàn)程序,然后添加到工程中。 3)設(shè)置工程鏈接地址RO Base為0x40000000,RW Base為0x40003000。設(shè)置調(diào)試入口地址Image entry point 為 0x40000000。 4)編譯鏈接工程,選擇Project —Debug,啟動(dòng)AXD進(jìn)行軟件仿真調(diào)試。5)打開寄存器窗口(Processor Registers),選擇Current 項(xiàng)監(jiān)視各寄存器的值。6)單步運(yùn)行程序,觀察寄存器值的變化。 四、程序清單: X EQU ;定義X 的值為11 Y EQU ;定義Y 的值為8 BIT23 EQU (1<<23) ;定義BIT23 的值為0x00800000 AREA Example3,CODE,READONLY ;聲明代碼段Example3 ENTRY ;標(biāo)識(shí)程序入口 CODE32 ;聲明32 位ARM 指令 START ;使用MOV、ADD 指令實(shí)現(xiàn):R8 = R3 = X + Y MOV R0,#X ;R0 <= X,X 的值必須是8 位圖數(shù)據(jù) MOV R1,#Y ;R1 <= Y,Y 的值必須是8 位圖數(shù)據(jù) ADD R3,R0,R1 ;即是R3 = X + Y MOV R8,R3 ;R8 <= R3 ;使用MOV、MVN、SUB 指令實(shí)現(xiàn):R5 = 0x5FFFFFF8y; ; break; ; case 7: x = key * y; ; break; ; default: x = 168; SWITCH CASE_0 CASE_2 CASE_3 CASE_5 CASE_7 ; break;;};設(shè)x 為R0,y 為R1,key 為R2(x、y、key 均為無符號(hào)整數(shù))MOV R1,#3 ;初始化y 的值 MOV R2,#2 ;初始化key 的值 AND R2,R2,#0x0F ;switch(key&0x0F) CMP R2,#0 ;case 0: CMPNE R2,#2 ;case 2: MPNE R2,#3 ;case 3: BNE CASE_5 ADD R0,R2,R1 ; x = key + y B SWITCH_END ; break CMP R2,#5 ;case 5: BNE CASE_7 SUB R0,R2,R1 ; x = key1)*4 SvcStackSpace +(SVC_STACK_LEGTH1)*4 FiqStackSpace +(FIQ_STACK_LEGTH1)*4 UndtStackSpace +(UND_STACK_LEGTH-1)*4 ;分配堆棧空間 AREA MyStacks, DATA, NOINIT, ALIGN=2 UsrStackSpace SPACE USR_STACK_LEGTH * 4 ;用戶(系統(tǒng))模式堆棧空間 SvcStackSpace SPACE SVC_STACK_LEGTH * 4 ;管理模式堆棧空間 IrqStackSpace SPACE IRQ_STACK_LEGTH * 4 ;中斷模式堆棧空間 FiqStackSpace SPACE FIQ_STACK_LEGTH * 4 ;快速中斷模式堆棧空間 AbtStackSpace SPACE ABT_STACK_LEGTH * 4 ;中止義模式堆棧空間 UndtStackSpace SPACE UND_STACK_LEGTH * 4 ;未定義模式堆棧 END 五、心得體會(huì):通過本次實(shí)驗(yàn),我較好的掌握了如何使用MRS/MSR指令實(shí)現(xiàn)ARM微控制器工作模式的切換。較好的了解了在各個(gè)工作模式下的寄存器。 實(shí)驗(yàn)六 C語言程序?qū)嶒?yàn) 一、實(shí)驗(yàn)?zāi)康模?/p> 通過實(shí)驗(yàn)了解使用ADS 1.2編寫C語言程序,并進(jìn)行調(diào)試。 二、實(shí)驗(yàn)內(nèi)容: 編寫一個(gè)匯編程序文件和一個(gè)C程序文件。匯編程序的功能是初始化堆棧指針和初始化C程序的運(yùn)行環(huán)境,然后跳轉(zhuǎn)到C程序運(yùn)行,這就是一個(gè)簡(jiǎn)單的啟動(dòng)程序。C程序使用加法運(yùn)算來計(jì)算1+2+3+…+(N-1)+N的值(N為0時(shí),結(jié)果為0;N為1時(shí),結(jié)果為1)。 三、實(shí)驗(yàn)步驟: 1.啟動(dòng)ADS1.2,使用ARM Executable Image 工程模板建立一個(gè)工程ProgramC。2.建立匯編源文件Startup.s和Test.c,編寫實(shí)驗(yàn)程序,然后添加到工程中。 3.設(shè)置工程鏈接地址RO Base為0x40000000,RW Base為0x40003000。設(shè)置調(diào)試入口地址Image entry point 為 0x40000000。 4.設(shè)置位于開始位置的起始代碼段:選擇Edit—DebugRel Settings,在DebugRel Settings對(duì)話框的左邊選擇ARM Linker項(xiàng),然后在Layout頁(yè)設(shè)置Object/Symbol為Startup.o,Section為Start。 5.編譯鏈接工程,選擇Project—Debug,啟動(dòng)AXD進(jìn)行軟件仿真調(diào)試。6.在Startup.s的“B Main”處設(shè)置斷點(diǎn),然后全速運(yùn)行程序。 7.程序在斷點(diǎn)處停止。單步運(yùn)行程序,判斷程序是否跳轉(zhuǎn)到C程序中運(yùn)行。 選擇Processor Views—Variables打開變量觀察窗口,觀察全局變量的值,然后單步/全速運(yùn)行程序,判斷程序的運(yùn)算結(jié)果是否正確。 四、程序清單: #define uint8 unsigned char #define uint32 unsigned int #define N uint32 sum; // 使用加法運(yùn)算來計(jì)算 1+2+3+...+(N-1)+N 的值。(N>0) void Main(void) { uint32 i; sum = 0; for(i=0;i<=N;i++) { sum += i; } while(1); } 程序清單3.9 簡(jiǎn)單的起動(dòng)代碼 ;起動(dòng)文件。初始化 C 程序的運(yùn)行環(huán)境,然后進(jìn)入C 程序代碼。 IMPORT |Image$$RO$$Limit| IMPORT |Image$$RW$$Base| IMPORT |Image$$ZI$$Base| IMPORT |Image$$ZI$$Limit| IMPORT Main ;聲明C 程序中的Main()函數(shù) AREA Start,CODE,READONLY ;聲明代碼段Start ENTRY ;標(biāo)識(shí)程序入口 CODE32 ;聲明32 位ARM 指令 Reset LDR SP,=0x40003F00 ;初始化C 程序的運(yùn)行環(huán)境 LDR R0,=|Image$$RO$$Limit| LDR R1,=|Image$$RW$$Base| LDR R3,=|Image$$ZI$$Base| CMP R0,R1 BEQ LOOP1 LOOP0 CMP R1,R3 LDRCC R2,[R0],#4 STRCC R2,[R1],#4 BCC LOOP0 LOOP1 LDR R1,=|Image$$ZI$$Limit| MOV R2,#0 LOOP2 CMP R3,R1 STRCC R2,[R3],#4 BCC LOOP2 B Main ;跳轉(zhuǎn)到 C 程序代碼Main()函數(shù) END 五、心得體會(huì):通過本次實(shí)驗(yàn),我學(xué)會(huì)并掌握使用ADS 1.2編寫C語言程序,并進(jìn)行調(diào)試。這次實(shí)驗(yàn)不同于前幾次,必須在一個(gè)工程里面同時(shí)加載兩個(gè)文件,分別是“。c”和“.s”文件。 實(shí)驗(yàn)一 ARM匯編語言程序設(shè)計(jì) 一、實(shí)驗(yàn)?zāi)康?/p> 1.了解IAR Embedded Workbench 集成開發(fā)環(huán)境 2.掌握ARM匯編指令程序的設(shè)計(jì)及調(diào)試 二、實(shí)驗(yàn)設(shè)備 1.PC操作系統(tǒng)WIN98或WIN2000或WINXP,ADSI.2集成開發(fā)環(huán)境,仿真驅(qū)動(dòng)程序 三、實(shí)驗(yàn)內(nèi)容 1.熟悉IAR Embedded Workbench 集成開發(fā)環(huán)境 2.理解下列程序,新建工程,加入下面的程序,并觀察實(shí)驗(yàn)結(jié)果,解釋程序?qū)崿F(xiàn)的功能 分析:該程序?qū)崿F(xiàn)的功能是程序功能:Y = A*B+C*D+E*F 程序代碼: AREA Examl, CODE,READONLY;定義一個(gè)代碼段 ENTRY ;程序入口 MOV R0,#0;設(shè)置R0寄存器的值為0 MOV R8,#0;設(shè)置R8寄存器的值為0 ADR R2,N;將R2寄存器的值設(shè)為數(shù)據(jù)域N的地址 LDR R1,[R2];將以R2的值為地址的數(shù)據(jù)讀入R1 MOV R2,#0;設(shè)置R2的值為0 ADR R3,C;將R3寄存器的值設(shè)為數(shù)據(jù)域C的地址 ADR R5,X;將R5寄存器的值設(shè)為數(shù)據(jù)域X的地址 LOOP LDR R4,[R3,R8];將R3+R8的數(shù)據(jù)讀入R4 LDR R6,[R5,R8];將R5+R8的數(shù)據(jù)讀入R6 MUL R9,R4,R6;R9 = R4*R6 ADD R2,R2,R9;R2 = R2+R9 ADD R8,R8,#4;R8 = R8+4 ADD R0,R0,#1;R0 = R0+1 CMP R0,R1;比較R0和R1的值 BLT LOOP;R0 執(zhí)行結(jié)果如下: 3.實(shí)現(xiàn)1+2+3+4+····+100,求的值,并保存在地址0x90018的地址里面 程序代碼: MOV R0,#100;設(shè)置R0寄存器的值為100 LDR R2,=0X90018;設(shè)置R2寄存器指向地址0x90018 MOV R1,#0;設(shè)置R1的值為0 MOV R3,#0;設(shè)置R3的值為0 LOOP ADD R3,R3,R0;R3 = R3+R0 SUB R0,R0,#1;R0 = R0-1 CMP R0,R1;將R0和R1的值比較 BNE LOOP;不相等的話繼續(xù)執(zhí)行循環(huán) STR R3,[R2];將R3的值裝入到R2指向的地址塊中。END 程序執(zhí)行結(jié)果:程序執(zhí)行完在0x90018內(nèi)存入的數(shù)據(jù)是0x13ba即5050 實(shí)驗(yàn)二 ARM匯編語言程序設(shè)計(jì) 一、實(shí)驗(yàn)?zāi)康?/p> 1.了解ARM匯編語言的基本框架,學(xué)會(huì)使用ARM的匯編語言編程; 2.掌握ARM匯編指令中的堆棧指令的操作,以及存儲(chǔ)器的裝載指令操作。 二、實(shí)驗(yàn)設(shè)備 1.PC操作系統(tǒng)WIN98或WIN2000或WINXP,ADS1.2.集成開發(fā)環(huán)境,仿真器驅(qū)動(dòng)程序。 三、實(shí)驗(yàn)內(nèi)容 1.理解下列程序,新建工程,加入下面的程序,并觀察實(shí)驗(yàn)結(jié)果 程序代碼: x EQU 15;定義常量x=15 y EQU 61;定義常量y=61 stack_top EQU 0X1000;定義堆棧棧頂?shù)刂窞?x1000 ENTRY;程序入口處 MOV sp,#stack_top;將堆棧指針指向棧頂 MOV r0,#x;將x的值放入r0 STR r0,[sp];將r0的值壓入堆棧 MOV r0,#y;將y的值放入r0 LDR r1,[sp];將x的值放入r1 ADD r0,r0,r1;r0 = r0+r1 STR r0,[sp];將r0的值裝入堆棧 Stop;B stop;程序結(jié)果為:r1 = x+y = 0x6D 2.編寫程序循環(huán)R4~R11進(jìn)行累加8次賦值,R4~R11初始值是1~8,每次操作后把R4~R11的內(nèi)容放到SP棧中,SP初始設(shè)置為0x800,最后把R4~R11用LDMFD指令清空為0 程序代碼如下: X EQU 1;定義常量x = 1 stack_top EQU 0X800;定義棧頂?shù)刂?ENTRY;MOV SP,#stack_top;將棧頂?shù)刂分赶?x800 MOV R4,#1;設(shè)置R4 = 1 MOV R5,#2;設(shè)置R5 = 2 MOV R6,#3;設(shè)置R6 = 3 MOV R7,#4;設(shè)置R7 = 4 MOV R8,#5;設(shè)置R8 = 5 MOV R9,#6;設(shè)置R9 = 6 MOV R10,#7;設(shè)置R10 = 7 MOV R11,#8;設(shè)置R11 = 8 LOOP ADD R4,R4,#x;R4累加1 ADD R5,R5,#x;R5累加1 ADD R6,R6,#x;R6累加1 ADD R7,R7,#x;R7累加1 ADD R8,R8,#x;R8累加1 ADD R9,R9,#x;R9累加1 ADD R10,R10,#x;R10累加1 ADD R11,R11,#x;R11累加1 STMIA SP!,{R4-R11};將R4-R11的值壓入堆棧 CMP R4,#9;比較R4和9的大小 BLT LOOP;R4 < 9繼續(xù)執(zhí)行循環(huán) LDMFD SP!,{R4-R11};將R4-R11清零 END;實(shí)驗(yàn)結(jié)果:主要實(shí)現(xiàn)將數(shù)據(jù)2-9,3-10,4-11……9-16壓入堆棧(初始地址是0x800處開始),最后將R4-R11全部清零。 3.更改實(shí)驗(yàn)中1中的X,Y的值,觀察期結(jié)果 程序代碼: x EQU 20 y EQU 120 stack_top EQU 0X1000 ENTRY MOV sp,#stack_top MOV r0,#x STR r0,[sp] MOV r0,#y LDR r1,[sp] ADD r0,r0,r1 STR r0,[sp] Stop B Stop END 程序結(jié)果為:r0 = x+y = 140 = 0X8C 實(shí)驗(yàn)三 ARM匯編語言程序設(shè)計(jì) 一、實(shí)驗(yàn)?zāi)康?/p> 1.了解ARM匯編語言的基本框架,學(xué)會(huì)使用ARM的匯編語言編程 2.掌握ARM匯編的存儲(chǔ)器加載/存儲(chǔ)指令,及if條件、循環(huán)、循環(huán)及循環(huán)的匯編實(shí)現(xiàn) 二、實(shí)驗(yàn)設(shè)備 1.PC操作系統(tǒng)WIN98或WIN2000或WINXP,ADS1.2集成開發(fā)環(huán)境,仿真器驅(qū)動(dòng)程序 三、實(shí)驗(yàn)內(nèi)容 1.理解下列程序,新建工程,加入下面的程序,并觀察實(shí)驗(yàn)結(jié)果 程序代碼: Num EQU 20;定義常量Num = 20 START;LDR r0,=src;將src數(shù)據(jù)塊的開始地址存入r0中 LDR r1,=dst;將dst數(shù)據(jù)塊的開始地址存入r1中 MOV r2,#Num;設(shè)置r2的值為20 MOV sp,#0x400;堆棧指針sp指向0x400 blockcopy;MOVS r3,r2,LSR #3;將r2左移3位移入r3并且影響標(biāo)志位 BEQ copywords;結(jié)果為0的話跳轉(zhuǎn)到copywords STMFD SP!,{r4-r11};將r4-r11的值入棧 octcopy;LDMIA r0!,{r4-r11};將src的前8個(gè)字?jǐn)?shù)據(jù)存入讓r4-r11 STMIA r1!,{r4-r11};將r4-r11中的數(shù)據(jù)放入dst數(shù)據(jù)塊中 SUBS r3,r3,#1;r3 = r3-1 BNE octcopy;結(jié)果不為0跳轉(zhuǎn)到octcopy LDMFD SP!,{R4-R11};恢復(fù)原來的r4-r11 copywords;ANDS r2,r2,#7;r2 = r2&7 BEQ stop;結(jié)果為0跳轉(zhuǎn)到stop wordcopy;LDR r3,[r0],#4;將r0指向的字?jǐn)?shù)據(jù)放入r3中,r0 = r0+4 STR r3,[r1],#4;將r3中的數(shù)據(jù)存入到dst數(shù)據(jù)塊中,r1 = r1+4 SUBS r2,r2,#1;r2 = r2-1 BNE wordcopy;不為0跳轉(zhuǎn)到wordcopy處 stop;B stop;src DCD 1,2,3,4,5,6,7,8,1,2,3,4,5,6,7,8,1,2,3,4;dst DCD 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0;END;程序結(jié)果:將src的數(shù)據(jù)全部存入到dst中 2.新建工程,并自行編寫程序,分別使用LDR,STR,LDMIA,STMIA操作,實(shí)現(xiàn)對(duì)某段連續(xù)存儲(chǔ)單元寫入數(shù)據(jù),并觀察結(jié)果 程序代碼: MOV R4,#1;設(shè)置r4 = 1; MOV R5,#2;設(shè)置r5 = 1; MOV R6,#3;設(shè)置r4 = 1; LDR R0,=dst;R0保存dst的首地址 STR R4,[R0];將r4的值裝入r0執(zhí)行的內(nèi)存中 STR R5,[R0,#4];將r5的值裝入r0+4執(zhí)行的內(nèi)存中 STR R6,[R0,#8];將r6的值裝入r0+8執(zhí)行的內(nèi)存中 LDR R7,=src;R0保存src的首地址 LDMIA R7,{R8-R10};將r7執(zhí)行的地址的數(shù)據(jù)讀入r8=r10 LDR R3,=N;r3保存N的首地址 STMIA R3!,{R8-R10};將r8-r10裝入r3指向的內(nèi)存 N DCD 0,0,0 src DCD 1,2,3 dst DCD 0,0,0 END 程序結(jié)果:熟悉使用LDMIA,STMIA和LDR,STR指令 3.使用ARM匯編指令實(shí)現(xiàn)if條件執(zhí)行,使用ARM匯編指令實(shí)現(xiàn)for條件執(zhí)行,使用ARM匯編指令實(shí)現(xiàn)while條件執(zhí)行,使用ARM匯編指令實(shí)現(xiàn)do…while條件執(zhí)行。程序代碼: 實(shí)現(xiàn)if條件: MOV R0,#1 MOV R1,#2 CMP R0,R1 BGT LOOP1 BLT LOOP2 LOOP1 MOV R3,R0 LOOP2 MOV R3,R1 END 程序結(jié)果: 實(shí)現(xiàn)for和while條件: MOV R1,#1 MOV R3,#0 MOV R2,#101;LOOP ADD R3,R1,R3 ADD R1,R1,#1 CMP R1,R2 BLT LOOP END 程序結(jié)果: 實(shí)現(xiàn)do…while條件: MOV R0,#1 MOV R1,#100 MOV R3,#0 LOOP CMP R0,R1 BGT STOP ADD R3,R0,R3 ADD R0,R0,#1 B LOOP STOP END 程序結(jié)果: 實(shí)驗(yàn)四 基于ARM的C語言程序設(shè)計(jì) 一、實(shí)驗(yàn)?zāi)康?/p> 1.了解ARM C語言的基本框架,學(xué)會(huì)使用ARM的C語言編程。2.掌握C語言和匯編語言編程的相互調(diào)用。 二、實(shí)驗(yàn)設(shè)備 1.EL-ARM-830教學(xué)實(shí)驗(yàn)箱,PentiumII以上的PC機(jī),仿真器電纜。 三、ARM C語言簡(jiǎn)介與使用規(guī)則 1.ARM使用C語言編程是大勢(shì)所趨 在應(yīng)用系統(tǒng)的程序設(shè)計(jì)中,若所有的編程任務(wù)均由匯編語言來完成,其工作量巨大,并且不宜移植。由于ARM的程序執(zhí)行速度較高,存儲(chǔ)器的存儲(chǔ)速度和存儲(chǔ)量也很高,因此,C語言的特點(diǎn)充分發(fā)揮,使得應(yīng)用程序的開發(fā)時(shí)間大為縮短,代碼的移植十分方便,程序的重復(fù)使用率提高,程序架構(gòu)清晰易懂,管理較為容易等等。因此,C語言的在ARM編程中具有重要地位。 2.ARM C語言程序的基本規(guī)則 在ARM程序的開發(fā)中,需要大量讀寫硬件寄存器,并且盡量縮短程序的執(zhí)行時(shí)間的代碼一般使用匯編語言來編寫,比如ARM的啟動(dòng)代碼,ARM的操作系統(tǒng)的移植代碼等,除此之外,絕大多數(shù)代碼可以使用C語言來完成。 C語言使用的是標(biāo)準(zhǔn)的C語言,ARM的開發(fā)環(huán)境實(shí)際上就是嵌入了一個(gè)C語言的集成開發(fā)環(huán)境,只不過這個(gè)開發(fā)環(huán)境和ARM的硬件緊密相關(guān)。 在使用C語言時(shí),要用到和匯編語言的混合編程。當(dāng)匯編代碼較為簡(jiǎn)潔,則可使用直接內(nèi)嵌匯編的方法,否則,使用將匯編文件以文件的形式加入項(xiàng)目當(dāng)中,通過ATPCS的規(guī)定與C程序相互調(diào)用與訪問。 ATPCS,就是ARM、Thumb的過程調(diào)用標(biāo)準(zhǔn)(ARM/Thumb Procedure Call Standard),它規(guī)定了一些子程序間調(diào)用的基本規(guī)則。如寄存器的使用規(guī)則,堆棧的使用規(guī)則,參數(shù)的傳遞規(guī)則等。 在C程序和ARM的匯編程序之間相互調(diào)用必須遵守ATPCS。而使用ADS的C語言編譯器編譯的C語言子程序滿足用戶指定的ATPCS的規(guī)則。但是,對(duì)于匯編語言來說,完全要依賴用戶保證各個(gè)子程序遵循ATPCS的規(guī)則。具體來說,匯編語言的子程序應(yīng)滿足下面3個(gè)條件: ● 在子程序編寫時(shí),必須遵守相應(yīng)的ATPCS規(guī)則; ● 堆棧的使用要遵守相應(yīng)的ATPCS規(guī)則; ● 在匯編編譯器中使用-atpcs選項(xiàng)。基本的ATPCS規(guī)定,請(qǐng)?jiān)斠娤嚓P(guān)技術(shù)文檔。 匯編程序調(diào)用C程序 匯編程序的設(shè)置要遵循ATPCS規(guī)則,保證程序調(diào)用時(shí)參數(shù)正確傳遞。在匯編程序中使用IMPORT偽指令聲明將要調(diào)用的C程序函數(shù)。在調(diào)用C程序時(shí),要正確設(shè)置入口參數(shù),然后使用BL調(diào)用。 C程序調(diào)用匯編程序 匯編程序的設(shè)置要遵循ATPCS規(guī)則,保證程序調(diào)用時(shí)參數(shù)正確傳遞。 在匯編程序中使用EXPORT偽指令聲明本子程序,使其他程序可以調(diào)用此子程序。在C語言中使用extern關(guān)鍵字聲明外部函數(shù)(聲明要調(diào)用的匯編子程序)。 在C語言的環(huán)境內(nèi)開發(fā)應(yīng)用程序,一般需要一個(gè)匯編的啟動(dòng)程序,從匯編的啟動(dòng)程序,跳到C語言下的主程序,然后,執(zhí)行C程序,在C環(huán)境下讀寫硬件的寄存器,一般是通過宏調(diào)用,在每個(gè)項(xiàng)目文件的Startup44b0/INC目錄下都有一個(gè)44b.h的頭文件,那里面定義了所有關(guān)于44B0的硬件寄存器的宏,對(duì)宏的讀寫,就能操作44B0的硬件。 具體的編程規(guī)則同標(biāo)準(zhǔn)C語言。 四、實(shí)驗(yàn)內(nèi)容 1、理解下列程序,新建工程,加入下面的程序,并觀察實(shí)驗(yàn)結(jié)果。程序代碼: /*實(shí)現(xiàn)5個(gè)數(shù)的相加*/ int sum5(int a,int b,int c,int d,int e){ return(a+b+c+d+e);};匯編語言 IMPORT sum5;聲明調(diào)用c函數(shù) CALLSUMS STMFD SP!,{LR};將LR寄存器入棧 MOV R0,#1;r0 = 1 ADD R1,R0,R0;r1 = 2 ADD R2,R1,R0;r2 = 3 ADD R3,R1,R2;r3 = 5 STR R3,[SP,#-4]!;將r3的值入棧當(dāng)做第五個(gè)參數(shù) ADD R3,R1,R1;R3 = R3+R1=4 BL sum5;調(diào)用sum5 ADD SP,SP,#4;sp = sp+4 LDMFD SP,{PC} 程序結(jié)果:實(shí)現(xiàn)了i+2i+3i+4i+5i的匯編語言調(diào)用c語言 2、用匯編語言實(shí)現(xiàn)1到100累加的函數(shù),用C言語編寫主程序,在主程序中調(diào)用所編寫的匯編函數(shù) 程序代碼: NAME asmfile PUBLIC sum5 SECTION.intvec : CODE(2)CODE32 sum5 ENTRY MOV R1,#1 MOV R2,#0 sum6 ADD R2,R1,R2 ADD R1,R1,#1 CMP R1,R0 BLE sum6 MOV PC,LR END #include 總結(jié) 本次實(shí)驗(yàn)主要是通過對(duì)ARM的各種指令進(jìn)行操作,通過對(duì)這些指令的應(yīng)用,讓我們學(xué)會(huì)了如何使用匯編來進(jìn)行編程,掌握匯編編程和C語言編程的技巧,并且能夠熟練的使用匯編語言,深刻理解ARM的工作。并且培養(yǎng)了我們寫代碼的能力以及對(duì)代碼的閱讀能力和修改能力。為我們?cè)谝院蟮膶W(xué)習(xí)和生活中更實(shí)用ARM,利用匯編進(jìn)行編程奠定了一定的基礎(chǔ)!第二篇:嵌入式實(shí)驗(yàn)報(bào)告
第三篇:嵌入式實(shí)驗(yàn)報(bào)告
第四篇:嵌入式實(shí)驗(yàn)報(bào)告
第五篇:嵌入式實(shí)驗(yàn)報(bào)告