【ARM】ARM接口技术
2022-05-13 来源:eefocus
#0开发工具的使用
##0.1安装keil4
在arm资料1压缩文件中找到mdk411.rar,解压,双击MDK411.exe进行安装
##0.2运行MDK411.EXE安装
##0.3选择好要安装的目的位置
点NEXT,安装界面如下
##0.4安装完成并运行
安装完成后,鼠标右键单击该程序,以管理员身份运行该程序:
把CID拷贝下来:
复制Computer ID:C2043-1B7RE ,然后运行
把CID填入上图,然后:
复制注册码:
复制注册码填入:
点ADD LIC后,提示:
提示:*** LIC Added Sucessfully ***
说明注册成功了。
##0.5安装JLink驱动
在资料2中可以找到Setup_JLinkARM_V408k.exe文件,双击安装JLink驱动
将会弹出如下窗口
然后一直点击next
最后提示出如下界面
##0.6运行测试例程,验证开发板是否OK
运行老师给的mini2440_led工程文件,即双击mini2440_led.uvproj文件
可以看到以下界面:
双击点开main.c,看看源码
看不懂,没关系,直接编译,看结果,点
在最下方提示出如下结果
紧接着点
进入调试界面
点击运行程序,听开发板蜂鸣器的运行状态!
(蜂鸣器一会响,一会停)
点击上面红【 X】停止运行
再次点击点【 】退出调试状态。
#1自己做一个例子
##1.1新建一个项目
##1.2选择与开发板对应的CPU型号
##1.3设置一个好的目标和组
结果如下:
##1.4配置目标
点OK!
##1.5创建一个测试文件
###1.5.1创建main.c文件
保存为main.c
把main.c添加到工程
###1.5.2建一个汇编文件
同样的步骤建一个汇编文件,保存,添加!
###1.5.3建立一个ini文件
内容如下:
说明:倒数第三行文件要根据实际情况进行设置
FUNC void SetupForStart (void) {
// PC = 0x30000000; } FUNC void Init (void) { _WDWORD(0x4A000008, 0xFFFFFFFF); // Disable All Interrupts _WDWORD(0x53000000, 0x00000000); // Disable Watchdog Timer // Clock Setup // FCLK = 300 MHz, HCLK = 100 MHz, PCLK = 50 MHz _WDWORD(0x4C000000, 0x0FFF0FFF); // LOCKTIME _WDWORD(0x4C000014, 0x0000000F); // CLKDIVN _WDWORD(0x4C000004, 0x00043011); // MPLLCON _WDWORD(0x4C000008, 0x00038021); // UPLLCON _WDWORD(0x4C00000C, 0x001FFFF0); // CLKCON // Memory Controller Setup for SDRAM _WDWORD(0x48000000, 0x22000000); // BWSCON _WDWORD(0x4800001C, 0x00018005); // BANKCON6 _WDWORD(0x48000020, 0x00018005); // BANKCON7 _WDWORD(0x48000024, 0x008404F3); // REFRESH _WDWORD(0x48000028, 0x00000032); // BANKSIZE _WDWORD(0x4800002C, 0x00000020); // MRSRB6 _WDWORD(0x48000030, 0x00000020); // MRSRB7 _WDWORD(0x56000000, 0x000003FF); // GPACON: Enable Address lines for SDRAM } // Reset chip with watchdog, because nRST line is routed on hardware in a way // that it can not be pulled low with ULINK _WDWORD(0x40000000, 0xEAFFFFFE); // Load RAM addr 0 with branch to itself CPSR = 0x000000D3; // Disable interrupts PC = 0x40000000; // Position PC to start of RAM _WDWORD(0x53000000, 0x00000021); // Enable Watchdog g, 0 // Wait for Watchdog to reset chip Init(); // Initialize memory LOAD .objnew.axf INCREMENTAL // Download program SetupForStart(); // Setup for Running g, main // Goto Main 保存为ram.ini ##1.6设置参数 ##1.7上板子调试 #2ARM接口原理 ##2.1查看原理图 思路: 要控制一个设备,首先想到的是搞清楚这个硬件设备在什么位置。 怎么办? 参考《mini2440-um-20090223.pdf》第13页 找到丝印,再找原理图 参考原理图《mini2440原理图.pdf》第3页。 通过网络表nLED_1,在原理图中找到控制这个灯的cpu引脚。 找到cpu引脚与LED灯的对应关系如下 GPB5----------------- nLED _1 GPG6----------------- nLED _2 GPB7----------------- nLED _3 GPB8----------------- nLED _4 接下来怎么办? 接下来就要看cpu的说明书了,就像我们买了一个微波炉,使用前就要看一下它的说明书,我们CPU的说明书就是s3c2440的datasheet。即《S3C2440全套中文手册.PDF》 ##2.2GPIO控制原理 ##2.2.1GPBCON 两个位控制一个引脚,所以GPB0GPB10共11各引脚,需要021共22各位来设置 00----该引脚配置为输入 01----该引脚配置为输出 10------该引脚配置为其他特殊功能 11------一般引脚表示保留,未使用 要让我们四个LED亮灭,GPBCON寄存器该如何设置呢? GPBCON===????? GPBDAT是数据寄存器,用来控制(或者反应)引脚的高低电平,该寄存器是一个位对应一个引脚,如果某个位为0那么对应引脚为低电压,如果为1则引脚为高电平 ##2.2.2GPBDAT 原理搞清楚了,程序怎么写? ##2.3程序怎么写 我们要把某个引脚设置为输出,也就是我们的GPBCON寄存器要配置为0x15400,那么这个值怎么给我们的cpu呢? 这里的地址,就是cpu提供给我们控制它的接口。 知道了这个接口,代码怎么操作呢? 这里涉及到怎么访问可读性的绝对地址问题? void delay(int time) { int i,j; for(i=0; i