嵌入式实验报告(小编整理)

时间:2019-05-12 06:35:36下载本文作者:会员上传
简介:写写帮文库小编为你整理了多篇相关的《嵌入式实验报告》,但愿对你工作学习有帮助,当然你在写写帮文库还可以找到更多《嵌入式实验报告》。

第一篇:嵌入式实验报告

嵌入式应用系统设计实验报告

2013-12-17 计算机学院软件工程系嵌入式应用系统设计

实验一ARM 汇编指令

一、实验目的

初步学会使用Embest IDE for ARM 开发环境及 ARM 软件模拟器。通过实验掌握简单 ARM 汇编指令的使用方法。

二、实验设备

硬件:PC 机。软件:Embest IDE Pro 集成开发环境,Windows 98/2000/NT/XP。

三、实验内容

熟悉开发环境的使用并使用ldr/str,mov等指令访问寄存器或存单元。使用 add/sub/lsl/lsr/and/orr等指令,完成基本数学/逻辑运算。

四、实验步骤

1)新建工程:

运行Embest IDE Pro 2005 集成开发环境,选择菜单项 File → New Workspace,系统弹出一个对话框,按照图 1-1 所示输入相关内容。

点击 OK 按钮,将创建一个新工程,并同时创建一个与工程名相同的工作区。此时在工作区窗口将打开该工作区和工程。2)建立源文件:

点击菜单项 File → New,系统弹出一个新的、没有标题的文本编辑窗,输入光标位于窗口中第一行,按照实验参考程序编辑输入源文件代码。编辑完后,保存文件 asm1_a.s。3)添加源文件:

选择 Project → Add To Project → Files 命令,或单击工程管理窗口中的相应右键菜单命令,弹出文件选择对话框,在工程目录下选择刚才建立的源文件 asm1_a.s。4)基本配置:

选择菜单项 Project → Settings„或快捷键 Alt+F7,弹出工程设置对话框。在工程设置对话框中,选择 Processor 设置对话框,按照图 1-2 所示,进行目标板所用处理器的配置。

计算机学院软件工程系嵌入式应用系统设计

图 1-2 新的工作区处理器配置

5)编译并生成目标代码: 选择菜单项 Build → Build asm_a或快捷键 F7,生成目标代码。6)调试设置:

选择菜单项 Project → Settings„或快捷键 Alt+F7,弹出工程设置对话框。在工程设置对话框中,选择 Remote 设置对话框,按照图 1-4 所示对调试设备模块进行设置我们这里只能实现软件仿真,故选 SimArm7。

图 1-4 新工作区仿真器配置

按照图 1-4 所示对调试设备模块进行设置我们这里只能实现软件仿真,注意: Symbol file 与 Download file 设置应该相同,用户可以从 Linker 页面拷贝系统默认的输出文件配置;且该实验输入下载地址为 0x8000,即为AS 默认的代码段起始地址。由于汇编和链接选项在本实验中没有进行配置,完全使用其默认选项,所以,代码段是从 0x8000 开始的,下载地址应该与它保持一致。

计算机学院软件工程系嵌入式应用系统设计

7)选择 Debug 菜单 Remote Connect 进行连接软件仿真器,执行 Download 命令下载程序,并打开寄存器窗口。打开 memory 窗口,观察地址 0x8000~0x801f 的内容,与地址 0xff0~0xfff 的内容。8)单步执行程序并观察和记录寄存器与 memory 的值变化。9)结合实验内容和相关资料,观察程序运行,通过实验加深理解 ARM 指令的使用。

10)程序运行以及观察结果如下图所示:

上图为单步调试开始时执行结果,内容的地址为: 0x8000

上图是执行到stop之前的调试结果。五.实验总结

初次接触到嵌入式,通过此次实验对嵌入式的内容以及研究的对象有了初始化的理解,这有助于以后对嵌入式的学习。

计算机学院软件工程系嵌入式应用系统设计

实验二 ARM 汇编指令 一实验目的

初步学会使用Embest IDE for ARM 开发环境及 ARM 软件模拟器。通过实验掌握简单 ARM 汇编指令的使用方法。二实验设备 硬件:PC 机。

软件:Embest IDE Pro 集成开发环境,Windows 98/2000/NT/XP。三实验内容

熟悉开发环境的使用并使用ldr/str,mov等指令访问寄存器或存储单元。使用 add/sub/lsl/lsr/and/orr等指令,完成基本数学/逻辑运算。

四实验操作步骤

1)在工作区窗口工作区名称上击右键鼠标,在弹出的快捷菜单中选择“Add New Project to Workspace„”。

2)参照实验 A 及相应的实验参考程序,建立工程 asm1_b。3)添加源文件:

选择 Project → Add To Project → Files 命令,或单击工程管理窗口中的相应右键菜单命令,弹出文件选择对话框,在工程目录下选择刚才建立的源文件 asm1_b.s。4)基本配置:

选择菜单项 Project → Settings„或快捷键 Alt+F7,弹出工程设置对话框。在工程设置对话框中,选择 Processor 设置对话框,按照图 1-7 所示,进行目标板所用处理器的配置。

计算机学院软件工程系嵌入式应用系统设计

5)编译并生成目标代码:

选择菜单项 Build → Build asm_a或快捷键 F7,生成目标代码。6)参照实验A 的步骤完成调试设置。

7)选择 Debug 菜单 Remote Connect 进行连接软件仿真器,执行 Download 命令下载程序,并打开寄存器窗口。打开 memory 窗口.8)程序执行结果及总结:

计算机学院软件工程系嵌入式应用系统设计

初次接触到嵌入式,通过此次实验对嵌入式的内容以及研究的对象有了初始化的理解,这有助于以后对嵌入式的学习。并且本次实验后,明白了嵌入式的开发环境及所用到的开发软件,其次就是对程序的调试与运行,通过实验认真思考其原理知识。本次实验收益匪浅。五实验参考程序

#NAME asm1_b.s # Author: Embest #DesARMinstructionexamples.equ x, 45 /* x=45 */.equ y, 64 /* y=64 */.equ z, 87 /* z=87 */.equstack_top, 0x1000 /* define the top address for stacks */.global _start.text _start: /* code start */ mov r0, #x /* put x value into R0 */ mov r0, r0, lsl #8 /* R0 = R0 << 8 */ mov r1, #y /* put y value into R1 */ 计算机学院软件工程系嵌入式应用系统设计

add r2, r0, r1, lsr #1 /* R2 =(R1>>1)+ R0 */ movsp, #0x1000 str r2, [sp] mov r0, #z /* put z value into R0 */ and r0, r0, #0xFF /* get low 8 bit from R0 */ mov r1, #y /* put y value into R1 */ add r2, r0, r1, lsr #1 /* R2 =(R1>>1)+ R0 */ ldr r0, [sp] /* put y value into R1 */ mov r1, #0x01 orr r0, r0, r1 mov r1, R2 /* put y value into R1 */ add r2, r0, r1, lsr #1 /* R2 =(R1>>1)+ R0 */ }}

实验三 C 语言程序实验一

一.实验目的

学会使用Embest IDE 编写简单的 C 语言程序并进行调试。学会编写和使用命令脚本文件。

掌握过memory/register/watch/variable 窗口分析判断运行结果。二.实验设备

硬件:PC 机。

软件:Embest IDE Pro 2005 集成开发环境,Windows 98/2000/NT/XP。三.实验内容

利用命令脚本初始化栈指针,并使用 c 语言完成延时函数。四.实验操作步骤

1)参考前面实验创建新的工程(工程名为 C1);

2)按照参考程序,编写源文件 C1.c 和 C1.cs,并把它们加入工程里面。C1.cs 加在工程根目录即可。

计算机学院软件工程系嵌入式应用系统设计

3)参考前面例子进行标准的设置,其中需要注意的是,在调试 Debug 对话框设置的时候,增加连接后自动执行脚本文件:

4)参考前面实验步骤进行编译和连接;

5)下载,打开 Memory/Register/Watch/Variable 窗口,单步执行,通过 memory/register /watch/variable 窗口分析判断结果,在 watch 框中输入要观察变量 I 和变量 J 的值,并记录下来。特别注意在 variable 窗口观察变量 I 的变化并记录下来;

6)结合实验内容和相关资料,观察程序运行,通过实验; 7)理解和掌握实验后,完成实验练习题。五.实验参考程序 1.C1.c 参考源代码:/********************************************************** * File: c1.c * Author: embest * Desc: c language example 1 /*********************************************************/ /* function declare */ void delay(int nTime);/********************************************************** * name: _start * func: entry point **********************************************************/ _start(){ int i = 5;for(;;){ delay(i);} } /********************************************************** * name: delay * func: delay some time * para: nTime--input * ret: none *******************************************************/ void delay(nTime){

int i, j = 0;for(i = 0;i < nTime;i++){ for(j = 0;j < 10;j++)} 计算机学院软件工程系嵌入式应用系统设计

} 2.C1.cs 参考源代码 stop regwrite sp 0x1000;initialize the sp , sp = 0x1000 实验截图如下:

六、实验总结

在实验中我慢慢地熟悉了EmbestIDE的使用,在老师的教导和指导下,学会了编写和使用简单的命令脚本文件,学会了在memory/register/watch/variable等等中查看变量,分析判断运行结果。

计算机学院软件工程系嵌入式应用系统设计

实验四 C 语言程序实验二

一.实验目的

掌握建立基本完整的 ARM 工程,包含启动代码,连接脚本等。了解 ARM9 启动过程,学会使用Embest IDE 编写简单的 C 语言程序和汇编启动代码并进行调试。掌握链接脚本的作用。掌握如何指定代码入口地址与入口点。掌握通过 memory/register/watch/variable 窗口分析判断结果。二.实验设备

硬件:PC 机。

软件:Embest IDE Pro 2005 集成开发环境,Windows 98/2000/NT/XP。三.实验内容

用 c 语言编写延时函数,使用嵌入汇编实验原理 1.ARM 异常向量表

