嵌入式系统实训报告--走马灯
嵌入式系统实训报告5--走马灯

《嵌入式系统技术》实训报告1、实验目的z 熟悉ADS开发环境调试环境。
z 掌握简单的ARM汇编指令的使用方法。
z 掌握S3C2440A的I/O控制寄存器的配置。
z 掌握ARM汇编指令和C语言相互调用的方法2、实验设备z PC机、ARM仿真器、2440实验箱、串口线。
3、实验内容z 熟悉ARM开发环境的建立。
z 使用ARM汇编和C语言设置GPIO 口的相应寄存器。
z 编写跑马灯程序。
4、实验原理C程序与汇编程序相互调用规则为了使单独编译的C语言程序和汇编程序之间能够相互调用,必须为子程序间的调用规定一定的规贝农ATPCS即ARM Thumb过程调用标准(ARM/Thumb Procedure Call Standard),是ARM程序和Thumb程序中子程序调用的基本规则,它规定了一些子程序间调用的基本规则,如子程序调用过程中的寄存器的使用规则,堆栈的使用规则,参数的传递规则等。
下面结合实际介绍几种ATPCS规则,如果读者想了解更多的规则,可以查看相关的书籍籍。
1. 基本ATPCS基本ATPCSS定了在子程序调用时的一些基本规则,包括下面3方面的内容:(1) 各寄存器的使用规则及其相应的名称。
(2) 数据栈的使用规则。
(3) 参数传递的规则。
相对于其它类型的ATPCS满足基本ATPCS勺程序的执行速度更快,所占用的内存更少。
但是它不能提供以下的支持:ARM程序和Thumb程序相互调用,数据以及代码的位置无关的支持,子程序的可重入性,数据栈检查的支持。
而派生的其他几种特定的ATPCS就是在基本ATPCS的基础上再添加其他的规则而形成的。
其目的就是提供上述的功能。
2.寄存器的使用规则寄存器的使用必须满足下面的规则:(1) 子程序间通过寄存器R0〜R3来传递参数。
这时,寄存器R0〜R3可以记作A0〜A3。
被调用的子程序在返回前无需恢复寄存器R0〜R3的内容。
(2) 在子程序中,使用寄存器R4〜RII来保存局部变量。
嵌入式实训跑马灯报告

一、引言随着科技的飞速发展,嵌入式系统在各个领域得到了广泛的应用。
为了更好地了解嵌入式系统的开发过程,提高自己的实践能力,我参加了嵌入式实训课程,并完成了跑马灯项目的开发。
本文将详细介绍跑马灯项目的背景、设计思路、实现过程以及总结和反思。
二、项目背景跑马灯是一种常见的嵌入式应用,其基本功能是在屏幕上显示不断滚动的文字。
跑马灯项目旨在通过实践,让我们掌握嵌入式系统开发的基本流程,包括硬件选型、软件开发、调试与优化等。
三、设计思路1. 硬件选型跑马灯项目主要涉及硬件部分有:单片机、显示模块、按键模块、电源模块等。
考虑到成本和易用性,我选择了基于STC89C52单片机的硬件平台,该单片机具有丰富的外设资源,且价格低廉。
2. 软件设计跑马灯项目主要涉及软件设计,包括主程序、显示模块、按键模块等。
(1)主程序:负责跑马灯的基本功能,包括文字显示、滚动速度调整、按键控制等。
(2)显示模块:负责将文字显示在屏幕上,包括字体选择、颜色设置等。
(3)按键模块:负责实现按键功能,包括启动/停止跑马灯、调整滚动速度等。
3. 调试与优化在软件开发过程中,需要不断调试和优化程序,以提高跑马灯的性能。
主要优化方向包括:(1)优化程序结构,提高代码可读性和可维护性。
(2)优化显示模块,提高显示效果。
(3)优化按键模块,提高按键响应速度。
四、实现过程1. 硬件搭建首先,根据设计图纸,焊接电路板,连接单片机、显示模块、按键模块等硬件设备。
2. 软件编写(1)主程序:编写主程序,实现跑马灯的基本功能。
(2)显示模块:编写显示模块,实现文字显示、颜色设置等功能。
(3)按键模块:编写按键模块,实现按键控制功能。
3. 调试与优化在软件开发过程中,使用示波器、逻辑分析仪等工具进行调试,观察程序运行情况,发现问题并及时修改。
经过多次调试,跑马灯项目最终实现预期功能。
五、总结与反思1. 总结通过本次嵌入式实训,我掌握了跑马灯项目的开发过程,包括硬件选型、软件开发、调试与优化等。
可调控走马灯实训报告

