官方已经将驱动写好了,只需要简单的添加就可以了。
下面简单的说一下修改哪些:
1、 编写了一个函数
#include "hal_uart.h"
#include "npi.h"
#define uint8_t unsigned char
static void npi_serial_call_back(uint8_t port,uint8_t events)
{
(void)port;
if (events & (HAL_UART_RX_TIMEOUT | HAL_UART_RX_FULL))
{
uint8_t num_bytes=0;
num_bytes = NPI_RxBufLen();
if ( 0 == num_bytes )
{
return;
}
else
{
uint8_t *buffer = osal_mem_alloc(num_bytes);
if (buffer)
{
NPI_ReadTransport(buffer,num_bytes);
NPI_WriteTransport(buffer,num_bytes);
osal_mem_free(buffer);
}
}
}
}
2、 添加初始化函数,同时通过串口打印SimpleBLETest_Init\r\n
3、 配置串口
4、 将流控关闭
//========================================================
简单的分析一下代码:
1、串口数据哪里来?
1.1、Hal_ProcessPoll查询
1.2、HalUARTPoll
1.3、回调刚刚我们写的函数npi_serial_call_back
static void HalUARTPollDMA(void)
{
uint8 evt = 0;
uint16 cnt;
if (!HAL_UART_DMA_NEW_RX_BYTE(dmaCfg.rxHead))
{
if (HAL_UART_DMA_NEW_RX_BYTE(uartRxBug))
{
do {
HAL_UART_RX_IDX_T_INCR(dmaCfg.rxHead);
} while (!HAL_UART_DMA_NEW_RX_BYTE(dmaCfg.rxHead));
uartRxBug = dmaCfg.rxHead;
dmaCfg.rxTail = dmaCfg.rxHead;
}
HAL_UART_RX_IDX_T_INCR(uartRxBug);
}
cnt = HalUARTRxAvailDMA(); // Wait to call until after the above DMA Rx bug work-around.
if (cnt != 0)
{
evt = HAL_UART_RX_TIMEOUT;
}
if (cnt >= HAL_UART_DMA_FULL)
{
evt |= HAL_UART_RX_FULL;
}
else if (cnt >= HAL_UART_DMA_HIGH)
{
evt |= HAL_UART_RX_ABOUT_FULL;
if (!DMA_PM && (UxUCR & UCR_FLOW))
{
HAL_UART_DMA_CLR_RDY_OUT(); // Disable Rx flow.
}
}
if (dmaCfg.txMT)
{
dmaCfg.txMT = FALSE;
evt |= HAL_UART_TX_EMPTY;
}
if ((evt != 0) && (dmaCfg.uartCB != NULL))
{
dmaCfg.uartCB(HAL_UART_DMA-1, evt);//回调刚刚我们写的函数npi_serial_call_back
}
if (DMA_PM && (dmaRdyDly == 0) && !HalUARTBusyDMA())
{
HAL_UART_DMA_CLR_RDY_OUT();
}
}
1.4、 在回调函数获取串口数据,然后回显。