发新帖我要提问
123
返回列表
打印

USCI模块例程

[复制链接]
楼主: zhanghqi
手机看帖
扫描二维码
随时随地手机跟帖
41
mmbs| | 2016-1-30 23:22 | 只看该作者 回帖奖励 |倒序浏览
#include "stdio.h"
void Init_uart0()
{
  UCA0CTL1|=UCSWRST;
  P1SEL|=BIT1+BIT2; //将P1.1 P1.2设为第二功能
  P1SEL2|=BIT1+BIT2;
  P1DIR  |= BIT2;           //P1.2  UART_TX
  P1DIR  &=~BIT1;           //P1.2  UART_RX
  UCA0CTL0&=~UC7BIT;//字符长度为8
  UCA0CTL1|=UCSSEL_2;//选择系统时钟
  UCA0BR0=0x68;  //波特率为9600
  UCA0BR1=0;
  UCA0MCTL=0X40;//UCA0MCTL=UCBRS0;
  UCA0CTL1&=~UCSWRST;
  
  IE2|=UCA0RXIE;//开接收使能
  
}
void Uart0Sends(char *s)
{
  while(*s!='\0')
  {
    UCA0TXBUF=*s;
    while((IFG2&UCA0TXIFG)==0); //查询发送是否结束
    IFG2&=~UCA0TXIFG; //清除发送一标志位
    s++;
  }
}
void main( )
{
  // Stop watchdog timer to prevent time out reset

  BCSCTL1 = CALBC1_1MHZ;     
  DCOCTL  = CALDCO_1MHZ;
  Init_uart0();
  WDTCTL = WDTPW + WDTHOLD;
  _EINT();
  Uart0Sends("hello  ");
   
}
#pragma vector=USCIAB0RX_VECTOR
__interrupt void usart0_rx(void)
{
  while((IFG2&UCA0RXIFG )==0);//接收一位然后给发送缓存器 再中断再接受 再发送的过程
  IFG2&=~UCA0RXIFG ;
// Uart0Sends("ok ");
  UCA0TXBUF=UCA0RXBUF;
}这个是成功了的,大家可以试试。

使用特权

评论回复
42
lzbf| | 2016-1-30 23:25 | 只看该作者
#include <msp430x14x.h>
unsigned char RecBuf[255]; //接收数据缓存
unsigned char *SDat;     //指向要发送的数据
unsigned char Rindex;      //接收数据计数
unsigned char Tindex;      //发送数据计数
unsigned char SendLen;     //发送数据长度


void ConfigUart0()
{
    P3SEL |= 0x30;                            // 选择P3.4和P3.5做UART通信端口
    ME1 |= UTXE0 + URXE0;                     // 使能USART0的发送和接受
    UCTL0 |= CHAR;                            // 选择8位字符
   
    UTCTL0 |= SSEL1;                          // UCLK = SMCLK
    UBR00 = 0xD0;                             // 波特率9600
    UBR10 = 0x00;                             //
    UMCTL0 = 0x40;                            // Modulation
    UCTL0 &= ~SWRST;                          // 初始化UART状态机
    IE1 |= URXIE0 + UTXIE0;                   // 使能USART0的收发中断   
}

void main(void)
{
    unsigned int i;
   
    WDTCTL = WDTPW + WDTHOLD;     // 关闭看门狗
    BCSCTL1 &= ~XT2OFF;           //使TX2有效,TX2上电默认是关闭的
    do
    {
      IFG1 &= ~OFIFG;             //清除振荡器失效标志
      for(i=0xff;i>0;i--);        //延时,待稳定
    }
    while((IFG1 & OFIFG)!=0);     //若振荡器失效标志有效
    BCSCTL2 |= SELM1;             //使MCLK=XT2
    BCSCTL2 |= SELS+DIVS1;        //SMCLK=XT2,4分频,即2MHZ
   
    BoardConfig(0xb8);            // 关闭数码管、流水灯和电平转换
    ConfigUart0();                //配置UART0
    _EINT();                      //打开全局中断
      
    while(1)
    {
        LPM1;
    }
}


#pragma vector = UART0RX_VECTOR
__interrupt void UART0_RXISR(void)
{
    RecBuf[Rindex++] = RXBUF0;
    if(RecBuf[Rindex-1]==0xfe) //接收完毕
    {
        SendLen = Rindex;
        Rindex=0;
        if(RecBuf[0]==0xfd) //帧头正确
        {
            LPM1_EXIT;
            SDat = RecBuf;
            IFG1 |= UTXIFG0; // 设置中断标志,进入发送中断程序
        }
    }
}

#pragma vector = UART0TX_VECTOR
__interrupt void UART0_TXISR(void)
{
      if(Tindex < SendLen)
      {
          TXBUF0 = *(SDat+Tindex);
          Tindex++;
      }
      else
      {
          Tindex=0;
          //LPM1;
      }
}

使用特权

评论回复
43
mmbs| | 2016-1-30 23:28 | 只看该作者
msp430f5438A的DMA在code比较少时一切正常,但是当code较大时,DMA死活不触发,怎么办

使用特权

评论回复
44
mmbs| | 2016-1-30 23:28 | 只看该作者
可以在仿真状态下,单步运行

使用特权

评论回复
45
pmp| | 2016-1-30 23:28 | 只看该作者
可以实时刷新数据,查看寄存器的值。

使用特权

评论回复
46
i1mcu| | 2016-1-30 23:29 | 只看该作者
MSP430F2616的DMA传输,根据触发方式的不同有多种模式,最简单的是Single Transfer

使用特权

评论回复
47
i1mcu| | 2016-1-30 23:29 | 只看该作者
MSP430的DMA源地址和目标地址可以为byte或者word类型,且可以设置递增、递减或者不变

使用特权

评论回复
48
mmbs| | 2016-1-30 23:29 | 只看该作者
DTC用在adc中,是转换结果传输控制的,也就是转换结果不需要CPU干涉。

使用特权

评论回复
49
pmp| | 2016-1-30 23:30 | 只看该作者
DMA用的范围广泛,实现将一个地方的数据转移到另一个地方

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则