Linux|嵌入式硬件初步使用
嵌入式实验引语案例过程虚拟机Ubuntu串口终端软件secureCRTC文件代码三色循环法国国旗德国国旗显示bmp位图引语记录学习路程,抛砖引玉。如有更好的算法或者出现错误,欢迎指点。案例三色循环变换法国国旗(上例的实操)德国国旗显示bmp位图过程编写C文件通过虚拟机打开的Ubuntu里编译成可执行文件串口连接嵌入式硬件和电脑,使用secureCRT写入嵌入式硬件执行文件虚拟机Ubuntu先设置共
引语
记录学习路程,抛砖引玉。如有更好的算法或者出现错误,欢迎指点。
案例
- 三色循环变换
- 法国国旗(上例的实操)
- 德国国旗
- 显示bmp位图
过程
- 编写C文件
- 通过虚拟机打开的Ubuntu里编译成可执行文件
- 串口连接嵌入式硬件和电脑,使用secureCRT写入嵌入式硬件
- 执行文件
虚拟机Ubuntu
先设置共享文件夹(本例为ub2)然后把C文件放文件夹里,接着去虚拟机里面设置共享文件夹
注:有些电脑文件夹默认不共享,要另外设置
如下设置:
1)Ctrl+Alt+t打开terminal 命令行
gec@ubuntu:~$ cd /mnt/hgfs/ub2/
注意:
cd ---- 去到那个目录的一个命令
/ ----根目录
/mnt/hgfs/ ---- 设置好的共享文件夹都在这个路径下
ub2----设置好的共享文件夹
2)查看共享文件夹下的文件
gec@ubuntu:/mnt/hgfs/ub2$ ls
colors.c dg.c fg.c lx.bmp main.c tp.c
3)编译程序
arm-linux-gcc -o name name.c(比如德国国旗就是dg dg.c,下同)
或者:
arm-linux-gcc name.c -o name
编译完成后文件夹会对应生成相应的可执行文件
串口终端软件secureCRT
相关参数COM1(根据电脑接口情况),115200,8N1,取消流控
串口连接好嵌入式硬件后打开终端软件
设置参数
连接完成
快捷键Ctrl+C进行格式化
1)创建一个test文件夹
[root@GEC6818 /]#rm /test -r
[root@GEC6818 /]#mkdir /test
2)进入test目录
[root@GEC6818 /]#cd ./test
3)查看test目录文件
[root@GEC6818 /test]#ls
[root@GEC6818 /test]#
4)使用rx命令下载Ubuntu编译好的可执行文件
[root@GEC6818 /test]#rx name(比如德国国旗就是dg,下同)
C
secureCRT—>传输—>发送Xmodem—>选择name文件
CCCCCCCCCC
开始 xmodem 传输。 按 Ctrl+C 取消。
100% 5 KB 5 KB/s 00:00:01 0 Errors
5)再次查看test目录文件
[root@GEC6818 /test]#ls
dg
6)修改文件的权限
[root@GEC6818 /test]#chmod 777 name
7)执行文件
[root@GEC6818 /test]#./name
C文件代码
三色循环
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <stdio.h>
int main(void)
{
int fd_lcd;
int lcd_buf[800*480]; //显存。int -- 4B
fd_lcd = open("/dev/fb0", O_WRONLY);
if(fd_lcd == -1)
{
perror("open lcd");
return -1;
}
printf("fd_lcd = %d\n", fd_lcd);
while(1)
{
//green
for(int i=0;i<800*480;i++)
lcd_buf[i] = 0x0000FF00;//green
write(fd_lcd,lcd_buf,sizeof(lcd_buf)); //800*480*4
sleep(1);
int ret;
ret = lseek(fd_lcd, 0, SEEK_SET);
if(ret == -1)
{
perror("lseek lcd"); //根据系统返回的errno输出错误原因。
}
//red
for(int i=0;i<800*480;i++)
lcd_buf[i] = 0x00FF0000;//red
write(fd_lcd,lcd_buf,sizeof(lcd_buf)); //800*480*4
sleep(1);
ret = lseek(fd_lcd, 0, SEEK_SET);
if(ret == -1)
{
perror("lseek lcd"); //根据系统返回的errno输出错误原因。
}
//blue
for(int i=0;i<800*480;i++)
lcd_buf[i] = 0x000000FF;//red
write(fd_lcd,lcd_buf,sizeof(lcd_buf)); //800*480*4
sleep(1);
ret = lseek(fd_lcd, 0, SEEK_SET);
if(ret == -1)
{
perror("lseek lcd"); //根据系统返回的errno输出错误原因。
}
}
close(fd_lcd);
return 0;
}
法国国旗
略(可查看往期,不想重复)
德国国旗
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <stdio.h>
int main(void)
{
int fd_lcd;
int lcd_buf[800*480]; //显存。int -- 4B
int j,i;
fd_lcd = open("/dev/fb0", O_WRONLY);
if(fd_lcd == -1)
{
perror("open lcd");
return -1;
}
printf("fd_lcd = %d\n", fd_lcd);
for(i=0;i<800*160;i++) lcd_buf[i]=0x00000000;
for(i=800*160;i<800*320;i++) lcd_buf[i]=0x00FF0000;
for(i=800*320;i<800*480;i++) lcd_buf[i]=0x00FFD700;
write(fd_lcd,lcd_buf,sizeof(lcd_buf));
close(fd_lcd);
return 0;
}
显示bmp位图
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <stdio.h>
int main(void)
{
int fd_lcd;
int fd_bmp;
int lcd_buf[800*480]; //显存。int -- 4B
int j,i;
int ret;
char bmp_buf[800*480*3];
fd_bmp=open("./lx.bmp",O_RDONLY);//打开相应的位图,位图要放在同位置处
if(fd_bmp==-1)
{
perror("open bmp");
return -1;
}
ret =lseek(fd_bmp,54,SEEK_SET);
if(ret==-1)
{
perror("lseek lcd");
}
read(fd_bmp,bmp_buf,sizeof(bmp_buf));
close(fd_bmp);
fd_lcd = open("/dev/fb0", O_WRONLY);
if(fd_lcd == -1)
{
perror("open lcd");
return -1;
}
printf("fd_lcd = %d\n", fd_lcd);
for(i=0;i<800*480;i++)
{
lcd_buf[i]=(0x00<<24)+(bmp_buf[3*i+2]<<16)+(bmp_buf[3*i+1]<<8)+(bmp_buf[3*i]<<0);
}
write(fd_lcd,lcd_buf,sizeof(lcd_buf));
close(fd_lcd);
return 0;
}
更多推荐
所有评论(0)