当正常的程序执行流程暂时挂起时,称之为异常,例如:处理一个外部的中断请求。在处理异常之前,必须保存当前的处理器状态,以便从异常程序返回时可以继续执行当前的程序。ARM 异常向量表如下:

表 1-4 ARM 异常向量表

地址异常入口模式 0x00000000 Reset 管理 0x00000004 Undefined Instruction 未定义 0x00000008 Software interrupt 管理0x0000000C Prefetch abort 中止 0x00000010 Data abort 中止 0x00000014 Reserved 保留 0x00000018 IRQ IRQ 0x0000001C FIQ FIQ处理器允许多个异常同时发生,这时,处理器会按照固定的顺序进行处理,参照下面的异常优先级。

高优先级: 1----Reset 2----Data abort 3----FIQ 4----IRQ 5----Prefetch abort 低优先级: 6----Undefined Instruction,Software interrupt 由上可见,Reset 入口,即为整个程序的实际入口点。因此,我们在编写代码的时候,第一条语句是在 0x00000000 处开始执行的。一般地,我们使用下面的代码: #---Setup interrupt / exception vectors B Reset_HandlerUndefined_Handler: B Undefined_HandlerSWI_Handler: B SWI_HandlerPrefetch_Handler: B Prefetch_HandlerAbort_Handler: B Abort_Handler NOP /* Reserved vector */ IRQ_Handler: B IRQ_HandlerFIQ_Handler: B FIQ_HandlerReset_Handler: LDR sp, =0x00002000 2.链接脚本文件

所有的链接都是通过链接脚本来控制实现的。这些链接脚本文件使用链接命令语言编写。链接脚本的主要作用是描述我们编写的文件中这么多个部分应该如何的 计算机学院软件工程系嵌入式应用系统设计

相应摆放在输出文件中,并控制存储区如何定位这些输出文件。同时,如果需要,我们还可以使用链接脚本文件实现其它功能。大部分链接脚本文件都是很简单的。简单的链接脚本只有一行命令:SECTIONS。我们使用 SECTIONS 命令来告诉存储区应该如何摆放我们的输出文件。SECTIONS 命令是一个强大的命令,这里通过一个简单的例子来说明一下。假设程序中包括代码、已经初始化的数据和还没有初始化的数据。这些需要相应的分别摆放在.text.data 和.bss部分。针对这个例子,我们可以假设代码必须放在 0x10000,数据必须放在地址 0x8000000 开始的地方。下面是一个描述上面内容的一个简单的链接脚本:

SECTIONS {.= 0x10000;.text : { *(.text)}.= 0x8000000;.data : { *(.data)}.bss : { *(.bss)}.} 链接脚本文件中全部使用半角符号,文件编写格式必须从 SECTIONS 关键字开始,紧接着是开大括号,接着是所有需要输出的描述部分,后用闭大括号收尾。上面的例子的链接脚本命令第一行使用专门的符号“.”,它指向当前的地址计数器。如果没有在其它地方专门的说明输出部分的地址(有关“其它地方”后面有说明),一般程序都会默认当前的地址计数器。地址计数器会根据输出部分的大小而增加。在 SECTIONS 命令开始,地址计数器一般为 0。第二行定义了一个输出区,.text。其中的“:”号是必须的,但是它经常被忽略。在大括号里面,每个输出部分的名称后面必须把所有需要输入的部分的名字都列出来。“*”号是一个通配符,可以搭配成任何文件名字。*(text)表示在输入文件中所有的.text 输入部分。开始时定义了输出部分.text 的起始地址为 0x10000,链接器会把输出文件中的.text 部分的地址设置为 0x10000。在后面的几行里面,定义了.data 和.bss部分。连接器会把.data 输出部分的起始地址设置为 0x8000000。当连接器设置.data 部分后,当前地址计数器会自动指向 0x800000。这样,连接器会紧跟着把.bss部分放在.data 部分后面。连接器会增加本地计数器,以确保需要时每个输出部分都有必需的队列。在这个例子里面,为.text和.data 部分指定了特定的地址,这两个部分会确保可以得到队列保证,但是连接器可能会在.dat a 和.bss之间创建一个小小的空隙。

3.内嵌汇编语言从下面的示例看得出来,GCC 支持大部分基本的内嵌汇编语言。编译器遇到这个声明的时会在输出流中插入一个汇编语言标记。示例:一个基本的内嵌汇编语言例子 __asm__(“mov r1, r2”);四.实验操作步骤

1.参考前面实验创建新的工程(工程名为:C2)。

2.编写新的源代码文件 c2.c,init.s和脚本文件ldscript,并把它们加入工程中。

3.参考前面例子进行标准的设置。4.参考前面实验步骤进行编译&连接。

计算机学院软件工程系嵌入式应用系统设计

5.下载调试,打开 memory/register/watch/variable 窗口,单步执行,并通过 memory/re gister/watch/variable 窗口分析判断结果。

6.结合实验内容和相关资料,观察程序运行。7.理解和掌握实验后,完成实验练习题。五.实验参考程序 1.c2.c 参考源代码

/******************************************************************* *File: c2.c * Author: embest * Desc: c language example 2 ********************************************************************/ /******************************************************************** * name: _nop_ * func: The following shows c language embededassembel language * para: none * ret: none ********************************************************************/ void _nop_(){ __asm(“ mov r0,r0 ”);} /******************************************************************** * name: delay * func: delay time * para: none * ret: none ********************************************************************/ void delay(void){ inti;for(i = 0;i<= 10;i++){ _nop_();} } /******************************************************************** * name: delay10 * func: delay time * para: none * ret: none ********************************************************************/ void delay10(void){ inti;for(i = 0;i<= 10;i++){ delay();} } /******************************************************************** * name: _main 计算机学院软件工程系嵌入式应用系统设计

* func: c code entry * para: none * ret: none ********************************************************************/ __main(){ inti = 5;for(;;){ delay10();} } 2.init.s 参考源代码:

#******************************************************************** # File:init.s # Author: embest # Desc:C start up codes.Configure memory, #InitializeISR ,stacks,initialize C-variables # Fill zeros into zero-initialized C-variables #******************************************************************** /* global symbol define */.global _start /* code */.text _start: # Set interrupt / exception vectors b Reset_HandlerUndefined_Handler: b Undefined_HandlerSWI_Handler: b SWI_HandlerPrefetch_Handler: b Prefetch_HandlerAbort_Handler: b Abort_Handlernop /* Reserved vector */ IRQ_Handler: b IRQ_Handler FIQ_Handler: b FIQ_HandlerReset_Handler: ldrsp, =0x00002000 # ******************************************************************** # Branch on C code Main function(with interworking).* # Branch must be performed by an interworking call as.* # either an ARM or Thumb.main C function must be.* # supported.This makes the code not position-independent.* # A Branch with link would generate errors * # ***********************************************************************.extern __main ldr r0, = __main movlr, pc # jump to __main()bx r0 # ************************************************************************ # * Loop for ever * 计算机学院软件工程系嵌入式应用系统设计

# * End of application.Normally, never occur.* # * Could jump on Software Reset(B 0x0).* # ************************************************************************End: b End.end 3.ldscript参考源代码:

SECTIONS {.= 0x0;.text : { *(.text)}.data : { *(.data)}.rodata : { *(.rodata)}.bss : { *(.bss)} } 五.实验截图如下:

六、实验总结:

在实验中我学会了建立基本完整的 ARM 工程,包含启动代码,连接脚本等。了解 ARM9 启动过程,学会简单使用 Embest IDE 编写简单的 C 语言程序和汇编启动代码并进行调 试。明白了一些链接脚本的作用。子解了如何指定代码入口地址与入口点。通过 memory/register/watch/variable 窗口分析判断结果。

计算机学院软件工程系嵌入式应用系统设计

实验五 LED 控制实验

一.实验目的

 在 EBDCC2530 节点板上运行自己的程序。 通过 I/O 控制小灯闪烁和蜂鸣器鸣叫。二.实验环境

 硬件:PC 机,EBDCC2530 节点板,USB 接口仿真器。 软件:Windows 98/2000/NT/XP,IAR 集成开发环境。三.实验原理

低电平来控制灯的亮与灭和蜂鸣器的鸣叫。

本实验设置 P1.0、P1.1、P1.4 I/O 引脚来选通 LED1、LED2、LED3,引脚置为低电平点亮 LED,反之熄灭 LED。设置 P0.1 引脚来选通 BEEP,引脚置为低电平蜂鸣器鸣叫,反之蜂鸣器不鸣叫。

P1DIR(P1 方向寄存器):D7 D6 D5 D4 D3 D2 D1 D0 P1.7方向 0:输入 1:输出P1.6方向 0:输入 1:输出 P1.5方向 0:输入 1:输出P1.4方向 0:输入 1:输出 P1.3方向 0:输入 1:输出P1.2方向 0:输入 1:输出 P1.1方向 0:输入 1:输出P1.0方向 0:输入 1:输出

P1.7 功能 0:普通 I/O 1:外设P1.6 功能 0:普通 I/O 1:外设 P1.5 功能 0:普通 I/O 1:外设P1.4 功能 0:普通 I/O 1:外设 P1.3 功能 0:普通 I/O 1:外设P1.2 功能 0:普通 I/O 1:外设 P1.1 功能 0:普通 I/O 1:外设P1.0 功能 0:普通 I/O 1:外设 LDE 灯实现的主要代码为: void main(void){ led_beep_init();halWait(250);while(1){ //开始循环 LED1 = 0;LED1 = 1;//LED1 闪烁halWait(250);halWait(250);LED2 = 0;//LED2 闪烁 halWait(250);LED2 = 1;halWait(250);LED3 = 0;//LED3 闪烁 halWait(250);LED3 = 1;halWait(250);BEEP = 0;//BEEP 鸣叫 halWait(250);BEEP = 1;halWait(250);LED1 = 0;LED2 = 0;LED3 = 0;//LED 灯全亮 halWait(250);halWait(250);LED1 = 1;LED2 = 1;LED3 = 1;//LED 灯全灭

计算机学院软件工程系嵌入式应用系统设计

halWait(250);halWait(250);} } 四.实验步骤

