前言:使用友善之臂tiny4412进行嵌入式学习,对于初学者而言并不是一件轻松事情,即使该平台已经存在很多年,网上也有很多分享,但由于官方文档相对还是不够全面,导致很多初学者遇到问题不知如何下手,如果可以建议初学者使用2240、6410来进行学习(更加成熟,如果学习途中遇到问题,在网上寻找解决方案会更加快捷),下面我会记录自己利用该平台学习嵌入式开发的一些过程及遇到的一些问题
- 平台:Ubuntu:16.04
- 开发板:Tiny4412 1506
- 依赖工具:arm-linux-gcc 4.5.1 dnw minicom (使用minitools传输在裸板开发时尝试过很多方法程序没有跑起来,后来干脆直接使用dnw的方式,有成功的小伙伴可以留言介绍下,感谢)
1、在开发板PCB图上找到相应的引脚与对应的寄存器
a、电路图中led对应的引脚为
从上图可以找到相应的寄存器GPM4,于是从三星给到芯片手册中可以搜索GPM4可以找到相应的控制寄存器与数据寄存器:
b、button
与LED一样,通过先查找官方给的原理图,找到LED的引脚位置:
再利用引脚编码XEINT26查找对应的寄存器GPX3,同样在三星官方给的芯片手册中找到对应的数据寄存器与控制寄存器:
2、编码
a、地址写进头文件中adress.h
#pragma once
//led 灯引脚寄存器
#define gpiobase 0x11000000
#define GPM4DAT (*(volatile unsigned long *)(gpiobase + 0x02E4))
#define GPM4CON (*(volatile unsigned long *)(gpiobase + 0x02E0))
//key 引脚寄存器
#define GPX3DAT (*(volatile unsigned long *)(gpiobase + 0x0C64))
#define GPX3CON (*(volatile unsigned long *)(gpiobase + 0x0C60))
b、控制逻辑如下:
#include "address.h"
void led_on(void);
void led_off(void);
void (*printf)(char *, ...) = 0x43e11a54;//该函数地址在uboot中可以找到对应地址
void key_led(void){
//GPX3_2~GPX3_5分别控制K1~K4
GPX3CON &=~(0xffff<<8);//Configure GPX3-2 as input for K1~K4
//K1 ->GPX3-2,1=keydown,0=keyup
while (1)
{
/* 使用按键控制led灯 */
//->GPX3-2,1=keydown,0=keyup
if(GPX3DAT&(1<<2)){
led_off();
}else{
led_on();
}
//->GPX3-4,1=keydown,0=keyup
if(GPX3DAT&(1<<4)){
led_off();
}else{
led_on();
}
//->GPX3-5,1=keydown,0=keyup
if(GPX3DAT&(1<<5)){
led_off();
}else{
led_on();
}
}
//K3我这儿K3按键已经损坏
}
void led_on(void){
GPM4CON &= ~0xffff;//控制位先清零,然后赋1
GPM4CON |=0x1111;
GPM4DAT &=~0xf; //赋0控制灯亮
}
void led_off(void){
GPM4CON &= ~0xffff;//控制位先清零,然后赋1
GPM4CON |=0x1111;
GPM4DAT |=0xf; //赋1控制灯灭
}
c、Makefile:
default:
arm-linux-gcc -c key_led.c -o key_led.o
arm-linux-ld -Ttext=0x70003000 key_led.o -o key_led
arm-linux-objcopy -O binary key_led key_led.bin
clean:
rm -f key_led.o key_led key_led.bin *~
执行make,然后生成key_led.bin二进制文件
连接dnw到70003000处:
然后使用dnw传送二进制文件到板子上:
使用go 70003000执行:
然后分别按K1,K3,K4可以看到led小灯全部亮起!!!