Hi3520D 串口使用实例

    xiaoxiao2021-03-25  165

    以下给出了一个源文件uart.c和makefile文件,在 sdk/mpp/sample/  底下新建一个文件夹,随便命名,现在命名为UartTest,再把uart.c和makefile拷贝进去,编译

    此外,还需要把 libjpeg.so libmpi.so libtde.so 放入核心板 /lib目录下;

    所有的文件拷贝完成后 运行  ./uart /dev/ttyAMA2 0

    源文件 uart.c

    [csharp]   view plain  copy   /*   * uart_gkwzt.c   *   *  Created on: 2012-10-15   *      Author: root   */     #include  <stdio.h>           /*  标准输入输出定义            */   #include  <stdlib.h>          /*  标准函数库定义         <span style="white-space:pre">    </span>*/   #include  <unistd.h>          /*  Unix标准函数定义      <span style="white-space:pre">    </span>*/   #include  <sys/types.h>       /*                      */   #include  <sys/stat.h>        /*                      */   #include  <fcntl.h>           /*  文件控制定义          <span style="white-space:pre">    </span>*/   #include  <termios.h>         /*  PPSIX终端控制定义     <span style="white-space:pre">    </span>*/   #include  <errno.h>           /*  错误号定义               */   #include  <string.h>     #include "mpi_sys.h"   #include "hi_comm_sys.h"   #include "hi_io.h"   #include "hi_tde_api.h"     #define TRUE 1   #define FALSE 0      /*  **********************************************************************************************************  *寄存器基地址映射  **********************************************************************************************************  */   #define     IOCFG_BASE_ADDR     0x200F0000                      /*  IO口复用寄存器地址空间映射              */   #define     GPIO0_BASE_ADDR     0x20150000                      /*  GPIO0的地址空间映射                    */   #define     GPIO1_BASE_ADDR     0x20160000                      /*  GPIO1的地址空间映射                    */   #define     GPIO2_BASE_ADDR     0x20170000                      /*  GPIO2的地址空间映射                    */   #define     GPIO3_BASE_ADDR     0x20180000                      /*  GPIO3的地址空间映射                    */   #define     GPIO4_BASE_ADDR     0x20190000                      /*  GPIO4的地址空间映射                    */   #define     GPIO5_BASE_ADDR     0x201A0000                      /*  GPIO5的地址空间映射                    */   #define     GPIO6_BASE_ADDR     0x201B0000                      /*  GPIO6的地址空间映射                    */   #define     GPIO7_BASE_ADDR     0x201C0000                      /*  GPIO7的地址空间映射                    */   #define     GPIO8_BASE_ADDR     0x201D0000                      /*  GPIO7的地址空间映射                    */         int speed_arr[] = {B115200, B57600, B38400, B19200, B9600, B4800, B2400, B1200, B300};   int name_arr[]  = {115200,  57600,  38400,  19200,  9600,  4800,  2400,  1200,  300};         /*  **********************************************************************************************************  *说    明:设置波特率,数据位,停止位,奇偶校验位  *入口参数:  *出口参数:  **********************************************************************************************************  */   int wzt_SetSerialParameter(int fd, int baudrate, int databits, int stopbits, int parity)   {       struct  termios scmTermios  ;          if(tcgetattr(fd,&scmTermios) != 0){           perror("Get serial parameter error");           return(FALSE);       }       /*  设置波特率   */       int i = 0;       for(i = 0; i < sizeof(speed_arr)/sizeof(int); i++){           if(baudrate == name_arr[i]){               tcflush(fd, TCIOFLUSH);                                     /*  清除输入输出缓冲区               */               if(0 != cfsetispeed(&scmTermios,speed_arr[i])){             /*  设置输入波特率 成功返回0 否则-1  */                   printf("ERROR:Set input Serial baudrate fail\n");               }               if(0 != cfsetospeed(&scmTermios,speed_arr[i])){             /*  设置输出波特率 成功返回0 否则-1  */                   printf("ERROR:Set output Serial baudrate fail\n");               }               break;           }       }       /*  设置数据位   */       scmTermios.c_cflag &= ~CSIZE;                           /*  清零                          */       switch (databits){           case 7: scmTermios.c_cflag |= CS7;  break;           case 8: scmTermios.c_cflag |= CS8;  break;           default:fprintf(stderr,"Unsupported data size\n");return (FALSE);       }       /*  设置停止位   */       switch(stopbits){           case 1: scmTermios.c_cflag &= ~CSTOPB;  break;           case 2: scmTermios.c_cflag |= CSTOPB;   break;           default:fprintf(stderr,"Unsupported stop bits\n");return (FALSE);       }       /*  奇偶校验位   */       switch (parity){           case 'n':           case 'N':               scmTermios.c_cflag &= ~PARENB;               scmTermios.c_iflag &= ~INPCK;               break;           case 'o':           case 'O':               scmTermios.c_cflag |= (PARODD | PARENB);               scmTermios.c_iflag |= INPCK;               break;           case 'e':           case 'E':               scmTermios.c_cflag |= PARENB;               scmTermios.c_cflag &= ~PARODD;               scmTermios.c_iflag |= INPCK;               break;           case 'S':           case 's':               scmTermios.c_cflag &= ~PARENB;               scmTermios.c_cflag &= ~CSTOPB;               break;           default:               fprintf(stderr,"Unsupported parity\n");               return (FALSE);       }       if(parity != 'n') scmTermios.c_iflag |= INPCK;          scmTermios.c_cc[VTIME]  = 150;                      /*  非规范模式读取时的超时时间           */       scmTermios.c_cc[VMIN]   = 0;                        /*  非规范模式读取时的最小字符数          */          tcflush(fd, TCIOFLUSH);                     <span style="white-space:pre">    </span>/* 清除输入输出缓冲区               */       if (tcsetattr(fd,TCSANOW,&scmTermios) != 0){        <span style="white-space:pre">        </span>/* 不等数据传输完毕就立即改变属性     <span style="white-space:pre">    </span>*/           perror("Set serial parameter error");           return (FALSE);       }       else{           printf("MSG  :Set serial parameter successfully!\n");       }          return (TRUE);   }      /*  **********************************************************************************************************  *说    明:标准输入模式,显示输入字符  *入口参数:  *出口参数:  **********************************************************************************************************  */   void wzt_DisableTerminalReturn(int fd)   {       struct termios scmTermios;          tcgetattr(fd, &scmTermios);       scmTermios.c_lflag &= ~(ICANON | ECHO);       tcsetattr(fd, TCSANOW, &scmTermios);   }         /*  **********************************************************************************************************  *说    明:gpio 复用寄存器初始化,如果在内核中复用过,在这个地方就不需要配置  *入口参数:  *出口参数:  **********************************************************************************************************  */   void gpio_cfg_init(void)   {       HI_S32 byregval = 0;          HI_MPI_SYS_SetReg(IOCFG_BASE_ADDR+0x050,0x01);          /*  设置GPIO5_1为UART1_RXD                 */       HI_MPI_SYS_SetReg(IOCFG_BASE_ADDR+0x058,0x01);          /*  设置GPIO5_3为UART1_TXD                 */          HI_MPI_SYS_SetReg(IOCFG_BASE_ADDR+0x05C,0x01);          /*  设置GPIO5_4为UART2_RXD                 */       HI_MPI_SYS_SetReg(IOCFG_BASE_ADDR+0x060,0x01);          /*  设置GPIO5_5为UART2_TXD                 */          HI_MPI_SYS_SetReg(IOCFG_BASE_ADDR+0x0B8,0x01);          /*  设置GPIO1_0为UART3_TXD                 */       HI_MPI_SYS_SetReg(IOCFG_BASE_ADDR+0x0BC,0x01);          /*  设置GPIO1_1为UART3_RXD                 */   }            /*  **********************************************************************************************************  *说    明:主函数  *入口参数:  *出口参数:  *备    注:LED灯闪烁  **********************************************************************************************************  */   int main(int argc, char** argv, char *envp[])   {       if(argc<3){           printf("*****************************************************\n");           printf("if argv[2] = 0,function: uart test \n");           printf("Usage:  filename  /dev/ttyAMAn  0\n");           printf("*****************************************************\n");           exit(0);       }          int action = atoi(argv[2]);       if(action==0){           gpio_cfg_init();           printf("Devices:%s\n",argv[1]);              int Ctrlfd = open(argv[1], O_RDWR);           if(-1 == Ctrlfd){               Ctrlfd = 0;               printf("Can't Open Serial Port!\n");               return 0;           }              wzt_SetSerialParameter(Ctrlfd, 115200, 8, 1, 'N');           wzt_DisableTerminalReturn(Ctrlfd);              int n=0,ret;           char buffer[1024];           char cmd[12];           for(n=0;n<10;n++){cmd[n]='0'+n;}cmd[10] = '\r';cmd[11] = '\n';              while(1){               cmd[0]='0'+(n++)%8;               ret = write(Ctrlfd,cmd,12);               int count = read(Ctrlfd,buffer,sizeof(buffer));               if(count>0){                   buffer[count] = '\0';                   printf("Read:%s\n",buffer);               }               else{                   printf("Read:%d\n",count);               }               usleep(20000);           }           return 0;       }       exit(0);   }  

    Makefile 文件(其实就是在SDK/mpp/sample/ 底下随便找个例程把其中的makefile直接拿来用就行)

    [csharp]   view plain  copy   # Hisilicon Hi3516 sample Makefile      include ../Makefile.param   #ifeq ($(SAMPLE_PARAM_FILE), )   #     SAMPLE_PARAM_FILE:=../Makefile.param   #     include $(SAMPLE_PARAM_FILE)   #endif     # target source   SRC  := $(wildcard *.c)    OBJ  := $(SRC:%.c=%.o)      TARGET := $(OBJ:%.o=%)   .PHONY : clean all      all: $(TARGET)      MPI_LIBS := $(REL_LIB)/libmpi.a   MPI_LIBS += $(REL_LIB)/libhdmi.a      $(TARGET):%:%.o $(COMM_OBJ)       $(CC) $(CFLAGS) -lpthread -lm -o $@ $^ $(MPI_LIBS) $(AUDIO_LIBA) $(JPEGD_LIBA)      clean:       @rm -f $(TARGET)       @rm -f $(OBJ)       @rm -f $(COMM_OBJ)      cleanstream:       @rm -f *.h264       @rm -f *.jpg       @rm -f *.mjp       @rm -f *.mp4
    转载请注明原文地址: https://ju.6miu.com/read-11262.html

    最新回复(0)