按键控制Led的裸奔代码

来源:互联网 发布:游戏ui网络班 编辑:程序博客网 时间:2024/04/25 18:03

  很简单的代码,昨晚却折腾了很久,没有仔细看datasheet手册。
  先说下原理:GPIOB5 6 7 8分别控制着led1 2 3 4,GPBCON的[11,10],[13,12],[15,14],[17,16]bit分别控制GPIOB的输入输出状态,01为输出状态(见datasheet),GPBDAT0 1 2 3位分别控制各led的数据,输出状态下当为0低电平的时候,对应的led会亮。
  GPIOF1 4 2 0引脚控制着按键k1 k2 k3 k4,我们需要读取GPIOF的值来判断按键是否有按下,所以GPIOF要置为输入状态(GPFCON对应的各引脚为00),当有按键按下的时候,会产生一个低电平0,此时我们来轮询GPFDAT的值可以判断到是哪个键被按下。

  代码如下:

汇编代码start.S

因为是裸机跑到程序,主程序又是c,所以要建立基本的c环境,建立堆栈,关闭看门狗以免系统不停的重启,我的程序是准备copy进cpu的片内ram中运行,其只有4k大小,所以栈顶不能超出这个范围。

c代码main.c

c代码中按键和led的对应可能有点饶,我昨晚就是饶的晕头了 ,其实很简单,动手写出对应关系就好

K1(GPF1) ------Led1(GPB5)

K2(GPF4) ------Led2(GPB6)

K3(GPF2) ------Led3(GPB7)

K4(GPF0) ------Led4(GPB8)

根据读k的GPFDAT来写Led的GPFDAT

下面的是头文件main.h

用来定义一些地址

最后的是Makefile

被注释掉的部分其实也是可以的,但是生成的bin文件竟然有32K,远大于4k,所以我改用了下面的

其实使用的部分一些参数为也还没有理解,以后学会了就补上

关于注释掉的部分ld的参数-Bdynamic -lgcc_s是google来的,为了避免一个错误

 

======================================================================

下面说下怎么运行这段程序

我是用jlink下载到cpu片内ram中运行的,先将TQ2440置为nand flash启动,nand flash启动的原理是,nand 会自动将自己的前4k代码复制到cpu的片内ram中,此ram只有4k。此时的片内ram的地址(本来是0x40000000)被映射到0x0地址,所以直接会从此ram运行,这些都是硬件完成的,我们无需干涉,我们能做的就是nand的前4k代码。嗯,扯远了点,但知道了这一原理我们就可以进行下面的操作了

链接好jlink和开发板,打开jlink commader,它会自动识别开发板的信息,

在命令行输入:

loadbin  d:/led.bin     0 

setpc 0

g

下载命令 目标文件位置 下载到的位置

设置pc值

跳转到0

 

如果你想从nor flash启动,也是可以的,此时片内ram未映射,地址为0x40000000,所以稍加改动即可

loadbin  d:/led.bin     0x40000000 

setpc 0x40000000

g

 

ok,到这里一切大功告成了 ,可以试验下,是否有效了,如果有出入,请仔细对照datasheet和开发板原理图修改

 

 

 

原创粉丝点击