参考链接:(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的文件传输路径
终于...下载成功...