uboot裸机编程以及程序烧录

参考链接:(100条消息) tftp配置方法及常见错误_寻找家的感觉的博客-CSDN博客_tftp连接请求失败

 今天学了一天,想试试程序烧录,看看linux的裸机编程效果,没想到碰到了一连串的问题...

硬件平台:GEC6818

软件平台:Ubuntu16.04、MobaXterm

逻辑编程思路:

        与51思路差不多:

        1.分析原理图

        2.分析控制原理

        3.查阅使用手册寻找相关寄存器

        4.分析寄存器控制原理

        5.配置寄存器(位带操作)

以Led为例:

(1)如图,左边接线为VCC电源,由此可知点亮led灯的条件便是拉低对应引脚电平,至此12步骤均已完成

 (2)阅读说明

1.配置某个端口某个引脚为输出模式

GPIOE多功能寄存器,设置对应的为b'00(这里是二进制格式)

2.使能当前的引脚输出使能

GPIOE 输出使能寄存器对应的位设置为1

3.输出高低电平

GPIOE输出寄存器对应的位设置为1/0.

(3)查阅相关寄存器

 (4)根据阅读说明得到的配置步骤将相应寄存器位置位,以下是示例代码:

//1.定义寄存器
#define GPIOEOUT 		(*(volatile unsigned int *)0xC001E000)
#define GPIOEOUTENB 	(*(volatile unsigned int *)0xC001E004)
#define GPIOEOUTALTFN0 	(*(volatile unsigned int *)0xC001E020)
#define GPIOEOUTALTFN1 	(*(volatile unsigned int *)0xC001E024)

static void delay(void);

//2.c程序的入口,同时不使用标准的c库,因此入口函数名字为_start
void _start(void)
{
	
	//配置GPIOE13为输出模式
	GPIOEOUTALTFN0&=~(3<<26);	//GPIOE13的多功能配置[27:26]清零
	
	
	//允许GPIOE13输出电平
	GPIOEOUTENB|=1<<13;			
	
	while(1)
	{
		
		//点亮
		GPIOEOUT&=~(1<<13);
		
		//延时一会
		delay();
		
		//熄灭
		GPIOEOUT|=1<<13;
		
		//延时一会
		delay();
	}
}

void delay(void)
{
	//思考为什么要加volatile
	volatile unsigned int i=0x2000000;
	
	while(i--);
}

至此,简单的一个led驱动就编写完成了我们将其编译后生成可执行文件

        1.将led.c编译为目标文件led.o,且不使用标准c的库:

        arm-linux-gcc -o led.o -c led.c -nostdlib

        2.将led.o链接到内存地址0x40000000,输出新的执行程序为led.elf:

        arm-linux-ld -Ttext 0x40000000 -o led.elf led.o

        3.由于uboot不是linux操作系统,不具有运行应用程序的能力,需转为bin文件:

        arm-linux-objcopy -O binary led.elf led.bin

        4.使用uboot的tftp进行下载:

        tftp 0x40000000 led.bin

        5.执行led.bin:

        go 0x40000000

     在烧录之前需配置uboot网络环境变量:ipaddr、gatewayaddr、netmask、ethaddr、serveraddr。

        上述变量依次是板子ip地址、网关ip、子网掩码、MAC、服务器IP(这里建议配置为ubuntu的IP),在我的一通操作下配置完了(记得saveenv),但是无论我怎么ping虚拟机都无法ping通: 

      

        上图是网络不通的情况,下图是配置完成的情况:(ping的ip不同,这里仅为了展示两种效果)

         后询问老师得知“板子出厂uboot有问题”,需要刷机...,在uboot模式下输入“fastboot”并在fastboot目录(PC端)下执行auto.bat

        刷机完成后修改IP即可ping通...

        调用tftp 40000000 led.bin 将可执行文件下载至0x40000000处,传输失败(输出内容我给忘记了)错误原因:“tftp服务器未开启”,于是我又回到了虚拟机当中输入“netstat -a | grep tftp”发现终端没有任何信息输出->tftp没能启动成功->输入“service xinetd restart”->依旧没有信息输出->"思考片刻...会不会是tftp压根就没安装好?",于是我参照文章开头的参考链接重新配置了一遍tftp,再次输入“netstat -a | grep tftp”输出“udp 0 0 *:tftp *:* ”,至此tftp配置完成

(sudo gedit /etc/default/tftpd-hpa)在该文件下可设置tftp的文件传输路径

 

        终于...下载成功... 

  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值