TQ2440按键点亮LED灯的裸机程序

一,说到做ARM的裸机程序,很多人马上就会联想到一个名为ADS的开发工具,但是我们在linux下同样也可以做ARM的裸机程序,下面来说说其具体实施过程:

步骤一:编辑代码,这个没什么好说的。

步骤二:编译代码,编译代码分为三个方面的内容:1.链接脚本 2.用命令行确定链接时的文件顺序 3.用命令行编译。这三部分的内容可以全部写成一个Makefile文件,编译的时候执行make命令就可以了。

步骤三:把编译后的".bin"文件烧写进开发板,重新上电观察效果。

二,TQ2440按键点亮LED灯裸机程序分析:

1.启动文件:

ARM是不能直接执行C语言程序的,必须通过一个名为crt0.S的汇编程序完成一些初始化的工作后才能转而执行C语言程序,这个名为crt0.S的文件我们把其称之为--启动文件。

启动文件目的是做一些初始化的工作,为最终执行C语言程序做好准备,前面所说的初始化工作包含两个方面的内容:1.软件初始化,具体流程是 设置栈-->设置返回地址 --> 调用main函数 --> 做一些调用完后的清理工作。 2.硬件初始化,具体流程是 关闭看门狗 --> 初始化时钟 --> 初始化SDRAM。

TQ2440按键点亮LED灯裸机程序的启动文件:

@******************************************************************************
@ File:crt0.S
@ 功能:通过它转入C程序
@******************************************************************************       

.text
.global _start
_start:
            ldr     r0, =0x53000000     @ WATCHDOG寄存器地址
            mov     r1, #0x0                     
            str   r1, [r0]              @ 写入0,禁止WATCHDOG,否则CPU会不断重启
            
            ldr     sp, =1024*4         @ 设置堆栈,注意:不能大于4k, 因为现在可用的内存只有4K
                                        @ nand flash中的代码在复位后会移到内部ram中,此ram只有4K
            bl      main                @ 调用C程序中的main函数
halt_loop:
            b       halt_loop

2.Makefile :

key_led.bin : crt0.S  key_led.c 
	arm-linux-gcc -g -c -o crt0.o crt0.S
	arm-linux-gcc -g -c -o key_led.o key_led.c
	arm-linux-ld -Ttext 0x0000000 -g  crt0.o key_led.o -o key_led_elf
	arm-linux-objcopy -O binary -S key_led_elf key_led.bin
	arm-linux-objdump -D -m arm  key_led_elf > key_led.dis
clean:
	rm -f   key_led.dis key_led.bin key_led_elf *.o

Makefile的规则:

目标文件:依赖文件1 依赖文件2 .....

Tab键     命令

Makefile命令能够被执行的条件:目标文件不存在;目标文件的依赖文件已经更新;以上两个条件满足其中一个便能够执行Makefile的命令

3.TQ2440按键点亮LED灯裸机程序的源代码:

//led的控制寄存器和数据寄存器 
#define GPBCON      (*(volatile unsigned long *)0x56000010)
#define GPBDAT      (*(volatile unsigned long *)0x56000014)
//Key的控制寄存器和数据寄存器
#define GPFCON      (*(volatile unsigned long *)0x56000050)
#define GPFDAT      (*(volatile unsigned long *)0x56000054)

/*
 * LED1,LED2,LED3,LED4对应GPB5、GPB6、GPB7、GPB8
 */
#define	GPB5_out	(1<<(5*2))
#define	GPB6_out	(1<<(6*2))
#define GPB7_out    (1<<(7*2))
#define GPB8_out    (1<<(8*2))

#define	GPB5_msk	(3<<(5*2))
#define	GPB6_msk	(3<<(6*2))
#define	GPB7_msk	(3<<(7*2))
#define GPB8_msk    (3<<(8*2))

/*
 * K1,K2,K3,K4对应GPF1、GPF4、GPF2、GPF0
 */
