主题中讨论的其他器件: MSP-EXP430FR5739
您好!
我正在从事一个项目、该项目将在器件中集成一个 MSP430FR5739。 这是我第一次使用微控制器、所以我只是想弄清楚如何使用每个子系统。 我正在尝试弄清楚如何将 UART 数据发送到芯片。 我有 MSP-EXP430FR5739实验板、我将使用它来测试我的代码、然后再转到现实器件。
为了测试 UART、我有如下所示的代码:
#include
#include
//UART 参数、直接从示例代码中提取。
#define SMCLK_115200 0
#define SMCLK_9600 1
#define ACLK_9600 2
//这些只是 SET_GPIO 函数的任意常数。
#define PIN_J0 99
#define PIN_J1 98
#define UART_MODE SMCLK_9600
void initGPIO()
{
PJDIR = 0b00000011;//PJ.1、PJ.0
}
void initClockTo16MHz ()
{
//时钟系统设置
CSCTL0_H = CSKKEY_H; //解锁 CS 寄存器
CSCTL1 = 0; //清除 DCO 设置
CSCTL1 |= DCORSEL | DCOFSEL_2; //将 DCO 设置为16MHz
//将所有时钟设置为从 DCO 运行
CSCTL2 = SELA_DCOCLK | SELM_DCOCLK | SELM_DCOCLK;
CSCTL3 = DIVA_0 | DIVS_0 | DIVM_0; //将所有分频器设置为/1
CSCTL4 |= XT1DRIVE_0;
CSCTL4 &= XT1OFF;
操作
{
CSCTL5 &=~XT1OFFG;
//清除 XT1故障标志
SFRIFG1 &=~OFIFG;
} while (SFRIFG1&OFIFG); //测试振荡器故障标志
CSCTL0_H = 0; //锁定 CS 寄存器
}
void initUART()
{
//将 USCI_A0配置为 UART 模式
UCA0CTLW0 = UCSWRST; //将 eUSCI 置于复位状态
#if UART_MODE = SMCLK_115200
UCA0CTLW0 |= UCSSEL_SMCLK; // CLK = SMCLK
//波特率设置
//使用系列用户指南中的表30-5
UCA0BR0 = 8;
UCA0BR1=0;
UCA0MCTLW |= UCOS16 | UCBRF_10 | 0xF700;//0xF700为 UCBRSx = 0xF7
#elif UART_MODE = SMCLK_9600
UCA0CTLW0 |= UCSSEL_SMCLK; // CLK = SMCLK
//波特率设置
//使用系列用户指南中的表30-5
UCA0BR0 = 104;
UCA0BR1=0;
UCA0MCTLW |= UCOS16 | UCBRF_2 | 0xD600;//0xD600为 UCBRSx = 0xD6
#Elif UART_MODE = ACLK_9600
UCA0CTLW0 |= UCSSEL_ACLK; // CLK = ACLK
//波特率计算
// 32768/(9600)= 3.4133
//分数部分= 0.4133
//使用系列用户指南中的表24-5
UCA0BR0=3; // 32768/9600
UCA0BR1=0;
UCA0MCTLW |= 0x9200;//0x9200为 UCBRSx = 0x92
其他
#错误"请将波特率指定为115200或9600 "
#endif
UCA0CTLW0 &=~UCSWRST; //初始化 eUSCI
}
void set_gpio (pin、state)
{
IF (引脚= PIN_J0)
{
IF (PJOUT & 0b00000001)
PJOUT &=(状态* 0b00000001);
其他
PJOUT |=(状态* 0b00000001);
}
IF (引脚==引脚_J1)
{
IF (PJOUT 和0b00000010)
PJOUT &=(状态* 0b00000010);
其他
PJOUT |=(状态* 0b00000010);
}
}
void delay_milliseconds (int duration)
{
//此处的每个循环将等待1ms (因为时钟为16MHz),直到持续时间为空。
while (持续时间)
{
_DELAY_CYCLES (16000);
持续时间--;
}
}
//*********
int main (void)
{
WDTCTL = WDTPW | WDTHOLD;//停止看门狗计时器
//UART 内容就在这里
initClockTo16MHz();
inituart();
initGPIO();
while (1)
{
delay_milliseconds (1000);
IF (UCA0IFG 和 UCRXIFG)
{
SET_GPIO (PIN_J1、1);
delay_milliseconds (1000);
SET_GPIO (PIN_J1、0);
}
SET_GPIO (PIN_J0、1);
delay_milliseconds (1000);
SET_GPIO (PIN_J0、0);
}
}
我知道这个代码可以大大改进、我应该使用中断、但是现在我只想获得一些证据、证明我的电路板正在接收 UART 数据。 根据我的理解、我的代码应该一直运行、一直闪烁 J0 LED、直到它接收到 UART 数据。 一旦它接收到数据、UCRXIFG 标志应该被激活、因此 UCA0IFG 和 UCRXIFG 应该返回"真"、并且它应该使 J1 LED 闪烁一次。 当我从计算机上的终端发送数据(使用 Arduino IDE 中的串行监视器、波特率设置为9600)时、我不会看到第二个闪烁的 LED。 我在 RXD 线路上连接了一个示波器、以确认正在发送数据。 连接示波器后、我在计算机上的串行监视器中打了一个 R。 我测量了一个到达的波形(其中 H 为高电平、L 为低电平):HHHHHHHHHHHHHHHHHLLHLHLHLHLHLHLHLHLHLHLHLHLHLHLHLHLHLHLLLHLLLHLHHHHHHHHHHHHHHHH。 我使用 ASCII 表将这些数据分开、它显示了一个开始位、一个 R、一个停止位、一个开始位、一个 NL 线路馈送和一个最终停止位(这些位与返回其休眠高电平状态的信号混合)。 因此、正确的数据肯定会发送到电路板。 我在电路板上设置了所有跳线、以便按照其出现的方式进行排列、跳线全部对齐以跨电路板上的虚线。 那么、如果我已经验证了电路板上存在正确的数据、那么为什么我的代码没有使 J1 LED 闪烁、因为发送 R 应该会导致 UCRXIFG 标志被置位? 我想我在 UART 设置中做了一切、最终得到了9600波特率、一个停止位、并且无奇偶校验、但可能还有其他的事情我会错过吗?
遗憾的是、Resource Explorer 中的所有示例代码都使用中断、我还不希望这样做。 再说一次、在我继续处理中断及其工作方式之前、只需尝试通过简单的线性执行编程开始让我的脚湿透。 谢谢!