// Haybin_Wu // Shenitech-RD // 2016.5 // Built with IAR Embedded Workbench v6.2 //****************************************************************************** #include #include #include "FR2433-RFSX.h" #include "RF_SX1276.h" uint32_t t=0; void FRAM_Write (uint16_t FRAM_START,uint8_t *(Array),uint8_t Array_Long); void FRAM_Read (uint16_t FRAM_START,uint8_t *(Array),uint8_t Array_Long); void Set_DT(void); void Refresh_Date(void); void UART0_Tx(uint8_t data); #define FRAM_Date_START 0x1800 //Date 存储起始地址 #define FRAM_ID_START 0x1806 //ID 存储起始地址 #define RTC_Data 1920 //定义RTC定时周期 RTC_Data/32=?s uint8_t Rx_Buf[64]; uint8_t Rx_Length=0; uint8_t Rx_Flog=0; uint8_t Rx_Data=0; uint8_t Date_Time[6]= { 30,//0秒 16,//1分 10,//2时 22,//3日 05,//4月 16,//5年 }; uint8_t Device_ID[4]={0xA6,0x52,0x40,0x01,};//设备ID //UART发送 void UART0_Tx(uint8_t data) { UCA0TXBUF = data; while((UCTXIFG&UCA0IFG)==0); UCA0IFG&=~UCTXIFG; } void Refresh_Date(void) { FRAM_Read(FRAM_Date_START,Date_Time,6); Date_Time[0]=RTCCNT/32; } //////////////////////////////////////////////////////////////////////////////// //主函数 //////////////////////////////////////////////////////////////////////////////// int main(void) { WDTCTL = WDTPW | WDTHOLD; // Stop WDT // Port Configuration all un-used pins to output low P1DIR = 0xFF; P2DIR = 0xFF; P3DIR = 0xFF; P1OUT = 0x00; P2OUT = 0x00; P3OUT = 0x00; PM5CTL0 &= ~LOCKLPM5;//开引脚功能 // Configure DCO Clock //外部时钟源启动 P2SEL0 |= BIT0 | BIT1; // set XT1 pin as second function do { CSCTL7 &= ~(XT1OFFG | DCOFFG); // Clear XT1 and DCO fault flag SFRIFG1 &= ~OFIFG; } while (SFRIFG1 & OFIFG); // Test oscillator fault flag //上面清除标志有助于降低功耗 __bis_SR_register(SCG0); // disable FLL CSCTL3 |= SELREF__XT1CLK; // 外部 32768hz reference source CSCTL0 = 0; // clear DCO and MOD registers CSCTL1 &= ~(DCORSEL_7); // Clear DCO frequency select bits first CSCTL1 |= DCORSEL_3; //DCO=8Mhz CSCTL2 = FLLD_0 + 243; // DCODIV = 8MHz __delay_cycles(3); __bic_SR_register(SCG0); // enable FLL while(CSCTL7 & (FLLUNLOCK0 | FLLUNLOCK1)); // Poll until FLL is locked CSCTL4 = SELREF__XT1CLK + SELMS__DCOCLKDIV;// set XT1CLK(32768Hz) as ACLK source & MCLK/SMCLK=DCO //Timer0_A3 setup //TA0CCTL0 = CCIE; // TACCR0 interrupt enabled //TA0CCR0 = 32768; //TA0CTL = TASSEL_1 | MC_1; // ACLK, continuous mode // Initialize RTC RTCMOD = RTC_Data; RTCCTL = (RTCSS__XT1CLK + RTCPS__1024 + RTCIE);//+ RTCSR// Source = 32kHz crystal, divided by 1024 if(RTCCNT>RTC_Data){RTCCTL |= RTCSR;WDTCTL=0;} Refresh_Date();//复位后刷新时间 //FRCTL0 = FRCTLPW | NWAITS_1;//FRRAM FRAM_Read(FRAM_ID_START,Device_ID,4);//刷新设备ID // Configure UART pins P1SEL0 |= BIT4 | BIT5; // set 2-UART pin as second function // Configure UART UCA0CTLW0 |=(UCSSEL__SMCLK+UCSWRST);//UCPEN+UCPAR+ // Baud Rate calculation UCA0BR0 = 52; // 8000000/8/9600//这位大于16 UCOS16位要置位 UCA0BR1 = 0x00; // Fractional portion = 0.083 //UCA0MCTLW = 0x11;//微调Baud Rate UCA0MCTLW = 0x4900 | UCOS16 | UCBRF_1;//微调Baud Rate UCA0CTLW0 &= ~UCSWRST; // Initialize eUSCI UCA0IE |= UCRXIE; // Enable USCI_A0 RX interrupt _EINT(); //无线模块测试化 uint8_t RF_error_flag=0; for(uint8_t i=0;i<5;i++)//最多初始化3次 { if(SX127x_init(Init_LoRa_0_8K)==NORMAL) break; //无线模块初始化失败复位 else RF_error_flag=1; } if(RF_error_flag==1) //无线初始化失败处理 { //P3OUT ^= 0xC0; LPM4; } LSD_RF_SleepMode();//深度睡眠1.2uA __bis_SR_register(LPM3_bits | GIE); // Enter LPM3 //uint32_t i=0; __no_operation(); // For debugger while(1) { //P3OUT ^= 0xC0; //for(uint8_t i=0;i= 100) { Rx_Length = 0; } Rx_Buf[Rx_Length]=UCA0RXBUF; Rx_Length++; Rx_Flog=1; } // SPI-B0 interrupt service routine #if defined(__TI_COMPILER_VERSION__) || defined(__IAR_SYSTEMS_ICC__) #pragma vector=USCI_B0_VECTOR __interrupt void USCI_B0_ISR(void) #elif defined(__GNUC__) void __attribute__ ((interrupt(USCI_B0_VECTOR))) USCI_B0_ISR (void) #else #error Compiler not supported! #endif { while (!(UCB0IFG&UCTXIFG)); // USCI_A0 TX buffer ready? UCB0TXBUF = UCB0RXBUF; // Echo received data } */ // Timer0 A0 interrupt service routine #if defined(__TI_COMPILER_VERSION__) || defined(__IAR_SYSTEMS_ICC__) #pragma vector = TIMER0_A0_VECTOR __interrupt void Timer0_A0_ISR(void) #elif defined(__GNUC__) void __attribute__ ((interrupt(TIMER0_A0_VECTOR))) Timer0_A0_ISR (void) #else #error Compiler not supported! #endif { t++; if(t>5) { t=0;//WDTCTL=0; //LSD_RF_RxVariPacket(Rxbuffer,Rxbuffer_size); //接收可变数据包,如果速率为大速率,只能用接收固定数据包长度 //LSD_RF_RXmode(30); //每次发送一包数据后,进入接收状态,等待B模块应答 } } // Timer1 A0 interrupt service routine #if defined(__TI_COMPILER_VERSION__) || defined(__IAR_SYSTEMS_ICC__) #pragma vector = TIMER1_A0_VECTOR __interrupt void Timer1_A0_ISR(void) #elif defined(__GNUC__) void __attribute__ ((interrupt(TIMER1_A0_VECTOR))) Timer1_A0_ISR (void) #else #error Compiler not supported! #endif { ; //if(t>5)WDTCTL=0;//P3OUT ^= 0xC0; } // RTC interrupt service routine //一分钟一次 #if defined(__TI_COMPILER_VERSION__) || defined(__IAR_SYSTEMS_ICC__) #pragma vector=RTC_VECTOR __interrupt void RTC_ISR(void) #elif defined(__GNUC__) void __attribute__ ((interrupt(RTC_VECTOR))) RTC_ISR (void) #else #error Compiler not supported! #endif { if(RTCIV&0x02) { Date_Time[0]=60; Set_DT();//万年历 FRAM_Write (FRAM_Date_START,Date_Time,6);//写入铁电 } } // UAR0 interrupt service routine #if defined(__TI_COMPILER_VERSION__) || defined(__IAR_SYSTEMS_ICC__) #pragma vector=USCI_A0_VECTOR __interrupt void USCI_A0_ISR(void) #elif defined(__GNUC__) void __attribute__ ((interrupt(USCI_A0_VECTOR))) USCI_A0_ISR (void) #else #error Compiler not supported! #endif { uint8_t CS=0; if((UCA0IV&USCI_UART_UCRXIFG)==USCI_UART_UCRXIFG) { Rx_Flog=1; Rx_Buf[Rx_Data] = UCA0RXBUF; Rx_Data++; //UCA0IFG&=~UCRXIFG; } if(Rx_Data>=10) { for(uint8_t i=0;i<(Rx_Buf[3]+1);i++) CS+=Rx_Buf[i+2]; if((Rx_Buf[0]==0x4D)&&(Rx_Buf[1]==0x4B)&&(Rx_Buf[Rx_Data-2]==0x55)&&(Rx_Buf[Rx_Data-1]==0x16)) { FRAM_Read(FRAM_ID_START,Device_ID,4);//刷新设备ID //功能码01 设置ID//4D 4B 01 08 00 00 00 00 ID ID ID ID CS 16 if((Rx_Buf[2]==0x01)&&(Rx_Buf[4]==Device_ID[0])&&(Rx_Buf[5]==Device_ID[1])&&(Rx_Buf[6]==Device_ID[2])&&(Rx_Buf[7]==Device_ID[3])) { Device_ID[0]=Rx_Buf[8];Device_ID[1]=Rx_Buf[9];Device_ID[2]=Rx_Buf[10];Device_ID[3]=Rx_Buf[11]; FRAM_Write(FRAM_ID_START,Device_ID,4); //FRAM_Read(FRAM_ID_START,Device_ID,4);//刷新设备ID UART0_Tx(0xE5); } //功能码06 读设备RTC//4D 4B 06 04 00 00 00 00 CS 16 if((Rx_Buf[2]==0x06)&&(Rx_Buf[4]==Device_ID[0])&&(Rx_Buf[5]==Device_ID[1])&&(Rx_Buf[6]==Device_ID[2])&&(Rx_Buf[7]==Device_ID[3])) { Refresh_Date();//refresh time //Return 4D 4B 06 A0 ID ID ID ID DT DT DT DT DT DT E5 16 UART0_Tx(0x4D);UART0_Tx(0x4B);UART0_Tx(0x06);UART0_Tx(0xA0);UART0_Tx(Device_ID[0]);UART0_Tx(Device_ID[1]);UART0_Tx(Device_ID[2]);UART0_Tx(Device_ID[3]); UART0_Tx(Date_Time[0]);UART0_Tx(Date_Time[1]);UART0_Tx(Date_Time[2]);UART0_Tx(Date_Time[3]);UART0_Tx(Date_Time[4]);UART0_Tx(Date_Time[5]); UART0_Tx(0xE5);UART0_Tx(0x16); } //功能码07 同步RTC//4D 4B 06 04 00 00 00 00 CS 16 if((Rx_Buf[2]==0x07)&&(Rx_Buf[4]==Device_ID[0])&&(Rx_Buf[5]==Device_ID[1])&&(Rx_Buf[6]==Device_ID[2])&&(Rx_Buf[7]==Device_ID[3])) { ; } } __bic_SR_register_on_exit(LPM3_bits); // Exit LPM3 } } //万年历程序 void Set_DT(void) { if(Date_Time[0]>59)//秒进位 { Date_Time[1]++; Date_Time[0]=0; } if(Date_Time[1]>59)//分进位 { Date_Time[2]++; Date_Time[1]=0; } if(Date_Time[2]>23)//小时进位 { Date_Time[3]++; Date_Time[2]=0; } //常31天情况 if((Date_Time[4]==1)||(Date_Time[4]==3)||(Date_Time[4]==5)||(Date_Time[4]==7)||(Date_Time[4]==8)||(Date_Time[4]==10)||(Date_Time[4]==12)) { if(Date_Time[3]>31) { Date_Time[3]=1; Date_Time[4]++; } if(Date_Time[4]>12) { Date_Time[4]=1; Date_Time[5]++; } if(Date_Time[5]>99)Date_Time[5]=0; } //常30天情况 if((Date_Time[4]==4)||(Date_Time[4]==6)||(Date_Time[4]==9)||(Date_Time[4]==11)) { if(Date_Time[3]>30) { Date_Time[3]=1; Date_Time[4]++; } } //2月特殊情况 if(Date_Time[4]==2) { if((Date_Time[5]%4==0&&Date_Time[5]%100!=0) ||(Date_Time[5]%400==0))//闰年 { if(Date_Time[3]>29) { Date_Time[3]=1; Date_Time[4]++; } } else { if(Date_Time[3]>28) { Date_Time[3]=1; Date_Time[4]++; } } } } void FRAM_Write (uint16_t FRAM_START,uint8_t *(Array),uint8_t Array_Long) { SYSCFG0 &= ~DFWP; //Close FRAM Write Protection //FRAM_Date_START=*0x1800; for (uint8_t i = 0; i < Array_Long; i++) { *(uint8_t *)(FRAM_START+i)=Array[i];// } SYSCFG0 |= DFWP; //Open FRAM Write Protection } void FRAM_Read (uint16_t FRAM_START,uint8_t *(Array),uint8_t Array_Long) { for (uint8_t i = 0; i < Array_Long; i++) { Array[i]=*(uint8_t *)(FRAM_START+i); } }