本文章为使用Elipse,使用汇编语言搭配Exynos4412实验箱进行的点亮LED,代码部分较为简单,环境配置花了很久的时间,大家可以去网络上寻找Elipse的搭建环境
需要使用Elipse平台编译,需要串口和A9下载器,其中不能直接编译过去,由于实验箱是运行Linux的,需要要实现裸机开关便是还没进入到Linux过程中用串口随便发送一个信息,然后去到编写的汇编语言的main函数那即可
1、需要找到自己运行的程序,需要将C编译的elf文件加入
2、需要将编译软件添加进去和程序的初始文件
3、需要添加load代表下载,break main代表在进入到Linux过程中用串口发送信息后就跳到main函数的人口,c代表之后执行c程序
其中需要利用到串口,需要注意的是本次实验使用的波特率为115200,需要进行修改,在设备管理器中查看实验室串口的COM号进行填写,打开串口后当给实验箱上电在5s内用串口发送空格即可,则程序会跳到main函数准备执行C语言代码部分
在串口发送信息,程序能跳到main函数后,打开BOXLAB OpenOCD Link,可以看到debug的过程信息,不然程序无法进行。
这里主要用到几个简单的函数:LED的输出端口配置、延时函数、LED端口电平输出配置和执行函数即可实现我们实验的要求,接下来让我们分析分析:
第一个是延时函数,能够达到延时1ms的要求,延时函数在我们编写程序的时候非常常见就不过多分析了,也是非常简单的用c代码编写的
第二部分便是LED端口的配置,即我需要将对于LED的IO口配置为输出模式
可以看到LED四个IO口对应的端口了,通过电路图可以知道当LED端口输出高电平的时候,三极管导通,并且通过查询寄存器可以得知,当0X1的时候端口为输出模式
GPX1.CON = (GPX1.CON & ~(0xf<<(3*4)))| 1<<(3*4);
分析这段代码:首先知道与非全一为零,有零为一,要配置GPX1_3就是第13—16位,0xf就1111左移12位那就移到了13—16位,然后与非变成了0000相当于就是复位成0000,然后在1左移12位变成了0001那就0x1配置端口变成了输出output模式
其他的也是如此,要注意到每个LED端口,四个LED分别是GPX1_3 ,GPX1_5 ,GPXL1_1和GPXL2_3,所以在配置端口的时候要注意好就行。
这段代码其实相当于Switch语句,传入的mask为形参,满足条件执行置高的操作,没有满足就不变,接下去便是执行语句
这里便是主程序,串口发送信息后会跳到main函数入口这,首先是LED的端口输出配置,下面是LED输出IO口电平配置,先发送0x00则一开始都不亮,接下去是俩个循环
【要注意的是LED只有4个,只需要看后四位的1或0即可】
其i=0时,左移0位,右移4位变成了0000 0000
其i=1时,左移1位,右移4位变成了0000 0001 就是0x01那就第一个灯亮
i=2,那就是0000 0011 那就是第一个灯和第二个灯亮
i=3 那就是 0000 0111 那就是第1、2、3个灯亮
i=4那就是0000 1111那就是4个灯都亮
i=5 那就是0001 1110 前面4个与0相与后变成了0,也就是变成了第2、3、4个灯亮
i=6那就是0011 1100 那就第3、4个灯亮
i=7那就是0111 1000那就是第四个灯亮
如何进行一个500ms的延时,继续执行下面一段循环代码,和上面一个循环是类似的
0xF0那就是1111 0000 进行右移操作,其LED亮灭和上一段分析类似,所以可以看到LED流水灯的效果:
实验现象如下所示:
嵌入式实验1
本次实验最主要的是环境的搭建和对汇编程序的理解