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

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

3天内不再提示

在V85x上将uart3设置成普通串口收发模式

全志在线 来源:全志在线开发者论坛 2023-05-17 10:00 次阅读

Uart3普通串口收发设置

作者@chhjnavy

由于UART0 被设定为系统dubug 输出(简单来说就是将ttyS0 设定为console),所以使用UART3 作为普通的串口,进行与别的设备通信

查找TX/RX pin脚

a9cf8dc0-f40e-11ed-90ce-dac502259ad0.png

从图中可以看出TX = PE12 RX = PE13 。

PE12 PE13 可以通过排插用杜邦线接出,排插电路图如下:

a9da6556-f40e-11ed-90ce-dac502259ad0.png

查看pin脚复用

记住PE12 PE13 用作UART3-TX UART3-RX 是function7 ,这个很重要,一会我们在board.dts 文件中需要用到。

a9fd7564-f40e-11ed-90ce-dac502259ad0.png

配置设备树

设备树文件通过of 文件解析出属性,进一步被应用(原理此处不再介绍)。

board.dts 路径:

tina-v853-docker/device/config/chips/v851s/configs/lizard/board.dts

在设备树中搜索UART 找到UART3 相关配置

&uart0 {
 pinctrl-names = "default", "sleep";
 pinctrl-0 = <&uart0_pins_active>;
 pinctrl-1 = <&uart0_pins_sleep>;
 status = "okay";
};


&uart1 {
 pinctrl-names = "default", "sleep";
 pinctrl-0 = <&uart1_pins_active>;
 pinctrl-1 = <&uart1_pins_sleep>;
 status = "disabled";
};


&uart2 {
 pinctrl-names = "default", "sleep";
 pinctrl-0 = <&uart2_pins_active>;
 pinctrl-1 = <&uart2_pins_sleep>;
 status = "disabled";
};


&uart3 {
 pinctrl-names = "default", "sleep";
 pinctrl-0 = <&uart3_pins_active>;
 pinctrl-1 = <&uart3_pins_sleep>;
 status = "okay";
};


&pio {
 uart0_pins_active: uart0@0 {
  allwinner,pins = "PH9", "PH10";
  allwinner,function = "uart0";
  allwinner,muxsel = <5>;
  allwinner,drive = <1>;
  allwinner,pull = <1>;
 };


 uart0_pins_sleep: uart0@1 {
  allwinner,pins = "PH9", "PH10";
  allwinner,function = "gpio_in";
  allwinner,muxsel = <0>;
 };


 uart1_pins_active: uart1@0 {
  allwinner,pins = "PG6", "PG7";
  allwinner,function = "uart1";
  allwinner,muxsel = <4>;
  allwinner,drive = <1>;
  allwinner,pull = <1>;
 };


 uart1_pins_sleep: uart1@1 {
  allwinner,pins = "PG6", "PG7";
  allwinner,function = "gpio_in";
  allwinner,muxsel = <0>;
 };


 uart2_pins_active: uart2@0 {
  allwinner,pins = "PA8", "PA9";
  allwinner,function = "uart2";
  allwinner,muxsel = <6>;
  allwinner,drive = <1>;
  allwinner,pull = <1>;
 };


 uart2_pins_sleep: uart2@1 {
  allwinner,pins = "PA8", "PA9";
  allwinner,function = "gpio_in";
  allwinner,muxsel = <0>;
 };


 uart3_pins_active: uart3@0 {
  allwinner,pins = "PE12", "PE13";
  allwinner,function = "uart3";
  allwinner,muxsel = <7>;
  allwinner,drive = <1>;
  allwinner,pull = <1>;
 };


 uart3_pins_sleep: uart3@1 {
  allwinner,pins = "PE12", "PE13";
  allwinner,function = "gpio_in";
  allwinner,muxsel = <0>;
 };

将uart3 设定为 status = "okay";

将uart3 pin 脚设为 allwinner,pins = "PE12", "PE13";

将uart3 pin复用为function7 :allwinner,muxsel = <7>;

修改完成后,重新编译img

make -j1 V=s
pack

使用PhoenixSuit烧录后,通过adb shell 进入终端,就可以查看到设备节点:/dev/ttyS3 ,通过open 设备终端,就可以进行read write 操作。

进行收发操作

1)写应用程序:

