您的位置:首页 > 其它

zigbee z-stack 同时使用两个串口

2016-02-01 00:30 363 查看
       夜晚,写此篇博客,晚间调代码已经成为习惯,似乎只有进入黑夜,一切都安静下来,才能进入写代码的状态,耳机里循环放着《悟空》、《yesterday once more》,代码越写越多,思路也越来越清晰。好了,不矫情了,进入正题。

        如何在z-stack中同时使用两个串口,zstack较新的版本支持同时使用两个串行口,不过要求一个是DMA方式另一个是ISR方式,具体操作方法如下:

 1)找到workspace中项目名称,点击右键,在弹出的下拉菜单中点击options..c/c++compiler->preprocessor选项卡,找到define symbols: 查看是否有ZTOOL_P1,如果没有添加一个,OK确定。

 2)在IAR的编译选项中定义宏,HAL_DMA=TRUE,HAL_UART=TRUE,HAL_UART_DMA=1,HAL_UART_ISR=2。

具体操作:在HAL层,hal_board_cfg.h文件中修改

#if HAL_UART

#ifndef HAL_UART_DMA

#if HAL_DMA

#if (defined ZAPP_P2) || (defined ZTOOL_P2)
#define HAL_UART_DMA  1

#else

#define HAL_UART_DMA  1

#endif

#else

#define HAL_UART_DMA  0

#endif

#endif

#ifndef HAL_UART_ISR

#if HAL_UART_DMA           // Default preference for DMA over ISR.
#define HAL_UART_ISR  2

#elif (defined ZAPP_P2) || (defined ZTOOL_P2)

#define HAL_UART_ISR  2

#else

#define HAL_UART_ISR  1

#endif

#endif

 红色为修改的地方,总归的目的就是HAL_DMA=TRUE,HAL_UART=TRUE,HAL_UART_DMA=1,HAL_UART_ISR=2。具体实现方式有很多,上面我写的只是一种,如果你懂源代码的意思就很容易修改。注意我这种修改方法编译选项不能加ZTOOL_P2。

此处还有一个重要的修改,LCD会影响串口初始化。

#ifndef HAL_LCD

#define HAL_LCD FALSE

#endif

这儿修改过之后,hal_lcd.c可能出现编译错误一类的情况,请自行想办法解决,这是因为本身z-stack源代码缺陷造成的,相信你是可以解决的。

 3)在程序初始化时,HalUARTOpen()打开串行口。 

具体方法:除了正常的MT层void MT_UartInit ()函数以外,我另加加个一个初始化函数void MT_Uart1Init ()

void MT_Uart1Init ()

{

  halUARTCfg_t uartConfig;

  /* UART Configuration */

  uartConfig.configured           = TRUE;

  uartConfig.baudRate             = MT_UART_DEFAULT_BAUDRATE;

  uartConfig.flowControl          = MT_UART_DEFAULT_OVERFLOW;

  uartConfig.flowControlThreshold = MT_UART_DEFAULT_THRESHOLD;

  uartConfig.rx.maxBufSize        = MT_UART_DEFAULT_MAX_RX_BUFF;

  uartConfig.tx.maxBufSize        = MT_UART_DEFAULT_MAX_TX_BUFF;

  uartConfig.idleTimeout          = MT_UART_DEFAULT_IDLE_TIMEOUT;

  uartConfig.intEnable            = TRUE;

  uartConfig.callBackFunc         = MT_UartProcessZToolData;   //回调函数可以自己编写

 HalUARTOpen (HAL_UART_PORT_1, &uartConfig);

}

也就是说串口使用之前要调用这两个串口初始化函数,两个串口的初始化分别对应。

4)正常串行口读写。

 HalUARTWrite(HAL_UART_PORT_1,"Hello World\n",12); 

想自己区分回调函数,请参考http://blog.csdn.net/shiwaxinbin/article/details/9004256 的回调函数

5)关于硬件的说明,如果你去看cc2530的用户指南,你会发现

如果你深入研究z-stack的文件hal_uart_isr.c就能知道,上面设置的#define HAL_UART_DMA  1 实际上就是说用alt.1模式,也就是说UART0 的IO口是P0.2和P0.3,我们设置HAL_UART_ISR=2
,也就是说UART1用的是alt.2模式,即P1.6和P1.7。

历时两天才解决这个难题,走了不少弯路,不过很多也是因为基础不扎实的原因,以此向大家共享经验,如有错误,请见谅,联系我修改。转发请注明出处。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息