大家好,我是兔子。
是一个嵌入式软硬件工程师。
正在从单片机开发转岗Linux开发。
这次,有前几节的教程的基础。我们终于可以通过开发板,使用Linux跑流水灯了。
终于有种开始能写程序的赶脚。
1.操作大纲
1)我们在i.MX280开发板上(i.MX283及i.MX287也一样,驱动配置稍微调整),使用写好的驱动进行驱动编译。然后加载驱动。
2)看原理图,知道了解如何将流水灯接到ARM的IO管脚上。知道操控的灯属于哪些引脚。
3)写流水灯程序
4)开发板运行流水灯,观看效果。
2.调整驱动及驱动编译
将GPIO驱动工程(开发板配套资料获得,或者51转Linux学习群*获得)拷贝到虚拟机里。
可以看到,这个文件夹名叫2、gpio_driver。我拷贝到虚拟机的路径为~/XW_Linux/ZLG下。
打开驱动源文件gpio_driver.c
可以看到,该驱动是根据不同板卡进行配置的。
配置变量为zlg_board_type。
如果是i.MX283的板卡,则配0
如果是i.MX287的板卡,则配1
兔子我的板卡,是使用的i.MX280。所以我配置为2。
调整完成后,将驱动文件保存。
在驱动的Makefile里,强制指定内核的目录。(编译驱动需要使用到编译好的内核路径)
由于兔子我做好的虚拟机开发环境,内核目录是放置在了/home/book下。
故Makefile指定的内核路径为/home/book/linux-2.6.35.3
调整好Makefile文件,并保存后。
使用终端,进入驱动目录,make一下驱动。
可以看到,make后,生成了驱动文件,gpio_driver.ko
则驱动编译成功。
3.看原理图接线
首先先看我们的开发板,是又一个主控板以及一个扩展板组成。
4个流水灯位于数码管的下方的红框处。
两块板卡,通过排针排座相互连接。
故我们需要通过原理图,了解到4个流水灯是接到ARM的哪些管脚上。
首先先打开扩展板的原理图,找到4个LED灯。
分析电路可知,这4个LED灯,是ARM给低电平点亮。高电平熄灭。
同时他们的电气网络名,分别为IO_LED1, IO_LED4,IO_LED3,IO_LED2。
我们再在扩展板上,看这4个LED对应的电气网络名,还接到了哪里。
找到了,发现这4个灯的电气网络名,还接到了一个器件J8A上。
通过观察板卡,兔子我了解这是一个排针。
正好是在J8B和J8C两排排针的中间。
通过扩展板的原理图,我知道了J8B和J8C两个排针是最终和下面的主控板相接的。
于是我通过跳线帽,将4个LED灯都接到了J8B上。(接到J8C上也可以,到时候点灯控制J8C对应的IO口)。
跳线过后,实际在原理图上,是这样连接的。
LED1接到了280_IO3.28电气网络上。
LED2接到了280_IO3.26电气网络上。
LED3接到了280_IO3.25电气网络上。
LED4接到了280_IO3.24电气网络上。
再继续寻找
可以看到,这4个脚,分别是接到和主控板相接的2个大排座上。
及排座的IDC-B上的3,6,13,14。4个针脚上。
我们再打开主控板的原理图,找到这2个大排座。
这下可以知道了。
LED1接到ARM的PWM3管脚上。
LED2接到ARM的PWM7管脚上。
LED3接到ARM的SDA0管脚上。
LED4接到ARM的SCL0管脚上。
这下原理图确认完毕,灯的线路和ARM控制引脚已经对应上。
4.写流水灯程序
#include
程序说明:
1)open("/dev/gpio-PWM3", O_RDWR);表示打开开发板的/dev目录下的gpio-PWM3文件。O_RDWR表示对这个文件是可读可写操作。
开发板的/dev/gpio-PWM3文件是操作ARM的IO管脚的文件。
(只有加载驱动才会在开发板生成这个文件,故运行点灯程序之前,需要首先加载第2步的驱动,后续会说明如何加载)。
Linux操作,都是对文件的操作。所以在进行相关操作之前,都是需要open对应的文件。
2)ioctl(fd1,SET_GPIO_LOW); //点亮LED1
Ioctl表示直接操作文件,具体操作需要和驱动对应。这里简单器件直接写明。
SET_GPIO_LOW表示对应的IO输出低电平
SET_GPIO_HIGHT表示对应的IO输出高电平
注意:目前电路的接法是低电平点亮LED。
SET_GPIO_LOW和SET_GPIO_HIGHT是头文件gpio.h里的宏定义。
3)sleep(1);
表示延时1秒(在当前内核2.26.35.3里表示1秒,其他版本内核可能表示为毫秒)
如果想延时小于1秒,可以使用微秒延时函数。
usleep(500*1000);
表示延时500毫秒。
sleep();以及usleep();延时函数推荐使用。因为这不是软件延时,不会占用CPU的资源。
将点灯程序命名为gpio_led1.c存到路径~/XW_Linux/ZLG/2、gpio_driver/test目录下。
同时修改该目录下的点灯应用程序的Makefile。调整如下图所示。
然后使用终端,make一下,进行点灯应用程序的编译。
可以看到,无报错。生成的点灯文件在bin文件夹里。
将生成的点灯程序和驱动拷贝到NFS共享目录里。
(如何使用NFS共享目录,请移步至教程3)
兔子MCU:从51单片机到Linux 开发板传文件利器-NFS(教程3)zhuanlan.zhihu.com至此,点灯程序编译完成。
5.运行程序
1)开发板上电,并挂载NFS共享目录。
(具体操作可移步教程3)
兔子MCU:从51单片机到Linux 开发板传文件利器-NFS(教程3)zhuanlan.zhihu.com2)进入开发板的NFS挂载点/mnt文件夹下。通过ls命令能查看到我们编译好的点灯程序和驱动。
3)首先,先加载驱动。
使用insmod gpio_driver.ko指令。
可以看到,打印了很多生成的文件。表示驱动加载成功。
4)运行点灯程序
使用./gpio_led1 & 表示在后台运行点灯程序。
可以看到,返回了一个进程编号1256。
表示程序运行成功。
(进程编号每次运行不固定,是由Linux系统分配,可以暂时不用管)
5)视频效果