#define GPF1_in     (0<<(1*2))
#define GPF4_in     (0<<(4*2))
#define GPF2_in     (0<<(2*2))
#define GPF0_in     (0<<(0*2))

#define GPF1_msk    (3<<(1*2))
#define GPF4_msk    (3<<(4*2))
#define GPF2_msk    (3<<(2*2))
#define GPF0_msk    (3<<(0*2))

int main()
{
        unsigned long dwDat;
        // LED1,LED2,LED3,LED4对应的4根引脚设为输出
        GPBCON &= ~(GPB5_msk | GPB6_msk | GPB7_msk | GPB8_msk); //将4个寄存器的对应位设为 00 
        GPBCON |= GPB5_out | GPB6_out | GPB7_out | GPB8_out; 
        
        // K1,K2,K3,K4对应的4根引脚设为输入   
        GPFCON &= ~(GPF1_msk | GPF4_msk | GPF2_msk | GPF0_msk); //将4个寄存器的对应为设为 00 
        GPFCON |= GPF1_in | GPF4_in | GPF2_in | GPF0_in;  

        while(1){
            //若Kn为0(表示按下),则令LEDn为0(表示点亮)
            dwDat = GPFDAT;             // 读取GPF管脚电平状态
        
            if (dwDat & (1<<1))        // K1 没有按下
                GPBDAT |= (1<<5);       // LED1熄灭
            else    
                GPBDAT &= ~(1<<5);      // LED1点亮
                
            if (dwDat & (1<<4))         // K2 没有按下
                GPBDAT |= (1<<6);       // LED2熄灭
            else    
                GPBDAT &= ~(1<<6);      // LED2点亮
    
            if (dwDat & (1<<2))         //K3 没有被按下     
                GPBDAT |= (1<<7);       //LED3熄灭   
            else
                GPBDAT &= ~(1<<7);      //LED3点亮
                
            if (dwDat & (1<<0))         // K4 没有按下
                GPBDAT |= (1<<8);       // LED4熄灭
            else    
                GPBDAT &= ~(1<<8);      // LED4点亮
    }

    return 0;
}

具体原理和硬件的分析这里就不多说了,我以前写过一边名为《TQ2440按键点亮LED驱动程序》 这里面有分析,不同之处在于linux下的按键点亮LED是通过中断实现的,而这里的裸机程序并没有通过按键中断实现,而只是把按键所接的引脚当作一个普通的GPIO口来看待,通过判断按键是否被按下时其对应管脚电平的不同来设置LED管脚的电平的高低,从而控制LED灯的亮与灭。

时间: 2024-07-30 10:19:14

TQ2440按键点亮LED灯的裸机程序的相关文章

TQ2440按键点亮LED驱动程序

一,硬件分析: 1.打开TQ2440的底板原理图找到按键测试的模块,如下图所示: 从图我们知道,控制按键k1 k2 k3 k4 的管脚为EINT1 EINT4 EINT2 EINT0 ,当按键按下时,管脚输出低电平,当按键没有被按下时,管脚输出高电平. 2.打开TQ2440核心板原理图找到EINT1  EINT4 EINT2 EINT0所对应的cpu控制引脚,如下图所示: 从图我们可以知道,EINT1  EINT4 EINT2 EINT0 对应的cpu控制引脚为GPF1 GPF4 GPF2 GP

我的 FPGA 学习历程(02) &mdash;&mdash; 实验点亮 LED 灯

关于 Quartus 的操作可以使用 Quartus 自带的帮助,帮助中有全套的操作教程. 中文网络教程链接(链接至altera中文官网,点击观看) Quartus II 软件设计系列:基础 Quartus II 软件中的原理图设计 SignalTap II 嵌入式逻辑分析器 使用Nios II 处理器 系统控制台 Nios II 处理器开发软件:设计流程 Nios II 处理器开发软件:MMU和MPU 无论是英文帮助还是网络中文教程,他们的前提是你是有基础的,这些教程之会教给你我们的 quar

第二章之在BL1中点亮LED灯