1、正确连接 USB 仿真器的下载线和 EBDCC2530 节点板。

2、打开实验源码LEDs.eww(路径为:出厂光盘 DISK-EMBV210-WSN5-Example2 基本接口实验2.2 LED),编译工程,依次选择“Project”→“Download and Debug”,下载到 CC2530

3、把仿真器左侧的 USB 接口拔掉,然后拔掉连接在 EBDCC2530 节点板 DBG 位置的调试接

口。我们打开 EBDCC2530 节点板右下方的电源开关,此时可以观察到程序运行的情况。(在不拔掉仿真器的情况下,我们可以通过相关的调试进一步观察 LED 的闪烁情况和蜂鸣器的鸣叫情况。)

4、修改延时函数,可以改变 LED 小灯的闪烁和蜂鸣器鸣叫的时间间隔。

5、重新编译,并下载程序到 EBDCC2530 节点板,观察 LED 的闪烁和蜂鸣器的鸣叫情况。五.实验结果

六、实验总结:

在LED控制实验中,我们通过简单的程序进行I/O控制,从而达到控制LED的闪烁以及峰叫,理解一些简单的汇编知识,理解了一些ARM汇编在I/O控制的原理及其作用。

计算机学院软件工程系嵌入式应用系统设计

实验六看门狗实验

一.实验目的

 学习CC2530 片内看门狗的工作原理。 配置 CC2530 的看门狗相关的寄存器。二.实验环境

 硬件:PC 机,EBDCC2530 节点板,USB 接口仿真器。 软件:Windows98/2000/NT/XP,IAR 集成开发环境。三.实验原理

看门狗(WatchDog),准确的说应该是看门狗定时器,则正是专门用来监测单片机程序运行状态的电路结构。其基本原理是:启动看门狗定时器后,它就会从 0 开始计数,若程序在规定的时间间隔内没有及时对其清零,看门狗定时器就会复位系统(相当于重启电脑)。

看门狗的使用可以总结为:选择模式→选择定时器间隔→放狗→喂狗。(1)选择模式

看门狗定时器有两种模式,即“看门狗模式”和“定时器”模式。

在定时器模式下,它就相当于普通的定时器,达到定时间隔会产生中断(你可以在 ioCC2530.h文件中找到其中断向量为 WDT_VECTOR);在看门狗模式下,当达到定时间隔时,不会产生中断,取而代之的是向系统发送一个复位信号。本实验中,通过 WDCTL.MODE=0 来选择为看门口模式。(2)选择定时间隔

如上图所示,有四种可供选择的时钟周期,为了测试方便,我们选择时间间隔为 1s(即WDCTL.INT=00)。(3)放狗

令 WDCTL.EN=1,即可启动看门狗定时器。(4)喂狗

定时器启动之后,就会从 0 开始计数。在其计数值达到 32768 之前(即<1s),若我们用以下代码喂狗: WDCTL=0xa0;WDCTL=0x50;计数值喂狗 喂狗 喂狗 计数临界线 没有喂狗„„ 达到此线,系统复位 则定时器的计数值会被清 0,然后它会再次从 0x0000 开始计数,这样就防止了其发送复位信号,表现在开发板上就是:LED1 会一直亮着,不会闪烁; 若我们不喂狗(即把此代码注释掉),那么当定时器计数达到 32768 时,就会发出复位信号,程序将会从头开始运行,表现在开发板上就是:LED1 不断闪烁,闪烁间隔为 1s。(注:喂狗程序一定要严格与上述代码一致,顺序颠倒/写错/少写一句都将起不到清 0 的作用。)四.实验步骤

计算机学院软件工程系嵌入式应用系统设计

1、正确连接 USB 仿真器的下载线和 EBDCC2530 节点板。

2、打开实验源码watchdog.eww(路径为:出厂光盘 DISK-EMBV210-WSN5-Example2 基

本接口实验2.8 Watchdog),编译工程,依次选择“Project”→“Download and Debug”,下载到CC2530 节点板。

3、把仿真器左侧的 USB 接口拔掉,然后拔掉连接在 EBDCC2530 节点板 DBG 位置的调试接口。我们打开 EBDCC2530 节点板右下方的电源开关,此时可以观察到程序运行的情况。(在不拔掉仿真器的情况下,我们可以通过相关的调试进一步观察程序的运行情况。)

4、默认加上FeedDog函数,编译、下载、运行代码后,我们发现 LED1 一直亮着(系统不复位)。

5、若注释掉FeedDog函数,编译、下载、运行代码后,我们发现 LED1 以 1s 的间隔闪烁(系统每隔 1s 复位一次)。

五、实验结果

计算机学院软件工程系嵌入式应用系统设计

六、实验总结

通过这次实验我进一步了解了看门狗的工作原理和功能,以及看门狗寄存器定时周期的计算方法。在实验过程中遇到了很多的问题,例如,无法连接到超级终端、运行设备忘记设置为ARM7Simple、USB驱动无法正确装载等等。最终在同学的帮助下和老师的指导下,完成了实验,并且老师也向我们讲述了一些代码中我们不知道的知识,解决了我们的疑惑。

第二篇:嵌入式实验报告

目录

实验一 跑马灯实验.........................................................................1 实验二 按键输入实验.....................................................................3 实验三 串口实验.............................................................................5 实验四 外部中断实验.....................................................................8 实验五 独立看门狗实验................................................................11 实验七 定时器中断实验................................................................13 实验十三 ADC实验........................................................................15 实验十五 DMA实验........................................................................17 实验十六 I2C实验........................................................................21 实验十七 SPI实验........................................................................24 实验二十一 红外遥控实验............................................................27 实验二十二 DS18B20实验.............................................................30

实验一 跑马灯实验

一.实验简介

我的第一个实验,跑马灯实验。

二.实验目的

掌握STM32开发环境,掌握从无到有的构建工程。

三.实验内容

熟悉MDK KEIL开发环境,构建基于固件库的工程,编写代码实现跑马灯工程。通过ISP下载代码到实验板,查看运行结果。使用JLINK下载代码到目标板,查看运行结果,使用JLINK在线调试。

四.实验设备

硬件部分:PC计算机(宿主机)、亮点STM32实验板、JLINK。软件部分:PC机WINDOWS系统、MDK KEIL软件、ISP软件。

五.实验步骤

1.熟悉MDK KEIL开发环境 2.熟悉串口编程软件ISP 3.查看固件库结构和文件

4.建立工程目录,复制库文件 5.建立和配置工程 6.编写代码 7.编译代码

8.使用ISP下载到实验板 9.测试运行结果

10.使用JLINK下载到实验板 11.单步调试

12.记录实验过程,撰写实验报告

六.实验结果及测试

源代码:

两个灯LED0与LED1实现交替闪烁的类跑马灯效果,每300ms闪烁一次。

七.实验总结

通过本次次实验我了解了STM32开发板的基本使用,初次接触这个开发板和MDK KEILC软件,对软件操作不太了解,通过这次实验了解并熟练地使用MDK KEIL软件,用这个软件来编程和完成一些功能的实现。作为 STM32 的入门第一个例子,详细介绍了STM32 的IO口操作,同时巩固了前面的学习,并进一步介绍了MDK的软件仿真功能。

实验二 按键输入实验

一.实验简介

在实验一的基础上,使用按键控制流水灯速度,及使用按键控制流水灯流水方向。

二.实验目的

熟练使用库函数操作GPIO,掌握中断配置和中断服务程序编写方法,掌握通过全局变量在中断服务程序和主程序间通信的方法。

三.实验内容

实现初始化GPIO,并配置中断,在中断服务程序中通过修改全局变量,达到控制流水灯速度及方向。

使用JLINK下载代码到目标板,查看运行结果,使用JLINK在线调试。

四.实验设备

硬件部分:PC计算机(宿主机)、亮点STM32实验板、JLINK、示波器。软件部分:PC机WINDOWS系统、MDK KEIL软件、ISP软件。

五.实验步骤

1在实验1代码的基础上,编写中断初始化代码

2在主程序中声明全局变量,用于和中断服务程序通信,编写完成主程序 3编写中断服务程序

4编译代码,使用JLINK下载到实验板 5.单步调试

6记录实验过程,撰写实验报告

六.实验结果及测试

源代码:

我们将通过MiniSTM32 板上载有的3个按钮,来控制板上的2个LED,其中KEY0控制LED0,按一次亮,再按一次,就灭。KEY1 控制LED1,效果同KEY0。KEY_2(KEY_UP),同时控制LED0 和LED1,按一次,他们的状态就翻转一次。

七.实验总结

通过本次实验,我学会了如何使用STM32 的IO 口作为输入用。TM32 的IO 口做输入使用的时候,是通过读取IDR 的内容来读取IO 口的状态的。这里需要注意的是 KEY0 和KEY1 是低电平有效的,而WK_UP 是高电平有效的,而且要确认WK_UP 按钮与DS18B20 的连接是否已经断开,要先断开,否则DS18B20 会干扰WK_UP按键!并且KEY0 和KEY1 连接在与JTAG 相关的IO 口上,所以在软件编写的时候要先禁用JTAG 功能,才能把这两个IO 口当成普通IO 口使用。

实验三 串口实验

一.实验简介

编写代码实现串口发送和接收,将通过串口发送来的数据回送回去。

二.实验目的

掌握STM32基本串口编程,进一步学习中断处理。

三.实验内容

编写主程序,初始化串口1,设置波特率为9600,无校验,数据位8位,停止位1位。编写中断服务程序代码实现将发送过来的数据回送。

四.实验设备

硬件部分:PC计算机(宿主机)、亮点STM32实验板、JLINK、示波器。

软件部分:PC机WINDOWS系统、MDK KEIL软件、ISP软件、串口调试助手。

五.实验步骤

1编写串口初始化代码

2编写中断服务程序代码

3编译代码,使用JLINK或ISP下载到实验板 4记录实验过程,撰写实验报告

