本文章为使用Elipse,使用汇编语言搭配Exynos4412实验箱进行的点亮LED,代码部分较为简单,环境配置花了很久的时间,大家可以去网络上寻找Elipse的搭建环境

      一、平台配置说明

      需要使用Elipse平台编译,需要串口和A9下载器,其中不能直接编译过去,由于实验箱是运行Linux的,需要要实现裸机开关便是还没进入到Linux过程中用串口随便发送一个信息,然后去到编写的汇编语言的main函数那即可

b2b55cc2f7b646ccbe431b68da0a0903.png其中Debug需要注意其配置如下:

1、需要找到自己运行的程序,需要将C编译的elf文件加入

2、需要将编译软件添加进去和程序的初始文件

3、需要添加load代表下载,break main代表在进入到Linux过程中用串口发送信息后就跳到main函数的人口,c代表之后执行c程序

2eb92eee5e4d445e85e3203683862709.png

21ea979e24214d8b9ffa9022d066c2b2.png

85f74403910644aa9dd10968ecf0e0d2.png

       其中需要利用到串口,需要注意的是本次实验使用的波特率为115200,需要进行修改,在设备管理器中查看实验室串口的COM号进行填写,打开串口后当给实验箱上电在5s内用串口发送空格即可,则程序会跳到main函数准备执行C语言代码部分e128cd5796c447e9a499421e4ac1d616.png

    在串口发送信息,程序能跳到main函数后,打开BOXLAB  OpenOCD Link,可以看到debug的过程信息,不然程序无法进行。 

0c8cd452d66840d088d498183a4b4b4c.png

 二、代码分析

    这里主要用到几个简单的函数:LED的输出端口配置、延时函数、LED端口电平输出配置和执行函数即可实现我们实验的要求,接下来让我们分析分析:

      第一个是延时函数,能够达到延时1ms的要求,延时函数在我们编写程序的时候非常常见就不过多分析了,也是非常简单的用c代码编写的

f21447f512424fa6a57af60e299aeeca.png

       第二部分便是LED端口的配置,即我需要将对于LED的IO口配置为输出模式7f42fbdfc89d4134b4bd5e1708f3ae5c.png

d0c54e3c0ad34c0dbd18f1b1f480a90c.png

f240752fc32b4c03aae53a62afbe7079.png

6fcca3225dfc48d7af3edf0ae6ee0b13.png

       可以看到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为形参,满足条件执行置高的操作,没有满足就不变,接下去便是执行语句

d439e81f990f41bfb417f08fc1f886b4.png

     这里便是主程序,串口发送信息后会跳到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流水灯的效果:

e6e211cb11ac466d99b8155130690c4e.png

 实验现象如下所示:

嵌入式实验1

 

本次实验最主要的是环境的搭建和对汇编程序的理解

 

 

 

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