Linux环境下OK6410裸机开发详解
来源:互联网 发布:js utc转换 gmt 8000 编辑:程序博客网 时间:2024/05/17 23:24
关于ok6410的裸机开发资料,大多都是windows下的,使用RVDS编写裸机程序,并编译烧录到开发板上运行,但是我整了很久也没在windows10上将环境装好,又懒得装一个xp的虚拟机,所以就摸索在Linux下进行裸机程序的开发。具体内容分为以下几个部分:
一.前期准备
二.裸机程序的编写(驱动LED)
三.裸机程序编译链接
四.裸机程序的烧录
一.前期准备
1.交叉编译工具链
交叉编译工具链用来编译、链接裸机程序,生成开发板可执行的二进制文件,只需要将ok6410光盘中的交叉编译工具解压到Linux下,并添加环境变量指明路径即可,如下图:
2.tftp服务器
tftp服务器用来将二进制文件传送到开发板上
1.安装xinetd:
zoro@ubuntu:~$ sudo apt-get install xinetd2.安装tftp客户端和服务器
zoro@ubuntu:~$ sudo apt-get install tftp tftpd3.建立配置文件:
建立/etc/xinetd.h/tftp 并写入如下内容,其中var/tftpboot/是服务器的目录,需要将其权限设为777
3.SD卡
由于之后裸机程序需要通过uboot上的tftp烧录到开发板中,所以需要制作SD卡将uboot烧录到NandFlash
二、裸机程序的编写
之前的准备工作做好之后,就可以编写裸机程序了,按照国际惯例先驱动LED(比较简单……),首先看ok6410的原理图
由原理图可知,4个LED对应着芯片的GPM0~GPM3,接下来看芯片手册
由芯片手册可知,GPM0~GPM3的配置是GPMCON的0~15位,分别将其设置为0001,即输出模式,然后给GPMDAT寄存器赋值即可确定输出高电平或者低电平,由原理图可知,在ok6410开发板输出低电平,LED发光。知道这些即可编写裸机程序:
1 #define rGPMCON (*(volatile unsigned *)(0x7F008820)) 2 #define rGPMDAT (*(volatile unsigned *)(0x7F008824)) 3 #define rGPMPUD (*(volatile unsigned *)(0x7F008828)) 4 5 6 void msDelay(int time) 7 { 8 volatile unsigned int i,j; 9 for(i = 0; i < 2000000; i++) 10 for(j=0; j<time; j++); 11 } 12 13 void GPIO_Init(void) 14 { 15 rGPMCON = 0x11111; 16 rGPMPUD = 0x00; 17 rGPMDAT = 0X1F; 18 } 19 void LedTest(void) 20 { 21 volatile unsigned int i; 22 while (1) 23 { 24 for(i=0; i<4; i++) 25 { 26 rGPMDAT = ~(1<<i); 27 msDelay(10); 28 } 29 30 } 31 } 32 33 int main(void) 34 { 35 GPIO_Init(); 36 LedTest(); 37 return 0; 38 }再编写启动代码,调用C程序:
1 2 bl _start 3 _start: 4 5 /* Peri port setup */ 6 ldr r0, =0x70000000 7 orr r0, r0, #0x13 8 mcr p15,0,r0,c15,c2,4 @ 256M(0x70000000-0x7fffffff) 9 10 /* Disable Watchdog */ 11 ldr r0, =0x7E004000 @看门狗寄存器地址为0x7E004000 12 mov r1, #0 13 str r1, [r0] @往看门狗寄存器写入0,关闭看门狗,否则板子会不断重启 14 15 /* 设置栈 */ 16 ldr sp, =8*1024 @此时栈大小不能大于8K,因为现在可用的内存只有8K 17 @NAND Flash中的代码在复位后会移到SRAM中,而SRAM只有8K大小 18 19 20 bl main @跳入C程序的main函数处执行 21 halt: 22 b halt其中678三行告诉cpu外设的基地址(如下图),16行用于设置C语言的运行栈,20行跳转到main函数(当然,不叫main也是可以的,如果改名的话,在C语言程序里做相应改变就行),最后俩行相当于一个死循环
到这里裸机程序已经写完了,接下来需要做的就是编译了。
三、 裸机程序编译链接
说白了,使用RVDS只是把编译链接的过程集合到一块了,现在我们需要自己做这些工作,通过Makefile组织文件:
1 ll: led.bin 2 3 led.bin: start.o led.o 4 arm-linux-ld -Ttext 0 -o led.elf start.o led.o 5 arm-linux-objcopy -O binary led.elf led.bin 6 arm-linux-objdump -D led.elf > led.dis 7 8 start.o : start.s 9 arm-linux-gcc -g -o start.o start.s -c 10 11 led.o : led.c 12 arm-linux-gcc -g -o led.o led.c -c 13 14 clean: 15 rm *.o led.elf led.bin led.dis
arm-linux-gcc -g 为了调试 -o 控制输出文件 -c 只编译不链接
arm-linux-ld 链接器
arm-linux-objcopy 输出可执行二进制文件
arm-linux-objdump 将led.elf反汇编到led.dis中
然后执行make命令,就会生成二进制文件 len.bin
四.裸机程序的烧录
进行到这里,只需要将可执行文件烧录到开发板执行就ok了
1.将led.bin文件复制到tftp服务器的目录下(和我的配置的一样的话,即/var/tftpboot目录)
2.向开发板烧录uboot,然后切换到nandflash启动,出现输出信息是按空格,出现如下画面就成功了
然后选择6,进入uboot,给开发板连接网线,确保主机和开发板处于同一局域网,关闭主机的防火墙,然后配置ip
由上向下依次是 开发板ip, 主机ip, 网关, 最后保存
3.将可执行文件下载到DRAM:
tftp 【地址】【文件名】
注意这里的地址必须在0x50000000~0x6FFFFFFF范围内,因为其他内存地址不是DRAM
此时使用go命令, go 【地址】,即可运行你的裸机程序了,可以看到led被点亮了
4.到这里可以说整个流程都走完了,但是裸机程序掉电以后就没了,如果想让程序掉电以后还在开发
板上,可以将裸机程序写到nandflash,具体做法如下:
nand erase 【偏移量】【擦除长度】
擦除一块nand,我这里从0x30000000开始 擦除了1M
nand write 【内存地址】【偏移量】【写长度】
将内存里的数据写到nand,这里将0x60000000的裸机程序写到0x30000000处
然后重启以后,再将这片nand内容读入内存,使用go命令运行读到文件的地址。
这里需要注意的是,如果nand擦除的地址太低的话,有可能覆盖uboot,导致uboot不能正常启动,当然写入的地址如果为0的话,
开发板启动以后会直接执行你写的裸机程序,不执行uboot了。
到这里,你已经可以使用linux开发OK6410的裸机程序了,赶快燥起来,把其他外设也都驱动起来吧!
阅读全文
1 0
- Linux环境下OK6410裸机开发详解
- OK6410裸机开发环境搭建1
- OK6410裸机开发之Ubuntu上Openocd环境搭建
- linux下ok6410驱动开发环境搭建基本教程
- Linux下arm裸机开发环境搭建与实例
- Linux下arm裸机开发环境搭建与实例
- Linux下ARM裸机开发环境搭建与实例
- Linux下arm裸机开发环境搭建与实例
- Linux下arm裸机开发环境搭建与实例
- OK6410裸机开发之Beep
- OK6410裸机开发之KEY
- OK6410------裸机开发平台搭建
- ARM下裸机开发环境大全
- ARM下裸机开发环境大全
- ok6410裸机下跑led灯
- OK6410开发板裸机DS18B20驱动
- OK6410裸机开发之LED灯
- ok6410裸机开发启动程序模板
- wpf简单验证
- springboot 继承shiro 使用redis缓存 @Value 标签无效 无法获取zhi
- extjs4 grid 滚动条 联动
- ArrayAdapter 和 Spinner
- linux常用命令(1)——路径、文件
- Linux环境下OK6410裸机开发详解
- 批量删除hive表分区
- 心跳机制
- Laravel使用Redis
- 2017_12_01 echarts+springboot+mybatis(动态获取数据饼图+gl三维demo)
- 关系型数据库连接表的几种方式
- druid配置,以及应用
- gcc常用命令简介
- 视频开发(二) FFMPEG简介
原创粉丝点击
热门IT博客
热门问题
老师的惩罚
人脸识别
我在镇武司摸鱼那些年
重生之率土为王
我在大康的咸鱼生活
盘龙之生命进化
天生仙种
凡人之先天五行
春回大明朝
姑娘不必设防,我是瞎子
荨麻疹能吃山药吗
山药炒黑木耳
淮山是山药吗
胡萝卜山药排骨汤
乌鸡山药汤的做法
山药和胡萝卜
山药可以减肥吗
山药可以炖排骨吗
淮山是什么
淮山的功效
淮山
淮山的功效与作用
淮山怎么做好吃
怀山
淮山的做法大全家常
淮山药
淮山药图片
淮山怎么炒
淮山的做法
淮山汤的做法
淮山怎么炒好吃
三药
拔丝
拔丝香蕉的做法
拔丝香蕉
拔丝芋头
拔丝红薯
拔丝芋头的做法
拔丝红薯的做法
拔丝鸡蛋
淮山不能与什么同吃
炒淮山的做法
淮山不能和什么一起吃
玉米胡萝卜猪骨汤
孕妇能不能吃芋头
妈妈我要吃烤山药
什么人不能吃山药
孕妇能不能吃山药
淮山药和铁棍山药
寻麻疹可以吃山药吗
月子里可以吃山药吗