1.原理图 2.芯片手册 3.几条汇编代码 1.ldr:读内存 ldr R0, [R1] 假设R1的值是x,读取地址x上的数据(4字节),保存到R0中 ldr R0, =0x12345678 (4字节) R0 = 0x12345678 此语句是伪指令,它会被分为几条真正的ARM指令 2.str:写内存命令 str R0, [R1] 假设R1的值是x,把R0的值写到地址x(4字节) 3.b:跳转 4.mov: mov R0, R1 把R1的值赋给R0,R0 = R1 mov R0, #0x100…
初学ARM感觉写个裸板程序还真的不容易,可能是没有用到ADS,keil之类的开发平台的缘故吧.编译,链接过程在linux平台上完成,这样学起来更有实感,还能顺便熟悉linux环境,以及命令,何乐而不为呢? 为此得准备一些必要的基础知识,前几篇博客总结一些汇编的指令,以及makefile的总结.有兴趣的同学可以去看看. 汇编引导程序: 这段汇编代码做了3件事情: 1.关看门狗. 2.设置栈. 3.调用main函数. 这里想说明的就是,设置站.写C函数必须先设置栈,因为需要用栈来存放函数的参数值,局…
ARM裸板开发过程,程序的链接地址设置为为0x30000000,而前期的启动代码以及相关硬件的初始化代码需要在内部iRAM(steppingstone,起始地址0x0)的4K中运行.链接地址与运行地址(程序启动后PC从0x0位置执行)不一致时,不能出现位置相关代码.文中主要针对 SDRAM 初始化程序地址无关码问题进行了简单的分析. (本文的由来是我在学习韦东山系列 ARM 裸板开发过程遇到的一个问题所引发的.在虚拟内存(MMU)操作部分,他提到了 SDRAM 初始化过程应该用位置无关的代码实现…
在ARM裸板驱动编程中,是不允许程序直接调用C库程序的.为什么呢?因为此时kernel还没有被加载,所以在封装在kernel层的C库的API是用不了的,那怎么办? 在开发过程中,printf的功能我不用再详细多说,就是用来debug调试程序的,有了printf,写代码出错的时候能够快速定位错误. 那么如何在裸板中调用呢? 1.首先,我们在u-boot源代码中找到System.map这个文件,打开后我们能看到以下信息:(太多了,我只列举一部分) 40c29e94 T memscan 40c29eb…
//***************************************************************** //作者:昊天 // //功能:在ok6410板子上跑裸板程序,用四个按键控制四个led灯的两灭及蜂鸣器的叫声, //      当按键1按下时(此时为低电平)点亮led1同时蜂鸣器响,当松手时,led1灭及蜂鸣器不响     //      以此类推剩下三个键 //时间:2012/12/13   22:01 //************************…
在裸板2440中,当我们使用nand启动时,2440会自动将前4k字节复制到内部sram中,如下图所示: 然而此时的SDRAM.nandflash的控制时序等都还没初始化,所以我们就只能使用前0~4095地址,在前4k地址里来初始化SDRAM,nandflash,初始化完成后,才能将nandflash的4096至后面的地址内容存放到SDRAM里去. 而裸板驱动的步骤如下所示: 1.写makefile 2.写lds链接脚本 (供makefile调用) 3.写真正要执行的文件代码,比如初始化nand…
问题一:程序直接在iRAM内部可正常执行,而程序搬移(Nand ->SDRAM)之后,就不能正常运行了 #define NAND_SECTOR_SIZE 2048 /* 读函数 */ void nand_read(unsigned char *buf, unsigned long start_addr, int size) { int i, j; //if ((start_addr & NAND_BLOCK_MASK) || (size & NAND_BLOCK_MASK)) if…
要点亮LED,先决条件是什么,当然得有相应的硬件设施.板子的整个电路图比较大,我就直接取相关部分. 给发光二级管加上3.3v电压后,通过1k电阻,直接与S3C2440连接.至于为什么要加电阻,大家应该都知道,发光二极管的正向电阻很小,管子很容易因电流过大而烧坏.至于具体多少,可以看你买的管子的说明. 具体的烧写驱动安装,ARM集成开发环境安装我就不说了.一般都有手册,手册里面说得很清楚. 下面是代码实现: AREA LED,CODE,READONLY ENTRY CODE32GPFCON EQU…
由于arm芯片一般都包含的由jtag调试这项功能,cpu向外部发出信号时,一般都要同jtag发送出去,它就像一个路口的交警一样,能够控制车辆的运行,当然在arm中指的是cpu发出的数据和地址,我们在调试的时候,拿到板子将板子的jtag接口接到jtag调试器,然后将jtag调试器与pc相连,那么调试系统就搭建完成,之后在电脑上一般的IDE软件,例如keil,ads这样的软件可以通过发送命令给jtag,然后jtag就可以中断cpu的数据发送和地址,那么此时就可以访问cpu中的各个寄存器,进行调试.j…
1. 点灯 2. 串口打印 3. JTAG调试器3.1 命令行调试 3.2 源码级别的调试前提a. 程序必须已经重定位好,位于它的链接地址a.1 如果程序的链接地址是SDRAM, 使用openocd初始化SDRAMa.2 使用arm-linux-gdb/arm-elf-gdb下载程序 b. 链接脚本必须把text,rodata,data,bss等分开存放c. 被调试的程序为ELF格式,内含调试信息(即编译时有-g选项)…