ZigBee学习之42—协议栈中的串口操作_第1页
ZigBee学习之42—协议栈中的串口操作_第2页
ZigBee学习之42—协议栈中的串口操作_第3页
ZigBee学习之42—协议栈中的串口操作_第4页
ZigBee学习之42—协议栈中的串口操作_第5页
已阅读5页,还剩4页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

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

2、L_UART = TRUE) HalUARTPoll();#endif/来看下串口poll函数,我们只看UART0的,因为我的开发板使用这个串口void HalUARTPoll( void )#if ( HAL_UART_0_ENABLE | HAL_UART_1_ENABLE ) static uint8 tickShdw; uartCfg_t *cfg; uint8 tick; #if HAL_UART_0_ENABLE /当发生串口接收中断时cfg0就会改变,如果串口没有数据输入cfg0为空,当接收到数据时cfg0将在串口中断服务程序中被改变 if ( cfg0 ) cfg = cfg0

3、; #endif/ Use the LSB of the sleep timer (ST0 must be read first anyway)./系统上电后,睡眠定时器就会自动启动做自增计数ST0:即睡眠定时器启动到现在计算值的最低8位 tick = ST0 - tickShdw; tickShdw = ST0;/要注意接下来的是个循环 do if ( cfg->txTick > tick ) cfg->txTick -= tick; else cfg->txTick = 0; if ( cfg->rxTick > tick ) cfg->rxTic

4、k -= tick; else cfg->rxTick = 0; /是使用DMA方式还是使用中断方式#if HAL_UART_ISR#if HAL_UART_DMA if ( cfg->flag & UART_CFG_DMA ) pollDMA( cfg ); else#endif pollISR( cfg ); /中断方式static void pollISR( uartCfg_t *cfg )/如果串口没有接收到数据,也就是说没有发生过串口接收中断,那么cfg应为是为空的,则cnt=0/如果发生了串口中断,则cnt计算出串口缓存中还有多少数据没有读出,这个缓存并不是硬件

5、寄存器的缓存,而是程序中开辟一段空间 uint8 cnt = UART_RX_AVAIL( cfg ); if ( !(cfg->flag & UART_CFG_RXF) )/这里是针对流控制的,如果又有新的数据接收到了那么就要重置超时时间(超时时间由睡眠定时器来控制),而且需要把已经读出的数据数目减去! / If anything received, reset the Rx idle timer. if ( cfg->rxCnt != cnt ) cfg->rxTick = HAL_UART_RX_IDLE; cfg->rxCnt = cnt; /* It

6、is necessary to stop Rx flow in advance of a full Rx buffer because * bytes can keep coming while sending H/W fifo flushes. */ /当接收缓存超过安全界限的时候停止RX流 if ( cfg->rxCnt >= (cfg->rxMax - SAFE_RX_MIN) ) RX_STOP_FLOW( cfg );/关于安全界限,在程序中有下面一段:/* Need to leave enough of the Rx buffer free to handle t

7、he incoming bytes * after asserting flow control, but before the transmitter has obeyed it. * At the max expected baud rate of 115.2k, 16 bytes will only take 1.3 msecs, * but at the min expected baud rate of 38.4k, they could take 4.2 msecs. * SAFE_RX_MIN and DMA_RX_DLY must both be consistent acco

8、rding to * the min & max expected baud rate. */如果声明了流控制,为保证数据的正确接收需要在RX缓存区中预留出足够的空间。CC2430可以使用的最大串口波特率为115.2k。这个安全界限的数字跟使用的波特率还有串口tick有关。#if !defined( SAFE_RX_MIN ) #define SAFE_RX_MIN 48 / bytes - max expected per poll 115.2k / 16 bytes 38.4 kBaud -> 4.16 msecs -> 138 32-kHz ticks. #defin

9、e DMA_RX_DLY 140 / 2 bytes 38.4 kBaud -> 0.52 msecs -> 17 32-kHz ticks. #define DMA_TX_DLY 20#endif/超时计数利用的是睡眠定时器,而睡眠定时器是以32Khz时钟计数的,所以1微妙约为33个计数值(如果使用外部32.768KHz晶振) / The timeout tick is at 32-kHz, so multiply msecs by 33.#define RX_MSECS_TO_TICKS 33/超时时间设为传输一个字节的时间,之所以是6而不是8我觉得是排除掉串口协议中的停止位和

10、起始位的结果/ The timeout only supports 1 byte.#if !defined( HAL_UART_RX_IDLE ) #define HAL_UART_RX_IDLE (6 * RX_MSECS_TO_TICKS)#endif #elif HAL_UART_DMA pollDMA( cfg );#endif /* The following logic makes continuous callbacks on any eligible flag * until the condition corresponding to the flag is rectifie

11、d. * So even if new data is not received, continuous callbacks are made. */ if ( cfg->rxHead != cfg->rxTail ) /如果接收缓存中有数据,当接收数据时rxHead会增计数,当读取数据时rxTail会增计数,两个标志的初始值都为0,所以这两个标志的差值就指示了缓存中有多少的数据 uint8 evt; if ( cfg->rxHead >= (cfg->rxMax - SAFE_RX_MIN) ) /已保存的数据已经超过了安全界限,发送接收满事件 evt = HA

12、L_UART_RX_FULL; else if ( cfg->rxHigh && (cfg->rxHead >= cfg->rxHigh) ) evt = HAL_UART_RX_ABOUT_FULL; else if ( cfg->rxTick = 0 ) /超时事件 evt = HAL_UART_RX_TIMEOUT; else evt = 0; /如果发生事件,并且配置了回调函数则调用回调函数 if ( evt && cfg->rxCB ) cfg->rxCB( (cfg->flag & UART_CFG_U1F)!=0), evt );/(cfg->flag & UART_CFG_U1F)!=0)判读是那个串口,如果是串口1则为1,否则为0 /下面的没看懂,下面的判断好像是没有用一样,不管是哪个条件都break了! if ( cfg = cfg0 ) break; else break; while ( TRUE );#else return;#endif/在来看一下串口中断,就是将U0DBUF的数据存放到cfg0->rxBuf里面,并且更改rxHead标志HAL_ISR_FUNCTION( halUart0R

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论