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板卡上有没有这俩寄存器或者对应的寄存器叫什么,我该怎么解决这个问题

  • Fullscreen
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    #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;
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

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

    USART_SR和USART_DR寄存器

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