协议栈串口的 DMA 模式
以下修改皆基于 ZStack-CC2530-2.3.0-1.4.0 版本:
1. 串口的初始化
根据底板的引脚分配,我们用的是串口的 UART0 的 Alt2 方式。需要修改的地方:
(1) 将 opon 里预编译选项,ZTOOL_P1 改成 ZTOOL_P2,使#dene HAL_UART_DMA 2 为真。
(2) _hal_uart_dma.c 的 HalUARTInitDMA 函数是对 UART 引脚以及寄存器的操作,修改如下:
在 HAL_UART_DMA == 2 情况下的
//#dene HAL_UART_Px_RTS 0x20 // Peripheral I/O Select for RTS.
//#dene HAL_UART_Px_CTS 0x10 // Peripheral I/O Select for CTS.
//屏蔽上两句,是因为该底板没有分配 RTS 和 CTS 的引脚
#dene HAL_UART_PERCFG_BIT 0x01 // USART0 on P1, Alt-2; so set this bit.
//这里是将串口设置为 UART0 的 Alt2 方式
#dene HAL_UART_Px_RX_TX 0x30 // Peripheral I/O Select for Rx/Tx.
//此处设置 RX,TX 引脚为 P1_4,P1_5
(3) 在 osal_init_system 里 osalInitTasks 下 MT_TaskInit 的 MT_UartInit(),是对串口的配置
但要将 uartCong.<owControl = MT_UART_DEFAULT_OVERFLOW;改为
uartCong.<owControl = FALSE;协议栈默认的流控制是 TRUE。
2. 串口的事件处理
//系统主循环
void osal_start_system( void )
{
……
Hal_ProcessPoll(); // 串口与定时器轮询函数
……
}
//定时器与串口轮询函数
void Hal_ProcessPoll ()
{
…….
#if (defined HAL_UART) && (HAL_UART == TRUE)
HalUARTPoll();
#endif
……
}
//串口轮询函数
void HalUARTPoll( void )
{
#if HAL_UART_DMA
HalUARTPollDMA();//根据 DMA 的方式选择 DMA 的轮询方式
#endif
……
}
//DMA 串口轮询函数
评论10