前言
本文基于JZ2440开发板
一、思维导图
二、代码
1.key_led.c
代码如下(示例):
/************************************************************************
*
* 文件名:key_led.c
*
* 功能: 用EINT0(GPF0)按键控制D12(GPF6),
用EINT2(GPF2)按键控制D11(GPF5),
用EINT11(GPG3)按键控制D10(GPF4)
*
* 创建人:LiZhenhao
*
* 时间:2021年10月9日16:49:52
*
* 版本号:1.0
*
* 修改记录:无
*
************************************************************************/
#include "S3C2440.h"
int main(int argc, char const *argv[])
{
//LED
/* GPFCON配置成输出模式 GPF4(bit9~bit8)、GPF5(bit11~bit10)、GPF6(bit13~bit12)置为01 */
GPFCON &= ~( (3 << 8) | ( 3 << 10 ) | ( 3 << 12) ); //清零
GPFCON |= ( ( 1 << 8 ) | ( 1 << 10 ) | ( 1 << 12 ) ); //置1
//按键
/* GPGCON配置成输入模式 GPG3(bit7~bit6)置为00 */
GPGCON &= ~( ( 3 << 6 ) );
/* GPFCON配置成输入模式 GPF0(bit1~bit0)、GPF2(bit5~bit4)置为00 */
GPFCON &= ~( (3 << 0) | ( 3 << 4 ) ); //清零
while(1) {
//控制D12
if ( !(GPFDAT & ( 1 << 0 )) ) { //if(GPDAT & (1<<0) ==0 )
//D12(GPF6)灯亮
GPFDAT &= ~( 1 << 6 );
} else {
//D12(GPF6)灯灭
GPFDAT |= ( 1 << 6 );
}
//控制D11
if ( !(GPFDAT & ( 1 << 2 )) ) {
//D11(GPF5)灯亮
GPFDAT &= ~( 1 << 5 );
} else {
//D11(GPF5)灯灭
GPFDAT |= ( 1 << 5 );
}
//控制D10
if ( !(GPGDAT & ( 1 << 3 )) ) {
//D10(GPF4)灯亮
GPFDAT &= ~( 1 << 4 );
} else {
//D10(GPF4)灯灭
GPFDAT |= ( 1 << 4 );
}
}
return 0;
}
2.头文件S3C2440.h
代码如下(示例):
#ifndef __S3C2440_H__
#define __S3C2440_H__
#define GPFCON (*(volatile unsigned int*)0x56000050)
#define GPFDAT (*(volatile unsigned int*)0X56000054)
#define GPGCON (*(volatile unsigned int*)0x56000060)
#define GPGDAT (*(volatile unsigned int*)0x56000064)
#endif
3.汇编start.S
代码如下(示例):
.text
.global _start
_start:
/* 关闭看门狗 */
ldr r0, =0x53000000
ldr r1, =0
str r1, [r0]
/* 设置内存: sp 栈 */
/* 分辨是nor/nand启动
* 写0到0地址, 再读出来
* 如果得到0, 表示0地址上的内容被修改了, 它对应ram, 这就是nand启动
* 否则就是nor启动
*/
mov r1, #0
ldr r0, [r1] /* 读出原来的值备份 */
str r1, [r1] /* 0->[0] */
ldr r2, [r1] /* r2=[0] */
cmp r1, r2 /* r1==r2? 如果相等表示是NAND启动 */
ldr sp, =0x40000000+4096 /* 先假设是nor启动 */
moveq sp, #4096 /* nand启动 */
streq r0, [r1] /* 恢复原来的值 */
bl main
halt:
b halt
4.Makefile
代码如下(示例):
all:
arm-linux-gcc -c -o key_led.o key_led.c
arm-linux-gcc -c -o start.o start.S
arm-linux-ld -Ttext 0 start.o key_led.o -o key_led.elf
arm-linux-objcopy -O binary -S key_led.elf key_led.bin
arm-linux-objdump -D key_led.elf > key_led.dis
clean:
rm *.bin *.o *.elf *.dis
总结
先学会把LED点亮,然后在LED灯点亮基础上的代码进行修改,这样会比较好上手。