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.

[参考译文] CCS/MSP432P401R:需要紧急修复。 串行端口通信问题。 正在尝试实现 UART 串行通信!!

Guru**** 2212860 points
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/961723/ccs-msp432p401r-urgent-fix-needed-serial-port-communication-issue-trying-to-implement-uart-serial-communication

器件型号:MSP432P401R

工具/软件: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;


  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、

    我没有浏览过您的代码、但首先、您可能应该使用 TI 高级库、这样可以节省大量工作。 可能应从示例应用程序开始并不断进行修改。 可能是 UartEcho?

    第二、您是否查看了 CPU 的勘误表? UART 就是一场灾难。 有许多事情不起作用。 中断在不正确的时间发生等...

    希望它能有所帮助。

    谢谢、

    Peter

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 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