原创 TinyOS的UART模块分析

2007-1-3 23:28 5708 8 11 分类: MCU/ 嵌入式

一.Tinyos中的USART组件<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />


 


Tinyos中提供了配置USART模块的两个组件:


HPLUSART1M组件(位置:tinyos-1.x/tos./plarform/telosb/HPLUSART1M.nc


HPLUARTM组件(位置:tinyos-1.x/tos/platform/telosb/ HPLUARTM.nc)


(1). HPLUSART1M组件(位置:tinyos-1.x/tos./plarform/telosb/HPLUSART1M.nc


 HPLUART1M组件提供了对MSP430UART硬件模块的所有配置,是Tinyos中直接控制硬件的最底层组件,可以通过调用HPLUART1M提供的命令对UART所有寄存器进行设置,实现我们需要的功能。同时HPLUART1M通过自己提供的事件,把接受到的数据通知上层组件。HPLUART1M为上层组件提供了HPLUSARTControlHPLUSARTFeedback接口。


 在调试中我们使用的是UART 模式,用到的命令和事件有:


   TOSH_SIGNAL(UART1RX_VECTOR) {


    uint8_t temp = U1RXBUF;


    signal USARTData.rxDone(temp);       //接收中断


  }


 


  TOSH_SIGNAL(UART1TX_VECTOR) {          //发送中断


    signal USARTData.txDone();


  }


  async command bool USARTControl.isUART() //判断工作模式是UART


  async command bool USARTControl.isUARTtx()//发送模式


  async command bool USARTControl.isUARTrx() //接收模式


  async command msp430_usartmode_t USARTControl.getMode()//获取工作模式


  async command void USARTControl.setMode()//设置工作模式


  async command void USARTControl.enableUART()//使能UART


  async command void USARTControl.disableUART()//关闭UART


  async command void USARTControl.enableUARTTx()//使能UART的发送状态


  async command void USARTControl.disableUARTTx()//关闭UART的发送状态


  async command void USARTControl.enableUARTRx()//使能UART的接收状态


  async command void USARTControl.disableUARTRx()//关闭UART的接收状


  async command void USARTControl.setModeUART_TX()//设置发送工作模式


  async command void USARTControl.setModeUART_RX()//设置接收工作模式


  async command void USARTControl.setModeUART()//设置UART工作模式


  async command void USARTControl.setClockSource()//设置时钟源


  async command void USARTControl.setClockRate()//设置波特率


  async command result_t USARTControl.disableRxIntr()//禁止接收中断


  async command result_t USARTControl.disableTxIntr()//禁止发送中断


  async command result_t USARTControl.enableRxIntr()//使能接收中断


  async command result_t USARTControl.enableTxIntr()//使能发送中断


  async command result_t USARTControl.tx()//发送数据


  async command uint8_t USARTControl.rx()//接收数据


  default async event result_t USARTData.txDone()//发送完成,上层组件实现


  default async event result_t USARTData.rxDone()//接收完成,向上层传递数据


(2).HPLUARTM组件(位置:tinyos-1.x/tos/platform/telosb/ HPLUARTM.nc)


   HPLUSARTM组件是HPLUART1M的上层组件,通过HPLUART1M提供的HPLUSARTControlHPLUSARTFeedback接口,调用HPLUART1M的命令实现对硬件的控制。同时也为实际的Tinyos应用程序提供了HPLUART接口。


   async command result_t UART.init() {             //初始化


    call USARTControl.setModeUART();                //设置UART模式 


    call USARTControl.setClockSource(SSEL_ACLK);    //时钟源为ACK


    call USARTControl.setClockRate(UBR_ACLK_57600, UMCTL_ACLK_57600);//波特率57600   


    call USARTControl.enableRxIntr();


    call USARTControl.enableTxIntr();              //使能中断


    return SUCCESS;


  }


 


  async command result_t UART.stop() {


    call USARTControl.disableRxIntr();


call USARTControl.disableTxIntr();         //禁止中断


call USARTControl.disableUART();           //禁止UART,可以工作在低功耗模式


    return SUCCESS;


  }


 


  async event result_t USARTData.rxDone(uint8_t b) {  //实现HPLUART1M中的事件,获得数据传给b


    return signal UART.get(b);                        //通知UART.get()


  }


 


  async event result_t USARTData.txDone() {          


    return signal UART.putDone();


  }


 


  async command result_t UART.put(uint8_t data){     //发送数据


    return call USARTControl.tx(data);               //调用HPLUART1M中的发送命令,把data发送出去


  }


  //应用组件实现,获得数据data


  default async event result_t UART.get(uint8_t data) { return SUCCESS; }


 


  default async event result_t UART.putDone() { return SUCCESS; }


}


(3)工作流程


   数据接收:串口接收到数据,产生中断TOSH_SIGNAL(UART1RX_VECTOR),读接收缓存中的数据temp = U1RXBUF,通知signal USARTData.rxDone(temp),在HPLUART中实现事件USARTData.rxDone(),通知signal UART.get(b)bdata,在应用程序中实现UART.get(),处理数据。


   数据发送:发送数据,产生中断TOSH_SIGNAL(UART1TX_VECTOR),通知signal USARTData.txDone(),在HPLUART中实现事件USARTData.txDone(),通知UART.putDone(),在应用程序中实现UART.putDone(),处理发送事件。

文章评论3条评论)