#include    /*标准输入输出定义*/
#include   /*标准函数库定义*/
#include   /*Unix标准函数定义*/
#include  
#include  /*六文件控制定义*/
#include    /*PX终端控制定义*/
#include   
#include 
#include  


enum parameter_type {
  PT_PROGRAM_NAME = 0,
  PT_DEV_NAME,
  PT_CYCLE,
  PT_NUM
};


#define DBG(string, args...) 
  do { 
      printf("%s, %s()%u---",__FILE__,__FUNCTION__,__LINE__); 
      printf(string, ##args); 
      printf("
"); 
  } while (0)




void usage(void) {
  printf("You should input as: 
");
  printf("	 select_test [/dev/name] [Cyclee Cnt]
");
}


int OpenDev(char *name) {
  int fd = open(name, O_RDWR ); 
  if (-1 == fd)
    DBG("Can not OPen(%s)!", name);
  return fd;
}


/*
 * @brief 设置串口通信速率
 * @param fd 类型 int打开串口的文件句柄长 
 * @param speed 类型 int 串口速度
 * @return void
*/


void set_speed(int fd, int speed) {


  int i;
  int status;
  struct termios Opt = {0};
  int speed_arr[] = {B230400, B115200, B57600, B38400, B19200, B9600, B4800, B2400, B1200, B300, B38400, B19200, B9600, B4800, B2400, B1200, B300, };
  int name_arr[] = {230400,115200, 57600, 38400, 19200, 9600, 4800, 2400, 1200, 300, 38400, 19200, 9600, 4800, 2400, 1200, 300, };


  tcgetattr(fd, &Opt);


  for ( i= 0; i < sizeof(speed_arr) / sizeof(int); i++) {
        if (speed == name_arr[i])
            break;
    }


    tcflush(fd, TCIOFLUSH);
    cfsetispeed(&Opt, speed_arr[i]);
    cfsetospeed(&Opt, speed_arr[i]);


    Opt.c_lflag &= ~(ICANON | ECHO | ECHOE | ISIG); /*Input*/
    Opt.c_oflag &= ~OPOST;  /*Output*/


    status = tcsetattr(fd, TCSANOW, &Opt);
    if (status != 0) {
        DBG("tcsetattr fd");
        return;
  }
  tcflush(fd, TCIOFLUSH);
 }


/**
*@brief  设置串口数据位,停止位和效验位
*@param fd  类型    int 打开的串口文件句柄
*@param  databits 类 型  int 数 据位  取值  为  7 或者8
*@param  stopbits 类 型  int 停 止位  取值为  1 或者2
*@param parity 类型 int 效验类型 取值为N,E,O,,S
 */


int set_Parity(int fd,int databits,int stopbits,int parity) {
  struct termios options;


    if ( tcgetattr( fd,&options) != 0) {
        perror("SetupSerial 1");
        return -1;
    }
    options.c_cflag &= ~CSIZE;
    switch (databits) /*设置数据位数*/
    {
        case 7:
        options.c_cflag |= CS7;
        break;
        case 8:
        options.c_cflag |= CS8;
        break;
        default:
        fprintf(stderr,"Unsupported data size
");
        return -1;
    }
    switch (parity)  
    {  
        case 'n':  
        case 'N':  
            options.c_cflag &= ~PARENB;  /* Clear parity enable */
            options.c_iflag &= ~INPCK;  /* Enable parity checking */
            break;  
        case 'o':
        case 'O':
            options.c_cflag |= (PARODD | PARENB); /* 设置为奇效验*/
            options.c_iflag |= INPCK;  /* Disnable parity checking */
            break;
        case 'e':
        case 'E':
            options.c_cflag |= PARENB;  /* Enable parity */
            options.c_cflag &= ~PARODD;  /*  */
            options.c_iflag |= INPCK;  /* Disnable parity checking */
            break;
        case 'S':
        case 's': /*as no parity*/
            options.c_cflag &= ~PARENB;
            options.c_cflag &= ~CSTOPB;break;
        default:
            fprintf(stderr,"Unsupported parity
");
            return -1;
    }
    /* 设置停止位*/
    switch (stopbits)
    {
        case 1:
            options.c_cflag &= ~CSTOPB;
            break;
        case 2:
            options.c_cflag |= CSTOPB;
            break;
        default:
            fprintf(stderr,"Unsupported stop bits
");
            return -1;
    }
    /* Set input parity option */
    if (parity != 'n')
        options.c_iflag |= INPCK;
    tcflush(fd,TCIFLUSH);
    options.c_cc[VTIME] = 150; /*  15 seconds*/
    options.c_cc[VMIN] = 0; /* Update the options and do it NOW */
    if (tcsetattr(fd,TCSANOW,&options) != 0) {
        perror("SetupSerial 3");
        return -1;
    }
    return 0;
}


void str_print(char *buf, int len) {
    int i;
    for (i=0; i

2)编写makefile:

需注意,将makefile 中的编译工具路径修改为自己的工具路径。

#CROSS_COMPILE = arm-linux-
#CROSS_COMPILE = arm-linux-gnueabihf-


CROSS_COMPILE=/home/xxx/v851s/Yuzukilizard/toolchain/gcc-linaro-5.3.1-2016.05-x86_64_arm-linux-gnueabi/bin/arm-linux-gnueabi-


# CPU = cortex-a7
# FPU = fpv4-sp-d16


AS        = $(CROSS_COMPILE)as
LD        = $(CROSS_COMPILE)ld
CC        = $(CROSS_COMPILE)gcc
CXX        = $(CROSS_COMPILE)g++
CPP        = $(CC) -E
AR        = $(CROSS_COMPILE)ar
NM        = $(CROSS_COMPILE)nm
STRIP       = $(CROSS_COMPILE)strip
OBJCOPY      = $(CROSS_COMPILE)objcopy
OBJDUMP      = $(CROSS_COMPILE)objdump
RANLIB      = $(CROSS_COMPILE)ranlib
SIZE       = $(CROSS_COMPILE)size


TOP_DIR      = $(shell pwd)


CFLAGS_inc_path  += -I$(TOP_DIR)


EXE = UARTTest


# CFLAGS_inc_path  += -I$(TOP_DIR)external/jpeg-9a


# for H.264 hardware codec
#CFLAGS_inc_path  += -I$(TOP_DIR)/../../prebuilt/include/cedar


# CFLAGS += -std=gnu99 -mthumb -mabi=aapcs-linux -mlittle-endian
# CFLAGS += -fdata-sections -ffunction-sections
# CFLAGS += -mcpu=$(CPU) -mtune=$(CPU) -mfpu=$(FPU) -mfloat-abi=hard


SRC_HAL += ./ 


LIB_SRC := $(foreach spath, $(SRC_HAL), $(wildcard $(spath)*.c))
OBJECT += $(patsubst %.c,%.o,$(LIB_SRC))


LOCAL_INCLUDE += -I./


#CFLAGS      += -O2 -ggdb3 -DNDEBUG
CFLAGS      += $(LOCAL_INCLUDE) -static


# LDFLAGS = -L../../library/arm-linux-gnueabihf
# LIBS += -lawh264 -lvdecoder -lcdc_base -lMemAdapter -lVE -lvencoder -lvideoengine


all:$(EXE)
$(EXE):$(OBJECT)
 @$(CC) $(OBJECT) -o $(EXE) $(CFLAGS)
# @echo -- gcc $(SRCS) --
 @echo "Compile target done."
 @echo "use src files"


$(OBJECT):
.PHONY:clean
clean:
 @rm -rf *.o $(OBJECT) $(EXE)
 @echo "Clean done." 

3)make 后,产生可执行文件,adb push 到开发板中进行执行,执行命令:

./UARTTest /dev/ttyS3 4

4)用杜邦线将PE12 PE13 GND 三根线接到电脑串口(需要串口转换小板子),波特率目前设定19200 ,使用串口工具,向板子随便发送数据,板子接受到数据,就会发送数据到电脑。

审核编辑:汤梓红

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

    关注

    18

    文章

    5969

    浏览量

    135829
  • 串口
    +关注

    关注

    14

    文章

    1543

    浏览量

    76163
  • uart
    +关注

    关注

    22

    文章

    1227

    浏览量

    101161
  • 烧录
    +关注

    关注

    8

    文章

    255

    浏览量

    35515
  • 设备树
    +关注

    关注

    0

    文章

    38

    浏览量

    3109

原文标题:【快速上手】在V85x上将uart3设置成普通串口收发模式

文章出处:【微信号:gh_79acfa3aa3e3,微信公众号:全志在线】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    STM32F302的PB8作为UART3的RXD连接串口模块遇到的问题求解

    STM32F302的PB8作为UART3的RXD连接串口模块。现在问题是: 1、DEBUG模式下,UART3能正常接收。 2、正常运行模式
    发表于 04-02 07:04

    [教程]PX2开发板上的串口UART3使用入门

    UART3在此图上左半区,GPIO扩展这组接口中,UART3是最容易连接外扩的一个串口(TTL电平),开发中需要接一些串口的外围器件(比如
    发表于 01-27 16:02

    可能配置UART3接收模式下工作吗

    我的项目中,我使用PIC32 MX795F512L,它在引脚12和11上有UART3 TX和RX,因为我需要RMI接口的ECRSZDV信号的PIN 12,有可能配置UART3接收
    发表于 11-28 16:45

    请问怎么把sim800c设置成透传模式

    我想把sim800c模块设置成透传模式,教程里是通过串口调试助手发送AT指令设置成透传模式。能不能再stm32中写代码通过
    发表于 04-11 23:28

    为什么MISO脚设置成输出模式

    为什么MISO脚设置成输出模式,这个脚应该是输入脚啊。推挽模式改为开漏模式行不行?原子哥
    发表于 09-16 01:26

    STM32 IO口要设置成什么模式

    stm32的部分管脚可以兼容5V,那么请问当外接信号为5V作为输入时,IO口要设置成什么模式
    发表于 05-29 10:13

    为什么使用调试后的UART3做通讯串口会发现程序卡死函数中呢

    为什么使用调试后的UART3做通讯串口会发现程序卡死函数中呢?怎样去解决?
    发表于 12-09 06:30

    请问大佬A40i的怎么Uart2和Uart3配置两线模式

    2、uart3的方式与操作uart4 、uart7相同,但是uart4 、uart7就可以正常收发
    发表于 01-04 07:19

    如果UART2和UART3同时支持232和485需要改驱动吗?

    通信的时候,这个自带的uart测试程序可以使用吗?)2. 如果UART2和UART3同时支持232和485 需要改驱动吗?还是说对于CPU的UART
    发表于 01-04 06:07

    请问OK1043A怎样将UART2及UART3配置普通GPIO?

    我想把UART2及UART3配置普通IO口:1. 根据文档将RCW中将UART_BASE=3
    发表于 01-06 07:21

    RK3288如何添加普通串口uart1和uart3

    RK3288如何添加普通串口uart1和uart3
    发表于 03-03 06:09

    如何修改RK3288调试串口UART2为普通串口

      我们使用的是RK3288 android5.1系统  uart1和uart3都可以正常使用,但是uart2却只能用于调试,目前想要把uart1,
    发表于 08-29 16:03

    全志v851s uart3 设置成普通串口收发

    作为普通串口,进行与别的设备通信。 1. 查看硬件电路图SCH_Schematic1_2022-11-23,查看uart3 的TX RX pin 脚 电路图pdf路径:Yuzukilizard
    发表于 04-23 15:49

    N9H30K的串口修改为UART3后,发现UART3没反应是怎么回事?

    测试 BSP包里的 UART和序,我是用 NK-N9H30 V1.2 的开发板测试的,发现BSP包里是 测度 UART1,但开发板板载的串口
    发表于 06-14 07:06

    F030系列芯片UART3~UART6代码分享

    看了大家对F030复用串口的疑惑,这里继续给出“当同时使用UART3~UART6中的多个串口时,由于其中断响应函数都是同一个,需要自己中断
    的头像 发表于 10-13 14:14 1543次阅读
    F030系列芯片<b class='flag-5'>UART3</b>~<b class='flag-5'>UART</b>6代码分享