嵌入式开发者社区

标题: 使用StarterWare软件包创建多个串口收发工程,Uart1、Uart2、Ua... [打印本页]

作者: wujianzhang    时间: 2017-1-19 22:28
标题: 使用StarterWare软件包创建多个串口收发工程,Uart1、Uart2、Ua...
本帖最后由 wujianzhang 于 2017-1-20 09:23 编辑

最近使用AM4379进行项目开发,基于StarterWare软件包进行裸机开发,参考了StarterWare中examples中的uart_echo实例,按照其中Uart0的相关配置,自己添加了Uart1、Uart2、Uart3,结果除了默认的UART0串口能够发送数据,也能够响应接收数据中断外,其余串口都不能向外发送数据,也无法响应数据接收中断。

对其余串口的配置方法都按照默认Uart0的配置方法,但就是不行。

请问哪位有关于StarterWare多串口的实例程序?如果有的话能否发给我一份?小弟不胜感激,在此谢过了!

我的邮箱:249065964@qq.com

另外,网上关于StarterWare的使用教程和资料真少啊!!!!!除了看StarterWare软件包中的源代码,真没有什么资料了。关于StarterWare如何使用,如何新建配置工程、如何生成BIN文件都没有相关资料。
作者: wujianzhang    时间: 2017-1-19 22:29
uart0 的 instnum 设置为了0

uart1 的 instnum 设置为了1

uart2 的 instnum 设置为了2

uart3 的 instnum 设置为了3

不太理解这个instnum起什么作用,不知道这样设置是否可以
作者: wujianzhang    时间: 2017-1-19 22:30
开发板采用的是创龙TL4379EVM

在uart_echo中进行了串口的添加

严格按照uart0的初始化方法对其他串口进行配置

依赖的starterware软件包中其他代码都没有修改

然后使用串口发送函数putchar进行发送

uart0能够发送数据

其他串口不能发送数据
作者: wujianzhang    时间: 2017-1-19 22:30
仅修改了starterware/examples/uart_echo中的串口配置
uart_echo依赖的其他工程都没有修改
其他串口严格按照uart0的配置方式
作者: wujianzhang    时间: 2017-1-19 22:36
请问如何添加附件呢?
想把我编写的uart工程添加上来
谢谢!

作者: human    时间: 2017-1-20 09:03
有个回形针一样的按钮的,就是添加附件!
作者: wujianzhang    时间: 2017-1-20 09:30
human 发表于 2017-1-20 09:03
有个回形针一样的按钮的,就是添加附件!

谢谢您!

附件中是我使用创龙TL437x开发板、基于StarterWare中的uart_echo创建的串口、定时器工程
定时器实现的是1ms定时器,在计数达到1s时,通过串口发送调试信息
其他串口都按照uart0方式进行配置,基本上是照葫芦画瓢
麻烦各位了!
谢谢!


作者: wujianzhang    时间: 2017-1-20 10:10
串口收发管脚的交叉、直连都试过了,还是不行
作者: vefone    时间: 2017-1-23 09:41
wujianzhang 发表于 2017-1-20 10:10
串口收发管脚的交叉、直连都试过了,还是不行

这部分设计的东西比较多,建议您这边把uart0涉及的每个结构体理解清楚。
主要涉及到的是pinmux,中断,dma。很有可能是某部分没有设置对,先一个个确认。



作者: wujianzhang    时间: 2017-1-23 10:12
vefone 发表于 2017-1-23 09:41
这部分设计的东西比较多,建议您这边把uart0涉及的每个结构体理解清楚。
主要涉及到的是pinmux,中断,dm ...

中断号配置肯定是正确的
这个我已经根据DataSheet重的Interrupt章节确认过了

先不说串口接收中断的问题
使用串口向外发送数据肯定不涉及中断吧?

问题是,现在使用串口向外发送数据都是失败的

