0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

测试新唐nuc980串口功能的过程

CHANBAEK 来源:嵌入式学习和实践 作者:嵌入式学习和实践 2023-09-04 16:07 次阅读

测试新唐nuc980串口功能的过程,如下:

  1. 直接下载使用官方的ubuntu系统。
  2. 直接使用官方的文件,在家目录下 NUC970_Buildroot 目录下或者自己git clone NUC970_Buildroot 工程也可以,克隆地址如下:
git clone https://github.com/OpenNuvoton/NUC970_Buildroot
或者
git clone https://gitee.com/OpenNuvoton/NUC970_Buildroot.git
  1. 查看配置文件 ls configs/* ,会显示当前的配置文件,我们选择输入 make nuvoton_nuc980_iot_defconfig ,产生预设的configuration file,预设的configuration 会联网安装U-Boot、Linux Kernel、root file system、toolchain ....... 等常用的工具。如果想修改预设的 configuration ,输入 make menuconfig ,进入配置界面进行配置。

4.输入 **make ** ,开始进行 Compile ,成功后 NUC980 BSP 相关的文件就会出现在NUC970_Buildroot目录下面的output 这个子目录。如下:

图片

  1. NUC970_Buildroot 文件夹下输入 sudo ./install_nuc980_bsp.sh , 安装下载nuc980bsp包。执行完脚本,会出现 nuc980bsp 文件夹。

图片

  1. 自行编译nuc980bsp包中的测试例程uart的demo,或者按照如下代码编写即可。编译uart 文件,将生成的可执行文件uart_demo,复制到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;
}
  1. 再NUC970_Buildroot 执行 make linux-menuconfig ,打开串口1和串口2的驱动使能,保存后退出。

图片

8.输入 **make **编译。

9.编译完之后,拷贝相关文件,共四个文件

拷贝 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 文件夹下 未发现env.txt,从别的地方拷贝一份即可。env.txt的内容如下:

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启动方式,上电进行镜像下载,(参考: 新唐Nuc980学习笔记1 - 工程创建和下载

u-boot-spl.bin 选择Loader默认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启动方式,复位运行(参考: 新唐Nuc980学习笔记1 - 工程创建和下载

12.开机之后的画面如下:

图片

13.输入测试指令 ./usr/bin/uart_demo,可看到串口功能测试符合预期,测试结果如下:

图片

注意:

【 以下动作只需要在更新 Buildroot 工具时使用 】
进入Buildroot 资料夹后请输入以下指令:
git reset --hard
git pull
更新完成后进入 dl 资料夹,先将既有的 linux kernel 与 u-boot 删除,并输入以下指令:
sudo rm -rf linux-master.tar.gz
输入密码 user,并输入以下指令:
sudo rm -rf uboot-master.tar.gz
离开 dl 资料夹,进入 Builroot 资料夹下 make clean。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 嵌入式
    +关注

    关注

    5082

    文章

    19123

    浏览量

    305117
  • 串口
    +关注

    关注

    14

    文章

    1554

    浏览量

    76500
  • Ubuntu
    +关注

    关注

    5

    文章

    563

    浏览量

    29754
  • 新唐
    +关注

    关注

    0

    文章

    133

    浏览量

    14212
  • nuc980
    +关注

    关注

    0

    文章

    4

    浏览量

    1262
收藏 人收藏

    评论

    相关推荐

    nuc980双网卡开机启动

    nuc980双网卡开机启动
    的头像 发表于 12-07 18:25 1462次阅读
    <b class='flag-5'>nuc980</b>双网卡开机启动

    NUC980怎么把Uboot和kernel的输出改到其它串口

    使用的NUC980官方固件 板子只引出了PA1和PA0 没有把UART0引出 请问应该怎么把Uboot和kernel的输出改到其它串口
    发表于 01-17 06:52

    基于NUC980开发板DIY的项目合集

    NUC980有非常丰富的外设资源,串口有10个,可以扩展出多个485接口,还有128M内存,用于多任务运行。DIY过程首先画了一个板子:通过arduino接口扩展了2个485和2个can,can与本次
    发表于 05-07 15:22

    NUC980IOT使用测评相关资料分享

    1、NUC980测评快速上手与GPIONUC980是新科技32位Cortex-A系列内核产品,NUC980IOT所使用的芯片为NUC980DK61
    发表于 06-02 14:56

    NUC980开发板DIY项目大挑战合集

    1、基于NUC980的4G、wifi、网的物联网网关项目开发项目描述目前工业控制和工业现场的数据采集与远程控制多还是使用串口类接口进行现场通信,而nuc980提供10个
    发表于 06-08 14:32

    求一种基于NUC980开发板的数据采集网关设计方案

    1、基于NUC980开发板的数据采集网关设计新NUC980系列MPU有高达300 MHz 的执行速度和内嵌最高 128 MB DRAM及丰富的周边,现在又搭载上了RT-Thread OS以及
    发表于 06-13 18:08

    NUC980测评快速上手与GPIO

    ,首先介绍一下板子上的两个端口,两个microusb分别为NUWriter的下载与普通串口,所以基本上一根线就可以满足譬如GPIO的测评。1.板载GPIO介绍NUC980是新科技3
    发表于 10-17 15:55

    请教nuc980如何实现在线升级

    请教,nuc980 如何实现在线升级,是通过u-boot升级吗,应该怎么配置u-boot,升级包要放在哪里?第一次用nuc980,不会linux
    发表于 10-28 10:16

    请问nuc980如何在裸机程序中实现nuc980软件复位?

    nuc980如何在裸机程序中实现nuc980软件复位?
    发表于 06-13 08:21

    请问nuc980如何在裸机程序中实现nuc980软件复位?

    nuc980如何在裸机程序中实现nuc980软件复位?
    发表于 09-04 08:22

    科技NuMaker NUC980 主板介绍

    Linux 工业网络控制开发平台 新科技提供工业网络控制开发平台采用 NUC980DK61Y 微处理器,此为一套工业用网络控制开发平台,完整的硬件设计与软件参考设计。包含了新执行速度300
    的头像 发表于 01-13 10:13 9479次阅读
    新<b class='flag-5'>唐</b>科技NuMaker <b class='flag-5'>NUC980</b> 主板介绍

    科技NUC980 工业控制物联网系列介绍

    NUC980 系列采用 ARM926EJ-S 核心,执行速度高达 300 MHz,堆栈 16 MB、64 MB 或 128 MB DDR-II 内存于同一封装,提供 64-pin、128-pin
    的头像 发表于 02-05 09:17 4166次阅读
    新<b class='flag-5'>唐</b>科技<b class='flag-5'>NUC980</b> 工业控制物联网系列介绍

    NUC980规格书

    NUC980规格书(嵌入式开发工程师工资水平)-新科技ARM9 系列 NUC980产品手册
    发表于 07-30 12:58 27次下载
    新<b class='flag-5'>唐</b><b class='flag-5'>NUC980</b>规格书

    NUC980 DIY项目大挑战 - EtherCAT实现

    ,就准备上个RTOS,以前M3和M4的芯片,主要用FreeRTOS,最近也开始用RT-Thread。新官方也推出了NUC980的RT
    的头像 发表于 02-02 11:30 2066次阅读

    NUC980 Chili平台可提供边缘运算(Edge Computing)远程监控的管理解决方案

    NUC980 Chili平台可提供边缘运算(Edge Computing)远程监控的管理解决方案
    的头像 发表于 08-10 11:00 667次阅读
    新<b class='flag-5'>唐</b><b class='flag-5'>NUC980</b> Chili平台可提供边缘运算(Edge Computing)远程监控的管理解决方案