既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上C C++开发知识点,真正体系化!
由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新
arm-linux-gcc -g -c -o led_on.o led_on.S
arm-linux-ld -Ttext 0x0000000 -g led_on.o -o led_on_elf
arm-linux-objcopy -O binary -S led_on_elf led_on.bin
clean:
rm -f led_on.bin led_on_elf *.o
led_on.S生成led_on.bin
第一行做汇编
第二行做连接,指定代码段起始地址为0x00000000
第三行把ELF格式转为二进制格式
clean用于清除编译生成的文件
2、使用c语言代码点亮LED
汇编可读性比C差,我们用C来实现
@******************************************************************************
@ 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,这4k是steppingstone,后面会介绍
@ nand flash中的代码在复位后会移到内部ram中,此ram只有4K
bl main
@ 调用C程序中的main函数
halt_loop:
b halt_loop
下面是led_on_c.c
#define GPBCON (*(volatile unsigned long *)0x56000010)
#define GPBDAT (*(volatile unsigned long *)0x56000014)
int main()
{
GPBCON = 0x00000400;
// 设置GPB5为输出口, 位[11:10]=0b01
GPBDAT = 0x00000000;
// GPB5输出0,LED1点亮
return 0;
}
最后是Makefile
led_on_c.bin : crt0.S led_on_c.c
arm-linux-gcc -g -c -o crt0.o crt0.S
arm-linux-gcc -g -c -o led_on_c.o led_on_c.c
arm-linux-ld -Ttext 0x0000000 -g crt0.o led_on_c.o -o led_on_c_elf
arm-linux-objcopy -O binary -S led_on_c_elf led_on_c.bin
arm-linux-objdump -D -m arm led_on_c_elf > led_on_c.dis
clean:
rm -f led_on_c.dis led_on_c.bin led_on_c_elf *.o
分别汇编crt0.S和led_on_c.c
连接目标到led_on_c_elf,代码段起始地址位0x00000000
转换ELF格式到二进制led_on_c.bin
最后转换结果为汇编码方便查看
3、测试程序
在先前搭建的编译环境中进入代码目录
#make
得到的bin文件,在win中使用dnw下载到开发板,设置串口波特率,对应端口,8N1,下载地址0x00000000
开关拨到nor flash,打开电源,出现菜单以后,选择a
然后选择USB PORT-transmit/restore,选择编译好的bin文件
然后开关拨到nand启动,效果如下:(设置LED1和LED4亮)
4、使用按键来控制LED
K1-K6如上图对应GPG,我们使用K1-K4操作LED1-LED4
@******************************************************************************
@ File:crt0.S
@ 功能:通过它转入C程序
@******************************************************************************
.text
.global _start
_start:
ldr r0, =0x56000010
@ WATCHDOG寄存器地址
mov r1, #0x0
str r1, [r0]
@ 写入0,禁止WATCHDOG,否则CPU会不断重启
ldr sp, =1024*4
@ 设置堆栈,注意:不能大于4k, 因为现在可用的内存只有4K,这4k是steppingstone,后面会介绍
@ nand flash中的代码在复位后会移到内部ram中,此ram只有4K
bl main
@ 调用C程序中的main函数
halt_loop:
b halt_loop
下面是key_led.c文件
#define GPBCON (*(volatile unsigned long *)0x56000010)
#define GPBDAT (*(volatile unsigned long *)0x56000014)
#define GPGCON (*(volatile unsigned long *)0x56000060)
#define GPGDAT (*(volatile unsigned long *)0x56000064)
/*
* LED1-4对应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))
/*
* K1-K4对应GPG0、GPG3、GPG5、GPG6
*/
#define GPG7_in ~(3<<(6*2))
#define GPG6_in ~(3<<(5*2))
#define GPG3_in ~(3<<(3*2))
#define GPG0_in ~(3<<(0*2))
int main()
{
unsigned long dwDat;
// LED1-LED4对应的4根引脚设为输出
GPBCON = GPB5_out | GPB6_out | GPB7_out | GPB8_out ;
// K1-K4对应的2根引脚设为输入
GPGCON = GPG0_in & GPG3_in & GPG6_in & GPG7_in ;
while(1){
//若Kn为0(表示按下),则令LEDn为0(表示点亮)
dwDat = GPGDAT;
// 读取GPG管脚电平状态
if (dwDat & (1<<0))
// K1没有按下
GPBDAT |= (1<<5);
// LED1熄灭
else
GPBDAT &= ~(1<<5);
// LED1点亮
if (dwDat & (1<<3))
// K2没有按下
GPBDAT |= (1<<6);
// LED2熄灭
else
GPBDAT &= ~(1<<6);
// LED2点亮
if (dwDat & (1<<5))
// K3没有按下
GPBDAT |= (1<<7);
// LED3熄灭
else
GPBDAT &= ~(1<<7);
// LED3点亮
if (dwDat & (1<<6))
// K4没有按下
GPBDAT |= (1<<8);
// LED4熄灭
else
GPBDAT &= ~(1<<8);
// LED4点亮
}
return 0;
}
最后是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
测试效果
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上C C++开发知识点,真正体系化!
由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新
cuY3Nkbi5uZXQvd2hhdGRheQ==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
[外链图片转存中…(img-lwRXZc5s-1715550724208)]
[外链图片转存中…(img-ChU6aDaE-1715550724209)]
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上C C++开发知识点,真正体系化!
由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新