一、摘要本次实训旨在通过设计与实现一个可调控走马灯,提升自己在电子设计、编程以及项目实践能力方面的技能。
在实训过程中,我学习了电路设计、微控制器编程、电机驱动等方面的知识,并通过动手实践,完成了一个具有自主调控功能的走马灯。
本报告将详细描述实训过程、遇到的问题及解决方案,以及对实训成果的总结与反思。
二、实训背景走马灯是一种传统的照明设备,具有美观、节能、环保等特点。
然而,传统的走马灯多为固定模式,缺乏可调控性。
为了提高走马灯的实用性,本次实训旨在设计并实现一个可调控走马灯,使其能够根据用户需求调整灯光模式、速度和亮度。
三、实训目标1. 学习电路设计、微控制器编程、电机驱动等方面的知识;2. 设计并实现一个可调控走马灯,具备以下功能:(1)灯光模式可调:可切换循环、闪烁、渐变等模式;(2)速度可调:可调整灯光闪烁速度;(3)亮度可调:可调整灯光亮度;(4)使用方便:通过按键实现模式、速度和亮度的切换。
四、实训过程1. 硬件设计(1)电路设计:根据实训要求,设计电路图,包括微控制器、按键、电机驱动、电源模块等。
(2)电路制作:根据电路图,制作电路板,并焊接元器件。
2. 软件设计(1)编程:使用C语言编写微控制器程序,实现走马灯的灯光模式、速度和亮度调节。
(2)调试:通过调试软件,对程序进行调试,确保程序运行正常。
3. 系统集成(1)安装:将微控制器、电机驱动、电源模块等安装到电路板上。
(2)调试:对走马灯进行整体调试,确保各个模块协同工作。
五、遇到的问题及解决方案1. 问题:电机启动时电流过大,导致电源不稳定。
解决方案:在电机驱动电路中增加限流电阻,降低启动电流。
2. 问题:按键响应速度慢,影响用户体验。
解决方案:优化程序算法,提高按键响应速度。
3. 问题:灯光亮度调节范围较小。
解决方案:调整电源电压,扩大亮度调节范围。
六、实训成果通过本次实训,我成功设计并实现了一个可调控走马灯。
该走马灯具有以下特点:1. 灯光模式可调,满足不同场景需求;2. 速度可调,适应不同使用习惯;3. 亮度可调,满足个性化需求;4. 使用方便,操作简单。
蜡烛走马灯制作实训报告

