开发板的厂商给的网盘中有相应的驱动下载,对应的目录为 06-裸机程序实验文档以及工具文件这一文件夹。其实里面只有两个简单的例程和一个简单的教程。
官方提供了三个版本的驱动,分别是xp,win7 32位与win7 64位,我是在win10 x64环境下使用的,选择win7 64位实测也是可以用的。安装这个驱动要先把win10的驱动强制签名先给关闭掉。
驱动的文件夹里面有一个解决驱动签名的小软件,我一开始也是这样操作的,重启了一次才想起来win10的驱动强制签名未关闭,所以这一步不知道是不是必须的。
前面的步骤操作完之后,打开DNW这个软件。
点击Configuration->Options配置串口以及USB。
这个软件也是有点历史了,只能从COM1-4里面选。到设备管理器里查看自己是串口几,如果不是1-4的话可以右键USB转串口工具-属性-端口设置选项卡->高级,将COM端口号改为COM4以下,貌似这里也要重启才能生效。
以上都没有问题之后,将板子的串口以及USB连上PC,DNW软件中 点击 Serial Port -> Connect,连接成功的话会在标题栏显示串口号及波特率。
上电启动板子,在uboot读秒时输入任意键进入uboot命令行。
输入dnw使板子进入 DNW模式?
这时候可以在设备管理器中看到一个名为 SEC S3C6400X Test B/D 的未知设备,手动将其驱动更新为前面的 win7 64位的dnw驱动,驱动安装成功后可以看到一个名为iTOP-4412 dnw driver的设备。
这里主要参照的就是板子所提供的那一份简陋的文档。
驱动安装完成后,重启开发板进入uboot命令行模式。
然后输入dnw 40008000,(意思是启动dnw 将程序下载到0x40008000的位置上)
然后点击USB Port->Transmit->Transmit,选择所提供的两个例程中的任意一个的bin文件,这一次其实是设置路径,并没有直接将bin文件传送至开发板。
再一次点击USB Port->Transmit会发现下面多了刚才选择的路径,点击这个选项将这个bin文件传送至开发板。正常的话显示如下。
在命令行中输入go 0x40008000,就是我们一开始设置的地址,可以看到板子上的LED交替闪烁。这个裸机程序就成功的跑起来了。
以LED这里例程为例子,先查看底板的原理图,可以看到LED2和LED3是分别接到了KP_COL0和VDD50_EN这两根线上的,当这两个IO为高时,Q2开启,LED被点亮。
再查看核心板的原理图,在核心板原理图中分别搜索KP_COL0和VDD50_EN
可以得知KP_COL0实际对应的引脚为GPL2_0,VDD50_EN实际对应的引脚为GPK1_1。
在4412 SOC的数据手册中搜索GPL2查看GPL2端口的寄存器。
GPK1的寄存器也是类似的。
继续查看GPL2CON这个寄存器
接上图
基地址为0x11000000,偏移地址为0x0100,这是一个32为的寄存器。我们所用到的为GPL2_0这个端口,所以只需要配置GPL2CON[0]这一位为OUTPUT即可,其他位保持为0。所以 GPL2CON = 0x1即可。
继续查看GPL2DAT这个寄存器。GPL2DAT寄存器的基地址为0x11000000,偏移地址为0x0104。
根据描述,当端口被配置为OUTPUT时,管脚的状态与对应的位相同,那么只需要将第0位配置为高即可点亮GPL2_0端口对应的LED。即GPL2DAT=0x1 。
另一个LED对应的IO GPK1_1也是一样的配置方式。
GPK1CON= 0x10
#define GPL2CON (*(volatile unsigned long *) 0x11000100) //GPL2控制寄存器地址
#define GPL2DAT (*(volatile unsigned long *) 0x11000104) //GPL2数据寄存器地址
#define GPK1CON (*(volatile unsigned long *) 0x11000060) //GPK1控制寄存器地址
#define GPK1DAT (*(volatile unsigned long *) 0x11000064) //GPK1数据寄存器地址
//GPL2_0, GPK1_1
void delay(int r0) //一个简单的延时函数
{
volatile int count = r0;
while (count--)
;
}
void led_blink()
{
GPL2CON = 0x00000001; //将GPL2CON的 bit 1 置为 1,即GPL2CON[0] = OUTPUT
GPK1CON = 0x00000010; //将GPK1CON的 bit 4 置为 1,即GPK1CON[1] = OUTPUT
while(1)
{
GPL2DAT = 1; //将GPL2DAT的 bit 0 置 1,其余位置0
GPK1DAT = 0; //GPK1DAT 置 0
delay(0x80000);
GPL2DAT = 0; //GPL2DAT 置 0
GPK1DAT = 0x2; //将GPK1DAT的 bit 1 置 1,其余位置0
delay(0x80000);
}
}
这是自带例程中的led.c文件,首先定义了寄存器的地址,然后将相应的值写入寄存器中即可。
再看makefile文件
led.bin: start.o led.o
arm-none-linux-gnueabi-ld -Ttext 0x0 -o led.elf $^
arm-none-linux-gnueabi-objcopy -O binary led.elf led.bin
arm-none-linux-gnueabi-objdump -D led.elf > led_elf.dis
%.o : %.S
arm-none-linux-gnueabi-gcc -o $@ $< -c -nostdlib
%.o : %.c
arm-none-linux-gnueabi-gcc -o $@ $< -c -nostdlib
clean:
rm *.o *.elf *.bin *.dis -f
里面只是多条指令的合集,方便我们执行编译操作。
把工程拷到ubuntu里,直接在工程路径文件夹执行make即可。
下方的终端里显示了编译的过程
arm-none-linux-gnueabi-gcc -o led.o led.c -c -nostdlib
arm-none-linux-gnueabi-ld -Ttext 0x0 -o led.elf start.o led.o
arm-none-linux-gnueabi-objcopy -O binary led.elf led.bin
arm-none-linux-gnueabi-objdump -D led.elf > led_elf.dis
如果要对其他的IO进行操作 基本上都是一样的套路