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.
#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寄存器
能描述一下这两个寄存器的作用吗?