void geiger_calc_fon(void) { DataUpdate.Need_fon_update=DISABLE; DataUpdate.Need_display_update=ENABLE; if(fon_level>Settings.Alarm_level && Settings.Alarm_level>0 && Alarm.Alarm_active==DISABLE) { Alarm.Alarm_active=ENABLE; Alarm.User_cancel=DISABLE; if(Power.Display_active==DISABLE) { screen=1; Power.sleep_time=Settings.Sleep_time; Power.led_sleep_time=Settings.Sleep_time-3; sleep_mode(DISABLE); sound_activate(); } else sound_activate(); } if((Alarm.Alarm_active && fon_level<Settings.Alarm_level) || (Alarm.Alarm_active && Settings.Alarm_level==0)) { sound_deactivate(); Power.Sound_active=DISABLE; Alarm.Alarm_active=DISABLE; Alarm.User_cancel=DISABLE; Alarm.Alarm_beep_count=0; } }
void check_wakeup_keys() { if ((!GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_3) && GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_4) && !GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_6)) || Power.Display_active) { sound_activate(); Power.sleep_time=Settings.Sleep_time; Power.led_sleep_time=Settings.Sleep_time-3; } }
// ======================================================= // Прерывание по импульсу от датчикав 1 и кнопки 2 void EXTI9_5_IRQHandler(void) { extern __IO uint8_t Receive_Buffer[64]; extern __IO uint32_t Receive_length ; extern __IO uint32_t length ; #ifdef debug Wakeup.sensor_wakeup++; #endif if(EXTI_GetITStatus(EXTI_Line8) != RESET) { EXTI_ClearITPendingBit(EXTI_Line8); if(!poweroff_state) { Detector_massive[Detector_massive_pointer]++; // Добавляем пойманную частицу к счетчику ram_Doze_massive[0]++; // Увеличение суточного массива дозы if(Power.Pump_active==DISABLE) { if(last_count_pump_on_impulse>3) { pump_on_impulse=ENABLE; Pump_now(ENABLE); } else last_count_pump_on_impulse++; } if(Settings.Sound && !(Alarm.Alarm_active && !Alarm.User_cancel)) { if(Power.Display_active) { sound_activate(); } } } } if(EXTI_GetITStatus(EXTI_Line6) != RESET) { EXTI_ClearITPendingBit(EXTI_Line6); if(!poweroff_state) { if(Power.Display_active) { key|=0x2; // Кнопка + } Sound_key_pressed=ENABLE; check_wakeup_keys(); } } #ifdef version_401 if(EXTI_GetITStatus(EXTI_Line9) != RESET) // Подключено USB { EXTI_ClearITPendingBit(EXTI_Line9); if(!poweroff_state) { sound_activate(); Power.sleep_time=Settings.Sleep_time; Power.led_sleep_time=Settings.Sleep_time-3; } } #endif }
int main(void) { NVIC_SetVectorTable(NVIC_VectTab_FLASH,0x3000); set_msi(); DBGMCU_Config(DBGMCU_SLEEP | DBGMCU_STANDBY | DBGMCU_STOP, DISABLE); set_bor(); Power.sleep_now=DISABLE; DataUpdate.Need_erase_flash=ENABLE; Settings.Geiger_voltage=360; // Напряжение на датчике 360 вольт Settings.Pump_Energy=350; // энергия накачки 350 мТл DataUpdate.current_flash_page=0; io_init(); // Инициализация потров МК eeprom_write_default_settings(); // Проверка, заполнен ли EEPROM eeprom_read_settings(); // Чтение настроек из EEPROM screen=1; Power.USB_active=DISABLE; Power.sleep_time=Settings.Sleep_time; Power.Display_active=ENABLE; ADCData.DAC_voltage_raw=0x610; dac_init(); comp_init(); comp_on(); timer9_Config(); // Конфигурируем таймер накачки timer10_Config(); tim2_Config(); sound_activate(); delay_ms(100); sound_deactivate(); //-------------------------------------------------------------------- RTC_Config(); // Конфигурируем часы //-------------------------------------------------------------------- // инициализация дисплея //-------------------------------------------------------------------- delay_ms(50); // подождать установки напряжения display_on(); LcdInit(); LcdClear(); //-------------------------------------------------------------------- adc_init(); delay_ms(100); adc_calibration(); delay_ms(10); //-------------------------------------------------------------------- EXTI8_Config(); #ifdef version_401 EXTI9_Config(); #endif EXTI3_Config(); EXTI4_Config(); EXTI6_Config(); DataUpdate.Need_batt_voltage_update=ENABLE; if(!GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_6))hidden_menu=ENABLE; // Открытие сервисных пунктов меню delay_ms(500); // подождать установки напряжения while(1) ///////////////////////////////// { if(DataUpdate.Need_fon_update==ENABLE) geiger_calc_fon(); if(key>0) keys_proccessing(); if(DataUpdate.Need_batt_voltage_update) adc_check_event(); //////////////////////////////////////////////////// if((Power.sleep_time>0)&(!Power.Display_active))sleep_mode(DISABLE); // Если дисплей еще выключен, а счетчик сна уже отсчитывает, поднимаем напряжение и включаем дисплей if(Power.Display_active) { if(Power.sleep_time==0 && !Alarm.Alarm_active) sleep_mode(ENABLE); // Счетчик сна досчитал до нуля, а дисплей еще активен, то выключаем его и понижаем напряжение if(Power.led_sleep_time>0) { GPIO_ResetBits(GPIOC,GPIO_Pin_13);// Включаем подсветку } else { GPIO_SetBits(GPIOC,GPIO_Pin_13);// Выключаем подсветку } if(DataUpdate.Need_display_update==ENABLE) { DataUpdate.Need_display_update=DISABLE; LcdClear_massive(); if (screen==1)main_screen(); if (screen==2)menu_screen(); if (screen==3)stat_screen(); } /////////////////////////////////////////////////////////////////////////////// } #ifdef version_401 if((!Power.USB_active) && (GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_9))){ usb_activate(0x0); // Если питание USB начало подаваться включаем USB } #endif if(!Power.USB_active) // если USB не активен, можно уходить в сон { if(current_pulse_count<30) // Если счетчик не зашкаливает, то можно уйти в сон { if(!Power.Pump_active && !Power.Sound_active) { PWR_EnterSTOPMode(PWR_Regulator_LowPower, PWR_STOPEntry_WFI); // Переходим в сон #ifdef debug Wakeup.total_wakeup++; DataUpdate.Need_display_update=ENABLE; #endif } else { PWR_EnterSleepMode(PWR_Regulator_ON, PWR_SLEEPEntry_WFI); #ifdef debug Wakeup.total_wakeup++; DataUpdate.Need_display_update=ENABLE; #endif } } }else USB_work(); // если USB активен, попробовать передать данные #ifdef debug Wakeup.total_cycle++; DataUpdate.Need_display_update=ENABLE; #endif } /////////////////////////////////////////////////////////////////////////////// }