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.

MSP430F5529: 串口接受波特率为9600的数据并显示在OLED屏幕上读取的数据只能显示一次,会卡住不动不能一直实时显示,怀疑是串口数据量大波特率高导致串口中断溢出的问题

Part Number: MSP430F5529

#include <msp430.h>
#include <driverlib.h>
#include "system.h"
#include "OLED.h"
#include "MSP430F5529_I2C.h"
#include "mpu6050.h"
#include "uart.h"
#include "pwm.h"
#include "hongwai.h"

#include<stdio.h>
#include<stdlib.h>
#include<string.h>

#define MCLK_IN_HZ 25000000
#define delay_us(x) __delay_cycles((MCLK_IN_HZ/1000000*(x)))
#define delay_ms(x) __delay_cycles((MCLK_IN_HZ/1000*(x)))

float Yaw;
float Roll;
float Pitch;

int16_t ROLL,ROLL_L;
int16_t PITCH,PITCH_L;
int16_t YAW,YAW_L;
int16_t TEM,TEM_L;
int16_t sum;

int16_t flag = 0;


float data_process(int16_t num)
{
float result=0;

result = num / 32768.0 * 180.0;

if(result<=180)
{
return result;
}
else
return result-360;
}

void unlock(void)
{
USCI_A_UART_transmitData(USCI_A1_BASE, 0xFF);
USCI_A_UART_transmitData(USCI_A1_BASE, 0xAA);
USCI_A_UART_transmitData(USCI_A1_BASE, 0x69);
USCI_A_UART_transmitData(USCI_A1_BASE, 0x88);
USCI_A_UART_transmitData(USCI_A1_BASE, 0xB5);

USCI_A_UART_transmitData(USCI_A1_BASE, 0xFF);
USCI_A_UART_transmitData(USCI_A1_BASE, 0xAA);
USCI_A_UART_transmitData(USCI_A1_BASE, 0x03);
USCI_A_UART_transmitData(USCI_A1_BASE, 0x03);
USCI_A_UART_transmitData(USCI_A1_BASE, 0x00);

USCI_A_UART_transmitData(USCI_A1_BASE, 0xFF);
USCI_A_UART_transmitData(USCI_A1_BASE, 0xAA);
USCI_A_UART_transmitData(USCI_A1_BASE, 0x04);
USCI_A_UART_transmitData(USCI_A1_BASE, 0x02);
USCI_A_UART_transmitData(USCI_A1_BASE, 0x00);

USCI_A_UART_transmitData(USCI_A1_BASE, 0xFF);
USCI_A_UART_transmitData(USCI_A1_BASE, 0xAA);
USCI_A_UART_transmitData(USCI_A1_BASE, 0x00);
USCI_A_UART_transmitData(USCI_A1_BASE, 0x00);
USCI_A_UART_transmitData(USCI_A1_BASE, 0x00);
}
/**
* main.c
*/
int main(void)
{
WDTCTL = WDTPW | WDTHOLD; // stop watch dog timer

SystemClock_Init();

Init_I2C_GPIO();
I2C_init(OLED_ADDRESS >> 1);

// UART_Init(USCI_A0_BASE, 115200);
UART_Init(USCI_A1_BASE, 9600);
unlock();
// UART_Init(USCI_A1_BASE, 4800);

// GPIO_setAsOutputPin(GPIO_PORT_P6, GPIO_PIN5);

PWM_Init();

__bis_SR_register(GIE);


OLED_Init();
OLED_Clear();
OLED_Display_On();


while(1)
{
//GPIO_toggleOutputOnPin(GPIO_PORT_P6, GPIO_PIN5);
// USCI_A_UART_resetDormant (USCI_A1_BASE);
Roll = data_process(ROLL);
Pitch = data_process(PITCH);
Yaw = data_process(YAW);
OLED_ShowSignedNum(0, 0, (int16_t)Roll, 5, 16);
OLED_ShowSignedNum(0, 2, (int16_t)Pitch, 5, 16);
OLED_ShowSignedNum(0, 4, (int16_t)Yaw, 5, 16);
delay_ms(200);
}

//return 0;
}


//****************************中断函数******************************************

//******************************************************************************
//
//This is the USCI_A0 interrupt vector service routine.
//
//******************************************************************************
//#pragma vector=USCI_A0_VECTOR
//__interrupt void USCI_A0_ISR (void)
//{
// uint8_t receivedData = 0;
// switch (__even_in_range(UCA0IV,4))
// {
// //Vector 2 - RXIFG
// case 2:
// receivedData = USCI_A_UART_receiveData(USCI_A0_BASE);
// USCI_A_UART_transmitData(USCI_A0_BASE,receivedData);
//
// break;
// default:
// break;
// }
//}

