Hi3520D 串口使用实例

以下给出了一个源文件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   在CODE上查看代码片 派生到我的代码片
  1. /* 
  2.  * uart_gkwzt.c 
  3.  * 
  4.  *  Created on: 2012-10-15 
  5.  *      Author: root 
  6.  */  
  7.  
  8. #include  <stdio.h>           /*  标准输入输出定义            */  
  9. #include  <stdlib.h>          /*  标准函数库定义         <span style="white-space:pre">    </span>*/  
  10. #include  <unistd.h>          /*  Unix标准函数定义      <span style="white-space:pre">    </span>*/  
  11. #include  <sys/types.h>       /*                      */  
  12. #include  <sys/stat.h>        /*                      */  
  13. #include  <fcntl.h>           /*  文件控制定义          <span style="white-space:pre">    </span>*/  
  14. #include  <termios.h>         /*  PPSIX终端控制定义     <span style="white-space:pre">    </span>*/  
  15. #include  <errno.h>           /*  错误号定义               */  
  16. #include  <string.h>  
  17.  
  18. #include "mpi_sys.h"  
  19. #include "hi_comm_sys.h"  
  20. #include "hi_io.h"  
  21. #include "hi_tde_api.h"  
  22.  
  23. #define TRUE 1  
  24. #define FALSE 0  
  25.   
  26. /* 
  27. ********************************************************************************************************** 
  28. *寄存器基地址映射 
  29. ********************************************************************************************************** 
  30. */  
  31. #define     IOCFG_BASE_ADDR     0x200F0000                      /*  IO口复用寄存器地址空间映射              */  
  32. #define     GPIO0_BASE_ADDR     0x20150000                      /*  GPIO0的地址空间映射                    */  
  33. #define     GPIO1_BASE_ADDR     0x20160000                      /*  GPIO1的地址空间映射                    */  
  34. #define     GPIO2_BASE_ADDR     0x20170000                      /*  GPIO2的地址空间映射                    */  
  35. #define     GPIO3_BASE_ADDR     0x20180000                      /*  GPIO3的地址空间映射                    */  
  36. #define     GPIO4_BASE_ADDR     0x20190000                      /*  GPIO4的地址空间映射                    */  
  37. #define     GPIO5_BASE_ADDR     0x201A0000                      /*  GPIO5的地址空间映射                    */  
  38. #define     GPIO6_BASE_ADDR     0x201B0000                      /*  GPIO6的地址空间映射                    */  
  39. #define     GPIO7_BASE_ADDR     0x201C0000                      /*  GPIO7的地址空间映射                    */  
  40. #define     GPIO8_BASE_ADDR     0x201D0000                      /*  GPIO7的地址空间映射                    */  
  41.   
  42.   
  43. int speed_arr[] = {B115200, B57600, B38400, B19200, B9600, B4800, B2400, B1200, B300};  
  44. int name_arr[]  = {115200,  57600,  38400,  19200,  9600,  4800,  2400,  1200,  300};  
  45.   
  46.   
  47. /* 
  48. ********************************************************************************************************** 
  49. *说    明:设置波特率,数据位,停止位,奇偶校验位 
  50. *入口参数: 
  51. *出口参数: 
  52. ********************************************************************************************************** 
  53. */  
  54. int wzt_SetSerialParameter(int fd, int baudrate, int databits, int stopbits, int parity)  
  55. {  
  56.     struct  termios scmTermios  ;  
  57.   
  58.     if(tcgetattr(fd,&scmTermios) != 0){  
  59.         perror("Get serial parameter error");  
  60.         return(FALSE);  
  61.     }  
  62.     /*  设置波特率   */  
  63.     int i = 0;  
  64.     for(i = 0; i < sizeof(speed_arr)/sizeof(int); i++){  
  65.         if(baudrate == name_arr[i]){  
  66.             tcflush(fd, TCIOFLUSH);                                     /*  清除输入输出缓冲区               */  
  67.             if(0 != cfsetispeed(&scmTermios,speed_arr[i])){             /*  设置输入波特率 成功返回0 否则-1  */  
  68.                 printf("ERROR:Set input Serial baudrate fail\n");  
  69.             }  
  70.             if(0 != cfsetospeed(&scmTermios,speed_arr[i])){             /*  设置输出波特率 成功返回0 否则-1  */  
  71.                 printf("ERROR:Set output Serial baudrate fail\n");  
  72.             }  
  73.             break;  
  74.         }  
  75.     }  
  76.     /*  设置数据位   */  
  77.     scmTermios.c_cflag &= ~CSIZE;                           /*  清零                          */  
  78.     switch (databits){  
  79.         case 7: scmTermios.c_cflag |= CS7;  break;  
  80.         case 8: scmTermios.c_cflag |= CS8;  break;  
  81.         default:fprintf(stderr,"Unsupported data size\n");return (FALSE);  
  82.     }  
  83.     /*  设置停止位   */  
  84.     switch(stopbits){  
  85.         case 1: scmTermios.c_cflag &= ~CSTOPB;  break;  
  86.         case 2: scmTermios.c_cflag |= CSTOPB;   break;  
  87.         default:fprintf(stderr,"Unsupported stop bits\n");return (FALSE);  
  88.     }  
  89.     /*  奇偶校验位   */  
  90.     switch (parity){  
  91.         case 'n':  
  92.         case 'N':  
  93.             scmTermios.c_cflag &= ~PARENB;  
  94.             scmTermios.c_iflag &= ~INPCK;  
  95.             break;  
  96.         case 'o':  
  97.         case 'O':  
  98.             scmTermios.c_cflag |= (PARODD | PARENB);  
  99.             scmTermios.c_iflag |= INPCK;  
  100.             break;  
  101.         case 'e':  
  102.         case 'E':  
  103.             scmTermios.c_cflag |= PARENB;  
  104.             scmTermios.c_cflag &= ~PARODD;  
  105.             scmTermios.c_iflag |= INPCK;  
  106.             break;  
  107.         case 'S':  
  108.         case 's':  
  109.             scmTermios.c_cflag &= ~PARENB;  
  110.             scmTermios.c_cflag &= ~CSTOPB;  
  111.             break;  
  112.         default:  
  113.             fprintf(stderr,"Unsupported parity\n");  
  114.             return (FALSE);  
  115.     }  
  116.     if(parity != 'n') scmTermios.c_iflag |= INPCK;  
  117.   
  118.     scmTermios.c_cc[VTIME]  = 150;                      /*  非规范模式读取时的超时时间           */  
  119.     scmTermios.c_cc[VMIN]   = 0;                        /*  非规范模式读取时的最小字符数          */  
  120.   
  121.     tcflush(fd, TCIOFLUSH);                     <span style="white-space:pre">    </span>/* 清除输入输出缓冲区               */  
  122.     if (tcsetattr(fd,TCSANOW,&scmTermios) != 0){        <span style="white-space:pre">        </span>/* 不等数据传输完毕就立即改变属性     <span style="white-space:pre">    </span>*/  
  123.         perror("Set serial parameter error");  
  124.         return (FALSE);  
  125.     }  
  126.     else{  
  127.         printf("MSG  :Set serial parameter successfully!\n");  
  128.     }  
  129.   
  130.     return (TRUE);  
  131. }  
  132.   
  133. /* 
  134. ********************************************************************************************************** 
  135. *说    明:标准输入模式,显示输入字符 
  136. *入口参数: 
  137. *出口参数: 
  138. ********************************************************************************************************** 
  139. */  
  140. void wzt_DisableTerminalReturn(int fd)  
  141. {  
  142.     struct termios scmTermios;  
  143.   
  144.     tcgetattr(fd, &scmTermios);  
  145.     scmTermios.c_lflag &= ~(ICANON | ECHO);  
  146.     tcsetattr(fd, TCSANOW, &scmTermios);  
  147. }  
  148.   
  149.   
  150. /* 
  151. ********************************************************************************************************** 
  152. *说    明:gpio 复用寄存器初始化,如果在内核中复用过,在这个地方就不需要配置 
  153. *入口参数: 
  154. *出口参数: 
  155. ********************************************************************************************************** 
  156. */  
  157. void gpio_cfg_init(void)  
  158. {  
  159.     HI_S32 byregval = 0;  
  160.   
  161.     HI_MPI_SYS_SetReg(IOCFG_BASE_ADDR+0x050,0x01);          /*  设置GPIO5_1为UART1_RXD                 */  
  162.     HI_MPI_SYS_SetReg(IOCFG_BASE_ADDR+0x058,0x01);          /*  设置GPIO5_3为UART1_TXD                 */  
  163.   
  164.     HI_MPI_SYS_SetReg(IOCFG_BASE_ADDR+0x05C,0x01);          /*  设置GPIO5_4为UART2_RXD                 */  
  165.     HI_MPI_SYS_SetReg(IOCFG_BASE_ADDR+0x060,0x01);          /*  设置GPIO5_5为UART2_TXD                 */  
  166.   
  167.     HI_MPI_SYS_SetReg(IOCFG_BASE_ADDR+0x0B8,0x01);          /*  设置GPIO1_0为UART3_TXD                 */  
  168.     HI_MPI_SYS_SetReg(IOCFG_BASE_ADDR+0x0BC,0x01);          /*  设置GPIO1_1为UART3_RXD                 */  
  169. }  
  170.   
  171.   
  172.   
  173. /* 
  174. ********************************************************************************************************** 
  175. *说    明:主函数 
  176. *入口参数: 
  177. *出口参数: 
  178. *备    注:LED灯闪烁 
  179. ********************************************************************************************************** 
  180. */  
  181. int main(int argc, char** argv, char *envp[])  
  182. {  
  183.     if(argc<3){  
  184.         printf("*****************************************************\n");  
  185.         printf("if argv[2] = 0,function: uart test \n");  
  186.         printf("Usage:  filename  /dev/ttyAMAn  0\n");  
  187.         printf("*****************************************************\n");  
  188.         exit(0);  
  189.     }  
  190.   
  191.     int action = atoi(argv[2]);  
  192.     if(action==0){  
  193.         gpio_cfg_init();  
  194.         printf("Devices:%s\n",argv[1]);  
  195.   
  196.         int Ctrlfd = open(argv[1], O_RDWR);  
  197.         if(-1 == Ctrlfd){  
  198.             Ctrlfd = 0;  
  199.             printf("Can't Open Serial Port!\n");  
  200.             return 0;  
  201.         }  
  202.   
  203.         wzt_SetSerialParameter(Ctrlfd, 115200, 8, 1, 'N');  
  204.         wzt_DisableTerminalReturn(Ctrlfd);  
  205.   
  206.         int n=0,ret;  
  207.         char buffer[1024];  
  208.         char cmd[12];  
  209.         for(n=0;n<10;n++){cmd[n]='0'+n;}cmd[10] = '\r';cmd[11] = '\n';  
  210.   
  211.         while(1){  
  212.             cmd[0]='0'+(n++)%8;  
  213.             ret = write(Ctrlfd,cmd,12);  
  214.             int count = read(Ctrlfd,buffer,sizeof(buffer));  
  215.             if(count>0){  
  216.                 buffer[count] = '\0';  
  217.                 printf("Read:%s\n",buffer);  
  218.             }  
  219.             else{  
  220.                 printf("Read:%d\n",count);  
  221.             }  
  222.             usleep(20000);  
  223.         }  
  224.         return 0;  
  225.     }  
  226.     exit(0);  
  227. }  


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