六.实验结果及测试

源代码:

把代码下载到 MiniSTM32 开发板,可以看到板子上的LED0 开始闪烁,说明程序已经在跑了。接着我们打开串口调试助手,看到如下信息:

证明串口数据发送没问题。接着,我们在发送区输入上面的文字,输入完后按回车键。然后单击发送,可以得到如下结果:

七.实验总结

通过本次实验,我进一步了解了串口的使用,学会了通过串口发送和接收数据,将通过串口发送来的数据回送回去。该实验的硬件配置不同于前两个实验,串口 1 与USB 串口默认是分开的,并没有在PCB上连接在一起,需要通过跳线帽来连接一下。这里我们把P4 的RXD 和TXD 用跳线帽与P3 的PA9 和PA10 连接起来。

实验四 外部中断实验

一.实验简介

STM32 的 IO 口在本章第一节有详细介绍,而外部中断在第二章也有详细的阐述。这里我们将介绍如何将这两者结合起来,实现外部中断输入。

二.实验目的

进一步掌握串口编程,进一步学习外部中断编程,提高编程能力。

三.实验内容

初始化IO口的输入,开启复用时钟,设置IO与中断的映射关系,从而开启与IO口相对应的线上中断事件,设置触发条件。配置中断分组(NVIC),并使能中断,编写中断服务函数。

四.实验设备

硬件部分:PC计算机(宿主机)、亮点STM32实验板、JLINK、示波器。

软件部分:PC机WINDOWS系统、MDK KEIL软件、ISP软件、串口调试助手。

五.实验步骤

1.2.3.4.编写中断服务程序代码 使用ISP下载到实验板 测试运行结果

记录实验过程,撰写实验报告

六.实验结果及测试

源代码:

打开串口助手。

七.实验总结

首先需要将IO设置为中断输入口: 1)初始化 IO 口为输入。

2)开启 IO 口复用时钟,设置 IO 口与中断线的映射关系。

3)开启与该 IO口相对的线上中断/事件,设置触发条件。

4)配置中断分组(NVIC),并使能中断。

5)编写中断服务函数。

这一节,使用的是中断来检测按键,通过 WK_UP 按键实现按一次 LED0 和 LED 1 同时翻转,按 KEY0 翻转 LED0,按 KEY1 翻转 LED1。

试验中外部中断函数不能进入的原因分析 : 1)GPIO或者AFIO的时钟没有开启。2)GPIO和配置的中断线路不匹配。3)中断触发方式和实际不相符合。

4)中断处理函数用库函数时,写错,经常可能出现数字和字母之间没有下划线。5)外部中断是沿触发,有可能不能检测到沿,比如 中断线是低电平(浮空输入),触发是下降沿触发,可能会出现一直是低电平,高电平的时候是一样的情况,电平持续为高电平。

6)没有用软件中断来触发外部中断,调用函数EXTI_GenerateSWInterrupt;,因为软件中断先于边沿中断处理。

实验五 独立看门狗实验

一. 实验简介

独立看门狗(IWDG)由专用的低速时钟(LSI)驱动,即使主时钟发生故障它也仍然有效。窗口看门狗由从APB1时钟分频后得到的时钟驱动,通过可配置的时间窗口来检测应用程序非正常的过迟或过早的操作。

二.实验目的

通过编程,编写一个独立看门狗驱动程序

三.实验内容

启动 STM32 的独立看门狗,从而使能看门狗,在程序里面必须间隔一定时间喂狗,否则将导致程序复位。利用这一点,我们本章将通过一个 LED 灯来指示程序是否重启,来验证 STM32 的独立看门狗。

四.实验设备

硬件部分:PC计算机(宿主机)、亮点STM32实验板、JLINK。

软件部分:PC机WINDOWS系统、MDK KEIL软件、ISP软件、串口调试助手。

五.实验步骤

1.2.3.4.参考教材独立看门狗部分,编写独立看门狗驱动程序。建立和配置工程 编写代码

使用ISP下载到实验板

记录实验过程,撰写实验报告

六.实验结果及测试

源代码:

在配置看门狗后,看到LED0 不停的闪烁,如果WK_UP 按键按下,就喂狗,只要WK_UP 不停的按,看门狗就一直不会产生复位,保持LED0 的常亮,一旦超过看门狗定溢出时间(Tout)还没按,那么将会导致程序重启,这将导致LED0 熄灭一次。

七.实验总结

通过本次实验,我掌握了启动独立看门狗的步骤: 1)向 IWDG_KR 写入 0X5555。2)向 IWDG_KR 写入 0XAAAA。3)向 IWDG_KR 写入 0XCCCC。

通过上面 3个步骤,启动 STM32 的看门狗,从而使能看门狗,在程序里面就必须间隔一定时间喂狗,否则将导致程序复位。利用这一点,本章通过一个LED 灯来指示程序是否重启,来验证 STM32 的独立看门狗。在配置看门狗后,LED0 将常亮,如果 WK_UP 按键按下,就喂狗,只要 WK_UP 不停的按,看门狗就一直不会产生复位,保持 LED 0 的常亮,一旦超过看门狗溢出时间(Tout)还没按,那么将会导致程序重启,这将导致 LED 0 熄灭一次。

实验七 定时器中断实验

一. 实验简介

STM32 的定时器是一个通过可编程预分频器(PSC)驱动的 16 位自动装载计数器(CNT)构成。STM32 的通用定时器可以被用于:测量输入信号的脉冲长度(输入捕获)或者产生输出波形(输出比较和 PWM)等。使用定时器预分频器和 RCC 时钟控制器预分频器,脉冲长度和波形周期可以在几微秒到几毫秒间调整。STM32 的每个通用定时器都是完全独立的,没有互相共享的任何资源。

二.实验目的

熟练掌握定时器中断,学会对定时器中断的编程操作。

三.实验内容

使用定时器产生中断,然后在中断服务函数里面翻转 LED1 上的电平,来指示定时器中断的产生,修改中断时间。

四.实验设备

硬件部分:PC计算机(宿主机)、亮点STM32实验板、JLINK。

软件部分:PC机WINDOWS系统、MDK KEIL软件、ISP软件、串口调试助手。

五.实验步骤

1.参考教材定时器中断部分,编写定时器中断的驱动程序。2.编写主程序

3.编译代码,使用JLINK或ISP下载到实验板 4.记录实验过程,撰写实验报告

六.实验结果及测试

源代码:

七.实验总结

通过本次实验,认识到时间中断来控制LED灯的闪烁,同时也可以将时间中断应用到控制其他的程序块。

以TIME3为例产生中断的步骤为 1)TIM3 时钟使能。

2)设置 TIM3_ARR 和 TIM3_PSC 的值。

3)设置 TIM3_DIER 允许更新中断。

4)允许 TIM3 工作。

5)TIM3 中断分组设置。6)编写中断服务函数。

在中断产生后,通过状态寄存器的值来判断此次产生的中断属于什么类型。然后执行相关的操作,我们这里使用的是更新(溢出)中断,所以在状态寄存器 SR 的最低位。在处理完中断之后应该向 TIM3_SR 的最低位写 0,来清除该中断标志。

实验十三 ADC实验

一.实验简介

通过DAC将STM32系统的数字量转换为模拟量。使用ADC将模拟量转换为数字量。

二.实验目的

掌握DAC和ADC编程。

三.实验内容

编写代码实现简单的DAC单次发送

编写代码实现ADC采集DAC发送的数据,并发送到串口

四.实验设备

硬件部分:PC计算机(宿主机)、亮点STM32实验板、JLINK。

软件部分:PC机WINDOWS系统、MDK KEIL软件、ISP软件、串口调试助手。

五.实验步骤

1编写主程序

2编译代码,使用JLINK或ISP下载到实验板,使用串口调试助手观察数据 3记录实验过程,撰写实验报告

六.实验结果及测试

源代码:

七.实验总结

本节将利用 STM32的 ADC1 通道 0 来采样外部电压值,并在串口调试助手中显示出来。步骤如下:

1)开启 PA 口时钟,设置 PA0 为模拟输入。

2)使能 ADC1 时钟,并设置分频因子。

3)设置 ADC1 的工作模式。

4)设置 ADC1 规则序列的相关信息。

5)开启 AD 转换器,并校准。

6)读取 ADC 值。

在上面的校准完成之后,ADC 就算准备好了。接下来我们要做的就是设置规则序列 0 里面的通道,然后启动 ADC 转换。在转换结束后,读取 ADC1_DR 里面的值。

通过以上几个步骤的设置,可以正常的使用 STM32 的 ADC1 来执行 AD 转换操作。

通过本次实验的学习,我们了解了STM32 ADC的使用,但这仅仅是STM32强大的ADC 功能的一小点应用。STM32 的ADC 在很多地方都可以用到,其ADC 的DMA 功能是很不错的,实验十五 DMA实验

一. 实验简介

直接存储器存取(DMA)用来提供在外设和存储器之间或者存储器和存储器之间的高速数据传输。无须CPU干预,数据可以通过DMA快速地移动,这就节省了CPU的资源来做其他操作。

二.实验目的

熟练掌握DMA编程,学会对EPC02的读写操作,学习双缓冲兵乓操作,理解互斥资源。提高编程能力。

三.实验内容

利用外部按键KEY0 来控制DMA 的传送,每按一次KEY0,DMA 就传送一次数据

到USART1,然后在串口调试助手观察进度等信息。LED0 还是用来做为程序运行的指示灯。

这里我们使用到的硬件资源如下: 1)按键KEY0。2)指示灯LED0。

3)使用串口调试助手观察数据

四.实验设备

硬件部分:PC计算机(宿主机)、亮点STM32实验板、JLINK。

软件部分:PC机WINDOWS系统、MDK KEIL软件、ISP软件、网络调试助手。

五.实验步骤

1编写主程序

2编译代码,使用JLINK或ISP下载到实验板,使用串口调试助手观察数据 3记录实验过程,撰写实验报告

六.实验结果及测试

