





HAL_NVIC_DisableIRQ(EXTI2_IRQn); //запрещаем прерывания от кнопки энкодера
btn_try_push_int=0;
HAL_TIM_Base_Start_IT(&htim1);
HAL_TIM_Base_Start_IT(&htim2);
HAL_LPTIM_Encoder_Start(&hlptim1, 0xFFFF);
LPTIM1->CNT = 0xFFFF/2;
state_enc_old = HAL_LPTIM_ReadCounter(&hlptim1);
HAL_ADC_Start_DMA(&hadc1, ADC_buf, 2);
HAL_RTCEx_SetWakeUpTimer_IT(&hrtc, 6000, RTC_WAKEUPCLOCK_RTCCLK_DIV16);
POWER_BLE(0);
POWER_OLED(1);
ssd1331_init();
accel.Accelerometer_ = Accelerometer_;
accel.Accelerometer_(ACCEL_ADDRESS_V1, &(accel.LIS331DLH_TWI));
gyro.Gyroscope_ = Gyroscope_;
gyro.Gyroscope_(GYRO_ADDRESS_V1, &(gyro.L3G4200D_TWI));
compass.Compass_ = Compass_;
compass.Compass_(COMPASS_ADDRESS_V1, &(compass.LIS3MDL_TWI));
barometer.Barometer_ = Barometer_;
barometer.Barometer_(BARO_ADDRESS_V1, &(barometer.LPS331));
accel.LIS331DLH_TWI.begin(&(accel.LIS331DLH_TWI));
gyro.L3G4200D_TWI.begin(&(gyro.L3G4200D_TWI));

int enc_counter=0;
while (1)
{
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
//считывание сенсоров
if(to_update_imu==1 || to_update_imu_sleep==1)
{
//считываем IMU
// считываем данные с акселерометра в единицах G
accel.LIS331DLH_TWI.readGXYZ(&ax, &ay, &az, &(accel.LIS331DLH_TWI));
float GX=0, GY=0, GZ=0;
// считываем данные с гироскопа в радианах в секунду
gyro.L3G4200D_TWI.readRadPerSecXYZ(&gx, &gy, &gz, &(gyro.L3G4200D_TWI));
#define AX_MIN -0.8
#define AX_MAX -0.4
#define AY_MIN -0.20
#define AY_MAX 0.20
#define AZ_MIN -1.0
#define AZ_MAX -0.50
if( ax > AX_MIN && ax < AX_MAX && ay > AY_MIN && ay < AY_MAX && az > AZ_MIN && az < AZ_MAX )
{// положение "смотрим на часы"
try_sensor_to_active = 1;
}
to_update_imu=0;
to_update_imu_sleep=0;
} 3. Формируем событие «смотрим на часы» при попадании в нужный диапазон
4. Модернизируем режим to sleep:

POWER_OFF(void)
{
POWER_OLED(0);
POWER_BLE(0);
HAL_TIM_PWM_Stop(&htim5, TIM_CHANNEL_4);
HAL_GPIO_WritePin(LED_ON_GPIO_Port, LED_ON_Pin, GPIO_PIN_RESET);
HAL_GPIO_WritePin(VIBRO_ON_GPIO_Port, VIBRO_ON_Pin, GPIO_PIN_RESET);
btn_try_push_int=0;
HAL_NVIC_EnableIRQ(EXTI2_IRQn); //разрешаем прерывания от кнопки энкодера
to_update_imu_sleep =1 ; //разрешаем немедленное чтение сенсоров
//входим в режим низкого потребления
HAL_PWR_EnterSTOPMode(PWR_LOWPOWERREGULATOR_ON, PWR_STOPENTRY_WFI); //пробуждение только от внешних прерываний или wake up
//HAL_PWR_EnterSTANDBYMode();
SystemClock_Config(); //восстановление тактирования контроллера
} 
| Стартуем! |
| Дальше |
| Проверить |
| Узнать результат |
| Дальше |
| Проверить |
| Узнать результат |
| Дальше |
| Проверить |
| Узнать результат |
| Пройти еще раз |
| Пройти еще раз |
| Пройти еще раз |