关于pinmux我已经跟技术支持说过了
贵公司提供的配套光盘中是没有StarterWare默认的*.pinmux工程的
而StarterWare中的各个工程都是根据那个默认*.pinmux工程生成的.h文件进行配置的
我如果使用配套光盘中提供的pinmux软件进行配置,生成的.h配置文件与starterware中的配置不一致,将会导致工程编译出错
我所能想到的,就是拿到TI默认的那个*.pinmux工程,然后在它基础上添加UART1、UART2等串口,其他管脚复用保持原来的,以便保证工程能够编译通过
但是在网上又找不到TI官方默认的*.pinmux工程文件
作者: wujianzhang    时间: 2017-1-23 10:15
另外,关于DMA,uart_echo中的DMA是关闭的,与DMA应该是没有关系的
作者: wujianzhang    时间: 2017-1-23 10:20
static int32_t UartAppSocInfoGet(uartAppObj_t *pObj)
{
    uint32_t status = S_PASS;

    /*Is the given resource present?*/
    if(TRUE == CHIPDBIsResourcePresent(CHIPDB_MOD_ID_UART, pObj->instNum))
    {
            /* Get the base address of the Module */
        pObj->instAddr = CHIPDBBaseAddress(CHIPDB_MOD_ID_UART, pObj->instNum);

        /* Update the Interrupt Line number */
        if(SOC_FAMILY_ID_AM43XX == SOCGetSocFamilyId())
        {
                switch(pObj->instNum)
                {
                case 0:
                        pObj->uartAppCfg.uartAppIntrCfg.intrLine = 104U;
                        break;
                case 1:
                        pObj->uartAppCfg.uartAppIntrCfg.intrLine = 105U;
                        break;
                case 2:
                        pObj->uartAppCfg.uartAppIntrCfg.intrLine = 106U;
                        break;
                case 3:
                        pObj->uartAppCfg.uartAppIntrCfg.intrLine = 76U;
                        break;
                default:
                        break;
                }

            pObj->uartAppCfg.dmaCfg.dmaType                                =        DMA_TYPE_ENHACED;
            pObj->uartAppCfg.dmaCfg.rxEvtInfo.dmaType         =         DMA_TYPE_ENHACED;
            pObj->uartAppCfg.dmaCfg.rxEvtInfo.instNum         =         0U;
            pObj->uartAppCfg.dmaCfg.rxEvtInfo.evtToChMapType = DMA_UTILS_EVENT_MAP_TYPE_DIRECT;
            pObj->uartAppCfg.dmaCfg.rxEvtInfo.evtNum         =         26U;
            pObj->uartAppCfg.dmaCfg.rxEvtInfo.chNum         =         26U;
            pObj->uartAppCfg.dmaCfg.rxEvtInfo.xferIdx         =         26U;
            pObj->uartAppCfg.dmaCfg.txEvtInfo.instNum         =         0U;
            pObj->uartAppCfg.dmaCfg.txEvtInfo.evtToChMapType = DMA_UTILS_EVENT_MAP_TYPE_DIRECT;
            pObj->uartAppCfg.dmaCfg.txEvtInfo.evtNum         =         26U;
            pObj->uartAppCfg.dmaCfg.txEvtInfo.chNum         =         26U;
            pObj->uartAppCfg.dmaCfg.txEvtInfo.xferIdx         =         26U;
        }
        else
        {
            if (pObj->instNum == 0)
            {
                pObj->uartAppCfg.uartAppIntrCfg.intrLine        =         72U;

                pObj->uartAppCfg.dmaCfg.dmaType                         =         DMA_TYPE_ENHACED;
                pObj->uartAppCfg.dmaCfg.rxEvtInfo.dmaType         =         DMA_TYPE_ENHACED;
                pObj->uartAppCfg.dmaCfg.rxEvtInfo.instNum         =         0U;
                pObj->uartAppCfg.dmaCfg.rxEvtInfo.evtToChMapType = DMA_UTILS_EVENT_MAP_TYPE_DIRECT;
                pObj->uartAppCfg.dmaCfg.rxEvtInfo.evtNum         =         27U;
                pObj->uartAppCfg.dmaCfg.rxEvtInfo.chNum         =         27U;
                pObj->uartAppCfg.dmaCfg.rxEvtInfo.xferIdx         =         27U;
                pObj->uartAppCfg.dmaCfg.txEvtInfo.instNum         =         0U;
                pObj->uartAppCfg.dmaCfg.txEvtInfo.evtToChMapType = DMA_UTILS_EVENT_MAP_TYPE_DIRECT;
                pObj->uartAppCfg.dmaCfg.txEvtInfo.evtNum         =         26U;
                pObj->uartAppCfg.dmaCfg.txEvtInfo.chNum         =         26U;
                pObj->uartAppCfg.dmaCfg.txEvtInfo.xferIdx         =        26U;
            }
            else if (pObj->instNum == 5) /* ICE v1 */
            {
                pObj->uartAppCfg.uartAppIntrCfg.intrLine = 46U;
                /* TBD: DMA Channels to be configured through cross bar */
            }
            else if (pObj->instNum == 3) /* ICE v2 */
            {
                pObj->uartAppCfg.uartAppIntrCfg.intrLine = 44U;
                /* TBD MA Channels to be configured through cross bar */
            }
        }
    }
    else
    {
        status = E_FAIL;
    }

    return status;
}

