微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 无线和射频 > TI Zigbee设计交流 > 一个被CC2538 ZStack-MESH的UART折腾了三天的初学者的自白

一个被CC2538 ZStack-MESH的UART折腾了三天的初学者的自白

时间:10-02 整理:3721RD 点击:

各位大神好。

我是一个初学者,打算使用CC2538的ZStack-MESH协议栈开发产品。

作为初学者,首先想到的是使用串口打印个“hello world”什么的。

但是我却被折腾了三天还没搞出来。

或许是我水平烂,或许是我不够勤奋。

但TI的文档写的不明不白,代码写的莫名其妙绝对是其中的原因之一。

参考协议栈自带的SWRA193文档中的Uart Service,原以为在GenericApp.c中调用下HalUARTInit (),HalUARTOpen ()

然后再用HalUARTWrite ()函数就能够看到串口打印出信息。

但是并没有。

沉下心来仔细研究工程,原来还有一个叫MT的东西,这玩意是Monitor & Test用的。

作为初学者我并不想知道这是个什么鬼,但这里面用到了uart。

我觉得是我上面的调用顺序或者什么参数没有配置正确,所以想借鉴一下MT里面是如何调用uart的。

顺着代码看

在MT_uart.c的MT_UartInit函数中调用了HalUartOpen函数来打开Uart

继续追HalUartOpen函数

在hal_uart.c中,HalUartOpen函数调用了HalUARTOpenIsr函数来打开Uart

以下是该函数的代码

uint8 HalUARTOpenIsr(uint8 port, halUARTCfg_t *config)
{
if (uartRecord.configured)
{
HalUARTClose(port);
}

if (config->baudRate > HAL_UART_BR_115200)
{
return HAL_UART_BAUDRATE_ERROR;
}

if (((uartRecord.rx.pBuffer = osal_mem_alloc(config->rx.maxBufSize)) == NULL) ||
((uartRecord.tx.pBuffer = osal_mem_alloc(config->tx.maxBufSize)) == NULL))
{
if (uartRecord.rx.pBuffer != NULL)
{
osal_mem_free(uartRecord.rx.pBuffer);
uartRecord.rx.pBuffer = NULL;
}

return HAL_UART_MEM_FAIL;
}

if(config->flowControl)
{
IOCPinConfigPeriphOutput(GPIO_D_BASE, GPIO_PIN_3, IOC_MUX_OUT_SEL_UART1_RTS);
GPIOPinTypeUARTOutput(GPIO_D_BASE, GPIO_PIN_3);
IOCPinConfigPeriphInput(GPIO_B_BASE, GPIO_PIN_0, IOC_UARTCTS_UART1);
GPIOPinTypeUARTInput(GPIO_B_BASE, GPIO_PIN_0);
}

IntEnable(HAL_UART_INT_CTRL);

uartRecord.configured = TRUE;
uartRecord.baudRate = config->baudRate;
uartRecord.flowControl = config->flowControl;
uartRecord.flowControlThreshold = (config->flowControlThreshold > config->rx.maxBufSize) ? 0 :
config->flowControlThreshold;
uartRecord.idleTimeout = config->idleTimeout;
uartRecord.rx.maxBufSize = config->rx.maxBufSize;
uartRecord.tx.maxBufSize = config->tx.maxBufSize;
uartRecord.intEnable = config->intEnable;
uartRecord.callBackFunc = config->callBackFunc;

UARTConfigSetExpClk(HAL_UART_PORT, SysCtrlClockGet(), UBRRTable[uartRecord.baudRate],
(UART_CONFIG_WLEN_8 | UART_CONFIG_PAR_NONE | UART_CONFIG_STOP_ONE));

/* FIFO level set to 1/8th for both RX and TX which is 2 bytes */
UARTFIFOLevelSet(HAL_UART_PORT, UART_FIFO_TX1_8, UART_FIFO_RX1_8);
UARTFIFOEnable(HAL_UART_PORT);

/* Clear and enable UART TX, RX, CTS and Recieve Timeout interrupt */
UARTIntClear(HAL_UART_PORT, (UART_INT_RX | UART_INT_TX | UART_INT_CTS | UART_INT_RT ));
UARTIntEnable(HAL_UART_PORT, (UART_INT_RX | UART_INT_TX | UART_INT_CTS | UART_INT_RT ));

if(config->flowControl)
{
/* Enable hardware flow control by enabling CTS and RTS */
HWREG(HAL_UART_PORT + UART_O_CTL) |= (UART_CTL_CTSEN | UART_CTL_RTSEN );
}
UARTEnable(HAL_UART_PORT);

return HAL_UART_SUCCESS;
}

原以为给这个函数的port参数是用来指定打开某个串口的

但是函数实现里面port参数只出现了一次,就是HalUARTClose(port);

倒数第二个语句UARTEnable(HAL_UART_PORT);应该就是使能串口的,但是通过宏定义给了一个UART1_BASE常量。

也就是说,CC2538里面有两个串口,通过调用HAL的API uint8 HalUARTOpen ( uint8 port, halUARTCfg_t *config );只能打开特定的uart1。

这我TM就看不明白了

HalUARTOpen函数要port这个参数玩呢?

后来大概想明白了,HAL的UART API基本就是为了MT服务的,压根不是开放给我来调用的。

不知道是否有其他开发者也遇到了类似的情况,如果你们有相同的困惑,欢迎跟帖吐槽。

感谢分享! 

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top