欢迎来到天天文库
浏览记录
ID:38584903
大小:41.00 KB
页数:9页
时间:2019-06-15
《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
此文档下载收益归作者所有