TI中文支持网
TI专业的中文技术问题搜集分享网站

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

Yale Li:

#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;}elsereturn 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 timerSystemClock_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 - RXIFGcase 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;}}

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

?? ? said:USART_SR和USART_DR寄存器

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

赞(0)
未经允许不得转载:TI中文支持网 » MSP430F5529: 串口接受波特率为9600的数据并显示在OLED屏幕上读取的数据只能显示一次,会卡住不动不能一直实时显示,怀疑是串口数据量大波特率高导致串口中断溢出的问题
分享到: 更多 (0)