大家好、
我正在使用 CCS Composer、我希望通过 UART 通信从 msp430FR5969与 ESP8266模块进行通信。 基本上、我想通过 USCI_A1中断向 ESP8266发送 AT 命令、以便获得答案(确定)、并使用 USCI_A0模块将其发送到 PC 上的串行监视器。
问题是代码永远不会进入 USCI_A1的中断、而只会进入 USCI_A0的中断。
//
//通过 UART 发送数据:尝试获取对 AT 的响应
//*********
//
#include
#include "driverlib.h"
#include "stdint.h"
#include
#include
#define RX_buffer_length 100
static volatile uint8_t RXbuffer[RX_buffer_length];
static volatile uint8_t RXbufferIDX;
#define RX_buffer_Length1 100
static volatile uint8_t RXbufferIDX1
;-----------
// UART 发送/解析字符串函数
//---------------------------------------------
//----------------------------------
// UART 接口
//--------------------------------------------------------
//USCI_A0
#define UART_TX_READY (UCA0IFG 和 UCTXIFG)
#define UART_RX_READY (UCA0IFG 和 UCRXIFG)
#define UART_TX_DONE (UCA0IFG 和 UCTXCPTIFG)
#define UART_RESET_TX_DONE (UCA0IFG &=~UCTXCPTIFG)
//USCI_A1
#define UART_TX_READY_1 (UCA1IFG 和 UCTXIFG)
#define UART_RX_READY_1 (UCA1IFG 和 UCRXIFG)
#define UART_TX_DONE_1 (UCA1IFG 和 UCTXCPTIFG)
#define UART_RESET_TX_DONE_1 (UCA1IFG &=~UCTXCPTIFG)
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
//--------------------------------
// USCI_A0的函数
//------------------------------
//使用 UART
静态 void send_char (char c)
{发送单个字符
//通过 UART 测试发送数据
while (!UART_TX_READY)
;
UCA0TXBUF = c;
while (!UART_TX_DONE)
;
UART_RESET_TX_DONE;
}
//使用 UART
静态 void send_str (char str[])
{发送字符串
while (*str !='\0')
{
send_char (* str);
STR++;
}
}
静态 void send_int (int n、int b)
{
静态字符数字[]="0123456789ABCDEF";
char buffer[5];
int i = 0、符号;
如果((符号= n)< 0)
{
N =-n;
}
操作
{
Buffer[i++]=数字[n % b];
}
while ((n /= b)>0);
如果(符号< 0)
{
Buffer[i++]='-';
}
while (--i >=0)
{
send_char (buffer[i]);
}
}
静态 void new_line()
{
send_char (0xD);
SEND_CHAR (0xA);
}
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
//--------------------------------
// USCI_A1的函数
//---------------------------------
静态空 send_char1 (char c)
{
//通过 UART 测试发送数据
while (!UART_TX_READY_1)
;
UCA1TXBUF = c;
while (!UART_TX_DONE_1)
;
UART_RESET_TX_DONE_1;
}
静态空 SEND_STF1 (char str[])
{
while (*str !='\0')
{
send_char1 (* str);
STR++;
}
}
静态 void send_int1 (int n、int b)
{
静态字符数字[]="0123456789ABCDEF";
char buffer[5];
int i = 0、符号;
如果((符号= n)< 0)
{
N =-n;
}
操作
{
Buffer[i++]=数字[n % b];
}
while ((n /= b)>0);
如果(符号< 0)
{
Buffer[i++]='-';
}
while (--i >=0)
{
send_char1 (buffer[i]);
}
}
静态 void new_line1()
{
SEND_CHAR1 (0xD);
SEND_CHAR1 (0xA);
}
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
//--------------------------------
// UART 初始化
//------------------
void init_uart_A0 (void)
{
// UART1端口
// 2.0:TX
// 2.1:RX
P2SEL1 |=(BIT0 | BIT1);
P2SEL0 &=~(BIT0 | BIT1);
//------------------------------------
// UART 的初始化
//-无奇偶校验
//- LSB 优先
//-一个停止位
//- 8位数据
//- UART 模式(异步)
//-使用 SMCLK 时钟(速率= 1MHz)
//-错误字符被拒绝
//-无中断字符中断
//-未处于休眠状态
//-软件复位被禁用
//-波特率:9600波特
//------------------------------------
UCA0CTLW0 = UCSWRST;//复位
UCA0CTLW0 = UCSSEL_SMCLK;
//设置波特率
UCA0BR0=6;
UCA0BR1 = 0x00;
UCA0MCTLW |= UCOS16 | UCBRF_8;
UCA0IE |= UCRXIE; //启用 USCI_A0 RX 中断
UCA0CTLW0 &=~UCSWRST;//取消复位
}
void init_UART_A1 (void)
{
// UART1端口
// 2.5:TX
// 2.6:RX
P2SEL1 |=(BIT5 | BIT6);
P2SEL0 &=~(BIT5 | BIT6);
UCA1CTLW0 = UCSWRST;//复位
UCA1CTLW0 |= UCSSEL_SMCLK;
//设置波特率
UCA1BR0=6;
UCA1BR1 = 0x00;
UCA1MCTLW |= UCOS16 | UCBRF_8;
UCA1IE |= UCRXIE; //启用 USCI_A1 RX 中断
UCA1IE |= UCTXIE; //启用 USCI_A1 TX 中断
UCA1CTLW0 &=~UCSWRST;//取消重置
}
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
//--------------------------------
//初始化时钟
//---------------------
静态空 init_clock (void)
{
//--------------------------------
//设置时钟
// MCLK 为1MHz,由 DCO 供源
// SMCLK 为1MHz,由用于 UART 通信的 DCO 供源
// ACLK 为32kHz,由 LFXT 供源,用于与传感器连接的 I2C 通信
//--------------------------------
CSCTL0_H = CSKEY >> 8;//解锁 CS 寄存器
CSCTL1 = DCOFSEL_0; //将 DCO 设置为8MHz
CSCTL2 = SELA_LFXTCLK | SELESS__DCOCLK | SELM_DCOCLK;//设置 ACLK = LFXT (32kHz)并且 MCLK = SMCLK = DCO。
CSCTL3 = DIVA__1 | DIVM_1 | DIVM__1;//所有分频器都设置为1
CSCTL0_H = 0x01;//锁定寄存
器}
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
///----------------------------------
// USCI_A0中断矢量处理例程。
///----------------------------------
#if defined (__TI_Compiler_version__)|| defined (__IAR_systems_icc_)
#pragma vector=USCI_A0_vector
__interrupt
#elif defined (__GNU__)
__attribute__(INTERRUPT (USCI_A0_Vector)))
#endif
void USCI_A0_ISR (void
)
开关(__evo_in_range (UCA0IV、USCI_UART_UCTXCPTIFG))
{
USCI_NONE 案例:
中断;
USCI_UART_UCRXIFG 案例:
RXbuffer[RXbufferIDX]= UCA0RXBUF;
RXbufferIDX =(RXbufferIDX + 1)% RX_buffer_length;
LPM3_EXIT;
中断;
USCI_UART_UCTXIFG 案例:
中断;
USCI_UART_UCSTTIFG 案例:
中断;
USCI_UART_UCTXCPTIFG 案例:
中断;
}
}
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
///----------------------------------
// USCI_A1中断矢量处理例程。
///----------------------------------
#if defined (__TI_Compiler_version__)|| defined (__IAR_systems_icc_)
#pragma vector=USCI_A1_vector
__interrupt
#elif defined (__GNU__)
__attribute__(INTERRUPT (USCI_A1_vector)))
#endif
void USCI_A1_ISR (void
)
//调试字符串、以了解中断是否正常工作
send_str ("Success USCI_A1_ISR");
new_line();
开关(__evo_in_range (UCA1IV、USCI_UART_UCTXCPTIFG))
{
USCI_NONE 案例:
中断;
USCI_UART_UCRXIFG 案例:
RXbuffer1[RXbufferIDX1]= UCA1RXBUF;
RXbufferIDX1 =(RXbufferIDX1 + 1)% RX_buffer_Length1;
send_str ("接收到的数据!");
send_int (RXbufferIDX、10);
new_line();
LPM3_EXIT;
中断;
USCI_UART_UCTXIFG 案例:
中断;
USCI_UART_UCSTTIFG 案例:
中断;
USCI_UART_UCTXCPTIFG 案例:
中断;
}
}
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
//main
void main (void)
{
volatile unsigned j;
WDTCTL = WDTPW | WDTHOLD;//停止看门狗计时器
PM5CTL0 &=~LOCKLPM5; // MSP430FR5969需要此功能!
init_clock();
init_uart_A0 ();
init_uart_a1();
_EINT();//全局启用中断。
while (1)
{
send_str ("begin");
new_line();
send_char1 ('a');
SEND_CHAR1 ("T");
new_line1();
send_str("at send");
new_line();
LPM3;
}
}
在这里、我们可以看到代码从未进入 USCI_A1中断。