作者: wujianzhang    时间: 2017-1-23 10:22
UartAppSocInfoGet()函数中的各个串口所对应的中断号,已经使用switch()语句进行了相应的设置了

switch(pObj->instNum)
                {
                case 0:
                        pObj->uartAppCfg.uartAppIntrCfg.intrLine = 104U;
                        break;
                case 1:
                        pObj->uartAppCfg.uartAppIntrCfg.intrLine = 105U;
                        break;
                case 2:
                        pObj->uartAppCfg.uartAppIntrCfg.intrLine = 106U;
                        break;
                case 3:
                        pObj->uartAppCfg.uartAppIntrCfg.intrLine = 76U;
                        break;
                default:
                        break;
                }
作者: wujianzhang    时间: 2017-1-23 10:31
关于您回复的第一个图中的设置项目

/* Initialize the Board */
status = BOARDInit(NULL);

/* Get board info */
status = UartAppBoardInfoGet(&g_ObjUart0);
if (S_PASS == status)
{
            /* Config Uart*/
            status=InitUartObject(&g_ObjUart0);
}

我也根据uart_echo中已经可以使用的uart0进行了相应的配置

如下所示:

/* Initialize the Board */
status = BOARDInit(NULL);

/* Initialize the UART console */
CONSOLEUtilsInit();

/* Select the console type based on compile time check */
CONSOLEUtilsSetType(CONSOLE_UTILS_TYPE_UART);

/* Get board info */
status = UartAppBoardInfoGet(&g_ObjUart0);
if (S_PASS == status)
{
            /* Config Uart*/
            status=InitUartObject(&g_ObjUart0);
}

status=InitUartObject(&g_ObjUart1);
status=InitUartObject(&g_ObjUart2);
status=InitUartObject(&g_ObjUart3);

作者: wujianzhang    时间: 2017-1-23 10:34
我查看了starterware中的pinmux生成的.h配置文件
发现只有关于uart0的pinmux配置

但是

没有拿到TI starterware默认的*.pinmux工程文件

我实在不知道如何进行UART1、UART2的管脚复用配置

使用自己创建的pinmux工程生成的.h配置文件,添加到Starterware中是编译不过去的
作者: wujianzhang    时间: 2017-1-23 10:37
所以,现在嫌疑最大的,有可能是关于UART1、UART2的pinmux配置不对



又不知道如何下手

麻烦您了,谢谢!!!!
作者: wujianzhang    时间: 2017-1-24 00:24
问题已经搞定……




欢迎光临 嵌入式开发者社区 (https://51ele.net/) Powered by Discuz! X3.4