arm 实验c语言代码
- 格式:doc
- 大小:211.00 KB
- 文档页数:41
实验二ARM下简单C语言程序实验一、实验目的1、熟悉教学平台JXARM9-24102、掌握C语言程序在ARM开发环境下的应用3、能够运行程序并进行简单分析二、实验设备硬件:PC机一台,JXARM9-2410教学实验平台。
软件:Windows98/XP/2000系统,ADT IDE集成开发环境三、实验内容1、熟悉ADT IDE集成开发环境2、建立一个基本的工程3、设置并编译工程4、调试工程四、实验程序1、数码管显示程序:/****************************************************************************/ /*文件名称:LEDSEG7.C *//*实验现象:数码管依次显示出0、1,2、……9、a、b、C、d、E、F *//* LED DEMO CODE for MBA-44B0(S3C2410X) *//****************************************************************************/ #define U8 unsigned charunsigned char seg7table[16] ={/* 0 1 2 3 4 5 6 7*/0xc0, 0xf9, 0xa4, 0xb0, 0x99, 0x92, 0x82, 0xf8,/* 8 9 A B C D E F*/0x80, 0x90, 0x88, 0x83, 0xc6, 0xa1, 0x86, 0x8e,};void Delay(int time);/****************************************************************************/ /* 函数说明: EB44B0 7段构共阳数码管测试*//* 功能描述: 依次在7段数码管上显示0123456789ABCDEF *//* 返回代码: 无*//* 参数说明: 无*//****************************************************************************/ void Test_Seg7(void){int i;*((U8*) 0x10000006) = 0x00;for( ; ; ){/* 数码管从0到F依次将字符显示出来*/for(i=0;i<0x10;i++){/* 查表并输出数据*/*((U8*) 0x10000004) = seg7table[i];Delay (1000);}/* 数码管从F到0依次将字符显示出来*/for(i=0xf;i>=0x0;i--){/* 查表并输出数据*/*((U8*) 0x10000004) = seg7table[i];Delay (1000);}}}/****************************************************************************//* Function name : 循环延时子程序*//* Description : 循环'time' 次*//* Return type :void *//* Argument : 循环延时计数器*//****************************************************************************/ void Delay(int time){int i;int delayLoopCount=1000;for(;time>0;time--)for(i=0;i<delayLoopCount;i++);}这段代码所实现的功能:是依次在7段数码管上显示0123456789ABCDEF。
实验二 C语言程序设计与调试实验一、实验目的学会在ADT IDE集成开发环境下,编写、编译和调试C语言程序。
二、实验设备及工具1 Microsoft Windows98,Windows NT,Windows 2000,Windows XP。
2 486以上CPU,建议采用Pentium II及更高的处理器。
3 64M以上内存,建议采用128M以上。
4 200M空间的可用硬盘空间。
5 CD-ROM驱动器。
6 并行打印机端口。
三、实验内容1、检查实验箱配件是否齐全,包括主板,核心板和LCD等。
2、检查JP5设置,确保跳线帽设置正确。
3、连接调试器,然后接通电源,包括JXARM9-2410-3的电源以及ADT1000的电源。
四、实验步骤及结果1、建立工程:打开ADT1000,点击“File->New菜单”,弹出New对话框,如下图所示,选择Project页,在Project页中选择调试设备,选择ARM9LPT,在工程名和位置中输入如下图所示,可以修改该目录,但注意目录和工程名中不要包含空格。
在工程类型中选择EXEC。
2、新建一个文件并保存为d:\leddemo\leddemo.c,并编辑该文件,添加如下所示代码:/*******************************************************************/ /*文件名称: LEDSEG7.C *//*实验现象:数码管依次显示出0、1,2、……9、a、b、C、d、E、F *//* LED DEMO CODE for MBA-44B0(S3C2410X) *//*******************************************************************/ #define U8 unsigned charunsigned char seg7table[16] ={ /* 0 1 2 3 4 5 6 7*/0xc0, 0xf9, 0xa4, 0xb0, 0x99, 0x92, 0x82, 0xf8,/* 8 9 A B C D E F*/0x80, 0x90, 0x88, 0x83, 0xc6, 0xa1, 0x86, 0x8e,};void Delay(int time);/*******************************************************************/ /* 函数说明: EB44B0 7段构共阳数码管测试 *//* 功能描述: 依次在7段数码管上显示ABCDEF *//* 返回代码: 无 *//* 参数说明: 无 *//*******************************************************************/ void Test_Seg7(void){ int i;*((U8*) 0x) = 0x00;for( ; ; ){ /* 数码管从0到F依次将字符显示出来 */for(i=0;i<0x10;i++){ /* 查表并输出数据 */*((U8*) 0x) = seg7table[i];Delay (1000);}/* 数码管从F到0依次将字符显示出来 */for(i=0xf;i>=0x0;i--){ /* 查表并输出数据 */*((U8*) 0x) = seg7table[i];Delay (1000); } } }/*******************************************************************/ /* Function name : 循环延时子程序 *//* Description : 循环 'time' 次 *//* Return type :void *//* Argument : 循环延时计数器 *//*******************************************************************/ void Delay(int time){ int i;int delayLoopCount=1000;for(;time>0;time--)for(i=0;i<delayLoopCount;i++); }3、将leddemo.c文件加入到工程中,如下图所示:弹出文件选择对话框,选择d:\leddemo\leddemo.c文件,并点击打开4、新建一个文件并保存为d:\leddemo\ldscript,并编辑该文件,按照如下进行编辑:SECTIONS{. = 0x;.text : { *(.text) }.data : { *(.data) }.rodata : { *(.rodata) }.bss : { *(.bss) }__EH_FRAME_BEGIN__ = .;__EH_FRAME_END__ = .;PROVIDE (__stack = .);.debug_info 0 : { *(.debug_info) }.debug_line 0 : { *(.debug_line) }.debug_abbrev 0 : { *(.debug_abbrev)}.debug_frame 0 : { *(.debug_frame) }}5、如下图所示,在工作区窗口中的leddemo工程名上右键点击并选择Setting菜单项弹出工程设置对话框,选择Link页,在Link script中输入.\ldscript,然后OK。
arm编程实例c语言ARM编程实例C语言是一种高效的编程语言,它可以用于开发各种类型的应用程序。
在本文中,我们将介绍一些ARM编程实例C语言的基本知识和技巧。
首先,我们需要了解ARM架构的基本知识。
ARM是一种基于RISC (精简指令集计算机)架构的处理器,它具有高效的指令集和低功耗的特点。
ARM处理器广泛应用于移动设备、嵌入式系统、智能家居等领域。
接下来,我们需要掌握C语言的基本语法和数据类型。
C语言是一种高级编程语言,它具有强大的数据类型和控制结构。
在ARM编程中,我们通常使用C语言来编写应用程序。
下面是一个简单的ARM编程实例C语言程序:```#include <stdio.h>int main(){printf("Hello, ARM!\n");return 0;}```这个程序的作用是输出“Hello, ARM!”这个字符串。
在这个程序中,我们使用了stdio.h头文件中的printf函数来输出字符串。
同时,我们还使用了int类型的main函数来定义程序的入口点。
除了基本的语法和数据类型,我们还需要掌握一些常用的ARM编程实例C语言库函数。
这些函数可以帮助我们更加高效地编写应用程序。
下面是一些常用的ARM编程实例C语言库函数:1. memcpy函数:用于将一个内存区域的数据复制到另一个内存区域。
2. memset函数:用于将一个内存区域的数据设置为指定的值。
3. strlen函数:用于计算一个字符串的长度。
4. strcmp函数:用于比较两个字符串是否相等。
5. sprintf函数:用于将格式化的数据写入字符串中。
最后,我们需要了解一些ARM编程实例C语言的调试技巧。
调试是编程过程中非常重要的一步,它可以帮助我们找到程序中的错误并进行修复。
在ARM编程中,我们通常使用调试器来进行调试。
常用的ARM调试器包括GDB和JTAG。
总之,ARM编程实例C语言是一种非常有用的编程语言,它可以帮助我们开发高效、低功耗的应用程序。
实验二汇编指令编程实验目的1 掌握ARM汇编指令编程2 掌握Thumb汇编指令编程需要完成的任务完成A部分和B部分实验A部分ARM 汇编指令编程方法1 建立工程启动ADS1.2 使用ARM Executable Image 工程模板建立一个Instruetion1。
关于ADS 工具的使用方法可参照前面的实验。
2 编写源代码COUNT EQU 0x30001010 ;定义一个变量,地址在0x30001010AREA Example1,CODE,READONLY ;声明代码段Example1ENTRY ;标识程序入口CODE32 ;声明31 位ARM 指令START LDR R1,=COUNT ;R1<=COUNTMOV R0,#0 ;R0<=0STR R0,[R1] ;[R1]<=R0, 即设置COUNT 为0LOOP LDR R1,=COUNT LDR R0,[R1] ;R0<=[R1]ADD R0,R0,#1 ;R0<=R0+1CMP R0,#10 ;R0 与10 比较,影响条件码标志MOVHS R0,#0 ;若R0>=10,则此指令执行R0<=0STR R0,[R1] ;[R1]<=R0 ,即保存COUNTB LOOP3设置编译选项设置工程连接地址RO Base 为0X30000000,RW Base 为0X30001000 。
设置调试入口地址Image entry point 为0X30000000 。
编译、调试编译连接工程,选择Project Debug ,启动AXD 进行软件仿真调试。
4查看寄存器,内存打开寄存器窗口(Processor Registers),选择Current 项监视R0 和R1 的值。
本实验代码使用LDR 指令读取0x30001010 地址上的数据,将数据加1。
若结果小于10,则使用STR 指令把结果写回原地址;若结果大于等于10,则把0 写回原地址。
XI`AN TECHNOLOGICAL UNIVERSITY 实验报告西安工业大学实验报告一丶实验目的学会使用Embest IDE编写简单的C语言程序并进行调试。
学会编写和使用命令脚本文件。
掌握通过memory/register/watch/variable窗口分析判断运行结果二、实验内容利用命令脚本文件自行编写C语言程序三、实验原理用户在集成环境与目标板连接时、软件调试过程中以及复位目标板后,有时需要集成环境自动完成一些特定的功能,比如复位目标板、清除看门狗、屏蔽中断寄存器、存储区映射等,这些特定的功能可以通过执行一组命令序列完成,保存一组命令序列的文本文件称为命令脚本文件(EmbestIDE 使用.cs 作为命令脚本文件扩展名)。
命令脚本文件中各行以半角格式的“;”号开始作为注释内容,分号前是一条命令。
凡是可以在调试命令窗口使用的命令,都可以在脚本文件中使用,包括执行脚本文件命令“SCRIPT”。
命令脚本文件执行时按照命令在脚本文件中排列的先后顺序自动连续地执行。
四、实验过程1)打开Embest IDE Pro软件,选择菜单项File-->New Workspace,系统弹出对话框,创建名为C1的新工程,并同时创建一个与工程名相同的工作区。
此时在工作窗口将打开该工作区和工程。
2)建立源文件:点击菜单项File-->New,系统弹出一个新的、没有标题的文本编辑窗,输入光标位玉窗口中第一行,编写源文件C1.c和C1.cs并把它们加入到工程里面。
3)基本配置:选择菜单项Project-->Settings,弹出工程设置对话框,在工程设置对话框中,选择Processor设置对话框,选择ARM7对目标板所用处理器进行配置。
4)调试设置:使用快捷键Alt+F7,弹出设置对话框,在工程设置对话框中,选择Remote设置对话框,对相应模块进行配置。
需要注意的是,在调试Debug 对话框设置的时候,增加连接后自动执行脚本文件5)下载,打开Memory/Register/Watch/Variable 窗口,单步执行,通过memory/register/watch/variable 窗口分析判断结果,在watch 框中输入要观察变量。
字体大小: 小中大作者:姜换新来源:日期:2007-03-28 点击:1443摘要本文详细介绍了嵌入式平台上用C 语言编写系统软件和应用软件的方法。
虽然是针对ARM 平台介绍的,但基本经验和算法也适合于其他嵌入式平台的软件设计。
1 引言无操作系统支持的嵌入式软件包括系统引导(BOOT) 、外围驱动程序、存储管理、系统IPO、通信、应用程序等方面,需要结合采用汇编语言(约占10 %) 和C 语言(约占90 %) 。
本文结合作者实践,详细介绍ARM嵌入式平台的C 编程方法。
考虑到通信软件涉及范围较大,本文不进行讨论。
2 系统引导与main 函数通常C 语言是从main 函数开始的。
main 函数的原型是:int main(int argc ,char 3 3 argv)其中argc 是参数的个数, argv 是指向各参数的指针的数组。
main 函数由操作系统内核启动,操作系统内核完成函数所需的变量初始化工作,并在调用结束后检查main 函数的返回值,若返回值为0 ,表明程序运行正常,否则表明程序运行出错。
在嵌入式系统中,由于没有操作系统内核存在,对main 函数的初始化工作只能由系统引导(BOOT) 模块完成。
系统引导(BOOT) 部分完成系统初始化工作,用汇编语言实现。
它的工作包括硬件初始化、栈寄存器的设置、全局变量的初始化或清0、RAM中运行的模块的加载、堆参数的初始化等。
完成这些工作后,再把控制权交给C 的main 函数。
显然,对嵌入式系统的main 而言,argc 和argv 这两个参数及返回值都是没有意义的(如果返回,表明系统出现严重错误) 。
另外,为了避免产生混淆,我们还必须给main 函数另外取一个名字,比如Main。
否则,编译器将会给main 函数生成一大堆初始化代码,导致C 程序的主入口与系统引导模块的接口错误。
系统引导模块完成各种初始化工作后,用一条跳转指令进入C 的主入口Main ,控制权从此移交给了C 应用程序。
(封面)学生实验报告(参考样本)学院:软通学院课程名称:ARM体系结构与编程专业班级:物联网173姓名:郑慧乐学号:0174280学生实验报告(理、工科类专业用)一、实验综述1、实验目的及要求1、任务1、C语言调用汇编程序(8.5 )2、任务2:汇编程序调用C程序(8.6)3、任务3:汇编程序调用C++程序(8.8)1、任务1、C语言调用汇编程序(8.5 )利用C语言定义两段字符串(*srcstr,*dststr),调用汇编程序实现字符串的复制,再用C语言显示复制前、后的字符串内容。
用汇编语言实现字符串的复制(源串复制到目的串中)2、任务2:汇编程序调用C程序(8.6)利用汇编程序调用C程序g()计算5个整数i,2*i,3*i,4*i,5*i的和;C程序g()返回5个整数的和3、任务3:汇编程序调用C++程序P275 程序8.82、实验仪器、设备或软件(1)硬件:PC机一台;(2)软件:Keil μVision 4 for ARM集成开发环境。
二、实验过程(实验步骤、记录、数据、分析)任务一:代码如下:.s文件AREA SCopy,CODE,READONLYEXPORT strcopystrcopyLDRB r2,[r1],#1STRB r2,[r0],#1CMP r2,#0BNE strcopyMOV pc,lrEND.c文件#include<stdio.h>extern void strcopy(char *d,const char *s);int main(){const char *srcstr="First string-source";char d[100];char *dststr=d;// printf("Before copying:\n");//printf(" %s\n %s\n,src str,dststr");strcopy(dststr,srcstr);// printf("After copying:\n");//printf(" %s\n %s\n,src str,dststr");return(0);}任务二代码如下:.s文件;8.6PRESERVE8EXPORT fAREA f,CODE,READONLYIMPORT g;ENTRYSTR lr,[sp,#4]!MOV r0,#2ADD r1,r0,r0ADD r2,r1,r0ADD r3,r1,r2STR r3,[sp,#-4]!ADD r3,r1,r1BL gADD sp,sp,#4LDR pc,[sp],#4END.c文件//8.6汇编调用C程序int g(int a,int b,int c,int d,int e){return a+b+c+d+e; }任务三代码如下:.cpp文件//8.8struct S{S(int s) : i(s) { }int i;};extern "C" void cppfunc(S * p){p->i +=5;}.s文件;8.8PRESERVE8AREA Asm,CODEIMPORT cppfuncEXPORT ffSTMFD sp!,{lr}MOV r0,#2STR r0,[sp,#-4]!MOV r0,spBL cppfuncLDR r0,[sp],#4ADD r0,r0,r0,LSL#1LDMFD sp!,{pc}END三、结论1、实验结果任务1——图1任务2——图1任务3——图12、分析讨论ARM 汇编语言与C、C++混合编程的方法1、在C程序中调用汇编在汇编程序中用export name来定义,在C程序中直接调用,用EXTERN声明2、在汇编中调用C的函数在汇编中调用C的函数,需要在汇编中IMPORT 对应的C函数名,然后将C的代码放在一个独立的C文件中进行编译,剩下的工作由连接器来处理3、汇编程序调用C++程序时在C++程序中使用关键词extern "C"声明被调用的C++程序。
实验四 C 和 ARM 汇编混合编程实验一实验目的1. 熟悉ADS 开发环境、AXD 及Multi_ICE 调试环境。
2. 掌握简单的ARM 汇编指令的使用方法。
3. 掌握S3C2410A 的I/O 控制寄存器的配置。
4. 掌握ARM 汇编指令和C 语言相互调用的方法二实验设备PC 机、ARM 仿真器、2410 实验箱、串口线。
三实验内容1. 熟悉ARM 开发环境的建立。
2. 使用ARM 汇编和C 语言设置 GPIO口的相应寄存器。
四实验原理1. C 程序与汇编程序相互调用规则为了使单独编译的 C语言程序和汇编程序之间能够相互调用,必须为子程序间的调用规定一定的规则。
ATPCS即ARM, Thumb过程调用标准(ARM/Thumb Procedure Call Standard),是 ARM程序和 Thumb程序中子程序调用的基本规则,它规定了一些子程序间调用的基本规则,如子程序调用过程中的寄存器的使用规则,堆栈的使用规则,参数的传递规则等。
下面结合实际介绍几种ATPCS 规则,如果读者想了解更多的规则,可以查看相关的书籍。
(1)基本ATPCS基本 ATPCS 规定了在子程序调用时的一些基本规则,包括下面 3方面的内容:①各寄存器的使用规则及其相应的名称。
②数据栈的使用规则。
③参数传递的规则。
相对于其它类型的 ATPCS,满足基本 ATPCS的程序的执行速度更快,所占用的内存更少。
但是它不能提供以下的支持: ARM 程序和 Thumb程序相互调用,数据以及代码的位置无关的支持,子程序的可重入性,数据栈检查的支持。
而派生的其他几种特定的ATPCS 就是在基本ATPCS 的基础上再添加其他的规则而形成的。
其目的就是提供上述的功能。
2.寄存器的使用规则寄存器的使用必须满足下面的规则:(1) 子程序间通过寄存器 R0~R3来传递参数。
这时,寄存器 R0~R3可以记作 A0~A3。
被调用的子程序在返回前无需恢复寄存器 R0~R3的内容。
ARM处理器工作模式实验程序代码:USR_STACK_LEGTH EQU 64SVC_STACK_LEGTH EQU 0FIQ_STACK_LEGTH EQU 16IRQ_STACK_LEGTH EQU 64ABT_STACK_LEGTH EQU 0UND_STACK_LEGTH EQU 0AREA Example5,CODE,READONL Y ; 声明代码段Example5ENTRY ; 标识程序入口CODE32 ; 声明32位ARM指令START MOV R0,#0MOV R1,#1MOV R2,#2MOV R3,#3MOV R4,#4MOV R5,#5MOV R6,#6MOV R7,#7MOV R8,#8MOV R9,#9MOV R10,#10MOV R11,#11MOV R12,#12BL InitStack ; 初始化各模式下的堆栈指针; 打开IRQ中断(将CPSR寄存器的I位清零)MRS R0,CPSR ; R0 <= CPSRBIC R0,R0,#0x80MSR CPSR_cxsf,R0 ; CPSR <= R0; 切换到用户模式MSR CPSR_c, #0xd0MRS R0,CPSR; 切换到管理模式MSR CPSR_c, #0xdfMRS R0,CPSRHALT B HALT; 名称:InitStack; 功能:堆栈初始化,即初始化各模式下的堆栈指针。
; 入口参数:无; 出口参数:无; 说明:在特权模式下调用此子程序,比如复位后的管理模式InitStackMOV R0, LR ; R0 <= LR,因为各种模式下R0是相同的;设置管理模式堆栈MSR CPSR_c, #0xd3LDR SP, StackSvc;设置中断模式堆栈MSR CPSR_c, #0xd2LDR SP, StackIrq;设置快速中断模式堆栈MSR CPSR_c, #0xd1LDR SP, StackFiq;设置中止模式堆栈MSR CPSR_c, #0xd7LDR SP, StackAbt;设置未定义模式堆栈MSR CPSR_c, #0xdbLDR SP, StackUnd;设置系统模式堆栈MSR CPSR_c, #0xdfLDR SP, StackUsrMOV PC, R0StackUsr DCD UsrStackSpace + (USR_STACK_LEGTH - 1)*4StackSvc DCD SvcStackSpace + (SVC_STACK_LEGTH - 1)*4StackIrq DCD IrqStackSpace + (IRQ_STACK_LEGTH - 1)*4StackFiq DCD FiqStackSpace + (FIQ_STACK_LEGTH - 1)*4StackAbt DCD AbtStackSpace + (ABT_STACK_LEGTH - 1)*4StackUnd DCD UndtStackSpace + (UND_STACK_LEGTH - 1)*4; 分配堆栈空间AREA MyStacks, DATA, NOINIT, ALIGN=2UsrStackSpace 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 ; 未定义模式堆栈ENDGPIO输出控制实验程序代码#include "config.h"// 定义LED控制口(输出高电平时点亮LED)#define LED1_CON (1<<11) /* GPE11口*/#define LED2_CON (1<<12) /* GPE12口*/#define LED3_CON (1<<4) /* GPH4口*/#define LED4_CON (1<<6) /* GPH6口*/// 定义蜂鸣器控制口#define BEEP (1<<10) /* GPH10口*/#define BEEP_MASK (~BEEP)void DelayNS(uint32 dly){uint32 i;for(; dly>0; dly--)for(i=0; i<50000; i++);}void RunBeep(void){rGPHDAT = rGPHDAT & BEEP_MASK; // BEEP = 0 DelayNS(5);rGPHDAT = rGPHDAT | BEEP; // BEEP = 1DelayNS(5);}void LED_DispAllOn(void){rGPEDAT = rGPEDAT | (0x03<<11);rGPHDAT = rGPHDAT | (0x05<<4);}void LED_DispAllOff(void){rGPEDAT = rGPEDAT & (~(0x03<<11));rGPHDAT = rGPHDAT & (~(0x05<<4));}void LED_DispNum(uint32 dat){dat = dat & 0x0000000F; // 参数过滤// 控制LED4、LED3显示(d3、d2位)if(dat & 0x08) rGPHDAT = rGPHDAT | (0x01<<6);else rGPHDAT = rGPHDAT & (~(0x01<<6));if(dat & 0x04) rGPHDAT = rGPHDAT | (0x01<<4);else rGPHDAT = rGPHDAT & (~(0x01<<4));// 控制LED2、LED1显示(d1、d0位)rGPEDAT = (rGPEDAT & (~(0x03<<11))) | ((dat&0x03) << 11);}int main(void){int i;// 初始化I/OrGPECON = (rGPECON & (~(0x0F<<22))) | (0x05<<22); // rGPECON[25:22] = 0101b,设置GPE11、GPE12为GPIO输出模式rGPHCON = (rGPHCON & (~(0x33<<8))) | (0x11<<8); // rGPHCON[13:8] = 01xx01b,设置GPH4、GPH6为GPIO输出模式rGPHCON = (rGPHCON & (~(0x03<<20))) | (0x01<<20); // rGPHCON[21:20] = 01b,设置GPH10为GPIO输出模式// LED显示控制while(1){RunBeep(); // 蜂鸣器响一声// LED全闪烁5次for(i=0; i<5; i++){LED_DispAllOff(); // LED全熄灭DelayNS(5);LED_DispAllOn(); // LED全点亮DelayNS(5);}// 控制LED指示0~F的16进制数值for(i=0; i<16; i++){LED_DispNum(i); // 显示数值iDelayNS(5);}}return(0);}外部中断实验程序代码:#include "config.h"// 定义LED控制口(输出高电平时点亮LED)#define LED1_CON (1<<11) /* GPE11口*/#define LED2_CON (1<<12) /* GPE12口*/#define LED3_CON (1<<4) /* GPH4口*/#define LED4_CON (1<<6) /* GPH6口*/// 定义独立按键KEY1的输入口#define KEY_CON (1<<4) /* GPF4口*/// 定义LED1控制值变量uint8 ledcon = 0x00;void DelayNS(uint32 dly){uint32 i;for(; dly>0; dly--)for(i=0; i<50000; i++);}void IRQ_Eint4(void){int i;// 按键去抖动rGPFCON = rGPFCON & (~(0x03<<8)); // 设置为GPIO输入方式for(i=0; i<10000; i++); // 延时去抖动if(rGPFDAT&KEY_CON) // 若是假按键,则直接退出{rGPFCON = rGPFCON | (0x02<<8); // 设置回EINT4中断口// 清除中断标志rEINTPEND = (1<<4);rSRCPND = (1<<4);rINTPND = rINTPND;return;}rGPFCON = rGPFCON | (0x02<<8); // 设置回EINT4中断口// 把LED1控制口输出信号取反if(ledcon){ledcon = 0;rGPEDAT = rGPEDAT & (~LED1_CON) ;}else{ledcon = 1;rGPEDAT = rGPEDAT | LED1_CON;}// 清除中断标志rEINTPEND = (1<<4);rSRCPND = (1<<4);rINTPND = rINTPND;}void EINT_init(void){rGPFCON = (rGPFCON & 0xFFFFFCFF) | (0x02<<8); // 设置GPF4引脚为外部中断EINT4功能rEXTINT0 = (0x2<<16); // 外部中断EINT4设置为下降沿触发VICVectAddr[4] = (uint32) IRQ_Eint4; // 中断向量地址设置rPRIORITY = 0x00000000; // 使用默认的固定的优先级rINTMOD = 0x00000000; // 所有中断均为IRQ中断rINTMSK = ~0x0000010; // 使能EINT4中断rEINTMASK = ~0x0000010;}void LED_DispAllOff(void){rGPEDAT = rGPEDAT & (~(0x03<<11));rGPHDAT = rGPHDAT & (~(0x05<<4));}int main(void){// 初始化I/OrGPECON = (rGPECON & (~(0x0F<<22))) | (0x05<<22); // rGPECON[25:22] = 0101b,设置GPE11、GPE12为GPIO输出模式rGPHCON = (rGPHCON & (~(0x33<<8))) | (0x11<<8); // rGPHCON[13:8] = 01xx01b,设置GPH4、GPH6为GPIO输出模式LED_DispAllOff(); // 熄灭LED1--LED4EINT_init(); // 外部中断初始化IRQEnable(); // 使能IRQ中断(清零CPSR寄存器的I位)while(1); // 等待外部中断return(0);}步进电机控制实验程序代码#include "config.h"// 步进电机控制口线及操作宏函数定义#define MOTOA (1<<5) /* GPC5 */#define MOTOB (1<<6) /* GPC6 */#define MOTOC (1<<7) /* GPC7 */#define MOTOD (1<<0) /* GPC0 */#define GPIOSET(PIN) rGPCDAT = rGPCDAT | PIN /* 设置PIN输出1,PIN 为MOTOA--MOTOD */#define GPIOCLR(PIN) rGPCDAT = rGPCDAT & (~PIN) /* 设置PIN输出0,PIN 为MOTOA--MOTOD */void DelayNS(uint32 dly){uint32 i;for(; dly>0; dly--)for(i=0; i<50000; i++);}void MOTO_Mode2(uint8 dly){uint32 i;for(i=0; i<20; i++){// AB相有效GPIOSET(MOTOA);GPIOSET(MOTOB);DelayNS(dly);GPIOCLR(MOTOA);GPIOCLR(MOTOB);// BC相有效GPIOSET(MOTOB);GPIOSET(MOTOC);DelayNS(dly);GPIOCLR(MOTOB);GPIOCLR(MOTOC);// CD相有效GPIOSET(MOTOC);GPIOSET(MOTOD);DelayNS(dly);GPIOCLR(MOTOC);GPIOCLR(MOTOD);// DA相有效GPIOSET(MOTOD);GPIOSET(MOTOA);DelayNS(dly);GPIOCLR(MOTOD);GPIOCLR(MOTOA);}}int main(void){// 步进电机控制口设置rGPCCON = (rGPCCON & (~0x0000FC03)) | (0x00005401); // GPC0、GPC5--7口设置为输出rGPCUP = rGPCUP | 0x00E1; // 禁止GPC0、GPC5--7口的上拉电阻rGPCDAT = rGPCDAT & (~0x00E1); // 设置GPC0、GPC5--7口输出低电平while(1){MOTO_Mode2(1); // 控制步进电机正转DelayNS(50); // 停止步进电机,延时}return(0);}基于μC/OS-Ⅱ程序代码#include "config.h"#define Task0StkLengh 64 // Define the Task0 stack length 定义用户任务0的堆栈长度#define Task1StkLengh 64 // Define the Task1 stack length 定义用户任务1的堆栈长度OS_STK Task0Stk [Task0StkLengh]; // Define the Task0 stack 定义用户任务0的堆栈OS_STK Task1Stk [Task1StkLengh]; // Define the Task1 stack 定义用户任务1的堆栈// 定义LED控制口(输出高电平时点亮LED)#define LED1_CON (1<<11) /* GPE11口*/#define LED2_CON (1<<12) /* GPE12口*/#define LED3_CON (1<<4) /* GPH4口*/#define LED4_CON (1<<6) /* GPH6口*/// 定义蜂鸣器控制口#define BEEP (1<<10) /* GPH10口*/#define BEEP_MASK (~BEEP)void Task0(void *pdata); // Task0 任务0void Task1(void *pdata); // Task1 任务1void RunBeep(void);void LED_DispNum(uint32 dat);int main (void){OSInit ();OSTaskCreate (Task0,(void *)0, &Task0Stk[Task0StkLengh - 1], 2);OSTaskCreate (Task1,(void *)0, &Task1Stk[Task1StkLengh - 1], 3);OSStart ();return 0;}void Task0 (void *pdata){pdata = pdata;TargetInit ();// 初始化I/OrGPECON = (rGPECON & (~(0x0F<<22))) | (0x05<<22); // rGPECON[25:22] = 0101b,// 设置GPE11、GPE12为GPIO输出模式rGPHCON = (rGPHCON & (~(0x33<<8))) | (0x11<<8); // rGPHCON[13:8] = 01xx01b,// 设置GPH4、GPH6为GPIO输出模式rGPHCON = (rGPHCON & (~(0x03<<20))) | (0x01<<20); // rGPHCON[21:20] = 01b,// 设置GPH10为GPIO输出模式while (1){RunBeep();OSTimeDly(OS_TICKS_PER_SEC);}}void Task1 (void *pdata){ uint8 i;pdata = pdata;while (1){for(i=0; i<16; i++){LED_DispNum(i);OSTimeDly(OS_TICKS_PER_SEC/2);}}}void RunBeep(void){rGPHDAT = rGPHDAT & BEEP_MASK; // BEEP = 0OSTimeDly(OS_TICKS_PER_SEC/10);rGPHDAT = rGPHDAT | BEEP; // BEEP = 1OSTimeDly(OS_TICKS_PER_SEC/10);}void LED_DispNum(uint32 dat){dat = dat & 0x0000000F; // 参数过滤// 控制LED4、LED3显示(d3、d2位)if(dat & 0x08) rGPHDAT = rGPHDAT | (0x01<<6);else rGPHDAT = rGPHDAT & (~(0x01<<6));if(dat & 0x04) rGPHDAT = rGPHDAT | (0x01<<4);else rGPHDAT = rGPHDAT & (~(0x01<<4));// 控制LED2、LED1显示(d1、d0位)rGPEDAT = (rGPEDAT & (~(0x03<<11))) | ((dat&0x03) << 11);}。
2.8_C语言程序实验#define uint8 unsigned char#define uint32 unsigned int#define N 100uint32 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);}2.9_C语言调用汇编程序实验#define uint8 unsigned char#define uint32 unsigned intextern uint32 Add(uint32 x, uint32 y);uint32 sum;// 调用汇编程序Add实现加法运算void Main(void){ sum = Add(555, 168);while(1);}2.10_GPIO输出控制实验1/**************************************************************************** * 文件名:main.c* 功能:蜂鸣器控制。
对蜂鸣器B1进行控制,采用软件延时方法。
* 使用I/O口直接控制,采用灌电流方式。
* 说明:将跳线器JP22短接,JP20断开。
****************************************************************************/ #include "config.h"#define BEEPCON 0x00000080 // P0.7引脚控制B1,低电平蜂鸣/**************************************************************************** * 名称:DelayNS()* 功能:长软件延时。
* 入口参数:dly 延时参数,值越大,延时越久* 出口参数:无****************************************************************************/ void DelayNS(uint32 dly){ uint32 i;for(; dly>0; dly--){for(i=0; i<5000; i++);}}/**************************************************************************** * 名称:main()* 功能:控制蜂鸣器蜂鸣。
****************************************************************************/ int main(void){PINSEL0 = 0x00000000; // 设置管脚连接GPIOIO0DIR = BEEPCON; // 设置I/O为输出while(1){IO0SET = BEEPCON; // BEEPCON = 1DelayNS(15);IO0CLR = BEEPCON; // BEEPCON = 0DelayNS(15);}return(0);}2.11_GPIO输出控制实验2//**************************************************************************** * 文件名:main.c* 功能:LED显示控制。
* 通过GPIO直接控制8个LED产生流水灯效果* 说明:将跳线JP23全部短接,JP15跳线全部断开。
* 这个警告可忽略,C2892E: signed constant overflow****************************************************************************/ #include "config.h"#define LED1 1<<16 // P2.16#define LED2 1<<17 // P2.17#define LED3 1<<18 // P2.18#define LED4 1<<19 // P2.19#define LED5 1<<20 // P2.20#define LED6 1<<21 // P2.21#define LED7 1<<22 // P2.22#define LED8 1<<23 // P2.23#define LEDCON 0x00ff0000const uint32 DISP_TAB[8] = { 0xff01ffff, 0xff02ffff, 0xff04ffff, 0xff08ffff,0xff10ffff, 0xff20ffff, 0xff40ffff, 0xff80ffff};/***************************************************************************** 名称:DelayNS()* 功能:长软件延时* 入口参数:dly 延时参数,值越大,延时越久* 出口参数:无****************************************************************************/ void DelayNS(uint32 dly){ uint32 i;for(; dly>0; dly--){for(i=0; i<5000; i++);}}/***************************************************************************** 名称:main()* 功能:根据表DISP_TAB来控制LED显示。
****************************************************************************/ int main(void){ uint8 i;/* PINSEL2使用启动代码的默认配置,切勿任意配置PINSEL2,否则总线会受到干扰*/ IO2DIR = LEDCON; // 配置LED控制I/O方向while(1){for(i=0; i<8; i++){IO2CLR = DISP_TAB[i]; // 输出LED显示数据DelayNS(10); // 延时IO2SET = 0xffffffff;}}return(0);}2.12_GPIO输入实验***************************************************************************** 文件名:main.c* 功能:读取I/O引脚值,并输出控制蜂鸣器。
* 使用I/O口输入方式对P0.20口进行扫描,对蜂鸣器控制。
* 说明:将跳线器JP9、JP22短接,JP20断开。
按下KEY1观察BUZZER效果。
****************************************************************************/ #include "config.h"#define BEEPCON 1<<7 // P0.7引脚控制B1,低电平蜂鸣#define KEY 1<<20 // 定义按键/**************************************************************************** * 名称:main()* 功能:读取P0.20口的值,并输出控制蜂鸣器B1。
****************************************************************************/ int main(void){ uint32 i;PINSEL0 = 0x00000000; // 设置管脚连接GPIOIO0DIR = BEEPCON; // 设置B1控制口为输出,其它I/O为输入while(1){if( (IO0PIN&KEY)!=0 ){IO0SET = BEEPCON;}else{IO0CLR = BEEPCON;}for(i=0; i<1000; i++);}return(0);}2.13_存储器重映射实验/**************************************************************************** * 文件名:main.c* 功能:将存储器重映射到片内RAM(0x40000000~0x4000003F),然后更改* 0x40000000~0x4000003F的内容。
* 说明:观察0x00000000~0x0000003F地址上的数据有何变化****************************************************************************/ #include "config.h"#define VECTOR_RAM ((unsigned char *) 0x40000000)/**************************************************************************** * 名称:main()* 功能:存储器重映射。
****************************************************************************/ int main(void){ uint8 i;uint8 *addr;MEMMAP = 0x02; // 中断向量从静态RAM重映射(用户RAM模式)addr = VECTOR_RAM;for(i=0; i<64; i++) // 用0x55填充0x40000000~0x4000003F{*addr = 0x55;addr++;}addr = VECTOR_RAM;for(i=0; i<64; i++) // 用0xAA填充0x40000000~0x4000003F{*addr = 0xAA;addr++;}MEMMAP = 0x00; // 中断向量从Boot Block重映射(Boot装载程序模式)while(1);return(0);}2.14_外部中断实验1/**************************************************************************** * 文件名:main.c* 功能:使用外部中断3进行B1的控制,每当有一次中断时,即取反B1控制口,* 使用非向量中断方式。