源代码:

伴随 LED0 的不停闪烁,提示程序在运行。我们打开串口调试助手,然后按KEY0,可以看到串口显示如下内容:

七.实验总结

本节利用 STM32 的 DMA 来实现串口数据传送,DMA通道的配置需要: 1)设置外设地址。

2)设置存储器地址。

3)设置传输数据量。

4)设置通道 4 的配置信息。

5)使能 DMA1 通道 4,启动传输。

通过以上 5 步设置,我们就可以启动一次 USART1 的 DMA 传输了。

DMA控制器对DMA请求判别优先级及屏蔽,向总线裁决逻辑提出总线请求。当CPU执行完当前总线周期即可释放总线控制权。此时,总线裁决逻辑输出总线应答,表示DMA已经响应,通过DMA控制器通知I/O接口开始DMA传输。

DMA控制器获得总线控制权后,CPU即刻挂起或只执行内部操作,由DMA控制器输出读写命令,直接控制RAM与I/O接口进行DMA传输。

在DMA控制器的控制下,在存储器和外部设备之间直接进行数据传送,在传送过中不需要中央处理器的参与。开始时需提供要传送的数据的起始位置和数据长度。

当完成规定的成批数据传送后,DMA控制器即释放总线控制权,并向I/O接口发出结束信号。当I/O接口收到结束信号后,一方面停 止I/O设备的工作,另一方面向CPU提出中断请求,使CPU从不介入的状态解脱,并执行一段检查本次DMA传输操作正确性的代码。最后,带着本次操作结果及状态继续执行原来的程序。

由此可见,DMA传输方式无需CPU直接控制传输,也没有中断处理方式那样保留现场和恢复现场的过程,通过硬件为RAM与I/O设备开辟一条直接传送数据的通路,使CPU的效率大为提高。

实验十六 I2C实验

一.实验简介

编程实现对使用I2C接口的EPC02芯片进行写和读操作。

二.实验目的

熟练掌握I2C编程,学会对EPC02的读写操作。

三.实验内容

编写I2C驱动程序,使用驱动程序初始化EPC02,判断设备正确性。

写256个0x5A到EPC02,读出并发送给串口,通过串口调试助手判别是否读到的都是0x5A.四.实验设备

硬件部分:PC计算机(宿主机)、亮点STM32实验板、JLINK。

软件部分:PC机WINDOWS系统、MDK KEIL软件、ISP软件、串口调试助手。

五.实验步骤

1参考教材I2C部分,编写I2C驱动程序。2编写主程序

3编译代码,使用JLINK或ISP下载到实验板 4记录实验过程,撰写实验报告

六.实验结果及测试

伴随 LED0 的不停闪烁,提示程序在运行。我们先按下KEY0,可以看到如下所示的内容,证明数据已经被写入到24C02了。

接着我们按KEY2,可以看我们刚刚写入的数据被显示出来了,如下图所示:

源代码:

七.实验总结

IIC是由数据线 SDA 和时钟 SCL 构成的串行总线,可发送和接收数据。在 CPU 与被控 IC 之间、IC 与 IC 之间进行双向传送,高速 IIC 总线一般可达 400kbps 以上。

IIC总线在传送数据过程中共有三种类型信号,它们分别是:开始信号、结束信号和应答信号。这些信号中,起始信号是必需的,结束信号和应答信号,都可以不要。程序在开机的时候会检测 24C02 是否存在,如果不存在则会在TFTLCD 模块上显示错误信息,同时LED0 慢闪。大家可以通过跳线帽把PC11 和PC12 短接就可以看到报错了。通过本次实验,我掌握了如何使用IIC写入与读出数据,学习了编写I2C驱动程序,使用驱动程序初始化EPC02,判断设备正确性,以及如何在助手上显示。

实验十七 SPI实验

一.实验简介

编程实现对SPI接口的W25Q64进行读写操作。

二.实验目的

熟练掌握SPI编程,学会对的W25Q64读写操作。

三.实验内容

1.2.3.4.5.编写SPI驱动程序 初始化SPI接口

读取SPIFLASH的ID,如果正确继续,否则报错

向SPIFALSH地址0x12AB00开始写一串字符,再读出比较判断是否与写入的一致 向SPIFALSH地址0x12AB00开始写连续256个字节的0x5A,然后读出并发送给串口,通过串口调试助手判别是否读到的都是0x5A.四.实验设备

硬件部分:PC计算机(宿主机)、亮点STM32实验板、JLINK。

软件部分:PC机WINDOWS系统、MDK KEIL软件、ISP软件、串口调试助手。

五.实验步骤

1参考SPI及SPI FLASH部分,编写SPI及SPI FLASH驱动程序(可参考书上代码)。2编写主程序

3编译代码,使用JLINK或ISP下载到实验板 4记录实验过程,撰写实验报告

六.实验结果及测试

源代码:

伴随 LED0 的不停闪烁,提示程序在运行。我们先按下KEY0,可以看到如图13.17.4.2 所示的内容,证明数据已经被写入到W25X16了。

接着我们按KEY2,可以看我们刚刚写入的数据被显示出来了,如下图所示:

七.实验总结

SPI 接口主要应用在EEPROM,FLASH,实时时钟,AD 转换器,还有数字信号处理器和数字信号解码器之间。SPI,是一种高速的,全双工,同步的通信总线,并且在芯片的管脚上只占用四根线,节约了芯片的管脚,同时为 PCB 的布局上节省空间,提供方便,正是出于这种简单易用的特性,现在越来越多的芯片集成了这种通信协议,STM32 也有 SPI 接口。

SPI 的设置步骤:

1)配置相关引脚的复用功能,使能 SPI时钟。

2)设置 SPI 工作模式。

3)使能 SPI。

程序在开机的时候会检测 W25X16 是否存在,如果不存在则会在TFTLCD 模块上显示错误信息,同时LED0 慢闪。大家可以通过跳线帽把PA5 和PA6 短接就可以看到报错了。通过本实验,我掌握了编写SPI程序写入和读取FLASH的方法,掌握了对学会对的W25Q64读写操作。对STM32开发板有了进一步的了解。

实验二十一 红外遥控实验

一. 实验简介

编程实现通过在 ALIENTEK MiniSTM32 开发板上实现红外遥控器的控制。

二.实验目的

掌握编程实现红外遥控控制开发板的方法。

三.实验内容

1.编写红外遥控驱动程序 2.编写红外遥控程序代码 3.使用红外遥控控制开发板

四.实验设备

硬件部分:PC计算机(宿主机)、亮点STM32实验板、JLINK。软件部分:PC机WINDOWS系统、MDK KEIL软件、ISP软件。

五.实验步骤

4.编写红外遥控驱动程序 5.编写红外遥控程序代码

6.编译代码,使用JLINK或ISP下载到实验板 7.记录实验过程,撰写实验报告

六.实验结果及测试

源代码:

使用串口调试助手观察数据

七.实验总结

红外遥控是一种无线、非接触控制技术,具有抗干扰能力强,信息传输可靠,功耗低,成本低,易实现等显著优点,被诸多电子设备特别是家用电器广泛采用,并越来越多的应用到计算机系统中。

通过本节实验,我学习到了如何编程使用红外遥控控制,在本程序中只是简单地输出一个数值,在以后的应用中可以实现更强大的功能,比如用红外远程输入控制开发板进行一些操作。对STM32有了进一步的认识。

实验二十二 DS18B20实验

一. 实验简介

一. 在ALIENTEK MiniSTM32 开发板上,通过 DS18B20 来读取环境温度值。

二.实验目的

巩固SPI编程。掌握使用感应器获取环境温度的方法。

三.实验内容

1.复位脉冲和应答脉冲

2.写时序

3.读时序

四.实验设备

硬件部分:PC计算机(宿主机)、亮点STM32实验板、JLINK。软件部分:PC机WINDOWS系统、MDK KEIL软件、ISP软件。

五.实验步骤

1.2.3.4.参考教材DS18B20编程部分,编写DS18B20驱动程序 编写主程序

编译代码,使用JLINK或ISP下载到实验板 记录实验过程,撰写实验报告

六.实验结果及测试

源代码:

使用串口调试助手观察数据:

七.实验总结

DS18B20 是由 DALLAS 半导体公司推出的一种的“一线总线”接口的温度传感器。与传统的热敏电阻等测温元件相比,它是一种新型的体积小、适用电压宽、与微处理器接口简单的数字化温度传感器。

通过本次实验,我认识到STM32的强大,在开发板上可以添加其他感应器从而实现更强大的功能。添加了DS18B20后的开发板可以感应外界的温度,通过公式计算显示出来。

第三篇:嵌入式实验报告

嵌入式系统及应用课 程设计报告

姓名:陈宥祎

班级:14级计算机01班 学号:1255010116 指导老师:黄卫红

按键输入实验

一.实验简介

在实验一的基础上,使用按键控制流水灯速度,及使用按键控制流水灯流水方向。

二.实验目的

熟练使用库函数操作GPIO,掌握中断配置和中断服务程序编写方法,掌握通过全局变量在中断服务程序和主程序间通信的方法。

三.实验内容

实现初始化GPIO,并配置中断,在中断服务程序中通过修改全局变量,达到控制流水灯速度及方向。

使用JLINK下载代码到目标板,查看运行结果,使用JLINK在线调试。

四.实验设备

硬件部分:PC计算机(宿主机)、亮点STM32实验板、JLINK、示波器。软件部分:PC机WINDOWS系统、MDK KEIL软件、ISP软件。

五.实验步骤

1在实验1代码的基础上,编写中断初始化代码

2在主程序中声明全局变量,用于和中断服务程序通信,编写完成主程序 3编写中断服务程序

4编译代码,使用JLINK下载到实验板 5.单步调试

6记录实验过程,撰写实验报告

六.实验结果及测试

源代码:

我们将通过MiniSTM32 板上载有的3个按钮,来控制板上的2个LED,其中KEY0控制LED0,按一次亮,再按一次,就灭。KEY1 控制LED1,效果同KEY0。KEY_2(KEY_UP),同时控制LED0 和LED1,按一次,他们的状态就翻转一次。

