Tiny4412裸机点亮LED

之前的工作中都是基于STM32开发项目的,很想学习下系统级别ARM Linux开发,手上正好有块友善之臂的Tiny4412开发板,在此做下记录,方便自己查阅,也希望能给大家提供参考。

  • 开发板:Tiny4412SDK标准版 「Tiny4412 SDK 1506」
  • 工具:「arm-linux-gcc-4.5.1」 「minicom」 「dnw」
  • 平台:Ubuntu 14.04

1. 根据原理图查找LED灯对应的GPIO

四个用户灯集成在核心板上:

Tiny4412裸机点亮LED_第1张图片

根据原理图,LED1—LED4对应GPM4_0—GPM4_3,且低电平有效「点亮」。

Tiny4412裸机点亮LED_第2张图片

Tiny4412裸机点亮LED_第3张图片

2. 根据芯片手册查找GPIO相关寄存器

GPIO操作主要用到两个寄存器,一个是控制寄存器,用来设置GPIO的模式,比如输入、输出,另一个是数据寄存器。

Tiny4412裸机点亮LED_第4张图片

Tiny4412裸机点亮LED_第5张图片

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的二进制文件。

Tiny4412裸机点亮LED_第6张图片

4. 上传程序到目标板

在minicom串口终端中执行:

dnw 70003000

可以看到uboot已经准备好,等在下载。
等待下载
然后在ubuntu下执行:

dnw led.bin

文件通过dnw上传到开发板的0x70003000地址。
Tiny4412裸机点亮LED_第7张图片
Tiny4412裸机点亮LED_第8张图片

然后在串口终端执行:

go 70003000

提示正在运行:

运行

5. LED灯点亮

更多内容,欢迎关注我的公众号。 微信扫一扫下方二维码即可关注:
扫码加入微信公众号:TonyCode

你可能感兴趣的:(ARM)