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

ZigBee学习之42——协议栈中的串口操作如果耍使用协议栈中提供的串口,则需耍眾义IIAL_UART和IIAL_UARTTRUE[haLboard_cfg.h]。首先初始化串口,在主函数中调用IlalDriverlnitO时,在函数中初始化串口,主要是配置筲脚和D\1A通道°然丿丘在osal_start_system()Jf始系统丿丘,会调用IlaLProcessPoll()來读取时间和串口,voidHal_ProcessPoll(){HalTimerTickO;#if(definedHAL_UART)&&(HALJJART二二TRUE)HalUARTPollO;Sendif}〃来看下串口poll函数,我们只看UARTO的,I大1为我的开发板使用这个串口voidHalUARTPolKvoid){#if(HAL_UART_O_ENABLE|HAL_UART_1_ENABLE)staticuintBtickShdw;uartCfg_t*cfg;uint8tick;#ifhal_lakt_o_enable//当发生串口接收中断时cfgO就会改变,如果串口没有数据输入cfgO为空,当接收到数据时cfgO将在串口中断服务程序中被改变if(cfgO){cfg=cfgO;}#endif//UsetheLSBofthesleeptimer(STOmustbereadfirstanyway).//系统上电后,睡眠圧时器就会口动启动做口增计数STO即睡眠左时器启动到现在计算值的最低8位tick=STO-tickShdw;tickShdw=STO;//耍注意接下來的是个循环do{辻(cfg->txTick>tick){cfg->txTick-=tick;}elsecfg->txTick二0;}if(cfg->rxTick>tick)---本文来源于网络,仅供参考,勿照抄,如有侵权请联系删除---{cfg->rxTick-二tick;}else{cfg->rxTick=0;}//是使用DMA方式还是使用中断方式#ifHAL_UART_ISR#ifUALUARTDMAif(cfg->flag&UARTCFGDMA){pollDMA(cfg);}else#endif{pollISR(cfg);〃中断方式staticvoidpollISR(uartCfg_t*cfg){〃如果串口没有接收到数据,也就是说没有发生过串口接收中断,那么cfg应为是为空的,则cnt=0〃如果发生了串口中断,则ent计算出串口缓存中还有多少数据没有读出,这个缓存并不是硬件寄存器的缓存,而是程序中开辟一段空间uintBent=UART_RX_AVAIL(cfg);if(!(cfg->flag&UART_CFG_RXF)){//这里是针对流控制的,如果又有新的数据接收到了那么就耍重置超时时间(超时时间由睡眠定时器来控制),而且需耍把已经读出的数据数目减去!//Ifanythingreceived,resettheRxidletimer.if(cfg~>rxCnt!=ent){cfg->rxTick=HAL_UART_RX」DLE;cfg->rxCnt=ent;/*ItisnecessarytostopRxflowinadvanceofafullRxbufferbecause*bytescankeepcomingwhilesendingII/Wfifoflushes.*/〃当接收缓存超过安全界限的时候停止RX流if(cfg->rxCnt>=(cfg->rxMax-SAFE_RX_MIN)){---本文来源于网络,仅供参考,勿照抄,如有侵权请联系删除---RX_STOP_FLOW(cfg);〃关于安全界限,在程序中有下面一段:/*NeedtoleaveenoughoftheRxbufferfreetohandletheincomingbytes*afterassertingflowcontrol,butbeforethetransmitterhasobeyedit.*Atthemaxexpectedbaudrateof115.2k,16byteswillonlytake~1.3msecs,*butattheminexpectedbaudrateof38.4k,theycouldtake~4.2msecs.*SAFE_RX_MINandDMA_RX_DLYmustbothbeconsistentaccordingto*themin&maxexpectedbaudrate.*/〃如果声明了流控制,为保证数据的止确接收需耍在RX缓存区中预留出足够的空间。CC2430可以使用的最大串口波特率为115.2k。这个安全界限的数字跟使用的波特率还有串口tick有关。#if!defined(SAFE_RX_MIN)#defineSAFE_RX_MIN18//bytes-maxexpectedperpoll@115.2k//16bytes@38.4kBaud->4.16msecs->13832-kHzticks.#defineDMA_RX_DLY140//2bytes@38.4kBaud->0.52msecs->1732~kHzticks.#defineDMA_TXJDLY20*endif〃超时计数利用的是睡眠立时器,而睡眠泄时器是以32Khz时钟计数的,所以1微妙约为33个计数值(如果使用外部32.768KHZ品振)//Thetimeouttickisat32-kHz,somultiplymsecsby33.#defineRX_MSECS_TO_TICKS33〃超时时间设为传输一个字节的时间,之所以是6而不是8我觉得是排除掉串口协议中的停」上位和起始位的结果//Thetimeoutonlysupports1byte.#if!defined(IIAL_UART_RX_IDLE)#defineHAL_UART_RX_IDLE(6*RX_MSECS_TO_TICKS)#endif#elifHALLARTDMApo11DMA(cfg);#endif/*Thefollowinglogicmakescontinuouscallbacksonanyeligibleflag*untiltheconditioncorrespondingtotheflag...

1、当您付费下载文档后,您只拥有了使用权限,并不意味着购买了版权,文档只能用于自身使用,不得用于其他商业用途(如 [转卖]进行直接盈利或[编辑后售卖]进行间接盈利)。
2、本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供参考,付费前请自行鉴别。
3、如文档内容存在侵犯商业秘密、侵犯著作权等,请点击“举报”。

常见问题具体如下:

1、问:已经付过费的文档可以多次下载吗?

      答:可以。登陆您已经付过费的账号,付过费的文档可以免费进行多次下载。

2、问:已经付过费的文档不知下载到什么地方去了?

     答:电脑端-浏览器下载列表里可以找到;手机端-文件管理或下载里可以找到。

            如以上两种方式都没有找到,请提供您的交易单号或截图及接收文档的邮箱等有效信息,发送到客服邮箱,客服经核实后,会将您已经付过费的文档即时发到您邮箱。

注:微信交易号是以“420000”开头的28位数字;

       支付宝交易号是以“2024XXXX”交易日期开头的28位数字。

客服邮箱:

biganzikefu@outlook.com

所有的文档都被视为“模板”,用于写作参考,下载前须认真查看,确认无误后再购买;

文档大部份都是可以预览的,笔杆子文库无法对文档的真实性、完整性、准确性以及专业性等问题提供审核和保证,请慎重购买;

文档的总页数、文档格式和文档大小以系统显示为准(内容中显示的页数不一定正确),网站客服只以系统显示的页数、文件格式、文档大小作为依据;

如果您还有什么不清楚的或需要我们协助,可以联系客服邮箱:

biganzikefu@outlook.com

常见问题具体如下:

1、问:已经付过费的文档可以多次下载吗?

      答:可以。登陆您已经付过费的账号,付过费的文档可以免费进行多次下载。

2、问:已经付过费的文档不知下载到什么地方去了?

     答:电脑端-浏览器下载列表里可以找到;手机端-文件管理或下载里可以找到。

            如以上两种方式都没有找到,请提供您的交易单号或截图及接收文档的邮箱等有效信息,发送到客服邮箱,客服经核实后,会将您已经付过费的文档即时发到您邮箱。

注:微信交易号是以“420000”开头的28位数字;

       支付宝交易号是以“2024XXXX”交易日期开头的28位数字。

笔杆子文秘
机构认证
内容提供者

为您提供优质文档,供您参考!

确认删除?