一、实训目的本次实训旨在通过亲手制作蜡烛走马灯,了解其制作原理,锻炼动手能力,增强对传统玩具文化的认识,同时培养创新精神和实践能力。
二、实训时间2023年10月26日三、实训地点学校实验室四、实训内容1. 走马灯的制作原理走马灯是一种利用热空气上升原理产生旋转的玩具。
其基本原理是:点燃蜡烛后,蜡烛燃烧产生的热量使周围空气温度升高,密度减小,热空气上升,带动风轮旋转。
风轮上的剪纸或图案随之转动,形成动态的画面。
2. 走马灯的制作步骤(1)材料准备:圆形纸板、细铁丝、蜡烛、剪刀、胶水、彩纸、铅笔、直尺等。
(2)制作风轮:将圆形纸板沿直径剪开,形成两个半圆形。
在半圆形纸板的一端,用剪刀剪出若干个等距离的缺口,作为风轮的叶片。
将两个半圆形纸板对折,用胶水粘合,形成风轮。
(3)制作灯罩:取一张正方形纸板,沿对角线剪开,形成两个等腰直角三角形。
将两个等腰直角三角形粘合,形成灯罩。
在灯罩上画上图案,增加美观。
(4)制作底座:取一根细铁丝,一端弯成烛台形状,另一端固定在圆形纸板的中心。
将蜡烛放在烛台上,点燃蜡烛。
(5)组装走马灯:将风轮放在底座上,调整位置使风轮与蜡烛垂直。
将灯罩放在风轮上,调整位置使灯罩与风轮平行。
五、实训过程1. 准备材料:按照实训内容准备所需材料。
2. 制作风轮:按照步骤(2)制作风轮。
3. 制作灯罩:按照步骤(3)制作灯罩。
4. 制作底座:按照步骤(4)制作底座。
5. 组装走马灯:按照步骤(5)组装走马灯。
6. 点燃蜡烛,观察走马灯的旋转情况。
六、实训结果经过一系列的制作过程,成功制作出一只蜡烛走马灯。
点燃蜡烛后,走马灯的叶片开始旋转,灯罩上的图案也随之转动,形成动态的画面。
七、实训心得1. 通过本次实训,我对走马灯的制作原理有了更深入的了解,对传统玩具文化有了更深刻的认识。
2. 实训过程中,我锻炼了动手能力,培养了创新精神和实践能力。
3. 在制作过程中,我遇到了一些问题,如风轮叶片的开口方向、灯罩与风轮的平行度等。
嵌入式跑马灯实验报告

嵌入式跑马灯实验报告嵌入式跑马灯实验报告引言:嵌入式系统是现代科技中的重要一环,它融合了计算机科学和电子工程的知识,被广泛应用于各个领域。
而跑马灯作为嵌入式系统中的一个经典实验,不仅能够帮助我们理解嵌入式系统的原理,还能够培养我们的动手能力和创新思维。
本篇实验报告将详细介绍嵌入式跑马灯实验的设计与实现过程,并总结实验中的收获和经验。
一、实验背景跑马灯是一种常见的电子显示器件,它能够按照一定的规律闪烁或滚动显示文字、图案等内容。
在本次实验中,我们将使用嵌入式系统来设计一个跑马灯,并通过编程控制其显示效果,从而加深对嵌入式系统的理解和应用。
二、实验材料1. 嵌入式开发板:我们选择了一款基于ARM架构的开发板,具有较高的性能和丰富的外设接口,适合进行跑马灯实验。
2. LED灯:我们使用了8个LED灯作为跑马灯的显示元素,通过控制每个LED的亮灭状态,实现跑马灯的效果。
3. 连接线:用于将开发板和LED灯进行连接,确保信号的传输和控制的准确性。
三、实验设计与实现1. 硬件连接:首先,我们将LED灯与开发板的GPIO口进行连接。
通过查阅开发板的引脚图,我们确定了每个LED灯对应的GPIO引脚,并使用连接线将它们相连。
2. 系统初始化:在嵌入式开发环境中,我们编写了初始化代码,用于配置GPIO 口的工作模式和初始化LED灯的状态。
通过设置引脚为输出模式,并将其电平置低,我们确保了LED灯的初始状态为熄灭。
3. 跑马灯效果实现:为了实现跑马灯的效果,我们编写了一个循环程序。
在每个循环中,我们通过改变LED灯的亮灭状态,实现灯光的闪烁。
具体而言,我们使用一个变量来表示当前亮灯的位置,然后将该位置对应的LED引脚电平置高,其他LED引脚电平置低。
随后,我们通过延时函数控制灯光的亮灭时间,再将亮灯位置变量进行更新,实现灯光的移动效果。
通过不断循环执行该程序,我们可以看到跑马灯的效果。
4. 实验调试:在实验过程中,我们发现了一些问题,例如灯光闪烁过快或过慢、灯光移动的不连续等。
跑马灯实验报告

