//实时时钟配置 //初始化RTC时钟,同时检测时钟是否工作正常 //BKP->DR1用于保存是否第一次配置的设置 //返回0:正常 //其他:错误代码 u8 RTC_Init(void) { //检查是不是第一次配置时钟 u8 temp=0; if(BKP->DR1!=0X5050)//第一次配置 { RCC->APB1ENR|=1<<28; //使能电源时钟 RCC->APB1ENR|=1<<27; //使能备份时钟 PWR->CR|=1<<8; //取消备份区写保护 RCC->BDCR|=1<<16; //备份区域软复位 RCC->BDCR&=~(1<<16); //备份区域软复位结束 RCC->BDCR|=1<<0; //开启外部低速振荡器 while((!(RCC->BDCR&0X02))&&temp<250)//等待外部时钟就绪 { temp++; delay_ms(10); }; if(temp>=250)return 1;//初始化时钟失败,晶振有问题 RCC->BDCR|=1<<8; //LSI作为RTC时钟 RCC->BDCR|=1<<15;//RTC时钟使能 while(!(RTC->CRL&(1<<5)));//等待RTC寄存器操作完成 while(!(RTC->CRL&(1<<3)));//等待RTC寄存器同步 RTC->CRH|=0X01; //允许秒中断 while(!(RTC->CRL&(1<<5)));//等待RTC寄存器操作完成 RTC->CRL|=1<<4; //允许配置 RTC->PRLH=0X0000; RTC->PRLL=32767; //时钟周期设置(有待观察,看是否跑慢了?)理论值:32767 Auto_Time_Set(); //RTC_Set(2009,12,2,10,0,55); //设置时间 RTC->CRL&=~(1<<4); //配置更新 while(!(RTC->CRL&(1<<5))); //等待RTC寄存器操作完成 BKP->DR1=0X5050; //BKP_Write(1,0X5050);;//在寄存器1标记已经开启了 //printf("FIRST TIME\n"); }else//系统继续计时 { while(!(RTC->CRL&(1<<3)));//等待RTC寄存器同步 RTC->CRH|=0X01; //允许秒中断 while(!(RTC->CRL&(1<<5)));//等待RTC寄存器操作完成 //printf("OK\n"); } MY_NVIC_Init(0,0,RTC_IRQChannel,2);//RTC,G2,P2,S2.优先级最低 RTC_Get();//更新时间 return 0; //ok }
/**@brief Function for application main entry. */ int main(void) { // Initialize // nrf_gpio_cfg_output(23); // nrf_gpio_pin_write(23, 0); // nrf_gpio_pin_write(23, 1); // nrf_delay_ms(1000); // nrf_gpio_pin_write(23, 0); uart_init(); leds_init(); timers_init(); gpiote_init(); buttons_init(); app_button_enable(); wdt_init(); #ifdef DEBUG_LOG printf("uart_init\r\n"); printf("leds_init\r\n"); printf("timers_init\r\n"); printf("gpiote_init\r\n"); printf("buttons_init\r\n"); printf("wdt_init\r\n"); #endif bond_manager_init(); ble_stack_init(); gap_params_init(); #ifdef DEBUG_LOG printf("bond_manager_init\r\n"); printf("ble_stack_init\r\n"); printf("gap_params_init\r\n"); #endif advertising_init(BLE_GAP_ADV_FLAGS_LE_ONLY_LIMITED_DISC_MODE); services_init(); conn_params_init(); sec_params_init(); radio_notification_init(); #ifdef DEBUG_LOG printf("advertising_init\r\n"); printf("services_init\r\n"); printf("conn_params_init\r\n"); printf("radio_notification_init\r\n"); #endif advertising_start(); #ifdef DEBUG_LOG printf("advertising_start\r\n"); #endif HTU21D_Init(); #ifdef DEBUG_LOG printf("HTU21D_Init\r\n"); printf("OLED_Init\r\n"); #endif my_timer_init(); Auto_Time_Set(); #ifdef DEBUG_LOG printf("rtc my_timer_init\r\n"); printf("Auto_Time_Set\r\n"); #endif wdt_start(); #ifdef DEBUG_LOG printf("wdt_start\r\n"); printf("Enter main loop\r\n"); #endif OLED_POWER_CONTROL(1); nrf_delay_ms(2000); OLED_POWER_CONTROL(0); for (;;) { updata_by_min(); updata_by_hour(); power_manage(); } }