ZigBee学习之42—协议栈中的串口操作

ZigBee学习之42—协议栈中的串口操作

ID:38584903

大小:41.00 KB

页数:9页

时间:2019-06-15

ZigBee学习之42—协议栈中的串口操作_第1页
ZigBee学习之42—协议栈中的串口操作_第2页
ZigBee学习之42—协议栈中的串口操作_第3页
ZigBee学习之42—协议栈中的串口操作_第4页
ZigBee学习之42—协议栈中的串口操作_第5页
资源描述:

《ZigBee学习之42—协议栈中的串口操作》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库

1、#1楼主:【原创】ZigBee学习之42——协议栈中的串口操作文章发表于:2010-02-2713:27如果要使用协议栈中提供的串口,则需要定义HAL_UART和HAL_UARTTRUE【hal_board_cfg.h】。首先初始化串口,在主函数中调用HalDriverInit()时,在函数中初始化串口,主要是配置管脚和DMA通道。然后在osal_start_system()开始系统后,会调用Hal_ProcessPoll()来读取时间和串口,voidHal_ProcessPoll(){HalTimerTick();#if(definedHAL_UART

2、)&&(HAL_UART==TRUE)HalUARTPoll();#endif}//来看下串口poll函数,我们只看UART0的,因为我的开发板使用这个串口voidHalUARTPoll(void){#if(HAL_UART_0_ENABLE

3、HAL_UART_1_ENABLE)staticuint8tickShdw;uartCfg_t*cfg;uint8tick;#ifHAL_UART_0_ENABLE//当发生串口接收中断时cfg0就会改变,如果串口没有数据输入cfg0为空,当接收到数据时cfg0将在串口中断服务程序中被改变if(cfg0){cfg=

4、cfg0;}#endif//UsetheLSBofthesleeptimer(ST0mustbereadfirstanyway).//系统上电后,睡眠定时器就会自动启动做自增计数ST0:即睡眠定时器启动到现在计算值的最低8位tick=ST0-tickShdw;tickShdw=ST0;//要注意接下来的是个循环do{if(cfg->txTick>tick){cfg->txTick-=tick;}else{cfg->txTick=0;}if(cfg->rxTick>tick){cfg->rxTick-=tick;}else{cfg->rxTick=0;}/

5、/是使用DMA方式还是使用中断方式#ifHAL_UART_ISR#ifHAL_UART_DMAif(cfg->flag&UART_CFG_DMA){pollDMA(cfg);}else#endif{pollISR(cfg);//中断方式staticvoidpollISR(uartCfg_t*cfg){//如果串口没有接收到数据,也就是说没有发生过串口接收中断,那么cfg应为是为空的,则cnt=0//如果发生了串口中断,则cnt计算出串口缓存中还有多少数据没有读出,这个缓存并不是硬件寄存器的缓存,而是程序中开辟一段空间uint8cnt=UART_RX_AV

6、AIL(cfg);if(!(cfg->flag&UART_CFG_RXF)){//这里是针对流控制的,如果又有新的数据接收到了那么就要重置超时时间(超时时间由睡眠定时器来控制),而且需要把已经读出的数据数目减去!//Ifanythingreceived,resettheRxidletimer.if(cfg->rxCnt!=cnt){cfg->rxTick=HAL_UART_RX_IDLE;cfg->rxCnt=cnt;}/*ItisnecessarytostopRxflowinadvanceofafullRxbufferbecause*bytescank

7、eepcomingwhilesendingH/Wfifoflushes.*///当接收缓存超过安全界限的时候停止RX流if(cfg->rxCnt>=(cfg->rxMax-SAFE_RX_MIN)){RX_STOP_FLOW(cfg);}//关于安全界限,在程序中有下面一段:/*NeedtoleaveenoughoftheRxbufferfreetohandletheincomingbytes*afterassertingflowcontrol,butbeforethetransmitterhasobeyedit.*Atthemaxexpectedbau

8、drateof115.2k,16byteswillonlytake~1.3msecs,*butattheminexpectedbaudrateof38.4k,theycouldtake~4.2msecs.*SAFE_RX_MINandDMA_RX_DLYmustbothbeconsistentaccordingto*themin&maxexpectedbaudrate.*///如果声明了流控制,为保证数据的正确接收需要在RX缓存区中预留出足够的空间。CC2430可以使用的最大串口波特率为115.2k。这个安全界限的数字跟使用的波特率还有串口tick有关。

9、#if!defined(SAFE_RX_MIN)#defineSAFE_RX_M

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。