请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
器件型号:MSP430FR2000 工具/软件:Code Composer Studio
您好!
我编写了一个代码、其中 FR2000从 UART 接收数据、并根据在 UART 中接收到的数据启动 RTC。 完全相同的代码适用于 P1.6、但不适用于 P1.2、但数据表显示了 UCA0RXD。
#include /*全局变量*/ #if defined (__IAR_systems_icc__) __persistent volatile unsigned char timeIncrement = 0;//软件计数变量 #Elif defined (__TI_Compiler_version__) #pragma PERSISTENT (TIMEINING) volatile unsigned char timeIncrement = 0; //软件计数变量 #endif //常数定义*/ #define Increment 0 //软件计数间隔,将其更改为增加 //唤醒时间。 #define SMCLK_115200 0 #define SMCLK_9600 1 #define UART_MODE SMCLK_9600//SMCLK_9600// void initGpio (void); void initUART (void); void initClockTo16MHz (void); int main (void) { WDTCTL = WDTPW | WDTHOLD; //停止看门狗计时器 //配置 GPIO initGpio(); //配置 GPIO inituart(); initClockTo16MHz(); P1OUT ^= BIT4; 操作 { CSCTL7 = 0; //清除 XT1故障标志 SFRIFG1 = 0; //清除故障标志 } while (SFRIFG1和 OFIFG);//测试振荡器故障标志 CSCTL4 = SELA_XT1CLK; //设置 ACLK = XT1CLK = 32768Hz……更改:初始使用内部时钟 REFO P1IFG = 0x00; //清除 P1.3 IFG _bis_SR_register (LPM3_bits | GIE); //输入 LPM3,启用中断 } void initGpio (void) { P1DIR = 0xFF;P2DIR = 0xFF; P1REN = 0xFF;P2REN = 0xFF; P1OUT = 0x00;P2OUT = 0x00; P2SEL1 = BIT6 | BIT7; // P2.6~P2.7:晶振引脚 SYSCFG0 = FRWPPW; //启用 FRAM 写入访问 P1SEL0 |= BIT6 | BIT7; //将2-UART 引脚设置为第二功能 // P1SEL1 &=~(BIT2 | BIT3); // USCI_A0 UART 操作 //P1SEL0 |= BIT2 | BIT3; PM5CTL0 &=~LOCKLPM5; } void initClockTo16MHz () { FRCTL0 = FRCTLPW | NWAITS_1; _bis_SR_register (SCG0); //禁用 FLL CSCTL3 |= SELREF_XT1CLK; //将 XT1设置为 FLL 基准源 CSCTL0 = 0; //清除 DCO 和 MOD 寄存器 CSCTL1 &=~(DCORSEL_7); //首先清除 DCO 频率选择位 CSCTL1 |= DCORSEL_5; //设置 DCO = 16MHz CSCTL2 = FLLD_0 + 487; // DCOCLKDIV = 16MHz _DELAY_CYCLES (3); _BIC_SR_register (SCG0); //启用 FLL while (CSCTL7 &(FLLUNLOCK0 | FLLUNLOCK1));// FLL 锁定 操作 { CSCTL7 = 0; //清除 XT1故障标志 SFRIFG1 = 0; //清除故障标志 } while (SFRIFG1 & OFIFG);//测试振荡器故障标志 } void initUART() { UCA0CTLW0 |= UCSWRST; //将 eUSCI 置于复位 #if UART_MODE = SMCLK_115200 UCA0CTLW0 |= UCSSEL_SMCLK; // CLK = SMCLK //波特率设置 //使用表21-5 UCA0BRW = 8; UCA0MCTLW |= UCOS16 | UCBRF_10 | 0xF700;//0xF700为 UCBRSx = 0xF7 #Elif UART_MODE = SMCLK_9600 UCA0CTLW0 |= UCSSEL_SMCLK; // CLK = SMCLK //波特率设置 //使用表21-5 UCA0BRW = 104; UCA0MCTLW |= UCOS16 | UCBRF_2 | 0xD600;//0xD600为 UCBRSx = 0xD6 #else #错误"请将波特率指定为115200或9600 " #endif UCA0CTLW0 &=~UCSWRST; //初始化 eUSCI UCA0IE |= UCRXIE; //启用 USCI_A0 RX 中断 } //********* // UART 中断 // #if defined (__TI_Compiler_version__)|| defined (__IAR_systems_icc_) #pragma vector=USCI_A0_vector __interrupt void USCI_A0_ISR (void) #Elif defined (__GNU__) void __attribute__(interrupt (USCI_A1_vector))#USCI_A0 Compiler #a0_aid! #endif { switch (__even_in_range (UCA0IV、USCI_UART_UCTXCPTIFG)) }{ USCI_NONE 案例:中断; USCI_UART_UCRXIFG 案例: while (!(UCA0IFG&UCTXIFG)); P1OUT ^= BIT4; RTCMOD = UCA0RXBUF; RTCCTL = RTCSS_XT1CLK | RTCSR | RTCPS__1024 | RTCIE; //RTCCTL = RTCSS_2 | RTCSR | RTCPS__1024 | RTCIE;//启动 RTC _bis_SR_register_ON_EXIT (LPM3_BITS | GIE); __no_operation(); 中断; 案例 USCI_UART_UCTXIFG:中断; 案例 USCI_UART_UCSTTIFG:中断; 实例 USCI_UART_UCTXCPTIFG:break; } }} //** * RTC 中断服务例程 */ //更改:保持开关打开并无限期等待 UNIT GPIO 中断 #pragma vector=RTC_vector __interrupt void RTC_ISR (void) { 开关(__evo_in_range (RTCIV、RTCIV__RTCIFG)) { 案例 RTCIV_none:中断; //无中断 案例 RTCIV_RTCIFG: // RTC 溢出 if (时间增量>=增量) { P1OUT ^= BIT4; 时间增量= 0; //清除软件计数器 RTCCTL = RTCSS_2 | RTCSR | RTCPS__1024;//停止 RTC P1IFG = 0x00; } 其他 { 时间增量++; } _bis_SR_register_ON_EXIT (LPM3_BITS | GIE); __no_operation(); 中断; 默认值:break; } }