打印
[MCU]

想通过串口调试助手发送数据给MSP430

[复制链接]
382|28
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
dengdc|  楼主 | 2020-9-9 23:50 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
下面的程序可以让MSP430通过串口传输数据给PC,但我想通过串口调试助手发送数据给MSP430,并且在接收中断中改变430单片机的状态(如点亮Led灯,方便观测实验结果)。那么应该怎么写,请高手指教!


#include "msp430G2553.h"
#include "stdio.h"
unsigned char a[8];
void Init_uart0()
{
  UCA0CTL1|=UCSWRST;   //UCA0软件复位
  //UCA0CTL0&=~UC7BIT;//字符长度为8
  UCA0CTL1|=UCSSEL_2;//选择系统时钟:SMCLK
  UCA0BR0=0x6D;  //波特率为9600
  UCA0BR1=0;
  UCA0MCTL=0;//UCA0MCTL=UCBRS0;
  IE2=UCA0RXIE+UCA0TXIE;//开接收使能
  UCA0CTL1&=~UCSWRST;
  P1SEL|=BIT1+BIT2; //将P1.1 P1.2设为第二功能
  P1SEL2|=BIT1+BIT2;
}
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
  WDTCTL = WDTPW + WDTHOLD;
  BCSCTL1 = CALBC1_1MHZ;
  DCOCTL  = CALDCO_1MHZ;
  Init_uart0();
  _EINT();
  while(1)
  {
    Uart0Sends("ni hao");
    __delay_cycles (1048576);
  }
}
#pragma vector=USCIAB0RX_VECTOR
__interrupt void usart0_rx(void)
{
  while((IFG2&UCA0RXIFG)==0);
  //a=RXBUF0;
  //i++;
  a[0]=UCA0RXBUF;
}

使用特权

评论回复

相关帖子

沙发
jlyuan| | 2020-9-9 23:53 | 只看该作者
要在接收中断函数中编写led灯亮的函数就OK,

使用特权

评论回复
板凳
dengdc|  楼主 | 2020-9-9 23:57 | 只看该作者
我也改写过,但发现是进不了接收中断的问题

使用特权

评论回复
地板
dengdc|  楼主 | 2020-9-10 18:52 | 只看该作者
我也改写过,但发现是进不了接收中断的问题

使用特权

评论回复
5
jiahy| | 2020-9-10 18:56 | 只看该作者
改过后的程序看看

使用特权

评论回复
6
dengdc|  楼主 | 2020-9-10 18:59 | 只看该作者

#include "msp430G2553.h"
#include "stdio.h"
unsigned char a[8];

void Init_uart0()
{

  UCA0CTL1|=UCSWRST;   //UCA0软件复位
  //UCA0CTL0&=~UC7BIT;//字符长度为8
  UCA0CTL1|=UCSSEL_2;//选择系统时钟:SMCLK
  UCA0BR0=0x6D;  //波特率为9600
  UCA0BR1=0;
  UCA0MCTL=0;//UCA0MCTL=UCBRS0;
  IE2=UCA0RXIE+UCA0TXIE;//开接收使能
  UCA0CTL1&=~UCSWRST;
  P1SEL|=BIT1+BIT2; //将P1.1 P1.2设为第二功能
  P1SEL2|=BIT1+BIT2;
}
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
  WDTCTL = WDTPW + WDTHOLD;

  P1DIR = 0x41;   //LED 配置为输出
  P1OUT = 0x09;   //LED1输出高电平,选择为上拉方式
  P1REN = 0x08;   //使能上拉电阻

  P1OUT ^= 0x41;

  BCSCTL1 = CALBC1_1MHZ;
  DCOCTL  = CALDCO_1MHZ;
  Init_uart0();
  _EINT();

  while(1)
  {
  }
}
#pragma vector=USCIAB0RX_VECTOR
__interrupt void usart0_rx(void)
{
  _DINT();
  IFG2&=~UCA0RXIFG;
  a[0]=UCA0RXBUF;
  P1OUT ^= 0x41;
  _EINT();
}

使用特权

评论回复
7
jiaxw| | 2020-9-10 19:03 | 只看该作者
你试试改一下串口寄存器初始化的顺序。将中断使能放在UCA0CTL1&=~UCSWRST;的后面

使用特权

评论回复
8
dengdc|  楼主 | 2020-9-10 19:07 | 只看该作者
好的,多谢大家啊

使用特权

评论回复
9
guoyt| | 2020-9-10 19:10 | 只看该作者
直接在中断里面写入就行。

使用特权

评论回复
10
zhuww| | 2020-9-10 19:16 | 只看该作者

下面的程序可以让MSP430通过串口传输数据给PC,但我想通过串口调试助手发送数据给MSP430,并且在接收中断中改变430单片机的状态(如点亮Led灯,方便观测实验结果)。那么应该怎么写,请高手指教!


#include "msp430G2553.h"
#include "stdio.h"
unsigned char a[8];
void Init_uart0()
{
  UCA0CTL1|=UCSWRST;   //UCA0软件复位
  //UCA0CTL0&=~UC7BIT;//字符长度为8
  UCA0CTL1|=UCSSEL_2;//选择系统时钟:SMCLK
  UCA0BR0=0x6D;  //波特率为9600
  UCA0BR1=0;
  UCA0MCTL=0;//UCA0MCTL=UCBRS0;
  IE2=UCA0RXIE+UCA0TXIE;//开接收使能
  UCA0CTL1&=~UCSWRST;
  P1SEL|=BIT1+BIT2; //将P1.1 P1.2设为第二功能
  P1SEL2|=BIT1+BIT2;
}
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
  WDTCTL = WDTPW + WDTHOLD;
  BCSCTL1 = CALBC1_1MHZ;
  DCOCTL  = CALDCO_1MHZ;
  Init_uart0();
  _EINT();
  while(1)
  {
    Uart0Sends("ni hao");
    __delay_cycles (1048576);
  }
}
#pragma vector=USCIAB0RX_VECTOR
__interrupt void usart0_rx(void)
{
  while((IFG2&UCA0RXIFG)==0);
  //a=RXBUF0;
  //i++;
  a[0]=UCA0RXBUF;
}
这里直接添加就行

使用特权

评论回复
11
huanghuac| | 2020-9-10 19:19 | 只看该作者
楼主需要点亮什么灯呢

使用特权

评论回复
12
songqian17| | 2020-9-10 19:23 | 只看该作者
中断函数中编写led灯亮

使用特权

评论回复
13
stly| | 2020-9-10 19:26 | 只看该作者
串口中断不是有了吗

使用特权

评论回复
14
xxrs| | 2020-9-10 19:29 | 只看该作者
直接在中断函数里面写吧

使用特权

评论回复
15
xxrs| | 2020-9-10 19:36 | 只看该作者
这个很难吗

使用特权

评论回复
16
yinxiangh| | 2020-9-10 19:39 | 只看该作者
代码返回什么函数呢

使用特权

评论回复
17
morrisk| | 2020-9-10 19:42 | 只看该作者
__interrupt void usart0_rx(void)
{
  while((IFG2&UCA0RXIFG)==0); 点亮LED

使用特权

评论回复
18
guoyt| | 2020-9-10 19:46 | 只看该作者
在中断代码里面直接对LED进行取反操作的。

使用特权

评论回复
19
langgq| | 2020-9-10 19:49 | 只看该作者
看着还真是很复杂的

使用特权

评论回复
20
huanghuac| | 2020-9-10 19:54 | 只看该作者

或者使用标志位的。

使用特权

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

本版积分规则

892

主题

13885

帖子

7

粉丝