Z-STACK之cc2530串口驱动详解上

        Z-STACK中串口采用DMA和ISR两种方式,本章主要讲解ISR方式的串口驱动。在OASL操作系统轮询时调用了Hal_ProcessPoll ()函数,在此函数中如果定义了HAL_UART=TRUE,则轮询串口,看时候有数据要发送或有数据要接收。定位到HalUARTPoll()函数中,如果是采用ISR方式即HAL_UART_ISR为1或2时,调用ISR串口轮询函数HalUARTPollISR(),在这个函数中调用了串口的回调函数,这个过程等会儿讲。

       先来看看头文件hal_uart.h,此头文件中定义了typedef void (*halUARTCBack_t) (uint8 port, uint8 event);串口回调函数的函数指针,定义了串口缓冲区halUARTBufControl_t结构体以及针对串口配置的结构体halUARTCfg_t,halUARTIoctl_t结构体没用到不用管。其中还有相关的宏定义,这个根据datasheet看。

      接下来看_hal_uart_isr.c文件。HAL_UART_ISR_RX_AVAIL()这个宏定义是返回接收缓冲区中可接收数据的长度大小,HAL_UART_ISR_TX_AVAIL()这个宏定义返回发送缓冲区中空位置的长度大小。下面看看这个结构体


typedef struct
{
  uint8 rxBuf[HAL_UART_ISR_RX_MAX];
#if HAL_UART_ISR_RX_MAX < 256
  uint8 rxHead;
  volatile uint8 rxTail;
#else
  uint16 rxHead;
  volatile uint16 rxTail;
#endif
  uint8 rxTick;
  uint8 rxShdw;

  uint8 txBuf[HAL_UART_ISR_TX_MAX];
#if HAL_UART_ISR_TX_MAX < 256
  volatile uint8 txHead;
  uint8 txTail;
#else
  volatile uint16 txHead;
  uint16 txTail;
#endif
  uint8 txMT;

  halUARTCBack_t uartCB;
} uartISRCfg_t;

这个是串口ISR方式的发送和接收缓冲区结构体,里面具体成员的意义弄懂了,后面几个串口驱动函数就很好理解了。rxBuf指接收缓冲区,大小有不同的定义,rxHead指示接收缓冲区接收到的数据的首位置或首地址,rxTail指示接收缓冲区接收到的数据的末位置。rxTick这个成员表示串口经过rxtick时间之后开始发送数据。在轮询串口的时候,即在HalUARTPollISR()函数中会检查rxTick是否为0,如果为0,才调用串口的回调函数进行数据发送,如果不为0,说明还没有到发送数据的时间,得继续等待直到rxTick为0,这里对rxTick的计时是采用了cc2530的睡眠定时器,等会儿在后面会讲。rxShdw这个参数表示当前睡眠定时器的ST0,即睡眠定时器的count value的低八位。txBuf就是发送缓冲区,需要发送的数据都放在此缓冲区里面,一旦允许发送中断,就开始将发送缓冲区里面的数据发送出去。txHead

、txTail和rxHead、rxTail含义相同,txMT是指发送缓冲区满或者空的标志位。uartCB为串口的回调函数,具体内容由自己定义,在轮询中被调用。static uartISRCfg_t isrCfg;声明了一个静态变量isrCfg,此变量只在本源文件中起作用,是针对于ISR方式的串口配置变量。

 

       看看串

  • 4
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 7
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值