1,u-boot中第一个入口在./arch/arm/cpu/armv7/start.S 翻到153行:如下图 前面都是进行一些基本设置,不用管. cpu_init_cp15设置协处理器, cpu_init_crit则跳转到其它地方,所以要点板子上电点灯要在152行之前. 2,通过板子资料,通过设置GPIO点亮LED灯,因为了 start.S是用汇编语言写的,所以点亮LED灯也要用汇编语言 代码如下: 1 gpin_out: 2 ldr r11,=0xE0200280 3 ldr r12,=0x0

1.2.第一个实验——点亮LED灯

1.2.第一个实验--点亮LED灯 预备知识: (1)位.字节.IO端口.IO口 字节是内存管理的最小单位,一个字节是八位,每一位可以存放一个二进制位(0或者1).一个IO端口包括一组IO口,一般一组是八个,一个端口就是一组IO引脚.一个IO口对应一个二进制位,一个IO端口对应一个字节. (2)二进制和十六进制的转换 一个十六进制位等于四个二进制位,比如0xff对应二进制是1111 1111 实验目的:点亮八颗LED灯 实验过程分析: (1)八颗LED分别由八位二进制位来控制,二进制位是1时LE

树莓派点亮LED灯需要几行代码?3行。小孩子都能学会

目录 点亮LED灯 硬件连接 代码 闪烁的LED灯 呼吸灯 其他 点亮LED灯 硬件连接 找一个LED灯,连接如上图,注意长短引脚,经过这些年的狂轰乱炸,大家对于这个应该不漠视,毕竟Arduino都进教材了. 代码 我们先来看图形化的版本: from gpiozero import LED led = LED(17) led.on() 是的你没有看错,树莓派点亮LED只需要3行代码.只需要像Python的turtle编程一样导入需要用到的LED类,然后生成一个表示连接在17号GPIO引脚的LED

Raspberry PI 系列 —— 裸机点亮LED灯

背景 最近刚买了Raspberry PI B+,配置运行了官方提供的Raspbian系统,折腾了一周Linux系统,感觉没啥意思,于是就试着想了解底层的启动流程,通过几天的研究,发现最底层部分的启动是由官方提供的bootcore.bin和start.elf文件来执行(应该是对硬件设备的初始化,如MMU等),之后由下一部分kernel.img的_start接管.为了真正验证此流程,于是想利用GPIO控制LED灯,几经折腾终于成功点亮LED,现记录于此. 外设地址编码 要想控制GPIO管脚就必须知道

三、点亮LED灯

目标:让LED每秒闪烁1次 材料: 1.SAGOO UNO板1块 2.USB线1根 步骤: 1.用USB线连接Arduino板和PC,电源LED灯亮: 2.启动Arduino IDE软件,打开“File"->"Examples"->"01.Basics"->"Blink"; 3.点击“编译Verify"->"下载Upload"; 4.看到电路板上L标示的LED灯每秒闪烁. 原理图 代

【树莓派】实验1:GPIO点亮led灯

详细请参考网友博文. 实验目的:控制GPIO,点亮一个led灯 实验步骤: 1.使用wiscp传输GPIO的库文件(下载地址)到树莓派中,并解压(可以像windows操作一样解压,或者使用命令行解压). 2.解压后,可以看到其中有一个文件setup.py 使用命令行切换到此文件的路径:cd /home/pi/Downloads/RPi.GPIO-0.6.3 再使用命令行安装setup.py: sudo python setup.py install 3.编写GPIO程序 1 import RPi

嵌入式linux——点亮led灯(二)

刚才在jz2440板子上写了一个点亮中间led的程序,前前后后十几分钟才好.最终代码 .text .global _start _start: /* 在这个程序中,完成点亮中间的led灯D11 * GPF5 从原理图得知,低电平点亮 * GPFCON 0x56000050 * GPFDAT 0x56000054 */ ldr r0, =0x56000050 ldr r1, =0x400 str r1, [r0] mov r0, #0 ldr r1, =0x56000054 str r0, [r1