各位大神好。
我是一个初学者,打算使用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服务的,压根不是开放给我来调用的。
不知道是否有其他开发者也遇到了类似的情况,如果你们有相同的困惑,欢迎跟帖吐槽。
VV:
感谢分享!