您好,
利用'uartecho_MSP_EXP432P401R_nortos_CCS'的示例,我能够毫无困难地获得常规UART回波活动。 我现在要做的是配置另一个UART,以便从GPS记录器接收NMEA数据。 我已经尝试登录SparkFun论坛多次,但无论使用什么电子邮件地址,我都无法收到他们的验证电子邮件。 通过查看他们的论坛,我还注意到许多问题从未得到解答,因此我将在这里发布。 除了有关实际GPS芯片本身的文档外,记录仪上没有很多文档(这并不奇怪)。 其余部分与SparkFun布局和原理图有关,因此不是很有用。
我以前从未接触过GPS设备,但从我可以看出它只是一个UART接口,所以我假定我只需要配置MSP432的UART,等待接收中断发生,然后我应该拥有 数据。 这根本不起作用。 这是我目前使用的代码。
#include <ti/devices/msp432p4xx/driverlib/driverlib.h>//#include
<ti/drivers/UART.h>
#include <string.h>
const eUSI_UART_Config UART_Config ={
EUSCI_A_UART_CLOCKSOURCE_SMCLK, // SMCLK时钟源
78, // BRDIV = 78
2, // UCXBRF = 2
0, // UCXBRS = 0
EUSCI_A_UART_NO_PARity, //不奇偶校验
EUSCI_A_UART_LSB First, // LSB优先
EUSCI_A_UART_ON_STOP_BIT, //一个停止位
EUSCI_A_UART_MODE, // UART模式
EUSCI_A_UART_OST_OWRAMP_BAUDRATE_generation // Oversampling
};
const eUSI_UART_Config GPS_Config ={
EUSCI_A_UART_CLOCKSOURCE_SMCLK, // SMCLK时钟源
78, // BRDIV = 78
2, // UCXBRF = 2
0, // UCXBRS = 0
EUSCI_A_UART_NO_PARity, //不奇偶校验
EUSCI_A_UART_LSB First, // LSB优先
EUSCI_A_UART_ON_STOP_BIT, //一个停止位
EUSCI_A_UART_MODE,// UART模式
EUSCI_A_UART_ORTS_Ooversampling_BAUDRATE_generation // Oversampling
};
void uartsend(car *printy)
{
//当有更多字符要发送时循环。
内部索引;
对于(index = 0;index < strlen (printy);index++)
{
//将下一个字符写入UART。
MAP_UART_HESRData(EUSI_A0_base, printy[index]);
}
}
void main(void){
//在UART模式下选择WFP 1.2 和WFP 1.3
MAP_GPIO设置外围模块功能输入引脚(GPIO_PORT_P1,
GPIO _PIN1 | GPIO _PIN2 | GPIO _PIN3,GPIO主要模块功能);
//在UART模式下选择WFP 3.2 和WFP 3.3
MAP_GPIO设置外围模块功能输入引脚(GPIO_PORT_P3,
GPIO _PIN2 | GPIO _PIN3,GPIO主要模块功能);
//将DCO设置为12MHz
MAP_CS_setDCOCenteredFrequency (CS_DCO_Frequency_12);
//配置UART模块
MAP_UART_INITModule (EUSCI_A0_BASE,&UART_Config);
//配置UART模块
MAP_UART_INITModule (EUSCI_A2_BASE,&GPS_Config);
//启用UART模块
MAP_UART_enableModule (EUSCI_A0_BASE);
//启用UART模块
MAP_UART_enableModule (EUSCI_A2_BASE);
//启用中断
MAP_UART_enableInterrupt (EUSCI_A0_BASE,EUSCI_A_UART_receive中断);
MAP_Interrupt_enableInterrupt (INT_EUSCIA0);
// 启用中断
MAP_UART_enableInterrupt (EUSCI_A2_BASE,EUSCI_A_UART_receive中断);
MAP_Interrupt_enableInterrupt (INT_EUSCIA2);
MAP_Interrupt_enableSleepOnIsrExit();
char blah[]="testing123\n\n";
"图尔特"(blah);
//下一行不起作用,只是挂起并等待GPS触发中断
// char temp = UART_receiveData(EUSI_A2_base);
易失性UINT32_t I;
//停止看门狗计时器
WDT_A_HOLD (WDT_A_BASE);
//将WFP 1.0 设置为输出方向
GPIO_setAsOutputPin(.
GPIO端口P1,
GPIO_PIN0
);
同时(1)
{
//切换WFP 1.0 输出
gPIO_ToggleOutputOnPin(.
GPIO端口P1,
GPIO PIN0
);
//延迟
对于(i=10万; i>0; i--);
}
}/*
EUSCI A2 UART ISR -应从GPS */
void euscia2_ISR(void)
{
UINT32_t status = MAP_UART_getEnabableInterruptStatus(EUSI_A2_base);
MAP_UART_CLEARInterruptFlag (EUSCI_A2_BASE,状态);
IF (状态和EUSCI_A_UART_receive中断)
{
CHAR Stuff = MAP_UART_receiveData(EUSI_A2_base);
uartsend(stuff);
}
}/*
ESCI A0 UART ISR -将数据回波到PC主机*/
void euscia0_isr (void)
{
UINT32_t status = MAP_UART_getEnabableInterruptStatus(EUSSCI_A0_base);
MAP_UART_CLEARInterruptFlag (EUSCI_A0_BASE,状态);
IF (状态和EUSCI_A_UART_receive中断)
{
MAP_UART_TEHData(EUSI_A0_base, MAP_UART_receiveData(EUSI_A0_base));
}
}
我在euscia2_ISR内设置了一个中断点,但它从未命中,这告诉我配置了错误的东西,或者GPS接收器没有触发中断。 我也尝试从GPS接收器读取数据,但程序挂起(我猜是因为呼叫被阻止),或者我得到了'0'。
如果有人能看看我在这里得到的东西,并告诉我我是否错过了一些很棒的东西。 如果任何人有使用火花趣味复仇记录仪的经验,我可以利用我所能获得的所有帮助。 我看到的所有示例都是Arduino中的,这并不是很有帮助。