七.实验总结

通过本次实验,我学会了如何使用STM32 的IO 口作为输入用。TM32 的IO 口做输入使用的时候,是通过读取IDR 的内容来读取IO 口的状态的。这里需要注意的是 KEY0 和KEY1 是低电平有效的,而WK_UP 是高电平有效的,而且要确认WK_UP 按钮与DS18B20 的连接是否已经断开,要先断开,否则DS18B20 会干扰WK_UP按键!并且KEY0 和KEY1 连接在与JTAG 相关的IO 口上,所以在软件编写的时候要先禁用JTAG 功能,才能把这两个IO 口当成普通IO 口使用。

串口通信

一.实验简介

编写代码实现串口发送和接收,将通过串口发送来的数据回送回去。

二.实验目的

掌握STM32基本串口编程,进一步学习中断处理。

三.实验内容

编写主程序,初始化串口1,设置波特率为9600,无校验,数据位8位,停止位1位。编写中断服务程序代码实现将发送过来的数据回送。

四.实验设备

硬件部分:PC计算机(宿主机)、亮点STM32实验板、JLINK、示波器。

软件部分:PC机WINDOWS系统、MDK KEIL软件、ISP软件、串口调试助手。

五.实验步骤

1编写串口初始化代码

2编写中断服务程序代码

3编译代码,使用JLINK或ISP下载到实验板 4记录实验过程,撰写实验报告

六.实验结果及测试

源代码:

把代码下载到 MiniSTM32 开发板,可以看到板子上的LED0 开始闪烁,说明程序已经在跑了。接着我们打开串口调试助手,看到如下信息:

证明串口数据发送没问题。接着,我们在发送区输入上面的文字,输入完后按回车键。然后单击发送,可以得到如下结果:

七.实验总结

通过本次实验,我进一步了解了串口的使用,学会了通过串口发送和接收数据,将通过串

口发送来的数据回送回去。该实验的硬件配置不同于前两个实验,串口 1 与USB 串口默认是分开的,并没有在PCB上连接在一起,需要通过跳线帽来连接一下。这里我们把P4 的RXD 和TXD 用跳线帽与P3 的PA9 和PA10 连接起来。

外部中断

一.实验简介

STM32 的 IO 口在本章第一节有详细介绍,而外部中断在第二章也有详细的阐述。这里我们将介绍如何将这两者结合起来,实现外部中断输入。

二.实验目的

进一步掌握串口编程,进一步学习外部中断编程,提高编程能力。

三.实验内容

初始化IO口的输入,开启复用时钟,设置IO与中断的映射关系,从而开启与IO口相对应的线上中断事件,设置触发条件。配置中断分组(NVIC),并使能中断,编写中断服务函数。

四.实验设备

硬件部分:PC计算机(宿主机)、亮点STM32实验板、JLINK、示波器。

软件部分:PC机WINDOWS系统、MDK KEIL软件、ISP软件、串口调试助手。

五.实验步骤

1.2.3.4.编写中断服务程序代码 使用ISP下载到实验板 测试运行结果

记录实验过程,撰写实验报告

六.实验结果及测试

源代码:

打开串口助手。

七.实验总结

首先需要将IO设置为中断输入口: 1)初始化 IO 口为输入。

2)开启 IO 口复用时钟,设置 IO 口与中断线的映射关系。

3)开启与该 IO口相对的线上中断/事件,设置触发条件。

4)配置中断分组(NVIC),并使能中断。

5)编写中断服务函数。

这一节,使用的是中断来检测按键,通过 WK_UP 按键实现按一次 LED0 和 LED 1 同时翻转,按 KEY0 翻转 LED0,按 KEY1 翻转 LED1。试验中外部中断函数不能进入的原因分析 : 1)GPIO或者AFIO的时钟没有开启。2)GPIO和配置的中断线路不匹配。3)中断触发方式和实际不相符合。

4)中断处理函数用库函数时,写错,经常可能出现数字和字母之间没有下划线。5)外部中断是沿触发,有可能不能检测到沿,比如 中断线是低电平(浮空输入),触发是下降沿触发,可能会出现一直是低电平,高电平的时候是一样的情况,电平持续为高电平。

6)没有用软件中断来触发外部中断,调用函数EXTI_GenerateSWInterrupt;,因为软件中断先于边沿中断处理。

独立看门狗实验

一. 实验简介

独立看门狗(IWDG)由专用的低速时钟(LSI)驱动,即使主时钟发生故障它也仍然有效。窗口看门狗由从APB1时钟分频后得到的时钟驱动,通过可配置的时间窗口来检测应用程序非正常的过迟或过早的操作。

二.实验目的

通过编程,编写一个独立看门狗驱动程序

三.实验内容

启动 STM32 的独立看门狗,从而使能看门狗,在程序里面必须间隔一定时间喂狗,否则将导致程序复位。利用这一点,我们本章将通过一个 LED 灯来指示程序是否重启,来验证 STM32 的独立看门狗。

四.实验设备

硬件部分:PC计算机(宿主机)、亮点STM32实验板、JLINK。

软件部分:PC机WINDOWS系统、MDK KEIL软件、ISP软件、串口调试助手。

五.实验步骤

1.2.3.4.参考教材独立看门狗部分,编写独立看门狗驱动程序。建立和配置工程 编写代码

使用ISP下载到实验板

记录实验过程,撰写实验报告

六.实验结果及测试

源代码:

在配置看门狗后,看到LED0 不停的闪烁,如果WK_UP 按键按下,就喂狗,只要WK_UP 不停的按,看门狗就一直不会产生复位,保持LED0 的常亮,一旦超过看门狗定溢出时间(Tout)还没按,那么将会导致程序重启,这将导致LED0 熄灭一次。

七.实验总结

通过本次实验,我掌握了启动独立看门狗的步骤: 1)向 IWDG_KR 写入 0X5555。2)向 IWDG_KR 写入 0XAAAA。3)向 IWDG_KR 写入 0XCCCC。

通过上面 3个步骤,启动 STM32 的看门狗,从而使能看门狗,在程序里面就必须间隔一定时间喂狗,否则将导致程序复位。利用这一点,本章通过一个LED 灯来指示程序是否重启,来验证 STM32 的独立看门狗。在配置看门狗后,LED0 将常亮,如果 WK_UP 按键按下,就喂狗,只要 WK_UP 不停的按,看门狗就一直不会产生复位,保持 LED 0 的常亮,一旦超过看门狗溢出时间(Tout)还没按,那么将会导致程序重启,这将导致 LED 0 熄灭一次。

第四篇:嵌入式实验报告

西安邮电大学

嵌入式处理器及应用实验报告书

学院名称学生姓名专业名称班

: : : :

实验一

ADS 1.2 集成开发环境练习

一、实验目的:

了解ADS 1.2 集成开发环境的使用方法。

二、实验内容:

1.建立一个新的工程。

2.建立一个C源文件,并添加到工程中。3.设置文本编辑器支持中文。4.编译链接工程。5.调试工程。

三、实验步骤:

1.启动ADS 1.2 IDE集成开发环境,选择File—New,使用ARM Executable Image工程模板建立一个工程,工程名称为ADS。

2.选择File—New建立一个新的文件TEST1.S,设置直接添加到项目中,输入程序代码。3.由于ADS安装后默认字体是Courier New,对于中文支持不完善,因此建议修改字体。选择Edit—Perferences,在Font选项设置字体为Fixedsys,Script为CHINESE_GB2312。建议在Tab Inserts Spaces前打勾,使Tab键插入的是多个空格。

4.选择Edit—DebugRel Settings,在DebugRel Settings对话框的左边选择ARM Linker项,然后在Output页设置连接地址ROBase 为0x40000000,RW Base 为0x40003000,在Options页设置调试入口地址Image entry point 为 0x40000000。5.选择Project—Make,将编译链接整个工程。

6.选择Project—Debug,或单击快捷键F5,IDE环境就会启动AXD调试软件。

四、程序清单:

AREA

Example1,CODE,READONLY

;声明代码段Example1

ENTRY

;标识程序入口

CODE32

;声明32 位ARM 指令

START

MOV

R0,#15

;设置参数

MOV

R1,#8

ADDS

R0,R0,R1

;R0 = R0 + R1

B

START

END

五、心得体会:

通过本次实验,我熟悉了ADS 1.2 集成开发环境,学会了怎样建立工程,在工程里面建立文件和进行最基本的运行操作。我感触最深的是每次软件的开始使用是最关键的,想要掌握一个软件的使用必须进行多次的练习,多练几遍自然而然的会熟练的操作。

实验二

存储器访问指令练习实验

一、实验目的:

1.了解ADS 1.2 集成开发环境及ARMulator软件仿真。

2.掌握ARM7TDMI汇编指令的用法,并能编写简单的汇编程序。3.掌握指令的条件执行以及使用LDR/STR指令完成存储器的访问。

二、实验内容:

1.使用LDR指令读取0x40003100上的数据,将数据加1,若结果小于10,则使用STR指令把结果回写原地址;若结果大于或等于10,则把0写回原地址。

2.使用ADS 1.2软件仿真,单步、全速运行程序,设置断点,打开寄存器窗口(Processor Registers)监视R0和R1的值,打开存储器观察窗口(Memory)监视0x40003100上的值。

三、实验步骤:

1.启动ADS 1.2,使用ARM Executable Image工程模板建立一个工程Instruction2。2.建立汇编源文件TEST2.S,编写实验程序,然后添加到工程中。

3.设置工程链接地址ROBase 为0x40000000,RW Base 为0x40003000。设置调试入口地址Image entry point 为 0x40000000。

4.编译链接工程,选择Project —Debug,启动AXD进行软件仿真调试。

5.打开寄存器窗口(Processor Registers),选择Current 项监视R0和R1的值。打开存储器观察窗口(Memory)设置观察地址为0x40003100,显示方式Size为32Bit,监视0x40003100地址上的值。

