之前的工作中都是基于STM32开发项目的,很想学习下系统级别ARM Linux开发,手上正好有块友善之臂的Tiny4412开发板,在此做下记录,方便自己查阅,也希望能给大家提供参考。
- 开发板:Tiny4412SDK标准版 「Tiny4412 SDK 1506」
- 工具:「arm-linux-gcc-4.5.1」 「minicom」 「dnw」
- 平台:Ubuntu 14.04
1. 根据原理图查找LED灯对应的GPIO
四个用户灯集成在核心板上:
根据原理图,LED1—LED4对应GPM4_0—GPM4_3,且低电平有效「点亮」。
2. 根据芯片手册查找GPIO相关寄存器
GPIO操作主要用到两个寄存器,一个是控制寄存器,用来设置GPIO的模式,比如输入、输出,另一个是数据寄存器。
GPM4CON每4bit一组,用来设置一路GPIO的模式,我们需要4路GPIO输出模式,所以Value的值为0x1111即可。
GPM4DAT寄存器的低四位对应了我们使用到的4个GPIO,对应给0,LED灯点亮,给1,LED灯熄灭。
3. 编写程序
led.c代码如下:
#define gpiobase 0x11000000
#define GPM4CON (*(volatile unsigned long *)(gpiobase + 0x02E0))
#define GPM4DAT (*(volatile unsigned long *)(gpiobase + 0x02E4))
void delay(void);
void ledConfig(void);
void ledOut(int pin, int ena);
int led(void)
{
int i;
ledConfig();
while(1)
{
for(i = 0; i < 4; i++)
{
ledOut(i, 0);
delay();
ledOut(i, 1);
}
}
return 0;
}
void ledConfig(void)
{
GPM4CON &= ~0xFFFF;
GPM4CON |= 0x1111;
}
void delay()
{
int x, y;
for(x = 0; x < 500; x++)
for(y = 0; y < 500; y++);
}
void ledOut(int pin, int ena)
{
GPM4DAT &= ~(1 << pin);
GPM4DAT |= ena<<pin;
}
Makefile代码如下:
default:
arm-linux-gcc -c led.c -o led.o
arm-linux-ld -Ttext=0x70003000 led.o -o led
arm-linux-objcopy -O binary led led.bin
clean:
rm -f led.o led led.bin *~
在当前目录下make clean,然后make,就生成了led.bin的二进制文件。
4. 上传程序到目标板
在minicom串口终端中执行:
dnw 70003000
可以看到uboot已经准备好,等在下载。
然后在ubuntu下执行:
dnw led.bin
文件通过dnw上传到开发板的0x70003000地址。
然后在串口终端执行:
go 70003000
提示正在运行: