本文为HalUARTInitDMA()函数的解析。在Zigbee2007中,协议栈对串口的处理主要是通过DMA方式进行的,在协议栈中留有中断的接口,但是没有实现。但是在2006版本中是通过中断实现的。本函数说是串口的初始化,其实大部分是关于DMA的设置。关于串口波特率,校验位,停止位的设置在另外一个函数中:SerialApp_Init()->HalUARTOpen()->HalUARTOpenDMA()。有兴趣的话可以自己看一下。
在本函数的代码中,首先是UART0和UART0占用P0的优先级,UART0最优先。然后配置了UART的工作模式。禁用ADC等。然后是一大串的DMA初始化。串口接收和发送部分的DMA初始化大体相同,具体请看代码中注释。
/******************************************************************************
* @fn HalUARTInitDMA
*
* @brief Initialize the UART
*
* @param none
*
* @return none
*****************************************************************************/
static void HalUARTInitDMA(void)
{
halDMADesc_t *ch;
P2DIR &= ~P2DIR_PRIPO;
P2DIR |= HAL_UART_PRIPO;
#if (HAL_UART_DMA == 1)
PERCFG &= ~HAL_UART_PE