四、程序清单:

COUNT

EQU

0x40003100

;定义一个变量,地址为0x40003100

AREA

Example2,CODE,READONLY;声明代码段Example2

ENTRY

;标识程序入口

CODE32

;声明32 位ARM 指令

START

LDR

R1,=COUNT

;R1 <= COUNT

MOV

R0,#0

;R0 <= 0

STR

R0,[R1]

;[R1] <= R0,即设置COUNT 为0

LOOP

LDR

R1,=COUNT

LDR

R0,[R1]

;R0 <= [R1]

ADD

R0,R0,#1

;R0 <= R0 + 1

CMP

R0,#10

;R0 与 10 比较,影响条件码标志

MOVHS

R0,#0

;若R0 大于等于 10,则此指令执行,R0 <= 0

STR

R0,[R1]

;[R1] <= R0,即保存COUNT

B

LOOP

END

五、心得体会:通过本次实验,让我更深一步的了解了ADS 1.2 集成开发环境及ARMulator软件仿真。通过对程序的解读,我掌握一些汇编指令的写法,同时也提高了我的读程序的能力。本次实验中我遇到了一个问题,在工程里加载文件的时候,没注意文件的后缀应为“。S”,结果造成文件加载失败。

实验三

数据处理指令练习实验

一、实验目的:

1.掌握ARM数据处理指令的使用方法。2.了解ARM指令灵活的第2个操作数。

二、实验内容:

1.使用MOV和MVN指令访问ARM通用寄存器。

2.使用ADD、SUB、AND、ORR、CMP和TST等指令完成数据加减运算及逻辑运算。

三、实验步骤:

1)启动ADS1.2,使用ARM Executable Image 工程模板建立一个工程Instruction3。2)建立汇编源文件TEST3.S ,编写实验程序,然后添加到工程中。

3)设置工程链接地址RO Base为0x40000000,RW Base为0x40003000。设置调试入口地址Image entry point 为 0x40000000。

4)编译链接工程,选择Project —Debug,启动AXD进行软件仿真调试。5)打开寄存器窗口(Processor Registers),选择Current 项监视各寄存器的值。6)单步运行程序,观察寄存器值的变化。

四、程序清单:

X

EQU

;定义X 的值为11

Y

EQU

;定义Y 的值为8

BIT23

EQU

(1<<23)

;定义BIT23 的值为0x00800000

AREA

Example3,CODE,READONLY

;声明代码段Example3

ENTRY

;标识程序入口

CODE32

;声明32 位ARM 指令

START

;使用MOV、ADD 指令实现:R8 = R3 = X + Y

MOV

R0,#X

;R0 <= X,X 的值必须是8 位图数据

MOV

R1,#Y

;R1 <= Y,Y 的值必须是8 位图数据

ADD

R3,R0,R1

;即是R3 = X + Y

MOV

R8,R3

;R8 <= R3

;使用MOV、MVN、SUB 指令实现:R5 = 0x5FFFFFF8y;

;

break;

;

case

7: x = key * y;

;

break;

;

default: x = 168;

SWITCH

CASE_0

CASE_2

CASE_3

CASE_5

CASE_7

;

break;;};设x 为R0,y 为R1,key 为R2(x、y、key 均为无符号整数)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

;用户(系统)模式堆栈空间

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

五、心得体会:通过本次实验,我较好的掌握了如何使用MRS/MSR指令实现ARM微控制器工作模式的切换。较好的了解了在各个工作模式下的寄存器。

实验六

C语言程序实验

一、实验目的:

通过实验了解使用ADS 1.2编写C语言程序,并进行调试。

二、实验内容:

编写一个汇编程序文件和一个C程序文件。汇编程序的功能是初始化堆栈指针和初始化C程序的运行环境,然后跳转到C程序运行,这就是一个简单的启动程序。C程序使用加法运算来计算1+2+3+…+(N-1)+N的值(N为0时,结果为0;N为1时,结果为1)。

三、实验步骤:

1.启动ADS1.2,使用ARM Executable Image 工程模板建立一个工程ProgramC。2.建立汇编源文件Startup.s和Test.c,编写实验程序,然后添加到工程中。

3.设置工程链接地址RO Base为0x40000000,RW Base为0x40003000。设置调试入口地址Image entry point 为 0x40000000。

4.设置位于开始位置的起始代码段:选择Edit—DebugRel Settings,在DebugRel Settings对话框的左边选择ARM Linker项,然后在Layout页设置Object/Symbol为Startup.o,Section为Start。

5.编译链接工程,选择Project—Debug,启动AXD进行软件仿真调试。6.在Startup.s的“B Main”处设置断点,然后全速运行程序。

7.程序在断点处停止。单步运行程序,判断程序是否跳转到C程序中运行。

选择Processor Views—Variables打开变量观察窗口,观察全局变量的值,然后单步/全速运行程序,判断程序的运算结果是否正确。

四、程序清单:

#define uint8

unsigned char

#define uint32

unsigned int

#define N

uint32 sum;

// 使用加法运算来计算 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

简单的起动代码

;起动文件。初始化 C 程序的运行环境,然后进入C 程序代码。

IMPORT

|Image$$RO$$Limit|

IMPORT

|Image$$RW$$Base|

IMPORT

|Image$$ZI$$Base|

IMPORT

|Image$$ZI$$Limit|

IMPORT

Main

;声明C 程序中的Main()函数

AREA

Start,CODE,READONLY

;声明代码段Start

ENTRY

;标识程序入口

CODE32

;声明32 位ARM 指令

Reset

LDR

SP,=0x40003F00

;初始化C 程序的运行环境

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

;跳转到 C 程序代码Main()函数

END

五、心得体会:通过本次实验,我学会并掌握使用ADS 1.2编写C语言程序,并进行调试。这次实验不同于前几次,必须在一个工程里面同时加载两个文件,分别是“。c”和“.s”文件。

第五篇:嵌入式实验报告

实验一 ARM汇编语言程序设计

一、实验目的

1.了解IAR Embedded Workbench 集成开发环境 2.掌握ARM汇编指令程序的设计及调试

二、实验设备

1.PC操作系统WIN98或WIN2000或WINXP,ADSI.2集成开发环境,仿真驱动程序

三、实验内容

1.熟悉IAR Embedded Workbench 集成开发环境

2.理解下列程序,新建工程,加入下面的程序,并观察实验结果,解释程序实现的功能

分析:该程序实现的功能是程序功能:Y = A*B+C*D+E*F 程序代码:

AREA Examl, CODE,READONLY;定义一个代码段 ENTRY

;程序入口

MOV R0,#0;设置R0寄存器的值为0 MOV R8,#0;设置R8寄存器的值为0 ADR R2,N;将R2寄存器的值设为数据域N的地址 LDR R1,[R2];将以R2的值为地址的数据读入R1 MOV R2,#0;设置R2的值为0 ADR R3,C;将R3寄存器的值设为数据域C的地址 ADR R5,X;将R5寄存器的值设为数据域X的地址 LOOP LDR R4,[R3,R8];将R3+R8的数据读入R4 LDR R6,[R5,R8];将R5+R8的数据读入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

执行结果如下:

3.实现1+2+3+4+····+100,求的值,并保存在地址0x90018的地址里面

程序代码:

MOV R0,#100;设置R0寄存器的值为100 LDR R2,=0X90018;设置R2寄存器指向地址0x90018 MOV R1,#0;设置R1的值为0 MOV R3,#0;设置R3的值为0 LOOP ADD R3,R3,R0;R3 = R3+R0 SUB R0,R0,#1;R0 = R0-1 CMP R0,R1;将R0和R1的值比较

BNE LOOP;不相等的话继续执行循环

STR R3,[R2];将R3的值装入到R2指向的地址块中。END 程序执行结果:程序执行完在0x90018内存入的数据是0x13ba即5050

实验二 ARM汇编语言程序设计

一、实验目的

1.了解ARM汇编语言的基本框架,学会使用ARM的汇编语言编程; 2.掌握ARM汇编指令中的堆栈指令的操作,以及存储器的装载指令操作。

二、实验设备 1.PC操作系统WIN98或WIN2000或WINXP,ADS1.2.集成开发环境,仿真器驱动程序。

三、实验内容

1.理解下列程序,新建工程,加入下面的程序,并观察实验结果

程序代码:

x EQU 15;定义常量x=15 y EQU 61;定义常量y=61 stack_top EQU 0X1000;定义堆栈栈顶地址为0x1000 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;程序结果为:r1 = x+y = 0x6D

2.编写程序循环R4~R11进行累加8次赋值,R4~R11初始值是1~8,每次操作后把R4~R11的内容放到SP栈中,SP初始设置为0x800,最后把R4~R11用LDMFD指令清空为0

程序代码如下: X EQU 1;定义常量x = 1 stack_top EQU 0X800;定义栈顶地址 ENTRY;MOV SP,#stack_top;将栈顶地址指向0x800 MOV R4,#1;设置R4 = 1 MOV R5,#2;设置R5 = 2 MOV R6,#3;设置R6 = 3 MOV R7,#4;设置R7 = 4 MOV R8,#5;设置R8 = 5 MOV R9,#6;设置R9 = 6 MOV R10,#7;设置R10 = 7 MOV R11,#8;设置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继续执行循环

LDMFD SP!,{R4-R11};将R4-R11清零 END;实验结果:主要实现将数据2-9,3-10,4-11……9-16压入堆栈(初始地址是0x800处开始),最后将R4-R11全部清零。

3.更改实验中1中的X,Y的值,观察期结果 程序代码:

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 程序结果为:r0 = x+y = 140 = 0X8C

实验三 ARM汇编语言程序设计

一、实验目的

1.了解ARM汇编语言的基本框架,学会使用ARM的汇编语言编程

2.掌握ARM汇编的存储器加载/存储指令,及if条件、循环、循环及循环的汇编实现

二、实验设备

1.PC操作系统WIN98或WIN2000或WINXP,ADS1.2集成开发环境,仿真器驱动程序