登录后参与讨论

用户152621 2008-7-14 11:31

你好,你说的我都明白。我想知道,我需要使用UART0和Radio,我需要从UART0获取数据,再用Radio发出去,这里面存在一个冲突问题,需要用仲裁来解决一下,从USARTControl接口来看,里面有一个rx命令,应该是读取接收数据缓冲区用的。然后再HPLUSARTFeedback接口中有rxDone()事件的发生,我想问一下,从申请资源一直到释放资源的过程是个怎么样的?我要用UART0是不是得先申请资源,然后申请成功后,我再要初始化UART0,然后设置成rx允许中断才可以接收到数据?是不是初始化UART0后,如果总线上来数据了,会自然触发rxDone()?然后再释放资源,然后再调用Radio发送数据(例如广播)?我编写的程序老是存在冲突。可以实现向UART0写数据同时也广播出去,但是读数据还没有实现。对它的事件触发机制还是不太清楚,忘指点。

用户76469 2007-4-19 12:31

你好!

我遇到了一个问题,可以向你请教一下吗?

我在下载Blink 时遇到了这样的问题:下载程序后灯不闪!


 

经过对app.c的分析,发现main()函数走不到Timer.fired(),而且奇怪的是我测试Leds.redToggle()函数时,灯居然不会灭(在原来是亮的情况下)。


 

opt\tinyos-1.x\tos\system下的LedsC.nc中的函数我作了下面的改动:


 

async command result_t Leds.redOn() {
    dbg(DBG_LED, "LEDS: Red on.\n");
    atomic {
      TOSH_SET_RED_LED_PIN();//原来是TOSH_CLR_RED_LED_PIN();
      ledsOn |= RED_BIT;
    }
    return SUCCESS;
  }


 

不知道是板子问题还是系统的问题。


 

欢迎大家跟我交流,我的邮箱是:qinkangping@amoi.com.cn

用户1177906 2007-1-27 23:07

关于core方面有什么具体的问题吗?可以交流一下,我不懂的可以帮你问问我们组别的人。
相关推荐阅读
用户1177906 2007-10-27 21:07
又一篇
最近都在忙自己的课题和毕业的事,好久好久都没有管理自己的blog了。大家提的问题都没有回复真是抱歉。以后有什么需要一起交流的东西,可以给我发邮件。邮件地址:leiyang1983@163.com....
用户1177906 2007-04-22 14:42
回复
你的板子是什么板子?买的现成的节点,还是自己的板子?编译Blink时用的是什么平台?好像每个平台下,三个LED灯的管脚部太一样。可以看看各个平台下对应的hardware。h文件,看看灯的管脚是哪个?如...
用户1177906 2007-03-26 13:46
新年第一篇
新学期刚开始事情比较多,最近又忙于开题,好久都没有写了。好多网友提出的问题也没有解答,很是抱歉。以后会经常写写,尽力回答大家提出的问题。多和大家交流...
用户1177906 2007-02-10 16:31
安装包
在Windows下的安装包下载地址:http://www.tinyos.net/dist-1.1.0/tinyos/windows/。下载tinyos-1.1.11-3is.exe.这个安装包是cyg...
用户1177906 2007-01-30 12:38
tinyos核心
tinyos核心其实就是system文件夹下的sched.c文件。这个文件规定了tinyos中任务的执行流程。system文件夹下的其它文件就是tinyos基本构成。...
用户1177906 2007-01-27 22:59
TinyOS代码
最近比较忙,一直在用TOSSIM做仿真。很久都没有写了。刚看到一条求助。就谈谈自己入门的一点点经验。    首先得看看tinyos的tutorial,前几个lesson得仔细的看,这样会对tinyos...
我要评论
3
8
关闭 站长推荐上一条 /2 下一条