工具/软件:Code Composer Studio
我正在尝试为 MSP430FR2433建立 UART 通信通道(引脚4和引脚5)。 我找到了该示例代码、并想先尝试一下。 出于某种原因、我在串行终端上获得损坏的数据。 我将波特率配置为115200。 我在 TI 的另一个示例代码上尝试过相同的硬件、但运行正常。 请帮助!
//=========== 头文件包括========================================================================================================
#include
#include
#include
#include
#include
//=========== 常量=========================================================================
#define CR 13
#define LF 10.
#define UART_TIMEOUT 9876
//=========== 全局变量===================================================
char Rx_data;
char debug_string [123];
uint64_t seconds = 0;
//=========== 函数原型===================================================================
void UART_init (void);
bool UART_SEND_DEBUG_string (char []);
bool UART_SEND_byte (char);
void init_rtc (void);
//=========== 函数定义===========================================
/*
*@简述这是主函数
*@param 无
*@返回无
*
void main (void)
{
WDTCTL = WDTPW | WDTHOLD;//停止看门狗计时器
init_rtc();
UART_INIT();
//禁用 GPIO 上电默认高阻抗模式
//激活先前配置的端口设置
PM5CTL0 &=~LOCKLPM5;
_ENABLE_INTERRUPT ();//启用所有中断--> GIE = 1 (高电平)
UART_SEND_DEBUG_STRING ("Hello World");
while (1)
{
}
}
// UCA0 UART ISR
#pragma vector=USCI_A0_Vector
_interrupt void USCI_A0_ISR (void)
{
switch (__evo_in_range (UCA0IV、USCI_UART_UCTXCPTIFG))
{
USCI_NONE 案例:
中断;
USCI_UART_UCRXIFG 案例:
UCA0IFG &=~ UCRXIFG;//清除中断
RX_DATA = UCA0RXBUF;//存储缓冲区
//sprintf (debug_string、"received:%c"、Rx_data);
UART_SEND_DEBUG_STRING (DEBUG_STRING);
UCA0TXBUF ='Q';
中断;
USCI_UART_UCTXIFG 案例:
中断;
USCI_UART_UCSTTIFG 案例:
中断;
USCI_UART_UCTXCPTIFG 案例:
中断;
}
}
//结束 UCA0 UART ISR
秘书长的报告
// RTC 中断服务例程
#pragma vector=RTC_vector
_interrupt void RTC_ISR (void)
{
开关(__evo_in_range (RTCIV、RTCIV_RTCIF))
{
案例 RTCIV_NONE:
中断;//无中断
案例 RTCIV_RTCIF:// RTC 溢出
P1OUT ^= BIT0;//闪烁 P1.0
秒++;
//sprintf (debug_string、"seconds:%llu"、seconds);
UART_SEND_DEBUG_STRING (DEBUG_STRING);
中断;
默认值:
中断;
}
}
//结束 RTC 中断服务例程
秘书长的报告
/*
*@简要初始化 USCI A0 UART 通信
*@param 无
*@返回无
*
void UART_init (void)
{
//配置 UART 引脚
P1SEL0 |= BIT4 | BIT5;//将2个 UART 引脚设置为第二功能
//配置 UART
UCA0CTLW0 |= UCSWRST;//将 eUSCI 置于复位状态
UCA0CTLW0 |= UCSSEL_SMCLK;//选择 SMCLK 作为时钟源
//使用 SMCLK (1MHz)计算115200的波特率
// 1000000/115200 = 8.68
// 1000000/115200 - INT (1000000/115200)=0.68
// UCBRSx 值= 0xD6 (请参阅 UG)
UCA0BR0 = 8;
UCA0MCTLW = 0xD600;
UCA0BR1=0;
UCA0CTLW0 &=~UCSWRST;//初始化 eUSCI
UCA0IE |= UCRXIE;//启用 USCI_A0 RX 中断
}
//结束 UART_init
秘书长的报告
/*
*@将此函数简短地通过 USCI A0 UART 发送给定的字节
*@param[in] data -要发送的字符字节
*@返回 true 成功,如果失败则返回 false
*
bool UART_SEND_byte (字符数据)
{
uint16_t UART_TIMEOUT = UART_TIMEOUT;//加载超时值
while ((!(UCA0IFG & UCTXIFG))&&(UART_TIMEOUT>0))
{
UART_TIMEOUT--;//等待 TX 中断挂起
}
if (UART_TIMEOUT = 0)
{
返回 false;//如果超时则返回失败
}
UCA0TXBUF =数据;
UCA0TXBUF ='R';
UART_TIMEOUT = UART_TIMEOUT;//再次加载超时值
while ((!(UCA0IFG & UCTXIFG))&&(UART_TIMEOUT>0))
{
UART_TIMEOUT--;//等待 TX 中断挂起
}
if (UART_TIMEOUT = 0)
{
返回 false;//如果超时则返回失败
}
返回 true;//否则返回成功
}
//结束 UART_SEND_BYTE
秘书长的报告
/*
*@简要介绍此函数通过 USCI A0 UART 发送给定的字符串
*@param array char array to send
*@返回 true 成功,如果失败则返回 false
*
bool UART_SEND_DEBUG_string (字符阵列[])
{
uint16_t size = strlen (array);
uint16_t 索引= 0;
for (index=0;<size; index++))
{
if (!UART_SEND_BYTE (array[索引])//逐一发送字符
{
返回 false;
}
}
if (!UART_SEND_BYTE (CR))//发送回车
{
返回 false;
}
if (!UART_SEND_BYTE (LF))//为新行发送换行
{
返回 false;
}
返回 true;
}
//结束 UART_SEND_DEBUG_STRING
秘书长的报告
/*
*@简要初始化系统 RTC、以勾选1秒的倍数
*@param 无
*@返回无
*
空 init_RTC (空)
{
// RTC 计数重载比较值
RTCMOD =(1026);
//源= SMCLK (1MHz),除以1024
RTCCTL = RTCSS_SMCLK | RTCSR | RTCPS_1024 | RTCIE;