【tiny4412】按键控制led灯亮灭

前言:使用友善之臂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小灯全部亮起!!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值