我们从2011年坚守至今,只想做存粹的技术论坛。  由于网站在外面,点击附件后要很长世间才弹出下载,请耐心等待,勿重复点击不要用Edge和IE浏览器下载,否则提示不安全下载不了

 找回密码
 立即注册
搜索
查看: 1008|回复: 11

海思Hi3520DV200  Hi3520DV300 Hi3520DV400 Hi3520DV500

[复制链接]

该用户从未签到

44

主题

17

回帖

164

积分

二级逆天

原厂PM 张工137 2421 2401

积分
164

终身成就奖

发表于 2020-9-21 23:35:39 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区

您需要 登录 才可以下载或查看,没有账号?立即注册

×
海思Hi3520DV200  Hi3520DV300 Hi3520DV400 Hi3520DV500串口
源文件 uart.c开发分享


/*
* 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){
            tcflush(fd, TCIOFLUSH);                                        /*    清除输入输出缓冲区                */
            if(0 != cfsetispeed(&scmTermios,speed_arr)){                /*    设置输入波特率    成功返回0 否则-1    */
                printf("ERROR:Set input Serial baudrate fail\n");
            }
            if(0 != cfsetospeed(&scmTermios,speed_arr)){                /*    设置输出波特率    成功返回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                    */
}



/*
**********************************************************************************************************
*说    明:主函数
*入口参数:
*出口参数:
*备    注ED灯闪烁
**********************************************************************************************************
*/
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);
}
原厂PM 张工137 2421 2401
回复

使用道具 举报

  • TA的每日心情
    擦汗
    2024-8-7 10:43
  • 签到天数: 1 天

    [LV.1]初来乍到

    0

    主题

    4393

    回帖

    2964

    积分

    二级逆天

    积分
    2964

    终身成就奖特殊贡献奖原创先锋奖优秀斑竹奖

    QQ
    发表于 2020-9-22 07:44:58 | 显示全部楼层
    回复

    使用道具 举报

    该用户从未签到

    1

    主题

    6740

    回帖

    1280

    积分

    二级逆天

    积分
    1280

    终身成就奖特殊贡献奖原创先锋奖优秀斑竹奖

    发表于 2020-9-22 08:08:49 | 显示全部楼层
    回复

    使用道具 举报

  • TA的每日心情

    8 小时前
  • 签到天数: 110 天

    [LV.6]常住居民II

    0

    主题

    3739

    回帖

    7558

    积分

    二级逆天

    积分
    7558

    终身成就奖特殊贡献奖原创先锋奖优秀斑竹奖

    发表于 2020-9-22 08:37:32 | 显示全部楼层
    回复

    使用道具 举报

  • TA的每日心情
    开心
    6 小时前
  • 签到天数: 137 天

    [LV.7]常住居民III

    6

    主题

    6780

    回帖

    1万

    积分

    三级逆天

    积分
    14291

    终身成就奖特殊贡献奖原创先锋奖

    发表于 2020-9-22 08:38:23 | 显示全部楼层
    回复

    使用道具 举报

    该用户从未签到

    61

    主题

    2233

    回帖

    50

    积分

    二级逆天

    积分
    50

    终身成就奖特殊贡献奖优秀斑竹奖

    发表于 2020-9-22 08:40:50 | 显示全部楼层
    回复

    使用道具 举报

  • TA的每日心情
    擦汗
    4 小时前
  • 签到天数: 148 天

    [LV.7]常住居民III

    1

    主题

    5392

    回帖

    7819

    积分

    二级逆天

    积分
    7819

    终身成就奖特殊贡献奖原创先锋奖优秀斑竹奖

    发表于 2020-9-22 08:45:01 | 显示全部楼层
    回复

    使用道具 举报

    该用户从未签到

    1

    主题

    4703

    回帖

    5

    积分

    二级逆天

    积分
    5

    终身成就奖特殊贡献奖原创先锋奖优秀斑竹奖

    发表于 2020-9-22 08:46:10 | 显示全部楼层
    回复

    使用道具 举报

  • TA的每日心情
    奋斗
    2024-5-28 15:00
  • 签到天数: 1 天

    [LV.1]初来乍到

    2

    主题

    342

    回帖

    704

    积分

    二级逆天

    积分
    704

    终身成就奖

    发表于 2020-9-22 08:55:33 | 显示全部楼层
    回复

    使用道具 举报

  • TA的每日心情
    开心
    前天 10:43
  • 签到天数: 20 天

    [LV.4]偶尔看看III

    0

    主题

    868

    回帖

    504

    积分

    二级逆天

    积分
    504

    终身成就奖

    发表于 2020-9-22 08:56:20 | 显示全部楼层
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    每日签到,有金币领取。


    Copyright ©2011-2024 NTpcb.com All Right Reserved.  Powered by Discuz! (NTpcb)

    本站信息均由会员发表,不代表NTpcb立场,如侵犯了您的权利请发帖投诉

    ( 闽ICP备2024076463号-1 ) 论坛技术支持QQ群171867948 ,论坛问题,充值问题请联系QQ1308068381

    平平安安
    TOP
    快速回复 返回顶部 返回列表