//******************************************************************************
//
//This is the USCI_A1 interrupt vector service routine.
//
//******************************************************************************
#pragma vector=USCI_A1_VECTOR
__interrupt void USCI_A1_ISR (void)
{

static int state = 0;
uint8_t receivedData = 0;
switch (__even_in_range(UCA1IV,4))
{
//Vector 2 - RXIFG
case 2:
receivedData = USCI_A_UART_receiveData(USCI_A1_BASE);
if(state>1)
{
if(state<8)
{
if(state==2)
{
ROLL_L = (uint16_t)receivedData;
state++;
break;
}
else if(state==3)
{
ROLL = ((uint16_t)receivedData<<8)|ROLL_L;
state++;

break;
}
else if(state==4)
{
PITCH_L = (uint16_t)receivedData;
state++;
break;
}
else if(state==5)
{
PITCH = ((uint16_t)receivedData<<8)|PITCH_L;
state++;

break;
}
else if(state==6)
{
YAW_L = (uint16_t)receivedData;
state++;
break;
}
else if(state==7)
{
YAW = ((uint16_t)receivedData<<8)|YAW_L;
state++;
break;
}
}
}

else
{
switch(state)
{
case 0:
if(receivedData==0x55)
{
state++;
}
else state=0;
break;
case 1:
if(receivedData==0x53)
{
state++;
}
else state=0;
break;
case 8:
state++;
break;
case 9:
state++;
break;
case 10:

state=0;
break;
default:break;
}
}
break;
default:
break;
}

}

每次按下reset可以正常读出三个角度值,但是会卡死不动了,不能一直读取实时显示,

在stm32中解决如下问题为顺序执行对USART_SR和USART_DR寄存器的读操作。

