1.管脚介绍:
1)与LED模块相关的原理图:
2)由上图可以看出,4个LED灯所对应的管脚:
名称 |
对应管脚 |
管脚功能 |
对应逻辑 |
LED1 |
GPB5 |
内部上拉输出 |
0:灯亮 1:灯灭 |
LED2 |
GPB6 |
内部上拉输出 |
0:灯亮 1:灯灭 |
LED3 |
GPB7 |
内部上拉输出 |
0:灯亮 1:灯灭 |
LED4 |
GPB8 |
内部上拉输出 |
0:灯亮 1:灯灭 |
2.相关的寄存器及其功能:
注释:
① GPBCON : 用于配置端口B的各个管脚功能
② GPBDAT : 端口B的数据寄存器
③ GPBUP : 用于配置端口B是否使用上拉功能
3.程序流程图:
4.程序设计:
① Makefile
LED_display.bin : LED_display.S
arm-linux-gcc -g -c -v -o LED_display.o $<
arm-linux-ld -Ttext 0x0000000 -g LED_display.o -o LED_display_elf
arm-linux-objcopy -O binary -S LED_display_elf $@
clean :
rm -f LED_display.bin LED_display_elf *.o
② LED_displays.S
#define GPBCON 0x56000010
#define GPBDAT 0x56000014
#define GPBUP 0x56000018
#define LED1_on (1 << 5)
#define LED2_on (1 << 6)
#define LED3_on (1 << 7)
#define LED4_on (1 << 8)
#define DELAY_nand 0x10000 /*在nand flash里面用这个延时值*/
;#define DELAY_sdram 0x1000000 /*在SDRAM里面用这个*/
.text
.global _start
_start:
/**************把4个LED管脚置为输出*****************/
ldr r0 , =GPBCON
ldr r1 , [r0] /*把GPBCON里的内容加载到r1里*/
bic r1 , r1 , #0x3FC00 /*操作数取反码或上r1,用于清零工作*/
orr r1 , r1 , #0x15400
str r1 , [r0]
/**************使能4个LED管脚的上拉功能*************/
/*********如果不使能下面注释的地方要加上去**********/
ldr r0 , =GPBUP
ldr r1 , [r0]
bic r1 , r1 , #0x1E0
; orr r1 , r1 , #0x1E0
str r1 , [r0]
ldr r0 , =GPBDAT
; ldr r1 , [r0]
; bic r1 , r1 , #0x1E0
; orr r1 , r1 , #0x1E0
; str r1 , [r0] /*此时4个LED等全灭*/
/*******************流水灯灯开始*********************/
ldr r1 , [r0]
LED_DISPLAY:
/*LED1亮,其余灭*/
bl DELAY
bic r2 , r1 , #LED1_on
str r2 , [r0]
bl DELAY
/*LED2亮,其余灭*/
bic r2 , r1 , #LED2_on
str r2 , [r0]
bl DELAY
/*LED3亮,其余灭*/
bic r2 , r1 , #LED3_on
str r2 , [r0]
bl DELAY
/*LED4亮,其余灭*/
bic r2 , r1, #LED4_on
str r2 , [r0]
b LED_DISPLAY
/***************延时函数****************/
DELAY:
ldr r2 , =DELAY_nand
DELAY1:
sub r2 , r2 , #0x1
cmp r2 , #0x0
bne DELAY1
mov pc , lr
/****************END******************/