一、实验目的1. 熟悉嵌入式系统硬件电路的搭建与调试;2. 掌握C语言编程,实现跑马灯功能;3. 理解并掌握GPIO口操作,学习定时器中断的使用。
二、实验环境1. 开发板:STM32F103C8T6开发板2. 编译器:Keil uVision53. 软件库:STM32标准外设库三、实验原理跑马灯实验是通过控制LED灯的亮灭,实现LED灯依次点亮的效果。
实验原理如下:1. GPIO口控制:将LED灯连接到开发板的GPIO口,通过控制GPIO口的输出电平,实现LED灯的点亮与熄灭;2. 定时器中断:定时器产生中断,实现LED灯点亮与熄灭的时间间隔;3. 循环控制:通过循环控制LED灯的点亮顺序,实现跑马灯效果。
四、实验步骤1. 硬件电路搭建(1)将LED灯的正极连接到开发板的GPIO口,负极接地;(2)将开发板的电源和地线连接到电源模块。
2. 软件编程(1)在Keil uVision5中创建项目,并导入STM32标准外设库;(2)编写程序,实现以下功能:a. 初始化GPIO口,将LED灯连接的GPIO口配置为输出模式;b. 初始化定时器,设置定时器中断周期,使LED灯点亮与熄灭的时间间隔为1ms;c. 编写定时器中断服务程序,控制LED灯的点亮与熄灭;d. 编写主函数,实现LED灯依次点亮的效果。
3. 编译与下载(1)编译程序,生成可执行文件;(2)将开发板连接到计算机,通过串口下载程序到开发板。
4. 实验调试(1)打开串口调试助手,观察LED灯的点亮与熄灭效果;(2)调整程序参数,优化跑马灯效果。
五、实验结果与分析1. 实验结果(1)LED灯依次点亮,实现跑马灯效果;(2)LED灯点亮与熄灭的时间间隔可调。
2. 实验分析(1)通过控制GPIO口的输出电平,实现LED灯的点亮与熄灭;(2)定时器中断实现LED灯点亮与熄灭的时间间隔控制;(3)循环控制实现LED灯依次点亮的效果。
六、实验总结本次实验成功实现了跑马灯功能,加深了对嵌入式系统硬件电路、C语言编程和GPIO口操作的理解。
嵌入式系统实验报告

实验报告课程名称:嵌入式系统学院:信息工程专业:电子信息工程班级:学生姓名:学号:指导教师:开课时间:学年第一学期实验名称:IO接口(跑马灯)实验时间:11.16 实验成绩:一、实验目的1.掌握 STM32F4 基本IO口的使用。
2.使用STM32F4 IO口的推挽输出功能,利用GPIO_Set函数来设置完成对 IO 口的配置。
3.控制STM32F4的IO口输出,实现控制ALIENTEK 探索者STM32F4开发板上的两个LED实现一个类似跑马灯的效果。
二、实验原理本次实验的关键在于如何控制STM32F4的IO口输出。
IO主要由:MODER、OTYPER、OSPEEDR、PUPDR、ODR、IDR、AFRH和AFRL等8个寄存器的控制,并且本次实验主要用到IO口的推挽输出功能,利用GPIO_Set函数来设置,即可完成对IO口的配置。
所以可以通过了开发板上的两个LED灯来实现一个类似跑马灯的效果。
三、实验资源实验器材:探索者STM32F4开发板硬件资源:1.DS0(连接在PF9)2.DS1(连接在PF10)四、实验内容及步骤1.硬件设计2.软件设计(1)新建TEST工程,在该工程文件夹下面新建一个 HARDWARE文件夹,用来存储以后与硬件相关的代码。
然后在 HARDWARE 文件夹下新建一个LED文件夹,用来存放与LED相关的代码。
(2)打开USER文件夹下的test.uvproj工程,新建一个文件,然后保存在 LED 文件夹下面,保存为 led.c,在led.c中输入相应的代码。
(3)采用 GPIO_Set 函数实现IO配置。
LED_Init 调用 GPIO_Set 函数完成对 PF9 和 PF10 ALIENTEK 探索者 STM32F407 开发板教程 119 STM32F4 开发指南(寄存器版) 的模式配置,控制 LED0 和 LED1 输出 1(LED 灭),使两个 LED 的初始化。
嵌入式系统原理实验三跑马灯

