新唐nuc980-串口测试笔记

news2024/11/18 23:39:37

测试新唐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

3. 查看配置文件 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 这个子目录。如下:

f321bc4fab52a9a291a80c8949b034e2.png

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

4fef0274f327447d0bd373a652384e56.png

6. 自行编译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:%s\n",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 byts\n", rev2);


  rev1 = 0;
  rev2 = 0;


  while(rev2 < 100)
  {
    rev1 = read(portfd,(RxBuffer+rev2),100);
    rev2 += rev1;
  }
    
  printf("\n uart1 receive %d bytes\n", 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;
}

7. 再NUC970_Buildroot 执行 make linux-menuconfig,打开串口1和串口2的驱动使能,保存后退出。

c28f7dd1c295d7e7dff721e3cea6a0e6.png

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 ; 下载即可

b51bd4be6cf97d6c8b49a5ffa78ddeb2.png

11.选择boot启动方式,复位运行(参考:新唐Nuc980学习笔记1 - 工程创建和下载

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

abf34cc9002123711e0e52d7fb645f14.png

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

ac7ab53aab065914c925770f41eaa7de.png

注意:

【 以下动作只需要在更新 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。

欢迎关注公众号:嵌入式学习与实践

参考:

https://www.bilibili.com/video/BV1ap4y1W7Za/?spm_id_from=333.999.0.0&vd_source=f58225e38b5a8bc42ab3351918ec20e5
https://www.bilibili.com/video/BV1Df4y1p7Jp/?spm_id_from=333.999.0.0&vd_source=f58225e38b5a8bc42ab3351918ec20e5

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/962352.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Revit SDK 介绍:AutoRoute 自动路由

前言 这个例子介绍如何用 Revit API 创建自动路由&#xff0c;本质上就是通过 API 创建机电管道。 内容 将出风口和风机自动连接&#xff0c;最终效果。 下面按步骤将其组装起来&#xff1a; 风机立管及连接件 生成红框内容的核心逻辑&#xff1a; ducts.Add(Duct.Create…

Ei Scopus 双检索 |第三届信息与通信工程国际会议国际会议(JCICE 2024)

会议简介 Brief Introduction 2024年第三届信息与通信工程国际会议国际会议(JCICE 2024) 会议时间&#xff1a;2024年5月10日-12日 召开地点&#xff1a;中国福州 大会官网&#xff1a;JCICE 2024-2024 International Joint Conference on Information and Communication Engin…

结构体的简单介绍

目录 概念&#xff1a; 与数组类比&#xff1a; 结构体声明&#xff1a; 注意&#xff1a; 结构体变量、全局变量、局部变量&#xff1a; 结构体声明中包含其他结构体变量&#xff1a; 结构体变量的初始化&#xff1a; 包含了其他结构体变量的初始化&#xff1a; 结构体…

报错:axios 发送的接口请求 404

axios 发送的接口请求 404 一、问题二、分析 一、问题 二、分析 axios 发送的接口请求 404&#xff0c;根本没有把接口信息发送到后端&#xff0c;这个时候你可以查看检查一下自己的接口名字&#xff0c;或让后端配合换一个接口名字再发送一次接口请求

性能提升5倍!翼支付基于多租户的降本增效实践

作者&#xff1a;王硕 中国电信翼支付 DBA 翼支付是天翼电子商务有限公司旗下第三方服务平台&#xff0c;面向 7000 万月活用户&#xff0c;提供民生缴费、消费购物、金融理财等服务内容&#xff0c;依托云计算、大数据、人工智能等技术&#xff0c;联合合作伙伴&#xff0c;赋…

Python操作文件的读取和写入,详解和案例介绍

Python文件IO操作是Python编程中非常重要的一部分&#xff0c;可以通过文件IO操作来读取和写入文件。文件IO操作提供了一种在程序中处理文件的方法&#xff0c;可以读取文件中的数据&#xff0c;也可以将数据写入到文件中。在本文中&#xff0c;我们将介绍Python中文件IO操作的…

【一对一学习小组】2023年有三AI-CV高阶-项目实战组发布,超过30个案例,60小时项目实战+2大基础方向专栏+3本书赠送...

2023年有三AI-CV高阶-项目实战组正式发布&#xff01;有三AI已经推出了CV初-中-高级培养计划&#xff08;原名有三AI-CV季划&#xff09;&#xff0c;这是我们的终身计算机视觉学习小组。 该培养计划具有以下特点&#xff1a; 【系统性】配套有非常完备的理论与实践 【永久性】…

stable diffusion实践操作-SD原理

本文专门开一节写提示词相关的内容&#xff0c;在看之前&#xff0c;可以同步关注&#xff1a; stable diffusion实践操作 正文 1、出图原理 1.1 AI画画不是和人一样&#xff0c;从0开始&#xff0c;而是一个去噪点的过程&#xff1a; 1.2 逆向去噪 所有的人图片都是从一张噪…

大型商城系统功能逻辑架构_各大系统关系设计_OctShop

一个商城系统应该具备什么样的功能才算一个合格的网上商城呢&#xff0c;才能满意用户的下单支付&#xff0c;退款退货&#xff0c;售后等需求呢&#xff01; 商城一般分为三种角色&#xff1a;买家&#xff0c;商家&#xff0c;平台&#xff0c;这三种角色都有各自的功能特点。…

记录--前端使用a链接下载内容增加loading效果

这里给大家分享我在网上总结出来的一些知识&#xff0c;希望对大家有所帮助 问题描述&#xff1a;最近工作中出现一个需求&#xff0c;纯前端下载 Excel 数据&#xff0c;并且有的下载内容很多&#xff0c;这时需要给下载增加一个 loading 效果。 代码如下&#xff1a; // util…

2023_Spark_实验六:Scala面向对象部分演示(二)(IDEA开发)

7、Scala中的apply方法&#xff08;&#xff09; 遇到如下形式的表达式时&#xff0c;apply方法就会被调用&#xff1a; Object(参数1,参数2,......,参数N) 通常&#xff0c;这样一个apply方法返回的是伴生类的对象&#xff1b;其作用是为了省略new关键字 Object的apply方法…

我开课了!《机器学习》公益课9月4日开课

我是黄海广&#xff0c;大学老师&#xff0c;我上的一门课叫《机器学习》&#xff0c;本科生学机器学习有点难&#xff0c;但也不是没有可能&#xff0c;我在摸索中&#xff0c;设计适合本科生的机器学习课程&#xff0c;写了教材&#xff0c;录了视频&#xff0c;做了课件。我…

如何使用SQL系列 之 了解SQL中的约束规则

简介 在设计数据库时&#xff0c;有时可能需要对某些列中允许的数据设置限制。例如&#xff0c;如果你要创建一张表来保存摩天大楼的信息&#xff0c;你可能希望在保存每座大楼高度的列中禁止使用负值。 关系型数据库管理系统(RDBMS)允许你使用约束来控制哪些数据被添加到表中…

PID 算法

1.1 概述 比例&#xff08;Proportion&#xff09;积分&#xff08;Integral&#xff09;微分&#xff08;Differential&#xff09;控制器&#xff08;PID控制器或三项控制器&#xff09;是一种采用反馈的控制回路机制&#xff0c;广泛应用于工业控制系统和需要连续调制控制的…

ArrayList(扩容机制)

文章目录 一、前言二、ArrayList扩容机制1、适用于什么场景&#xff1f;2、ArrayList特点3、ArrayList扩容机制3.1、内存分配的效率&#xff1a;3.2、数据迁移的代价3.3、性能和空间的平衡 三、总结 一、前言 对于ArrayList集合可能大家并不陌生&#xff0c;但ArrayList集合的…

Camera | 12.瑞芯微摄像头自动焦距马达驱动移植

本为你主要讲解如何让摄像头ov13850支持自动对焦功能。 摄像头的对角主要通过VCM马达驱动芯片DW9714来实现的。 一、环境 soc : rk3568 board: EVB1-DDR4-V10 软 件&#xff1a;Android 11 Linux&#xff1a;4.19.232 Camera:ov13850二、DW9714 1.DW9714简介 DW9714专…

企业知识管理的解决方案

人们发现&#xff0c;挖掘知识、创造知识、生产知识&#xff0c;用知识为自己的产品赋予高附加值&#xff0c;才是企业和社会可持续发展的动力之源。所以知识管理越来越受到重视。 知识管理作为一个新兴的管理概念&#xff0c;已经被学术界所接受&#xff0c;但尚未形成一个…

网站用户体验之深度感悟

个性化定制界面和极简版原装界面&#xff0c;哪一个你用起来更加顺手呢&#xff0c;相比之下你更喜欢哪一个&#xff1f; 界面选择&#xff1a; &#xff08;提醒&#xff1a;仅个人感悟。~~&#xff09; 方向一&#xff1a;表明自己的喜好 我个人觉得更喜欢个性化定制界面。…

虚拟机有代理备份、无代理备份是什么?

有代理备份&#xff1a; 在虚拟机内部安装备份代理程序&#xff0c;然后把虚拟机当作物理机一样来进行备份任务。借助虚拟机系统中内置的程序来进行备份的&#xff0c;就像在正常系统中备份那样&#xff0c;借助备份和还原&#xff08;Windows7&#xff09;功能对系统进行备份…

知识图谱笔记:TransE

1 知识图谱介绍 一条知识图谱可以表示为一个三元组(sub,rel,obj)。 举个例子&#xff1a;小明的爸爸是大明&#xff0c;表示成三元组是&#xff08;小明&#xff0c;爸爸&#xff0c;大明&#xff09;。前者是主体&#xff0c;中间是关系&#xff0c;后者是客体。主体和客体统…