概述
![在这里插入图片描述](https://img-blog.csdnimg.cn/20200824205312768.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2Rvbmdkb25nN183Nw==,size_16,color_FFFFFF,t_70#pic_center)
![在这里插入图片描述](https://img-blog.csdnimg.cn/20200824204731214.png#pic_center)
我们通过观察原理图可以发现LED灯有四个分别连接在GPM4_1, GPM4_2, GPM4_3 GPM4_4上面,这时候我们去查询我们板子4412的说明书,去寻址寄存器的配置
![在这里插入图片描述](https://img-blog.csdnimg.cn/20200824205107601.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2Rvbmdkb25nN183Nw==,size_16,color_FFFFFF,t_70#pic_center)
![在这里插入图片描述](https://img-blog.csdnimg.cn/20200824205121383.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2Rvbmdkb25nN183Nw==,size_16,color_FFFFFF,t_70#pic_center)
初始化的时候我们需要将他配置为输出模式,同时我们观察下面的电路可以发现,他需要输出低电平,来使led亮
#define GPM4BASE 0x11000000
#define GPM4CON 0x02E0
#define GPM4DAT 0x02E4
#define UDELAY 0x43e2647c
#define N 5000000
.text
.align 2
.global _start
_start:
mov ip, sp
push {fp, ip, lr, pc}
sub fp, ip, #4
@设置GPM4CON 使0-3引脚为输出功能
ldr r0, =GPM4BASE
ldr r1, [r0, #GPM4CON]
ldr r2, =0xffff
bic r1, r1, r2
@配置0-3引脚全部为1 0x1111 0b 0001 0001 0001 0001
ldr r2, =0x1111
orr r1, r1, r2
str r1, [r0, #GPM4CON]
@调用uboot中的延迟函数
ldr r0, =N
mov lr, pc
ldr pc, =UDELAY
loop:
@1, 将GPM4DAT 输出0x0 点亮所有灯
ldr r0, =GPM4BASE
ldrb r1, [r0, #GPM4DAT]
orr r1, r1, #0xf
bic r1, r1, #0x1
strb r1,[r0, #GPM4DAT]
@2 将GPM4DAT 输出0xf 熄灭所有灯
ldr r0, =GPM4BASE
ldrb r1, [r0, #GPM4DAT]
bic r1, r1, #0x3
strb r1,[r0, #GPM4DAT]
使用C与语言来点亮LED灯
布置现场,调用c语言函数,https://blog.csdn.net/dongdong7_77/article/details/108200731
可以参考我以前的这篇文章
.text
.align 2
.global _start
_start:
mov ip, sp
push {fp, ip, lr, pc}
sub fp, ip, #4
bl main
sub sp, fp, #12
ldm sp, {fp, sp, pc}
#define sdelay(x) (((void (*)(int))0x43e053d4)(x))
#define udelay(x) (((void (*)(int))0x43e2647c)(x))
typedef unsigned int u32;
typedef unsigned short u16;
typedef unsigned char u8;
void led_init(void)
{
GPM4CON &= ~0XFFFF;
GPM4CON |= 0X1111;
GPM4DAT |= 0XF;
}
void led_on(u32 num)
{
if (num >=0 && num <=3)
{
GPM4DAT &= ~(0x1 << num);
}
}
void led_off(u32 num)
{
if (num >=0 && num <=3)
{
GPM4DAT |= (0x1 << num);
}
int main(void)
{
int n = 0;
led_init();
while (1)
{
printf("led %d is on ! \n", n+1);
led_on(n);
udelay(1000000);
led_off(n);
n++;
if (n > 3)
{
n = 0;
}
}
return 0;
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)