// =============================================================================================== void Pump_now(FunctionalState pump) { if(pump==ENABLE && !Power.Pump_deny) { Power.Pump_active=ENABLE; dac_on(); // Включаем ЦАП TIM9->EGR |= 0x0001; // Устанавливаем бит UG для принудительного сброса счетчика TIM_ClearITPendingBit(TIM9, TIM_IT_Update); TIM_CCxCmd(TIM9, TIM_Channel_1, TIM_CCx_Enable); // разрешить накачку TIM_ITConfig(TIM9, TIM_IT_Update, ENABLE); comp_on(); // Включаем компаратор } else { TIM_CCxCmd(TIM9, TIM_Channel_1, TIM_CCx_Disable); // запретить накачку TIM_ITConfig(TIM9, TIM_IT_Update, DISABLE); pump_counter_avg_impulse_by_1sec[0]++; comp_off(); // Выключаем компаратор dac_off(); // Выключаем ЦАП TIM_ClearITPendingBit(TIM9, TIM_IT_Update); Power.Pump_active=DISABLE; } }
// ======================================================= // Прерывание при конце интервала одного импульса накачки void TIM9_IRQHandler(void) { #ifdef debug Wakeup.tim9_wakeup++; #endif if((TIM9->CCER & (TIM_CCx_Enable << TIM_Channel_1)) && !poweroff_state) { current_pulse_count++; pump_counter_avg_impulse_by_1sec[0]++; if(COMP->CSR & COMP_CSR_INSEL) // если компаратор активен { if(Power.Pump_active==DISABLE) Pump_now(DISABLE); }else{ comp_on(); } } TIM_ClearITPendingBit(TIM9, TIM_IT_Update); }
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 } /////////////////////////////////////////////////////////////////////////////// }