当前位置:文档之家› ARMS3C2440A讲解

ARMS3C2440A讲解

以下程序在Keil4中建立项目,芯片选S3C 2410A无论是S3C2410A还是S3C2440A,其IO口B都是11位二进制数,xxx xxxx xxxx,现在控制第5、6、7、8为做输出点亮LED灯(共阳极,输出0点亮),即xx8 765x xxxx,GPBCON equ 0x56000010GPBDAT equ 0x56000014GPBUP equ 0x56000018xport xmainarea Init,code,readonlyentryexportxmainldr r0,=GPBCONldr r1,[r0]bic r1,#0x3fC00 ;r1=xx00 0000 00xx xxxx xxxxorr r1,#0x15400 ;r1=xx01 0101 01xx xxxx xxxxstr r1,[r0] ;r1传给GPBCON设置8765位为输出ldr r0,=GPBUPldr r1,[r0]orr r1,#0x1e0 ;r1=xx1 111x xxxxstr r1,[r0] ;开B口第8、7、6、5位上拉电阻ldr r0,=GPBDATldr r2,[r0] ;把B口最初状态保存在R2 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;LOOP dr r1,[r2]orr r1,#0x1c0str r1,[r0]bl delay;BL跳转时将PC+4值自动保存在R14即LR中,也就是将程序的下一个语句地址保存在lr中在跳;转后执行mov pc,lr相当于返回,这样BL相当于调用子程序,pc=lr相当于子程序返回;;;;;;;;;;;;;;;;;;dr r1,[r2]orr r1,#0x1a0str r1,[r0]bl delay;;;;;;;;;;;;;;;;;;;;;ldr r1,[r2]orr r1,#0x160str r1,[r0]bl delay;;;;;;;;;;;;;;;;;;;;;;;;ldr r1,[r2]orr r1,#0x0e0str r1,[r0]bl delay;;;;;;;;;;;;;;;;;;;;;;;;b LOOPdelaymov r3,#3delay1 sub r3,r3,#1cmp r3,#0x0bne delay1mov pc,lr ;这句相当于子程序返回语句 end1. A(*(volatile unsigned *)0x56000010)的意思是把0x48000000强制转换成volatile unsigned long类型的指针,暂记为p,那么就是#define A *p,即A为P指针指向位置的内容了。

这里就是通过内存寻址访问到寄存器A,可以读/写操作。

*(volatile unsigned *)0×48000080 含义:因为()优先级高于*,所以先执行(volatile unsigned*)0×48000080 这个表示将0×48000080强制转化为指针类型,指针指向的类型是unsigned,指针存放的地址为0×56000080。

也就是说指针指向寄存器A。

然后在执行()外面的*,表示取出指针所指向的值。

2.在ADS1.2中,可以先添加头文件,再调用。

调用头文件时,由于2440addr.h头文件在调用了option.h头文件的内容,而option.h头文件在有调用了def.h,所以,这三个头文件需要同时调用。

在利用厂家提供的资料制作自己的头文件也用注意这种情况!在keil4中进行时,Keil4已经预装了一些许可芯片的头文件,可以直接调用芯片型号的头文件,如S3C2440芯片,可直接调用#include“S3C2440.h"、如S3C2410芯片,可直接调用#include"S3C2410.h",也可以新建头文件,把下面的内容复制进响应的头文件文本文件中,保存,再在C语言程序中调用这些头文件。

#include"option.h"#include<stdio.h>#include<stdlib.h>#include"def.h"#include"2440addr.h"3. 2440addr.h定义了ARM内所有寄存器的名称,如A~F等多个IO口的控制寄存器名称;option定义了时钟的设置等功能;def.h定义了几个特殊字长名称,如U32为unsigned int(无符号长整型)、U16为unsigned short (短整形),S32为int型(有符号整型),S16为short int,U8为unsigned char ,S8为char等4.ARM开发不会都用汇编语言或C语言单独完成,往往是两者配合使用,一般用汇编编写初始化文件,设置程序入口(根据硬件状况设置),再用C语言编写开发程序。

