This thread has been locked.
If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.
工具/软件:Code Composer Studio
大家好、我正在尝试使用下面给出的代码通过串行通信端口发送一个字符。 该代码用于控制连接到 Msp432P401R的步进电机的速度。 我正在尝试通过按下 按钮 P1.1将字符"B"发送至 PuTTy。按下按钮时、电机的方向会发生变化、并由字符"B"指示。 目前、我能够传输数据、但在 PuTTy 中接收到的数据是一些空值或一些其他字符。 我已经检查了波特率、奇偶校验位和停止位。 一切似乎都是正确的。
#include "msp432.h"
volatile unsigned int i;
//char TXData ='1';
int main (void){
WDT_A->CTL = WDT_A_CTL_PW | WDT_A_CTL_HOLD;//停止 WDT
// GPIO 设置
P4->OUT &=~BIT6;//电机方向
P4->DIR |= BIT6;//设置电机方向
P1->OUT = BIT1;
P1->REN = BIT1;//启用上拉电阻(P1.1输出高电平)
P1->IFG = 0;//清除所有 P1中断标志
P1->IE = BIT1;//为 P1.1启用中断
P1->IES = BIT1;//高电平到低电平转换时的中断
P2->SEL0 |= 0x80;
P2->SEL1 &=~0x80;//PWM
P2->DIR |= 0x80;
Timer_A0->CCR[0]= 10000 - 1;// PWM 周期*/
Timer_A0->CCTL[4]= 0xE0;// CCR4复位/设置模式*
Timer_A0->CTL = 0x0214;//使用 SMCLK、递增计数、清除 TA0R 寄存器*/
P5->SEL1 |= BIT4;//为 ADC 配置 P5.4
P5->SEL0 |= BIT4;
用于 UART 和 LED 的//端口
P1->DIR |= BIT0;
P1->OUT &=~BIT0;// P1.0 LED
//配置 UART 引脚
P1->SEL0 |= BIT2 | BIT3;//将2-UART 引脚设置为第二功能
//UART 配置
EUSCI_A0->CTLW0 |= EUSCI_A_CTLW0_SWRST;//将 eUSCI 置于复位状态
EUSCI_A0->CTLW0 = EUSCI_A_CTLW0_SWRST |EUSCI_B_CTLW0_ssel_SMCLK;//在复位和配置 SMCLK 的 eUSCI 时钟源时保持 eUSCI
// EUSCI_A0->BRW = 1;//使用波特率计算器
// EUSCI_A0->MCTLW =(10 << EUSCI_A_MCTLW_BRF_OFS)|EUSCI_A_MCTLW_OS16;
// EUSCI_A0->CTLW0 &=~EUSCI_A_CTLW0_SWRST;//初始化 eUSCI
// EUSCI_A0->IE |= EUSCI_A_IE_RXIE;//启用 USCI_A0 RX 中断
EUSCI_A0->BRW = 78;// 12000000/16/9600
EUSCI_A0->MCTLW =(2 << EUSCI_A_MCTLW_BRF_OFS)|EUSCI_A_MCTLW_OS16;
EUSCI_A0->CTLW0 &=~EUSCI_A_CTLW0_SWRST;//初始化 eUSCI
EUSCI_A0->IFG &=~EUSCI_A_IFG_RXIFG;//清除 eUSCI RX 中断标志
EUSCI_A0->IE |= EUSCI_A_IE_RXIE;//启用 USCI_A0 RX 中断
//启用全局中断
__ENABLE_IRQ ();//在 NVIC 模块中启用 ADC 中断
NVIC->ISER[0]= 1 <<(ADC14_IRQn)& 31);
//采样时间、S&H=16、ADC14打开
ADC14->CTL0 = ADC14_CTL0_SHT0_2 | ADC14_CTL0_SHP | ADC14_CTL0_ON;//、选择脉冲采样模式、内核在触发有效转换时准备加电。
ADC14->CTL1 = ADC14_CTL1_RES_2;//使用采样计时器、12位转换结果
ADC14->MCTL[0]|= ADC14_MCTLN_INCH_1;// A1 ADC 输入选择;Vref=AVCC
ADC14->IER0 |= ADC14_IER0_IE0;//启用 ADC 转换完成中断
ADC14->IER0 = ADC14_IER0_IE0;//启用 ADC14IFG.0
SCB->SCR &=~SCB_SCR_SLEEPONEXIT_MSK;//从 ISR 退出时唤醒
//确保 SLEEPONEXIT 立即生效
_DSB();
while (1)
{
//P1->OUT &=~BIT0;
//printf ("%d"、TXData);
//表示(i = 200;i > 0;i-);//延迟
//开始采样/转换
ADC14->CTL0 |= ADC14_CTL0_ENC | ADC14_CTL0_SC;
_SLEEP();
__no_operation();//用于调试器
}
}
// ADC14中断服务例程
void ADC14_IRQHandler (void){
volatile uint8_t temp;
if (ADC14->MEM[0]> 0x0F & ADC14->MEM[0]<= 0x7F){
P4->OUT = 0x0000;
Timer_A0->CCR[0]= 0;
Timer_A0->CCR[4]= 0;
}
if (ADC14->MEM[0]> 0x7F & ADC14->MEM[0]<= 0xFF){
if (P1->IFG & BIT1){
P4->OUT ^= BIT6;
}
P1->IFG &=~BIT1;
Timer_A0->CCR[0]= 50000 - 1;
Timer_A0->CCR[4]= 50000 / 5;
}
否则、如果(ADC14->MEM[0]> 0xFF & ADC14->MEM[0]<= 0x2FF){
if (P1->IFG & BIT1){
P4->OUT ^= BIT6;
}
P1->IFG &=~BIT1;
Timer_A0->CCR[0]= 40000 - 1;
Timer_A0->CCR[4]= 40000 / 3;
}
否则、如果(ADC14->MEM[0]> 0x2FF & ADC14->MEM[0]<= 0x7FF){
//P1->OUT =~BIT0;
if (P1->IFG & BIT1){
P4->OUT ^= BIT6;
}
P1->IFG &=~BIT1;
Timer_A0->CCR[0]= 20000 - 1;
Timer_A0->CCR[4]= 20000 / 2;
}
否则、如果(ADC14->MEM[0]> 0x7FF & ADC14->MEM[0]<= 0xAFF){
//P1->OUT =~BIT0;
if (P1->IFG & BIT1){
P4->OUT ^= BIT6;
}
P1->IFG &=~BIT1;
Timer_A0->CCR[0]= 15000 - 1;
Timer_A0->CCR[4]= 150/1.5;
}
否则、如果(ADC14->MEM[0]> 0xAFF & ADC14->MEM[0]<= 0xCFF){
// P1->OUT =~BIT0;
if (P1->IFG & BIT1){
P4->OUT ^= BIT6;
}
P1->IFG &=~BIT1;
Timer_A0->CCR[0]= 10000 - 1;
Timer_A0->CCR[4]= 10000 / 1.2;
}
否则、如果(ADC14->MEM[0]> 0xCFF & ADC14->MEM[0]<= 0xFFF){
//P1->OUT =~BIT0;
if (P1->IFG & BIT1){
IF (EUSCI_A0->IFG 和 EUSCI_A_IFG_RXIFG)
//temp = EUSCI_A0->RXBUF;
EUSCI_A0->IFG &=~EUSCI_A_IFG_RXIFG;
P4->OUT ^= BIT6;
while (!(EUSCI_A0->IFG 和 EUSCI_A_IFG_TXIFG));
EUSCI_A0->TXBUF = EUSCI_A0->RXBUF;
EUSCI_A0->TXBUF ="B";
}
P1->IFG &=~BIT1;
Timer_A0->CCR[0]= 5000 - 1;
Timer_A0->CCR[4]= 5000 / 1.1;
}
}
尊敬的 Peter:
感谢您的回复。 我正在使用我在线找到的示例代码。 它基于在 TI 论坛上发布的问题。 我在这里附上了这一链接。 我获得的结果与此处所述的结果不同。 我没有像这里提到的那样添加 DCO 时钟、因为它使我的器件有一次惊慌。 我无法恢复它。 因此、我必须得到一个新的。 我是 MSP432的编码新手。如果您能帮我解决问题、那我将会很棒。
以下是我提到的链接: e2e.ti.com/.../741392
我需要在最后期限到来时尽快解决这个问题。
您好、Balagopal、
您可以通过 MSP432 UART 代码示例开始 UART 通信吗?
这可以在 TI Resource Explorer 的 MSP432P4 SDK 下找到。
SDK 中包含以下代码示例。
msp432p401x_euscia0_UART_01 | 使用 BRCLK = 12MHz 时、eUSCI_A0 UART 在9600波特时回波 |
msp432p401x_euscia0_UART_03 | USCI_A0外部环回测试@ 115200波特 |
msp432p401x_euscia0_UART_09 | USCI_A0通过 RxD 引脚从 LPM3唤醒作为 GPIO 中断 |
根据代码示例、您可以针对您的应用代码对其进行更新。 检查时钟和 UART 配置是否正确后、您可以使用逻辑分析仪捕获 UART 波形、以调试和解决问题。
谢谢、
Lixin