msp板卡上有没有这俩寄存器或者对应的寄存器叫什么,我该怎么解决这个问题

  • #include <msp430.h>
    #include <driverlib.h>
    #include "system.h"
    #include "OLED.h"
    #include "MSP430F5529_I2C.h"
    #include "mpu6050.h"
    #include "uart.h"
    #include "pwm.h"
    #include "hongwai.h"
    
    #include<stdio.h>
    #include<stdlib.h>
    #include<string.h>
    
    #define MCLK_IN_HZ 25000000
    #define delay_us(x) __delay_cycles((MCLK_IN_HZ/1000000*(x)))
    #define delay_ms(x) __delay_cycles((MCLK_IN_HZ/1000*(x)))
    
    float Yaw;
    float Roll;
    float Pitch;
    
    int16_t ROLL,ROLL_L;
    int16_t PITCH,PITCH_L;
    int16_t YAW,YAW_L;
    int16_t TEM,TEM_L;
    int16_t sum;
    
    int16_t flag = 0;
    
    
    float data_process(int16_t num)
    {
        float result=0;
        
        result = num / 32768.0 * 180.0;
        
        if(result<=180)
        {
            return result;
        }
        else
        return result-360;
    }
    
    void unlock(void)
    {
        USCI_A_UART_transmitData(USCI_A1_BASE, 0xFF);
        USCI_A_UART_transmitData(USCI_A1_BASE, 0xAA);
        USCI_A_UART_transmitData(USCI_A1_BASE, 0x69);
        USCI_A_UART_transmitData(USCI_A1_BASE, 0x88);
        USCI_A_UART_transmitData(USCI_A1_BASE, 0xB5);
        
        USCI_A_UART_transmitData(USCI_A1_BASE, 0xFF);
        USCI_A_UART_transmitData(USCI_A1_BASE, 0xAA);
        USCI_A_UART_transmitData(USCI_A1_BASE, 0x03);
        USCI_A_UART_transmitData(USCI_A1_BASE, 0x03);
        USCI_A_UART_transmitData(USCI_A1_BASE, 0x00);
        
        USCI_A_UART_transmitData(USCI_A1_BASE, 0xFF);
        USCI_A_UART_transmitData(USCI_A1_BASE, 0xAA);
        USCI_A_UART_transmitData(USCI_A1_BASE, 0x04);
        USCI_A_UART_transmitData(USCI_A1_BASE, 0x02);
        USCI_A_UART_transmitData(USCI_A1_BASE, 0x00);
        
        USCI_A_UART_transmitData(USCI_A1_BASE, 0xFF);
        USCI_A_UART_transmitData(USCI_A1_BASE, 0xAA);
        USCI_A_UART_transmitData(USCI_A1_BASE, 0x00);
        USCI_A_UART_transmitData(USCI_A1_BASE, 0x00);
        USCI_A_UART_transmitData(USCI_A1_BASE, 0x00);
    }
    /**
    * main.c
    */
    int main(void)
    {
        WDTCTL = WDTPW | WDTHOLD; // stop watch dog timer
        
        SystemClock_Init();
        
        Init_I2C_GPIO();
        I2C_init(OLED_ADDRESS >> 1);
        
        // UART_Init(USCI_A0_BASE, 115200);
        UART_Init(USCI_A1_BASE, 9600);
        unlock();
        // UART_Init(USCI_A1_BASE, 4800);
        
        // GPIO_setAsOutputPin(GPIO_PORT_P6, GPIO_PIN5);
        
        PWM_Init();
        
        __bis_SR_register(GIE);
        
        
        OLED_Init();
        OLED_Clear();
        OLED_Display_On();
        
        
        while(1)
        {
            //GPIO_toggleOutputOnPin(GPIO_PORT_P6, GPIO_PIN5);
            // USCI_A_UART_resetDormant (USCI_A1_BASE);
            Roll = data_process(ROLL);
            Pitch = data_process(PITCH);
            Yaw = data_process(YAW);
            OLED_ShowSignedNum(0, 0, (int16_t)Roll, 5, 16);
            OLED_ShowSignedNum(0, 2, (int16_t)Pitch, 5, 16);
            OLED_ShowSignedNum(0, 4, (int16_t)Yaw, 5, 16);
            delay_ms(200);
        }
        
        //return 0;
    }
    
    
    //****************************中断函数******************************************
    
    //******************************************************************************
    //
    //This is the USCI_A0 interrupt vector service routine.
    //
    //******************************************************************************
    //#pragma vector=USCI_A0_VECTOR
    //__interrupt void USCI_A0_ISR (void)
    //{
    //  uint8_t receivedData = 0;
    //  switch (__even_in_range(UCA0IV,4))
    //  {
    //      Vector 2 - RXIFG
    //      case 2:
    //      receivedData = USCI_A_UART_receiveData(USCI_A0_BASE);
    //      USCI_A_UART_transmitData(USCI_A0_BASE,receivedData);
    //
    //      break;
    //      default:
    //      break;
    //  }
    //}
    
    //******************************************************************************
    //
    //This is the USCI_A1 interrupt vector service routine.
    //
    //******************************************************************************
    #pragma vector=USCI_A1_VECTOR
    __interrupt void USCI_A1_ISR (void)
    {
        
        static int state = 0;
        uint8_t receivedData = 0;
        switch (__even_in_range(UCA1IV,4))
        {
            //Vector 2 - RXIFG
            case 2:
            receivedData = USCI_A_UART_receiveData(USCI_A1_BASE);
            if(state>1)
            {
                if(state<8)
                {
                    if(state==2)
                    {
                        ROLL_L = (uint16_t)receivedData;
                        state++;
                        break;
                    }
                    else if(state==3)
                    {
                        ROLL = ((uint16_t)receivedData<<8)|ROLL_L;
                        state++;
                        
                        break;
                    }
                    else if(state==4)
                    {
                        PITCH_L = (uint16_t)receivedData;
                        state++;
                        break;
                    }
                    else if(state==5)
                    {
                        PITCH = ((uint16_t)receivedData<<8)|PITCH_L;
                        state++;
                    
                        break;
                    }
                    else if(state==6)
                    {
                        YAW_L = (uint16_t)receivedData;
                        state++;
                        break;
                    }
                    else if(state==7)
                    {
                        YAW = ((uint16_t)receivedData<<8)|YAW_L;
                        state++;
                        break;
                    }
                }
            }
            
            else
            {
                switch(state)
                {
                    case 0:
                    if(receivedData==0x55)
                    {
                        state++;
                    }
                    else state=0;
                    break;
                    case 1:
                    if(receivedData==0x53)
                    {
                        state++;
                    }
                    else state=0;
                    break;
                    case 8:
                    state++;
                    break;
                    case 9:
                    state++;
                    break;
                    case 10:
                    
                    state=0;
                    break;
                    default:break;
                }
            }
            break;
            default:
            break;
        }
    
    }

    上传代码请用 插入--代码 功能。

    USART_SR和USART_DR寄存器

    能描述一下这两个寄存器的作用吗?