zigbee UART 中断方式.docx

  1. 1、本文档共5页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
zigbee UART 中断方式

如上图为串口的接收和发送缓冲区数据结构图,它是循环数组,等游标到达数组末尾时变为0,即数组头。在中断方式串口传输数据时,当有数据通过串口传到本地时,接收到的数据由接收中断处理函数填充到rxBuf缓冲区中,填充的游标是rxTail,我们应用程序使用这些数据时是通过rxHead游标读取的。同样,发送时我们是将数据填充到txBuf中,填充的游标是txTail,填充完成后(因为在初始化函数中已经设置发送标志位,但是在写串口函数中才使能发送)由串口发送中断发送数据,发送游标是txHead,发送完成即txHead == txTail后设置txMT标志位(看下文在uartISRCfg_t结构体中)static void HalUARTInitISR(void)串口初始化函数。主要是配置串口的优先级选择(例如在相同的管脚上如果同时有UART0、UART1、定时器,应该优先将管脚配给谁),选择UART的备用位置(因为每个串口都有两组备用位置,此设置是为了确定串口的管脚位置),把相应的管脚设为外设I/O而不是GPIO,设置为UART模式而不是SPI模式,清除(flush)串口(即初始化串口为使用前的状态)static void HalUARTOpenISR(halUARTCfg_t *config)串口打开函数,其实是串口的进一步初始化函数。typedefstruct{? bool configured;? uint8baudRate;? boolflowControl;? uint16flowControlThreshold;? uint8idleTimeout;? halUARTBufControl_trx;? halUARTBufControl_ttx;? boolintEnable;? uint32rxChRvdTime;? halUARTCBack_tcallBackFunc;}halUARTCfg_t;首先设置串口的回调函数,然后根据给定的参数配置串口波特率、8/9位数据位、有无奇偶校验、停止位等串口相关的参数;若使能硬件流控制,将相应的RTS和CTS管脚也设为外设管脚而不是GPIO;最后接收器使能(UxCSR |= CSR_RE;注意顺序,必须配置完串口其他参数后才能使能),配置接收器中断使能位(URXxIE = 1),设置发送标志位(UTXxIF = 1;)(不知为何)uint16HalUARTReadISR(uint8 *buf, uint16 len)串口读函数。本函数用到isrCfg变量,其结构体类型为typedefstruct{? uint8rxBuf[HAL_UART_ISR_RX_MAX];? uint8rxHead;? volatile uint8 rxTail;? uint8rxTick;? uint8rxShdw;? uint8txBuf[HAL_UART_ISR_TX_MAX];? volatile uint8 txHead;? uint8txTail;? uint8txMT;? halUARTCBack_tuartCB;} uartISRCfg_t;其中rxBuf和txBuf分别为串口的接收和发送缓冲区,rxHead和txHead分别为接收和发送缓冲区的头索引,rxTail和txTail是尾索引,rxTick和rxShdw用于串口接收数据是否超时的判断(很明显,当接收数据时,如果两个字符之间的传输间隔超过一定时间,zstack就认为此次传输已经结束并设置接收超时标志交由上层处理),txMT是发送完成的标志(换句话说就是串口实际将数据都发送出去之后这是此标志),uartCB是回调函数。此函数被调用的前提肯定是rxBuf中有数据接收到,只要rxHead != rxTail,就说明rxBuf中有数据,就从rxHead 索引处开始将数据从rxBuf中复制到此函数的第一个参数buf中,同时rxHead 相应的变化,函数的返回值是真实读出的字节个数。其实是Poll轮询的时候检测到接收到数据,然后调用回调函数作进一步处理,具体看下文的HalUARTPollISR()uint16HalUARTWriteISR(uint8 *buf, uint16 len)串口写函数。功能是将从buf开始的len个字节发送出去。首先判断txBuf还能接收多少字节,如果len大于txBuf还能发送的字节数,返回0,说明此次发送失败。然后将要发送的字节添加到txBuf的txTail开始的缓冲区中。使能发送中断,函数返回真实发送的字节数。static void HalUARTPollISR(void)串口轮询函数,此函数最终被Hal_ProcessPoll()调用,而它在void osal_start_system( void )大循环中被调用。它

文档评论(0)

yan698698 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档