如IMPORT xMain ;相当于设置主函数入口,C语言的主函数就必须用xMain(),不能用main()AREA Init,CODE,READONLYENTRYLDR R0,=0x3FF0000 ;LDR也是一种赋值语句,相当于MOV,不同是LDR的数前是=,mov的数前是#BIC R1,R1,#0xF80 ;给立即数0xF8(即1111 1000)取反,再与R1与运算,结果是立即数为1的位对应的R1位全为0;STR R1,[R0]LDR SP,=0x3FE1000BL xMainB . ;注意B后有个点END#define rGPBCON (*(volatile unsigned *)0x56000010)//Port B control#define rGPBDAT (*(volatile unsigned *)0x56000014)//Port B data#define rGPBUP (*(volatile unsigned *)0x56000018)//Pull-up control B//定义了各个特殊功能寄存器地址和名称,要使用必须调用该头文件/*=== 如果不调用该头文件,必须把要使用的定义名称和地址语句在主程序前声明#define rGPBCON (*(volatile unsigned *)0x56000010)//Port B control#define rGPBDAT (*(volatile unsigned *)0x56000014)//Port B data#define rGPBUP (*(volatile unsigned *)0x56000018)//Pull-up control *//* 自定义简单延迟程序 */int delay(int times){int i;for(i=0;i<times;i++);return 0;}/* 主程序 */void xMain(void) //主函数名称与主函数入口地址对应,在上面汇编Init.s中有定义{ //不能随意写成main,或者Main等,要查看或编写init.s文件(见下图)rGPBCON |=0x3fc00; //GPB5-8 able outputrGPBCON &=0x15400; //GPBCON两位管理GPBDAT的方向(见下面对应关系,00-in,01-out,10-other,11-无用);/ / 方向控制GPBCON d21d20 d19d18 d17d16 d15d14 d13d12 d11d10 d9d8 d7d6 d5d4 d3d2 d1d0// 输入输出sfrGPDAT d10 d9 d8 d7 d6 d5 d4 d3 d2 d1 d0rGPBUP |=0x1e0; //disable GPB5-8 pull up res,GPBUP一位管一位,0-链接上拉电阻,1-关闭上拉电祖while(1){rGPBDAT|=0x1e0;//GPB7 output 0rGPBDAT&=0xeff;delay(50000000);//调用汇编语言编写的延时程序rGPBDAT|=0x1e0;//GPB7 output 0rGPBDAT&=0xf7f;delay(50000000);//调用汇编语言编写的延时程序rGPBDAT|=0x1e0;//GPB7 output 0rGPBDAT&=0xfbf;delay(50000000);//调用汇编语言编写的延时程序rGPBDAT|=0x1e0;//GPB7 output 0rGPBDAT&=0xfdf;delay(50000000);//调用汇编语言编写的延时程序 }}ARM汇编程序基本知识1.汇编程序的基本组成ARM汇编语言程序中,程序是以程序段为单位组织代码的。

段是相对独立的指令或者代码序列,拥有特定的名称。

段的种类有代码段、数据段和通用段,代码段的内容为执行代码,数据段存放代码运行时需要用到的数据,通用段不包含用户代码和数据,所有通用段共用一个空间。

段使用AREA 伪操作来定义,并且说明相关属性,如代码段定义AREA Init, CODE, READONLY…数据段定义AREA Stack1,DATA,READWRITE,NOINIT,ALIGN=3……;GPIO寄存器宏定义GPBCON EQU 0x56000010GPBDAT EQU 0x56000014 GPBUP EQU 0x56000018 EXPORT xmainAREA LEDTESTh,CODE,READONLY ENTRYxmainldr r0,=GPBCONldr r1,[r0]bic r1,r1,#0x3fc00orr r1,r1,#0x15400str r1,[r0]ldr r0,=GPBUPldr r1,[r0]orr r1,r1,#0x1e0str r1,[r0]looptestldr r2,=GPBDATldr r3,[r2]bic r3,r3,#0x1e0orr r3,r3,#0xF0str r3,[r2]ldr r0,=0x2ffffffbl delayldr r3,[r2]bic r3,r3,#0x1e0orr r3,r3,#0x1e0str r3,[r2]ldr r0,=0x2ffffffbl delayb looptestdelaysub r0,r0,#1cmp r0,#0x0bne delayldr pc,=looptestEND一个汇编程序至少应该有一个代码段,可以有零或者多个数据段。

相关主题