Other Parts Discussed in Thread: MSP430FR6989
尊敬的:
对于一个项目、我将通过 UCA1使用 UART (在我的 MSP430FR6989上)。 我将 UART 与 ACLK 配合使用、我将使用/将使用 SMCLK 进行16MHz 的时序。
对于 UART、我使用了示例代码并进行了相应的更改。 但是、它包含以下行: __bis_SR_register (LPM3_bits | GIE);、这会进入 LPM3模式。 但是、我不想进入 LP 模式、因为我需要处理器以16MHz 的频率运行来执行任务(以及 SMCLK)。 每当我从该行中擦除"LPM3_BITS l"(因此不允许它进入 LP 模式)时、我仍然通过 UART 获取某个内容、但它是不可读的。 这是为什么?
还有一个 main.c 代码、按时间顺序调用下面的所有这些函数。
void init_gpio (void){ //WDTCTL = WDTPW | WDTHOLD; //停止看门狗 //配置 GPIO P3SEL0 |= BIT4 + BIT5; // eUSCI_A1 UART P3SEL1 &=~(BIT4 + BIT5); // eUSCI_A1 UART PJSEL0 |= BIT4 | BIT5; //为 ACLK 配置 XT1引脚 //禁用 GPIO 上电默认高阻抗模式以激活 //先前配置的端口设置 PM5CTL0 &=~LOCKLPM5; } void init_clocks (void){ //根据 MCLK 的器件数据表的要求配置一个 FRAM 等待状态 //在配置时钟系统之前在8MHz 以上运行。 FRCTL0 = FRCTLPW | NWAITS_1; // XT1设置 CSCTL0_H = CSKEY >> 8; //解锁 CS 寄存器 CSCTL1 = DCOFSEL_4 | DCORSEL; //将 DCO 设置为16MHz CSCTL2 = SELA_LFXTCLK | SEL__DCOCLK | SELM_DCOCLK;//ACLK 为 LFXTCLK、SLCK 为 DCO、MCLK 为 DCO CSCTL3 = DIVA__1 | DIVS__1 | DIVM__1; //设置所有分频器 CSCTL4 &=~LFXTOFF; 操作 { CSCTL5 &=~LFXTOFFG; //清除 XT1故障标志 SFRIFG1 &=~OFIFG; } while (SFRIFG1&OFIFG); //测试振荡器故障标志 CSCTL0_H = 0; //锁定 CS 寄存 器} void init_communication (void){//根据器件数据表的要求配置一个 FRAM 等待状态,以实现 MCLK //操作超过8MHz _Befor_配置时钟系统。 FRCTL0 = FRCTLPW | NWAITS_1; // XT1设置 CSCTL0_H = CSKEY >> 8; //解锁 CS 寄存器 CSCTL1 = DCOFSEL_4 | DCORSEL; //将 DCO 设置为16MHz CSCTL2 = SELA_LFXTCLK | SELM_DCOCLK | SELM_DCOCLK;//带 LFXTCLK 的 ACLK、带 DCO 的 SLCK、带 DCO 的 MCLK CSCTL3 = DIVA_1 | DIVM_1 | DIVM_1; //设置所有分频 器 CSCTL4 &=~LFXTOFF; 执行 { CSCTL5 &=~LFXTOFFG; //清除 XT1故障标志 SFRIFG1 &=~OFIFG; } while (SFRIFG1&OFIFG); //测试振荡器故障标志 CSCTL0_H = 0; //锁定 CS 寄存器 //为 UART 模式配置 USCI_A1 UCA1CTLW0 = UCSWRST; //将 eUSCI 置于复位 UCA1CTLW0 |= UCSSEL_ACLK; // CLK = ACLK UCA1BR0 = 3; // 9600波特 UCA1MCTLW |= 0x5300; // 32768/9600 - INT (32768/9600)=0.41 // UCBRSx 值= 0x53 (请参阅 UG) UCA1BR1 = 0; UCA1CTL1 &=~UCSWRST; //初始化 eUSCI UCA1IE |= UCRXIE; //启用 USCI_A0 RX 中断 __bis_SR_register (LPM3_bits | GIE); //输入 LPM3、中断启用 __NO_OPERATION (); } #if defined (__TI_Compiler_version__)|| Defined (__IAR_systems_ICC__) #pragma vector=USCI_A1_vector __interrupt void USCI_A1_ISR (void) #Elif defined (__GNUCI_) (void USCI_A1_ISR (void)(void)(void USCI_USCI_A1_ISR)(void)(void)(void USCI_AULT_A1)(void USCI_AULT_I_)(void #endif { switch (__even_in_range (UCA1IV、USCI_UART_UCTXCPTIFG)) }{ USCI_NONE 案例:中断; USCI_UART_UCRXIFG 案例: while (!(UCA1IFG&UCTXIFG)); UCA1TXBUF = 0x55;//出于调试原因 __no_operation(); 中断; 案例 USCI_UART_UCTXIFG:中断; 案例 USCI_UART_UCSTTIFG:中断; 案例 USCI_UART_UCTXCPTIFG:break; } }
并提前感谢您、
Yannick