请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
器件型号:MSP-EXP430FR5994 主题中讨论的其他器件:MSP430FR5994
工具/软件:Code Composer Studio
我正在使用 MSP430FR5994 Devkit 硬件。 我遇到了以下问题:在 UART 通信期间、软件执行会在一段随机时间后停止。
我的 while 结构:
while (1)
{
P1.1引脚上的 LED 切换 (用于示波器跟踪)
如果(ISRflag=1)
{
读取 I2C 传感器数据
数据转换
通过 UART 发送数据
}
}
我以10ms 的时间间隔查询传感器。 当 UART 数据传输被关闭时、代码运行无任何问题。
当 UART 数据传输打开时、代码执行会在一段随机时间后终止。 这一随机时间周期各不相同、有时会在1分钟后发生、有时会在15-20分钟后发生、等等 在代码执行期间、我测量 P1.1引脚上的方波信号。 当代码执行随机终止时、P1.1的状态显示持续的 L 或 H 电平。
我的 UART 初始化代码:
void uartInit() { P2SEL0 &=~(BIT0 | BIT1); P2SEL1 |= BIT0 | BIT1; // USCI_A0 UART 操作 //将 USCI_A0配置为 UART 模式 UCA0CTLW0 = UCSWRST; //将 eUSCI 置于复位状态 UCA0CTLW0 |= UCSSEL_SMCLK; // CLK = SMCLK 8MHz UCA0BRW = 4; // 8000000/16/115200bps UCA0MCTLW |= UCOS16 | UCBRF_5 | 0x5500;// UCBRSx 值= 0x55 (请参阅 UG) UCA0CTLW0 &=~UCSWRST; //初始化 eUSCI UCA0IE |= UCRXIE; //启用 USCI_A0 RX 中断
test.newStringReceived = false; }
UART 中断例程:
#pragma vector=EUSCI_A0_VECTOR __INTERRUPT void USCI_A0_ISR (void) { //int receiveByte = UCA0RXBUF; //UCA0TXBUF = receiveByte; switch (__evo_in_range (UCA0IV、USCI_UART_UCTXCPTIFG)) { USCI_NONE 案例: 中断; USCI_UART_UCRXIFG 案例: rts_clear; CHAR DATA = UCA0RXBUF;//RXBUF0; //#define ECHO_ON #ifdef ECHO_ON while (!(IFG1 & UTXIFG0)); // USART0 TX 缓冲器准备好了吗? TXBUF0 =数据; // RXBUF0到 TXBUF0 #endif uartReceive(数据); if (test.newStringReceived == true){ // _BIC_SR_REGISTER_ON_EXIT (LPM4_BITS);/*退出低功耗模式4 */ } rts_set; 中断; USCI_UART_UCTXIFG 案例: 中断; USCI_UART_UCSTTIFG 案例: 中断; USCI_UART_UCTXCPTIFG 案例: 中断; 默认值: 中断; } __BIC_SR_REGISTER_ON_EXIT (LPM0_Bits);//退出活动 CPU }
变速器例行程序:
void sendBytes (int len){ unsigned int i; for (i = 0;i < len;++I) { //等待 UART 就绪 、同时(!(UCA0IFG & UCTXIFG); // USCI_A0 TX 缓冲器就绪? UCA0TXBUF = test.txString[i]; } }
uart_driver.h 文件中的字符串定义:
typedef struct{ unsigned char newStringReceived; char txString[MAX_STR_LENGTH]; char rxString[MAX_STR_LENGTH]; }end!kadov-->测试; 外部 s_test 测试;
从 main.c:
while (1) { LED2_TOGGLE (); IF (readDataFlag) { readDataFlag = 0; AFE44xx_SPO2_Data_Buf[0]= AFE4404_Reg_Read (42);//读取 LED2数据 AFE44xx_SPREG_Data_BUf[1]= AFE4404_REG_REG_READ (43);/AFE4404_4 = AFE4420_RE_4 (AFE4_RED2_AD4_4)= AFE4420_4 (AFE4420_4) //读取 LED1 -环境数据 sendDataFlag = 1; } if (sendDataFlag) { statHRMAlgo (AFE44xx_SPO2_Data_Buf[5]); //将 LED2-AMB2与心率覆盖 AFE44xx_SPO2_Data_BUf[4]= HeartRate; sendDataFlag = 0x430_0[0]&FAFE44xx]( SPO2_0[0]&FAST_FAST_0[0]&FAST_FAST_0]&FAST_FAST_0[0]&FAST_0_0[0]&FAST_FAST_0_FAST_0_0_0_FAST_0_0_FAST_0_0_0_FAST_0[0]&FAST_FAST_FAST_0 test.txString[2]=(unsigned char)((AFE44xx_SPO2_Data_BUf[0]和0x00FF0000)>> 16); test.txString[3]=(unsigned char)(AFE44xx_SPO2_ST_buf[1]和0xLED3 data test.tx2[0x000_EFA2]+[0x430_FA2]&FAST_000=0x430_000_000_000_000_000_000_000_0004_000_000_000_000_0004_000_000_000_00015_000_000_000_00015_000_000_000_000_000_000_00015_000_000_000_000_000_000_00015_000_000_000_000_000_000_00015_000_000_000_000_000_000_000_00015_000_000_000_000_000_000_00015_000_000_000_000_000_00015_000_000_000_000_000_000_000_000_000_ test.txString[8]=(unsigned char)((AFE44xx_SPO2_Data_BUFF[2]和0x00FF0000)>> 16); test.txString[9]=(unsigned char)(AFE44xx_SPFIT[3]& HeartFF);//环境数据 test.tx2[tx2]=(unsigned char) (0x4400_0[0[0_FAX2]=12](v_FAST_FAST_FA015[0_FF0[0_FAX12](0xFAST_FAX0_FAX0_FAX0_FAX0_FAX12]);(0xFAST_FAST_FAST_FAST_FAST_FF0_0_0[0x24=[0_FAST_0_0_FAST_0_0_FAST_FA0_FA2]=[0_FAST_FA0_FAST_FAST_0_0_FAV0 test.txString[25]=(无符号字符) cr; printf (test.txString); sendBytes (16);//发送 UART 数据字符串115200bps & 22byte = 1.90972222ms } /********* *端口3中断服务例程 / #if defined (__TI_Compiler_version__)|| defined (__IAR_systems_icc_) #pragma vector=PORT3_vector __interrupt port3_ISR_handler (void) #elif defined (__GNU__) void __attribute__((interrupt (PORT3_vector)))))#elif_isr_isr_iter_iter_port3 (void Compiler #ele! #endif { switch (__evo_in_range (P3IV、P3IV_P3IFG7)) { 案例 P3IV__NONE: 中断; //向量0:无中断 案例 P3IV_P3IFG0: 中断; //向量2:P1.0中断标志 案例 P3IV_P3IFG1: 中断;//向量4:P1.1中断标志 案例 P3IV_P3IFG2: 中断; //向量6:P1.2中断标志 案例 P3IV_P3IFG3: 中断; //向量8:P1.3中断标志 案例 P3IV_P3IFG4: 中断; //向量10:P1.4中断标志 案例 P3IV_P3IFG5: 中断; //向量12:P1.5中断标志 案例 P3IV_P3IFG6: LED1_TOGGLE ();//诊断 readDataFlag = 1;//设置标志来读取 AFE44x0 ADC REG 数据 中断; //向量14:P1.6中断标志 案例 P3IV_P3IFG7: 中断; //向量16:P1.7中断标志 默认值: 中断; } }