实验三跑马灯实验实验目的:通过一个经典的跑马灯程序,了解STM32F1 的IO 口作为输出使用的方法。
通过代码控制ALIENTEK 战舰STM32 开发板上的两个LED:DS0 和DS1 交替闪烁,实现类似跑马灯的效果内容要点:1.硬件设计本章用到的硬件只有LED(DS0 和DS1)。
其电路在ALIENTEK 战舰STM32F103开发板上默认是已经连接好了的。
DS0 接PB5,DS1 接PE5。
所以在硬件上不需要动任何东西。
其连接原理图如图:2.软件设计跑马灯实验我们主要用到的固件库文件是:stm32f10x_gpio.c /stm32f10x_gpio.hstm32f10x_rcc.c/stm32f10x_rcc.hmisc.c/ misc.hstm32f10x_usart /stm32f10x_usart.h其中stm32f10x_rcc.h 头文件在每个实验中都要引入,因为系统时钟配置函数以及相关的外设时钟使能函数都在这个其源文件stm32f10x_rcc.c 中。
stm32f10x_usart.h 和misc.h 头文件在我们SYSTEM 文件夹中都需要使用到,所以每个实验都会引用。
首先,找到之前新建的Template 工程,在该文件夹下面新建一个HARDWARE的文件夹,用来存储以后与硬件相关的代码,然后在HARDWARE 文件夹下新建一个LED 文件夹,用来存放与LED 相关的代码。
新建led.h和led.c文件,一个外设对应一个.h和.c文件。
在Manage Components 管理里面新建一个HARDWARE 的组,并把led.c 加入到这个组里面,将led.h 头文件的路径加入到工程里面一般的头文件有固定的格式,多个地方调用头文件会重复引用,为了避免头文件内容重复引用,一般通过预编译的方式来写头文件。
一般的格式如下:#ifndef __LED_H#define __LED_H……#endif第一次调用时会将#define下面这一节全部定义,重复调用时,下面的东西就不会被引用。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
《嵌入式系统技术》实训报告1、实验目的z熟悉A DS 开发环境调试环境。
z掌握简单的A RM 汇编指令的使用方法。
z掌握S3C2440A 的I/O 控制寄存器的配置。
z掌握A RM 汇编指令和C语言相互调用的方法2、实验设备z PC 机、ARM 仿真器、2440 实验箱、串口线。
3、实验内容z熟悉A RM 开发环境的建立。
z使用A RM 汇编和C语言设置G PIO 口的相应寄存器。
z编写跑马灯程序。
4、实验原理C 程序与汇编程序相互调用规则为了使单独编译的C 语言程序和汇编程序之间能够相互调用,必须为子程序间的调用规定一定的规则。
ATPCS ,即ARM ,Thumb 过程调用标准(ARM/Thumb Procedure Call Standard),是A RM 程序和T humb 程序中子程序调用的基本规则,它规定了一些子程序间调用的基本规则,如子程序调用过程中的寄存器的使用规则,堆栈的使用规则,参数的传递规则等。
下面结合实际介绍几种A TPCS 规则,如果读者想了解更多的规则,可以查看相关的书籍。
1.基本A TPCS基本A TPCS 规定了在子程序调用时的一些基本规则,包括下面3方面的内容:(1)各寄存器的使用规则及其相应的名称。
(2)数据栈的使用规则。
(3)参数传递的规则。
相对于其它类型的A TPCS,满足基本A TPCS 的程序的执行速度更快,所占用的内存更少。
但是它不能提供以下的支持:ARM 程序和T humb 程序相互调用,数据以及代码的位置无关的支持,子程序的可重入性,数据栈检查的支持。
而派生的其他几种特定的ATPCS 就是在基本ATPCS 的基础上再添加其他的规则而形成的。
其目的就是提供上述的功能。
2.寄存器的使用规则寄存器的使用必须满足下面的规则:(1) 子程序间通过寄存器R0~R3 来传递参数。
这时,寄存器R0~R3 可以记作A0~A3。
被调用的子程序在返回前无需恢复寄存器R0~R3 的内容。
(2) 在子程序中,使用寄存器R4~Rll 来保存局部变量。
这时,寄存器R4~R11 可以记作V1~V8。
如果在子程序中使用到了寄存器V1~V8 中的某些寄存器,子程序进入时必须保存这些寄存器的值,在返回前必须恢复这些寄存器的值;对于子程序中没有用到的寄存器则不必进行这些操作。
在T humb 程序中,通常只能使用寄存器R4~R7 来保存局部变量。
(3) 寄存器R12 用作子程序间s cratch 寄存器,记作I P。
在子程序间的连接代码段中常有这种使用规则。
(4) 寄存器R13 用作数据栈指针,记作S P。
在子程序中寄存器R13 不能用作其他用途。
寄存器S P 在进入子程序时的值和退出子程序时的值必须相等。
(5) 寄存器R14称为连接寄存器,记作LR。
它用于保存子程序的返回地址。
如果在子程序中保存了返回地址,寄存器R14则可以用作其他用途。
(6) 寄存器R15 是程序计数器,记作P C。
它不能用作其他用途。
3.参数传递规则根据参数个数是否固定可以将子程序分为参数个数固定的(nonvariadic)子程序和参数个数可变的(variadic)子程序。
这两种子程序的参数传递规则是不同的。
(1)参数个数可变的子程序参数传递规则对于参数个数可变的子程序,当参数不超过4个时,可以使用寄存器R0~R3 来传递参数;当参数超过4个时,还可以使用数据栈来传递参数。
在参数传递时,将所有参数看作是存放在连续的内存字单元中的字数据。
然后,依次将各字数据传送到寄存器R0、R1、R2、R3 中,如果参数多于4个,将剩余的字数据传送到数据栈中,入栈的顺序与参数顺序相反,即最后一个字数据先入栈。
按照上面的规则,一个浮点数参数可以通过寄存器传递,也可以通过数据栈传递,也可能一半通过寄存器传递,另一半通过数据栈传递。
(2)参数个数固定的子程序参数传递规则对于参数个数固定的子程序,参数传递与参数个数可变的子程序参数传递规则不同。
如果系统包含浮点运算的硬件部件,浮点参数将按照下面的规则传递:·各个浮点参数按顺序处理。
·为每个浮点参数分配F P 寄存器。
·分配的方法是,满足该浮点参数需要的且编号最小的一组连续的FP 寄存器。
第一个整数参数,通过寄存器R0~R3 来传递。
其他参数通过数据栈传递。
(3)子程序结果返回规则子程序中结果返回的规则如下:·结果为一个32 位的整数时,可以通过寄存器R0 返回。
·结果为一个64 位整数时,可以通过寄存器R0 和R l 返回,依次类推。
·结果为一个浮点数时,可以通过浮点运算部件的寄存器f0、d0 或者s0 来返回。
·结果为复合型的浮点数(如复数)时,可以通过寄存器f0~fN 或者d0~dN 来返回。
·对于位数更多的结果,需要通过内存来传递。
4.C 语言函数和A RM 汇编语言函数间相互调用高级语言函数与汇编语言函数的混合调用也要遵循A TPCS 规则,保证程序调用时参数的正确传递。
在汇编程序中使用EXPORT 伪指令声明本子程序,使其它程序可以调用此子程序,而在C语言程序中使用ex tern 关键字声明外部函数(声明要调用的汇编子程序),即可调用此汇编子程序。
下面给出两个例子来介绍函数相互调用。
例 C 函数中调用汇编示例中汇编子程序strcopy 使用两个参数,一个表示目标字符串地址,一个表示源字符串的地址,参数分别存放R0,R1 寄存器中。
#include <stdio.h>extern void strcopy(char*d,const char*s) //声明外部函数。
即要调用的汇编子程序int mian (void){const char *srcstr= "First string-source";//定义字符串常量char dstsrt[] = "Second string-destination";//定义字符串变量printf( "Before copying:/n" );printf ( "'%s' \n `%s/n," srcstr,dststr) ;//显示源字符串和目标字符串的内容strcopy(dststr,srcstr) ;//调用汇编子程序,R0=dststr,R1=srcstrprintf( "After copying:\n" )printf ( "' %s' \n '%s\n," srcstr,dststr) ;//显示s trcopy 复制字符串结果return(0);}被调用汇编子程序:AREA SCopy,CODE,READONL YEXPORT strcopy ;声明s trcopy,以便外部程序引用strcopy;R0 为目标字符串的地址;R1 为源字符串的地址LDRB R2,[R1],#1 ;读取字节数据,源地址加lSTRB R2,[R0],#1 ;保存读取的1字节数据,目标地址加1CMP r2,#0 ;判断字符串是否复制完BNE strcopy ;没有复制完毕,继续循环MOV pc,1r ;返回END例汇编程序调用C程序汇编程序的设置要遵循A TPCS 规则,保证程序调用时参数的正确传递。
在汇编程序中使用I MPORT 伪指令声明将要调用的C程序函数。
在调用C程序时,要正确设置入口参数,然后使用B L 调用。
示例程序中使用了5个参数,分别使用寄存器R0 存储第1个参数,R1 存储第2个数,R2 存储第3个参数,R3 存储第4个参数,第5个参数利用堆栈传送。
由于利用了堆栈传递参数,在程序调用结果后要调整堆栈指针。
汇编调用C程序的汇编程序/*函数s um ()返回5个整数的和*/int sum (int a,lit b,int c,int d,int e){return(a+b+c+d+e);//返回5个变量的和}EXPORT CALLSUMAREA Example,CODE,READONLYIMPORT sum ;声明外部标号s um5,即C函数s um5() CALLSUM STMFD SP!{LR} ;LR 寄存器堆栈ADD R1,R0,R0 ;设置s um 函数入口参数,R0 为参数aADD R2,R1,R0 ;R1 为参数b,R2 为参数cADD R3,R1,R2,STR R3,[SP,#-4]! ;参数e要通过堆栈传递ADD R3,R1,R1 ;R3 为参数dBL sum ;调用s um(),结果保存在R0ADD SP,SP#4 ;修正S P 指针LDMFD SP,PC ;子程序返回END5、实验相关寄存器GPBCON――端口配置寄存器GPBDAT――端口数据寄存器GPBUP――端口上拉电阻使能寄存器6、实验电路图7、实验程序实现7.1利用C语言实现跑马灯程序/**** led_asm_c.c ****//*C 语言函数*//* 定义端口寄存器 */#define rGPBCON (*(volatile unsigned *)0x56000010) //Port B control#define rGPBDAT (*(volatile unsigned *)0x56000014) //Port B data#define rGPBUP (*(volatile unsigned *)0x56000018) //Pull-up controlB/* 延迟程序 */extern void delay(int times);/* 主程序 */void xmain(void){rGPBCON= (rGPBCON & ~(0xff<<10)) | (0x55<<10);//GPB5-8 setoutputrGPBUP = (rGPBUP & ~(0xf<<5)) | (0xf<<5); //disable GPB pullupwhile(1){rGPBDAT=(rGPBDAT|(0xf<<5))& (~(0x1<<7));//GPB7 output 0 delay(0x5000000);//调用汇编语言编写的延时程序rGPBDAT=(rGPBDAT|(0xf<<5))& (~(0x1<<8));//GPB8 output 0delay(0x5000000);//调用汇编语言编写的延时程序0rGPBDAT= rGPBDAT & ~(0x3<<7);//GPB7-8 output 0delay(0x5000000);//调用汇编语言编写的延时程序rGPBDAT= rGPBDAT|(0x3<<7);//GPB7-8 output 1delay(0x5000000);//调用汇编语言编写的延时程序}}7.2 ARM汇编指令编写的延时程序/**** delay.s ****/EXPORT delayAREA DELAY,CODE,READONLY ;该伪指令定义了一个代码段,段名为Init,属性只读;下面是延迟子程序delaysub r0,r0,#1 ;r0=r0-1cmp r0,#0x0 ;将r0 的值与0 相比较bne delay ;比较的结果不为0(r0 不为0),继续调用delay,否则执行下一条语句mov pc,lr ;返回END ;程序结束符8、实验步骤1. 连接好实验环境,将仿真器的一端通过并口连接到P C 机,将仿真器的另一端通过J TAG线连接到2440 实验箱的J TAG 接口。