[csharp]   view plain  copy   在CODE上查看代码片 派生到我的代码片
  1. # Hisilicon Hi3516 sample Makefile  
  2.   
  3. include ../Makefile.param  
  4. #ifeq ($(SAMPLE_PARAM_FILE), )  
  5. #     SAMPLE_PARAM_FILE:=../Makefile.param  
  6. #     include $(SAMPLE_PARAM_FILE)  
  7. #endif  
  8.  
  9. # target source  
  10. SRC  := $(wildcard *.c)   
  11. OBJ  := $(SRC:%.c=%.o)  
  12.   
  13. TARGET := $(OBJ:%.o=%)  
  14. .PHONY : clean all  
  15.   
  16. all: $(TARGET)  
  17.   
  18. MPI_LIBS := $(REL_LIB)/libmpi.a  
  19. MPI_LIBS += $(REL_LIB)/libhdmi.a  
  20.   
  21. $(TARGET):%:%.o $(COMM_OBJ)  
  22.     $(CC) $(CFLAGS) -lpthread -lm -o $@ $^ $(MPI_LIBS) $(AUDIO_LIBA) $(JPEGD_LIBA)  
  23.   
  24. clean:  
  25.     @rm -f $(TARGET)  
  26.     @rm -f $(OBJ)  
  27.     @rm -f $(COMM_OBJ)  
  28.   
  29. cleanstream:  
  30.     @rm -f *.h264  
  31.     @rm -f *.jpg  
  32.     @rm -f *.mjp  
  33.     @rm -f *.mp4

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值