CC2540 ble1.4.1 uart dma 接收假死
使用ble1.4.1编写CC2540uart基于dma的通信程序时,串口接收正常一段时间后出现不再进入回调函数的现象,感觉像是串口DMA不再触发。但是此时的串口打印是好用,也就是说串口接收挂了发送没有问题,这让我很困惑。
IAR工程的宏配置如下:
IAR宏配置如下
INT_HEAP_LEN=3072
HALNODEBUG
OSAL_CBTIMER_NUM_TASKS=1
HAL_AES_DMA=TRUE
HAL_DMA=TRUE
xPOWER_SAVING
xPLUS_BROADCASTER
HAL_LCD=FALSE
HAL_LED=FALSE
HAL_KEY=FALSE
HAL_UART=TRUE
HAL_ADC=TRUE
HAL_UART_ISR=FALSE
HAL_UART_DMA=TRUE
串口初始化配置如下:
void serialInit( )
{
halUARTCfg_t uartConfig;
uartConfig.configured = TRUE;
uartConfig.baudRate = SBP_UART_BR;//波特率
uartConfig.flowControl = SBP_UART_FC;//流控制
uartConfig.flowControlThreshold = SBP_UART_FC_THRESHOLD;//流控制阈值
uartConfig.rx.maxBufSize = SBP_UART_RX_BUF_SIZE;//uart接收缓冲区大小
uartConfig.tx.maxBufSize = SBP_UART_TX_BUF_SIZE;//uart发送缓冲区大小
uartConfig.idleTimeout = SBP_UART_IDLE_TIMEOUT;
uartConfig.intEnable = SBP_UART_INT_ENABLE;//开启中断
uartConfig.callBackFunc = sbpSerialAppCallback;//uart接收回调函数,在该函数中读取可用uart数据
// start UART
// Note: Assumes no issue opening UART port.
(void)HalUARTOpen( SBP_UART_PORT, &uartConfig );
return;
}
回调函数如下:
void sbpSerialAppCallback(uint8 port, uint8 event)
{
uint8 *ptempBuf;
uint8 numBytes;
ptempBuf = tempBuf[Line];//指定信息存储地址
interface.led2 = 4;//调试用指示灯闪烁
if ( (numBytes = Hal_UART_RxBufLen(port)) > 0 )//返回串口缓存内可读的字节数
{
(void)HalUARTRead (port, pktBuffer, numBytes);
osal_memcpy(ptempBuf, pktBuffer, numBytes);//DMA拷贝至任务数据存储内存
}
}
你先在callback中直接回送串口收到的数据测试试试,注意你的pkBuffer要设大点,大于你最大可能收到的数据。
我这样侧过几百万次收发,没有问题。
if ( (numBytes = Hal_UART_RxBufLen(port)) > 0 )//返回串口缓存内可读的字节数
{
(void)HalUARTRead (port, pktBuffer, numBytes);
HalUARTWrite(port, pktBuffer, numBytes)
}