測試新唐nuc980串口功能的過程,如下:
- 直接下載使用官方的ubuntu系統(tǒng)。
- 直接使用官方的文件,在家目錄下 NUC970_Buildroot 目錄下或者自己git clone NUC970_Buildroot 工程也可以,克隆地址如下:
git clone https://github.com/OpenNuvoton/NUC970_Buildroot
或者
git clone https://gitee.com/OpenNuvoton/NUC970_Buildroot.git
- 查看配置文件 ls configs/* ,會顯示當(dāng)前的配置文件,我們選擇輸入 make nuvoton_nuc980_iot_defconfig ,產(chǎn)生預(yù)設(shè)的configuration file,預(yù)設(shè)的configuration 會聯(lián)網(wǎng)安裝U-Boot、Linux Kernel、root file system、toolchain ....... 等常用的工具。如果想修改預(yù)設(shè)的 configuration ,輸入 make menuconfig ,進(jìn)入配置界面進(jìn)行配置。
4.輸入 **make ** ,開始進(jìn)行 Compile ,成功后 NUC980 BSP 相關(guān)的文件就會出現(xiàn)在NUC970_Buildroot目錄下面的output 這個子目錄。如下:
- NUC970_Buildroot 文件夾下輸入 sudo ./install_nuc980_bsp.sh , 安裝下載nuc980bsp包。執(zhí)行完腳本,會出現(xiàn) nuc980bsp 文件夾。
- 自行編譯nuc980bsp包中的測試?yán)?a href="http://ttokpm.com/tags/uart/" target="_blank">uart的demo,或者按照如下代碼編寫即可。編譯uart 文件,將生成的可執(zhí)行文件uart_demo,復(fù)制到NUC970_Buildroot/output/target/usr/bin。
/****************************************************************************
* *
* Copyright (c) 2014 Nuvoton Technology Corp. All rights reserved. *
* *
****************************************************************************/
/****************************************************************************
*
* FILENAME
* uart_test.c
*
* VERSION
* 1.0
*
* DESCRIPTION
* This is the test program used to test the UARTs on NUC980 EV board
*
* DATA STRUCTURES
* None
*
* FUNCTIONS
* None
*
* HISTORY
*
*
* REMARK
* None
****************************************************************************/
#include < stdio.h >
#include < stdlib.h >
#include < unistd.h >
#include < sys/types.h >
#include < sys/stat.h >
#include < fcntl.h >
#include < termios.h >
#include < errno.h >
#include < string.h >
#include < signal.h >
#include < pthread.h >
#define FALSE 0
#define TRUE 1
int fd[2];
pthread_t threads[10];
char buff[101];
static struct termios newtios,oldtios; /*termianal settings */
static int saved_portfd=-1; /*serial port fd */
static void reset_tty_atexit(void)
{
if(saved_portfd != -1)
{
tcsetattr(saved_portfd,TCSANOW,&oldtios);
}
}
/*cheanup signal handler */
static void reset_tty_handler(int signal)
{
if(saved_portfd != -1)
{
tcsetattr(saved_portfd,TCSANOW,&oldtios);
}
_exit(EXIT_FAILURE);
}
static int open_port(const char *portname)
{
struct sigaction sa;
int portfd;
printf("opening serial port:%sn",portname);
/*open serial port */
if((portfd=open(portname,O_RDWR | O_NOCTTY)) < 0 )
{
printf("open serial port %s fail n ",portname);
return portfd;
}
/*get serial port parnms,save away */
tcgetattr(portfd,&newtios);
memcpy(&oldtios,&newtios,sizeof newtios);
/* configure new values */
cfmakeraw(&newtios); /*see man page */
newtios.c_iflag |=IGNPAR; /*ignore parity on input */
newtios.c_oflag &= ~(OPOST | ONLCR | OLCUC | OCRNL | ONOCR | ONLRET | OFILL);
newtios.c_cflag = CS8 | CLOCAL | CREAD;
newtios.c_cc[VMIN]=1; /* block until 1 char received */
newtios.c_cc[VTIME]=0; /*no inter-character timer */
/* 115200 bps */
cfsetospeed(&newtios,B115200);
cfsetispeed(&newtios,B115200);
/* register cleanup stuff */
atexit(reset_tty_atexit);
memset(&sa,0,sizeof sa);
sa.sa_handler = reset_tty_handler;
sigaction(SIGHUP,&sa,NULL);
sigaction(SIGINT,&sa,NULL);
sigaction(SIGPIPE,&sa,NULL);
sigaction(SIGTERM,&sa,NULL);
/*apply modified termios */
saved_portfd=portfd;
tcflush(portfd,TCIFLUSH);
tcsetattr(portfd,TCSADRAIN,&newtios);
return portfd;
}
void * process1(void* arg)
{
int portfd = (int) arg;
unsigned char i, j;
int rev1, rev2;
char RxBuffer[101];
rev1 =0;
rev2 =0;
while(rev2 < 100)
{
rev1 = write(portfd,(buff+rev2),100);
rev2 += rev1;
}
printf("n uart1 send %d bytsn", rev2);
rev1 = 0;
rev2 = 0;
while(rev2 < 100)
{
rev1 = read(portfd,(RxBuffer+rev2),100);
rev2 += rev1;
}
printf("n uart1 receive %d bytesn", rev2);
for(i = 0; i < 100; i++)
{
if(i != RxBuffer[i])
{
printf("n uart1 compare Error!!");
while(1);
}
}
printf("n uart1 compare correct!!n");
printf("n uart1 test done!!n");
}
void * process2(void* arg)
{
int portfd = (int) arg;
unsigned char i, j;
int rev1, rev2;
char RxBuffer[101];
rev1 =0;
rev2 =0;
while(rev2 < 100)
{
rev1 = write(portfd,(buff+rev2),100);
rev2 += rev1;
}
printf("n uart2 send %d bytes n", rev2);
rev1 = 0;
rev2 = 0;
while(rev2 < 100)
{
rev1 = read(portfd,(RxBuffer+rev2),100);
rev2 += rev1;
}
printf("n uart2 receive %d bytes n", rev2);
for(i = 0; i < 100; i++)
{
if(i != RxBuffer[i])
{
printf("n uart2 compare Error!!");
while(1);
}
}
printf("n uart2 compare correct!!n");
printf("n uart2 test done!!n");
}
/**
*@breif main()
*/
int main(int argc, char **argv)
{
char *dev[10]={"/dev/ttyS1", "/dev/ttyS2"};
unsigned int i;
printf("n demo uart1/uart2 external loop back function n");
for(i = 0; i < 100; i++)
{
buff[i] = (i & 0xff);
}
for(i = 0; i < 2; i++)
{
if((fd[i] = open_port(dev[i]))< 0)
return -1;
}
pthread_create(&threads[0], NULL, process1, (void*)(fd[0]));
pthread_create(&threads[1], NULL, process2, (void*)(fd[1]));
pthread_join(threads[0], NULL);
pthread_join(threads[1], NULL);
return 0;
}
- 再NUC970_Buildroot 執(zhí)行 make linux-menuconfig ,打開串口1和串口2的驅(qū)動使能,保存后退出。
8.輸入 **make **編譯。
9.編譯完之后,拷貝相關(guān)文件,共四個文件
拷貝 NUC970_Buildroot/output/images 文件夾下的 **uImage **文件;
拷貝 NUC970_Buildroot/output/build/uboot-master 文件夾下的u-boot.bin 文件 ;
拷貝 NUC970_Buildroot/output/build/uboot-master/spl 文件夾下的u-boot-spl.bin 文件;
拷貝 NUC970_Buildroot 文件夾下的 env.txt 文件。這里在 NUC970_Buildroot 文件夾下 未發(fā)現(xiàn)env.txt,從別的地方拷貝一份即可。env.txt的內(nèi)容如下:
baudrate=115200
bootdelay=1
stderr=serial
stdin=serial
stdout=serial
setspi=sf probe 0 30000000
loadkernel=sf read 0x7fc0 0x200000 0x800000
bootcmd=run setspi;run loadkernel;bootm 0x7fc0
10.選擇boot啟動方式,上電進(jìn)行鏡像下載,(參考: 新唐Nuc980學(xué)習(xí)筆記1 - 工程創(chuàng)建和下載 )
u-boot-spl.bin 選擇Loader默認(rèn)Image execute address:0x 200 ;下載即可
u-boot.bin 選擇 Data下載到 Image start offset: 0x 100000 ; 下載即可
uImage選擇Data下載到 Image start offset: 0x 200000 ; 下載即可
**env.txt **選擇 Environment下載到 Image start offset: 0x 80000 ; 下載即可
11.選擇boot啟動方式,復(fù)位運行(參考: 新唐Nuc980學(xué)習(xí)筆記1 - 工程創(chuàng)建和下載 )
12.開機之后的畫面如下:
13.輸入測試指令 ./usr/bin/uart_demo,可看到串口功能測試符合預(yù)期,測試結(jié)果如下:
注意:
【 以下動作只需要在更新 Buildroot 工具時使用 】
進(jìn)入Buildroot 資料夾后請輸入以下指令:
git reset --hard
git pull
更新完成后進(jìn)入 dl 資料夾,先將既有的 linux kernel 與 u-boot 刪除,并輸入以下指令:
sudo rm -rf linux-master.tar.gz
輸入密碼 user,并輸入以下指令:
sudo rm -rf uboot-master.tar.gz
離開 dl 資料夾,進(jìn)入 Builroot 資料夾下 make clean。
-
嵌入式
+關(guān)注
關(guān)注
5059文章
18973瀏覽量
302024 -
串口
+關(guān)注
關(guān)注
14文章
1540瀏覽量
76059 -
Ubuntu
+關(guān)注
關(guān)注
5文章
559瀏覽量
29501 -
新唐
+關(guān)注
關(guān)注
0文章
131瀏覽量
14178 -
nuc980
+關(guān)注
關(guān)注
0文章
4瀏覽量
1240
發(fā)布評論請先 登錄
相關(guān)推薦
評論