流水灯verilog实验原理_从51单片机到Linux Linux操控流水灯(教程5)

0a175bb960dbedbe3f31e0a8fb00e779.png

大家好,我是兔子。

是一个嵌入式软硬件工程师。

正在从单片机开发转岗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下。

8ff274567b3486b0203f3c53fddfcb6c.png

打开驱动源文件gpio_driver.c

34273d0383aead729796f5708ccc514f.png

可以看到,该驱动是根据不同板卡进行配置的。

配置变量为zlg_board_type。

如果是i.MX283的板卡,则配0

如果是i.MX287的板卡,则配1

兔子我的板卡,是使用的i.MX280。所以我配置为2。

调整完成后,将驱动文件保存。

在驱动的Makefile里,强制指定内核的目录。(编译驱动需要使用到编译好的内核路径)

3c840a1952d70360274add9cb957e975.png

由于兔子我做好的虚拟机开发环境,内核目录是放置在了/home/book下。

故Makefile指定的内核路径为/home/book/linux-2.6.35.3

54dbb1b53f56a138220e4cc79bb621b3.png

调整好Makefile文件,并保存后。

使用终端,进入驱动目录,make一下驱动。

7908018326b3f2ff34d14d4656844f52.png

可以看到,make后,生成了驱动文件,gpio_driver.ko

则驱动编译成功。

3.看原理图接线

首先先看我们的开发板,是又一个主控板以及一个扩展板组成。

4个流水灯位于数码管的下方的红框处。

0258cfd1078ddfe14dfac0ce8174696d.png

两块板卡,通过排针排座相互连接。

323fd348d808837a6c5cf4b57ffd812f.png

故我们需要通过原理图,了解到4个流水灯是接到ARM的哪些管脚上。

首先先打开扩展板的原理图,找到4个LED灯。

分析电路可知,这4个LED灯,是ARM给低电平点亮。高电平熄灭。

同时他们的电气网络名,分别为IO_LED1, IO_LED4,IO_LED3,IO_LED2。

546788386b0d013447306b0d951d587e.png

我们再在扩展板上,看这4个LED对应的电气网络名,还接到了哪里。

找到了,发现这4个灯的电气网络名,还接到了一个器件J8A上。

16bf91dacfb7bfe7aed9ff43b010f56a.png

通过观察板卡,兔子我了解这是一个排针。

c42199ef08c7c8c291be04bd01ba7661.png

正好是在J8B和J8C两排排针的中间。

通过扩展板的原理图,我知道了J8B和J8C两个排针是最终和下面的主控板相接的。

于是我通过跳线帽,将4个LED灯都接到了J8B上。(接到J8C上也可以,到时候点灯控制J8C对应的IO口)。

7e80642d2c35e631c83526882e8b06ff.png

跳线过后,实际在原理图上,是这样连接的。

77a4ec5afc52fd1170316ce8a60773d6.png

LED1接到了280_IO3.28电气网络上。

LED2接到了280_IO3.26电气网络上。

LED3接到了280_IO3.25电气网络上。

LED4接到了280_IO3.24电气网络上。

再继续寻找

b6bfb1fb71ef9a07bf40f21a47f3fa6e.png

可以看到,这4个脚,分别是接到和主控板相接的2个大排座上。

及排座的IDC-B上的3,6,13,14。4个针脚上。

7cf281712fa4d22a0026da6b3c10baef.png

我们再打开主控板的原理图,找到这2个大排座。

06d027fd6e41ceff1e1ba5e4a836f246.png

这下可以知道了。

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。调整如下图所示。

7b26a1491bb08a56bd9ddb9f20fd889b.png

然后使用终端,make一下,进行点灯应用程序的编译。

e54bb05b94115b2836e5556e14704587.png

可以看到,无报错。生成的点灯文件在bin文件夹里。

将生成的点灯程序和驱动拷贝到NFS共享目录里。

(如何使用NFS共享目录,请移步至教程3)

兔子MCU:从51单片机到Linux 开发板传文件利器-NFS(教程3)​zhuanlan.zhihu.com
a2fe4167b3d635ed10ca1b500bf7bf7a.png

至此,点灯程序编译完成。

5.运行程序

1)开发板上电,并挂载NFS共享目录。

(具体操作可移步教程3)

兔子MCU:从51单片机到Linux 开发板传文件利器-NFS(教程3)​zhuanlan.zhihu.com
a2fe4167b3d635ed10ca1b500bf7bf7a.png

2)进入开发板的NFS挂载点/mnt文件夹下。通过ls命令能查看到我们编译好的点灯程序和驱动。

11ea78e1279bad2634e22b66887779e7.png

3)首先,先加载驱动。

使用insmod gpio_driver.ko指令。

af6d850d2e91e4df484c8885f4dd755f.png

可以看到,打印了很多生成的文件。表示驱动加载成功。

4)运行点灯程序

使用./gpio_led1 & 表示在后台运行点灯程序。

980b51fd2e21ca296d39630b341cc884.png

可以看到,返回了一个进程编号1256。

表示程序运行成功。

(进程编号每次运行不固定,是由Linux系统分配,可以暂时不用管)

5)视频效果

62050096dfe4878b2c31e8e947a09e42.png
Linux流水的效果https://www.zhihu.com/video/1119742264540262400

958cdb2b09076a1001645d5e0c43f610.png
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
1、一盏一盏:第一盏灯先亮--延时--熄灭--延时--下一盏灯; 2、利用数组方法点亮:定义一个数组(即0xfe,0xfd,0xfb,0xf7,0xef,oxdf,0xbf,0x7f:依次代表只有第一盏灯,第二盏灯....亮),再利总线,按顺序点亮八盏灯; 3、利用移位方法点亮:(1)、利用移位运算和按位或运算,依次点亮八盏灯; (2)、包含intrins头文件(里面含有移位函数),使用相应的左移或右移函数进行移位, 下面是代码和注释,详细解释了点亮流水灯的思路,附件含有源代码和仿真文件,有需要的可以下载 //方式0控制流水灯循环点亮 #include //包含51单片机寄存器定义的头文件 #include //包含函数_nop_()定义的头文件 unsigned char code Tab[]={0xFE,0xFD,0xFB,0xF7,0xEF,0xDF,0xBF,0x7F};//流水灯控制码,该数组被定义为全局变量 sbit P17=P1^7; /************************************************************** 函数功能:延时约150ms **************************************************************/ void delay(void) { unsigned char m,n; for(m=0;m<200;m++) for(n=0;n<250;n++) ; } /************************************************************** 函数功能:发送一个字节的数据 **************************************************************/ void Send(unsigned char dat) { P17=0; //P1.7引脚输出清0信号,对74LS164清0 _nop_(); //延时一个机器周期 _nop_(); //延时一个机器周期,保证清0完成 P17=1; //结束对74LS164的清0 SBUF=dat; //将数据写入发送缓冲器,启动发送 while(TI==0) //若没有发送完毕,等待 ; TI=0; //发送完毕,TI被置“1”,需将其清0 } /******************************************* 函数功能:主函数 ******************************************/ void main(void) { unsigned char i; SCON=0x00; //SCON=0000 0000B,使串行口工作于方式0 while(1) { for(i=0;i<8;i++) { Send(Tab[i]); //发送数据 delay(); //延时 } } }

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值