三、实验内容

1.理解下列程序,新建工程,加入下面的程序,并观察实验结果 程序代码:

Num EQU 20;定义常量Num = 20 START;LDR r0,=src;将src数据块的开始地址存入r0中 LDR r1,=dst;将dst数据块的开始地址存入r1中 MOV r2,#Num;设置r2的值为20 MOV sp,#0x400;堆栈指针sp指向0x400 blockcopy;MOVS r3,r2,LSR #3;将r2左移3位移入r3并且影响标志位 BEQ copywords;结果为0的话跳转到copywords STMFD SP!,{r4-r11};将r4-r11的值入栈 octcopy;LDMIA r0!,{r4-r11};将src的前8个字数据存入让r4-r11 STMIA r1!,{r4-r11};将r4-r11中的数据放入dst数据块中 SUBS r3,r3,#1;r3 = r3-1 BNE octcopy;结果不为0跳转到octcopy LDMFD SP!,{R4-R11};恢复原来的r4-r11 copywords;ANDS r2,r2,#7;r2 = r2&7 BEQ stop;结果为0跳转到stop wordcopy;LDR r3,[r0],#4;将r0指向的字数据放入r3中,r0 = r0+4 STR r3,[r1],#4;将r3中的数据存入到dst数据块中,r1 = r1+4 SUBS r2,r2,#1;r2 = r2-1 BNE wordcopy;不为0跳转到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;程序结果:将src的数据全部存入到dst中

2.新建工程,并自行编写程序,分别使用LDR,STR,LDMIA,STMIA操作,实现对某段连续存储单元写入数据,并观察结果 程序代码:

MOV R4,#1;设置r4 = 1; MOV R5,#2;设置r5 = 1; MOV R6,#3;设置r4 = 1;

LDR R0,=dst;R0保存dst的首地址

STR R4,[R0];将r4的值装入r0执行的内存中

STR R5,[R0,#4];将r5的值装入r0+4执行的内存中 STR R6,[R0,#8];将r6的值装入r0+8执行的内存中 LDR R7,=src;R0保存src的首地址

LDMIA R7,{R8-R10};将r7执行的地址的数据读入r8=r10 LDR R3,=N;r3保存N的首地址

STMIA R3!,{R8-R10};将r8-r10装入r3指向的内存 N DCD 0,0,0 src DCD 1,2,3 dst DCD 0,0,0 END 程序结果:熟悉使用LDMIA,STMIA和LDR,STR指令

3.使用ARM汇编指令实现if条件执行,使用ARM汇编指令实现for条件执行,使用ARM汇编指令实现while条件执行,使用ARM汇编指令实现do…while条件执行。程序代码:

实现if条件: MOV R0,#1 MOV R1,#2 CMP R0,R1 BGT LOOP1 BLT LOOP2 LOOP1 MOV R3,R0 LOOP2 MOV R3,R1 END 程序结果:

实现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 程序结果:

实现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 程序结果:

实验四 基于ARM的C语言程序设计

一、实验目的

1.了解ARM C语言的基本框架,学会使用ARM的C语言编程。2.掌握C语言和汇编语言编程的相互调用。

二、实验设备

1.EL-ARM-830教学实验箱,PentiumII以上的PC机,仿真器电缆。

三、ARM C语言简介与使用规则

1.ARM使用C语言编程是大势所趋

在应用系统的程序设计中,若所有的编程任务均由汇编语言来完成,其工作量巨大,并且不宜移植。由于ARM的程序执行速度较高,存储器的存储速度和存储量也很高,因此,C语言的特点充分发挥,使得应用程序的开发时间大为缩短,代码的移植十分方便,程序的重复使用率提高,程序架构清晰易懂,管理较为容易等等。因此,C语言的在ARM编程中具有重要地位。

2.ARM C语言程序的基本规则

在ARM程序的开发中,需要大量读写硬件寄存器,并且尽量缩短程序的执行时间的代码一般使用汇编语言来编写,比如ARM的启动代码,ARM的操作系统的移植代码等,除此之外,绝大多数代码可以使用C语言来完成。

C语言使用的是标准的C语言,ARM的开发环境实际上就是嵌入了一个C语言的集成开发环境,只不过这个开发环境和ARM的硬件紧密相关。

在使用C语言时,要用到和汇编语言的混合编程。当汇编代码较为简洁,则可使用直接内嵌汇编的方法,否则,使用将汇编文件以文件的形式加入项目当中,通过ATPCS的规定与C程序相互调用与访问。

ATPCS,就是ARM、Thumb的过程调用标准(ARM/Thumb Procedure Call Standard),它规定了一些子程序间调用的基本规则。如寄存器的使用规则,堆栈的使用规则,参数的传递规则等。

在C程序和ARM的汇编程序之间相互调用必须遵守ATPCS。而使用ADS的C语言编译器编译的C语言子程序满足用户指定的ATPCS的规则。但是,对于汇编语言来说,完全要依赖用户保证各个子程序遵循ATPCS的规则。具体来说,汇编语言的子程序应满足下面3个条件:

● 在子程序编写时,必须遵守相应的ATPCS规则; ● 堆栈的使用要遵守相应的ATPCS规则; ● 在汇编编译器中使用-atpcs选项。基本的ATPCS规定,请详见相关技术文档。

汇编程序调用C程序

汇编程序的设置要遵循ATPCS规则,保证程序调用时参数正确传递。在汇编程序中使用IMPORT伪指令声明将要调用的C程序函数。在调用C程序时,要正确设置入口参数,然后使用BL调用。

C程序调用汇编程序

汇编程序的设置要遵循ATPCS规则,保证程序调用时参数正确传递。

在汇编程序中使用EXPORT伪指令声明本子程序,使其他程序可以调用此子程序。在C语言中使用extern关键字声明外部函数(声明要调用的汇编子程序)。

在C语言的环境内开发应用程序,一般需要一个汇编的启动程序,从汇编的启动程序,跳到C语言下的主程序,然后,执行C程序,在C环境下读写硬件的寄存器,一般是通过宏调用,在每个项目文件的Startup44b0/INC目录下都有一个44b.h的头文件,那里面定义了所有关于44B0的硬件寄存器的宏,对宏的读写,就能操作44B0的硬件。

具体的编程规则同标准C语言。

四、实验内容

1、理解下列程序,新建工程,加入下面的程序,并观察实验结果。程序代码:

/*实现5个数的相加*/ int sum5(int a,int b,int c,int d,int e){ return(a+b+c+d+e);};汇编语言

IMPORT sum5;声明调用c函数 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的值入栈当做第五个参数 ADD R3,R1,R1;R3 = R3+R1=4 BL sum5;调用sum5 ADD SP,SP,#4;sp = sp+4 LDMFD SP,{PC} 程序结果:实现了i+2i+3i+4i+5i的汇编语言调用c语言

2、用汇编语言实现1到100累加的函数,用C言语编写主程序,在主程序中调用所编写的汇编函数 程序代码:

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 extern void sum5(int x);int main(void){ const int n = 100;sum5(n);return(0);} 程序结果:

总结

本次实验主要是通过对ARM的各种指令进行操作,通过对这些指令的应用,让我们学会了如何使用汇编来进行编程,掌握汇编编程和C语言编程的技巧,并且能够熟练的使用汇编语言,深刻理解ARM的工作。并且培养了我们写代码的能力以及对代码的阅读能力和修改能力。为我们在以后的学习和生活中更实用ARM,利用汇编进行编程奠定了一定的基础!

下载嵌入式实验报告(小编整理)word格式文档
下载嵌入式实验报告(小编整理).doc
将本文档下载到自己电脑,方便修改和收藏,请勿使用迅雷等下载。
点此处下载文档

文档为doc格式


声明:本文内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:645879355@qq.com 进行举报,并提供相关证据,工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。

相关范文推荐

    嵌入式实验报告

    北京科技大学 黄强41050176 嵌入式实验报告 实验一 建立并编译WinCE平台 【实验目的】 掌握PB下WinCE平台的定制 【实验内容】 开始利用Platform Builder定制平台并编译 【......

    嵌入式实验报告

    计算机专业类课程 实验报告 课程名称:嵌入式微处理器系统及应用 学 院:计算机科学与工程 专 业:计算机科学与技术 学生姓名:廖雪平学 号:2011060120003 指导教师:陈丽蓉 日 期:201......

    嵌入式实验报告

    《嵌入式Linux实验开发》 ——实验二、安装和备份Linux 系统 ——实验三、ADS 集成开发环境的使用 ——实验四、在虚拟机中安装linux ——实验五、虚拟机和主机数据通信......

    嵌入式实验报告二(精选合集)

    嵌入式 实验报告二 二实验时间 2013/6/9 报告人一、实验目的:1.学习cygwin; 2.通过上机实验,使学生验证、巩固和充实所学理论知识,加深对相关内容的理解,了解嵌入式 Linux 的工具......

    浙工大 嵌入式实验报告

    金艳霞 通信2班201203110210 实验五 Linux交叉编译平台 一、 实验目的 1. 掌握一些基本的linux读写操作 2. 利用vcc编译c程序 3. 通过nfs挂载到实验箱中,利用交叉编译执行文......

    嵌入式操作系统实验报告

    实验一 嵌入式开发环境的建立 一、实验目的 通过此实验系统,读者可以了解嵌入式实时操作系统 uC/OS-II 的内核机制和运行原理。本实验系统展示了 uC/OS-II 各方面的管理功能,......

    嵌入式系统实验报告

    嵌入式系统实验报告 学号: 姓 名: 班 级:13电子信息工程指导老师: 苏州大学 电子信息学院 2016年12月 实验一:一个灯的闪烁 1、实验要求 实现PF6-10端口所连接的任意一个LED灯......

    嵌入式实验报告五

    嵌入式实验报告五实验时间2013/6/9报告人一、实验目的: 1.嵌入式文件烧写; 2.通过上机实验,使学生验证、巩固和充实所学理论知识,加深对相关内容的理解,了解嵌入式操作系统的镜像文......