【tiny4412】按键控制led灯亮灭

文章目录

    • 前言:使用友善之臂tiny4412进行嵌入式学习,对于初学者而言并不是一件轻松事情,即使该平台已经存在很多年,网上也有很多分享,但由于官方文档相对还是不够全面,导致很多初学者遇到问题不知如何下手,如果可以建议初学者使用2240、6410来进行学习(更加成熟,如果学习途中遇到问题,在网上寻找解决方案会更加快捷),下面我会记录自己利用该平台学习嵌入式开发的一些过程及遇到的一些问题
      • 1、在开发板PCB图上找到相应的引脚与对应的寄存器
        • a、电路图中led对应的引脚为![在这里插入图片描述](https://img-blog.csdnimg.cn/9488830fc14a4e6faeb4587ead363726.jpeg#pic_center)
        • b、button
      • 2、编码
      • a、地址写进头文件中adress.h
      • b、控制逻辑如下:
        • c、Makefile:

前言:使用友善之臂tiny4412进行嵌入式学习,对于初学者而言并不是一件轻松事情,即使该平台已经存在很多年,网上也有很多分享,但由于官方文档相对还是不够全面,导致很多初学者遇到问题不知如何下手,如果可以建议初学者使用2240、6410来进行学习(更加成熟,如果学习途中遇到问题,在网上寻找解决方案会更加快捷),下面我会记录自己利用该平台学习嵌入式开发的一些过程及遇到的一些问题

  • 平台:Ubuntu:16.04
  • 开发板:Tiny4412 1506
  • 依赖工具:arm-linux-gcc 4.5.1 dnw minicom (使用minitools传输在裸板开发时尝试过很多方法程序没有跑起来,后来干脆直接使用dnw的方式,有成功的小伙伴可以留言介绍下,感谢)

1、在开发板PCB图上找到相应的引脚与对应的寄存器

a、电路图中led对应的引脚为【tiny4412】按键控制led灯亮灭_第1张图片

在这里插入图片描述
从上图可以找到相应的寄存器GPM4,于是从三星给到芯片手册中可以搜索GPM4可以找到相应的控制寄存器与数据寄存器:
【tiny4412】按键控制led灯亮灭_第2张图片
【tiny4412】按键控制led灯亮灭_第3张图片

b、button

与LED一样,通过先查找官方给的原理图,找到LED的引脚位置:
【tiny4412】按键控制led灯亮灭_第4张图片
在这里插入图片描述

再利用引脚编码XEINT26查找对应的寄存器GPX3,同样在三星官方给的芯片手册中找到对应的数据寄存器与控制寄存器:
【tiny4412】按键控制led灯亮灭_第5张图片
在这里插入图片描述

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二进制文件
【tiny4412】按键控制led灯亮灭_第6张图片
连接dnw到70003000处:
【tiny4412】按键控制led灯亮灭_第7张图片
然后使用dnw传送二进制文件到板子上:
【tiny4412】按键控制led灯亮灭_第8张图片
使用go 70003000执行:
【tiny4412】按键控制led灯亮灭_第9张图片
然后分别按K1,K3,K4可以看到led小灯全部亮起!!!

你可能感兴趣的:(Linux驱动开发学习,c语言,驱动开发,学习,arm开发,物联网)