38
+ − 1 /**
+ − 2 ******************************************************************************
+ − 3 * @copyright heinrichs weikamp
+ − 4 * @file base.c including main()
+ − 5 * @author heinrichs weikamp gmbh
+ − 6 * @date 15-Aug-2014
+ − 7 * @version V1.0.3
+ − 8 * @since 21-Nov-2014
+ − 9 * @brief The beginning of it all. main() is part of this.
+ − 10 * + Do the inits for hardware
+ − 11 * + Do the inits for sub-systems like menu, dive screen etc.
+ − 12 * + Start IRQs
+ − 13 * + Start MainTasks not in IRQs
+ − 14 * @bug
+ − 15 * @warning
+ − 16 @verbatim
+ − 17 ==============================================================================
286
+ − 18 ##### What about hardware without 8 MHz oscillator #####
38
+ − 19 ==============================================================================
+ − 20 [..] modify OTP Byte 1 at 0x1FFF7800 with ST-Link utility
+ − 21
+ − 22 ==============================================================================
+ − 23 ##### Where is the RTE Firmware version #####
+ − 24 ==============================================================================
+ − 25 [..] in baseCPU2.c <just here below :->
+ − 26
+ − 27 ==============================================================================
+ − 28 ##### What to do with the RTE Firmware version #####
+ − 29 ==============================================================================
+ − 30 [..] change the values RTErequiredHigh and RTErequiredLow in settings.c
+ − 31 to start warning via the firmware if not updated
+ − 32
+ − 33 ==============================================================================
+ − 34 ##### What it does #####
+ − 35 ==============================================================================
286
+ − 36 [..] All realtime stuff and all what has to be done during sleep
38
+ − 37
+ − 38 [..] RealTimeClock. The entire time and date handling (including divetime)
+ − 39 [..] Hardware control for pressure sensor, compass, battery monitor
+ − 40 [..] Calculations of tissue load, critical radius, otu, cns
+ − 41 [..] Switching off the power of the main CPU after request from it.
+ − 42
+ − 43 ==============================================================================
+ − 44 ##### IRQs #####
+ − 45 ==============================================================================
+ − 46 [..] The IRQs are are only used for SystemTick and SPI TransferComplete after
+ − 47 DMA data reception.
+ − 48
+ − 49 [..] HAL_SPI_TxRxCpltCallback() restarts DMA and will call
+ − 50 scheduleSpecial_Evaluate_DataSendToSlave() only if it is not blocked
239
+ − 51 by I2C.
38
+ − 52 If the evaluation is blocked it has to be tested and executed afterwards.
+ − 53 I2C is executed _without_ the usage of interrupts.
+ − 54
+ − 55 ==============================================================================
+ − 56 ##### Main loop #####
+ − 57 ==============================================================================
+ − 58 [..] is a combination of the while loop below in main.c and code in scheduler.c
+ − 59 It is similar to the DR5 code / logic - in contrast to the main CPU
+ − 60 Switching the state is done via global.mode
+ − 61 The loops in scheduler all run in the main execution thread without
+ − 62 any job stacks (like it was in the DR5).
+ − 63
+ − 64 ==============================================================================
+ − 65 ##### Real Time Clock #####
+ − 66 ==============================================================================
286
+ − 67 The RTC is a separate part of hardware inside the CPU and is not affected
38
+ − 68 by reset. Only power-on reset does change something.
+ − 69 This is fine but the RTC is vital for the Sleep mode as Wakeuptimer.
+ − 70 This is the only date/time system in the OSTC. The main CPU is passive.
286
+ − 71 Data transfer is done with localtime_rtc_tr and localtime_rtc_dr
38
+ − 72 in HAL_RTC format to the main CPU and as HAL_RTC structs the way back for
+ − 73 setting the actual time and date.
+ − 74 The RTC unit has 20 Byte of V_bat powered SRAM. It could be used
286
+ − 75 for something useful in both CPUs.
38
+ − 76
+ − 77 ==============================================================================
+ − 78 ##### File system #####
+ − 79 ==============================================================================
+ − 80 [..] some files are used for both CPUs, like decom.c/.h, data_central.h, ...
+ − 81
+ − 82
+ − 83 ==============================================================================
+ − 84 ##### Unique device ID register (96 bits) #####
+ − 85 ==============================================================================
+ − 86 [..] some files are used for both CPUs, like decom.c/.h, data_central.h, ...
+ − 87
+ − 88
+ − 89 ==============================================================================
+ − 90 ##### I2C #####
+ − 91 ==============================================================================
+ − 92 [..] used for pressure, compass, (accelerator) and battery gauge
+ − 93 main cpu and pic (button) is spi
+ − 94
+ − 95
+ − 96 ==============================================================================
+ − 97 ##### Firmware Update Info #####
+ − 98 ==============================================================================
+ − 99 V0.85 160531 scheduleCheck_pressure_reached_dive_mode_level() changes
286
+ − 100 160606 global.no_fly_time_minutes is at least 24h after the dive
38
+ − 101 160613 ambient light fixed
+ − 102 160720 compass calib to Flash (8000 writes max. as erase has problems)
+ − 103 160829 do not reset main CPU on power on!
+ − 104 V0.91 161018 pressure_calculation_AN520_004_mod_MS5803_30BA__09_2015();
+ − 105 V0.92+ 161020 global.sensorError[MAX_SENSORS]
+ − 106 fix missing init_pressure(); at powerUp of RTE
+ − 107 added HAL_StatusTypeDef for many functions in pressure.c
+ − 108 161024 no_fly_time_minutes Backup FIX
+ − 109 seconds_since_last_dive now related to RTC clock
+ − 110 161121 close to surface starts at 1 meter below last known surface pressure
286
+ − 111 161121 in surface mode dive mode starts @1 mtr difference if surface 880 hPa instead of 700 hPa before
38
+ − 112 V0.97+ 170213 added global.dataSendToSlave.diveModeInfo for DIVEMODE_Apnea
+ − 113 added global.dataSendToSlave.setEndDive
+ − 114 DIVEMODE_Apnea special in scheduler.c (ticksdiff >= 1000) -> no tissue, cns, otu, no change in noFly Time etc.
+ − 115 V0.99 170320 new HAL Driver Repository
+ − 116 V1.01 170509 old HAL Driver Repository
+ − 117
+ − 118 @endverbatim
+ − 119 ******************************************************************************
+ − 120 * @attention
+ − 121 *
+ − 122 * <h2><center>© COPYRIGHT(c) 2017 heinrichs weikamp</center></h2>
+ − 123 *
+ − 124 ******************************************************************************
+ − 125 */
+ − 126
+ − 127 //#define DEBUG_PIN_ACTIVE
+ − 128 /* Includes ------------------------------------------------------------------*/
+ − 129
+ − 130 #include "baseCPU2.h"
+ − 131
+ − 132 // From Small_CPU/Inc:
+ − 133 #include "dma.h"
+ − 134 #include "i2c.h"
+ − 135 #include "spi.h"
+ − 136 #include "rtc.h"
+ − 137 #include "adc.h"
936
+ − 138 #include "gpio.h"
38
+ − 139 #include "compass.h"
+ − 140 #include "pressure.h"
+ − 141 #include "batteryGasGauge.h"
+ − 142 #include "batteryCharger.h"
+ − 143 #include "scheduler.h"
+ − 144 #include "tm_stm32f4_otp.h"
554
+ − 145 #include "externalInterface.h"
662
+ − 146 #include "uart.h"
922
+ − 147 #include "uart_Internal.h"
936
+ − 148 #include "uartProtocol_GNSS.h"
889
+ − 149 #include "GNSS.h"
938
+ − 150 #include "configuration.h"
889
+ − 151
38
+ − 152
+ − 153 // From Common/Inc:
+ − 154 #include "calc_crush.h"
+ − 155 #include "decom.h"
+ − 156 #include "FirmwareData.h"
+ − 157
+ − 158 // From Common/Drivers/
+ − 159 #include <stdio.h>
+ − 160
889
+ − 161
433
+ − 162 uint8_t coldstart __attribute__((section (".noinit")));
+ − 163
89
+ − 164 uint8_t hasExternalClock(void) {
+ − 165 if ((TM_OTP_Read(0, 0) > 0) && (TM_OTP_Read(0, 0) < 0xFF))
+ − 166 return 1;
+ − 167 else
+ − 168 return 0;
38
+ − 169 }
+ − 170
+ − 171 // SHALL LOAD AT 0x08000000 + 0x00005000 = 0x08005000.
+ − 172 // See CPU2-RTE.ld
100
+ − 173 const SFirmwareData cpu2_FirmwareData __attribute__(( section(".firmware_data") ))= {
728
+ − 174 .versionFirst = 3,
899
+ − 175 .versionSecond = 4,
762
+ − 176 .versionThird = 0,
968
+ − 177 .versionBeta = 0,
38
+ − 178
89
+ − 179 /* 4 bytes with trailing 0 */
100
+ − 180 .signature = "mh",
38
+ − 181
968
+ − 182 .release_year = 25,
+ − 183 .release_month = 1,
+ − 184 .release_day = 18,
100
+ − 185 .release_sub = 0,
38
+ − 186
89
+ − 187 /* max 48 with trailing 0 */
+ − 188 //release_info ="12345678901234567890123456789012345678901"
768
+ − 189 .release_info = "stable April 2023",
38
+ − 190
89
+ − 191 /* for safety reasons and coming functions */
+ − 192 .magic[0] = FIRMWARE_MAGIC_FIRST, .magic[1] = FIRMWARE_MAGIC_SECOND,
+ − 193 .magic[2] = FIRMWARE_MAGIC_CPU2_RTE, /* the magic byte for RTE */
433
+ − 194 .magic[3] = FIRMWARE_MAGIC_END
+ − 195 };
+ − 196
38
+ − 197
89
+ − 198 uint8_t firmwareVersionHigh(void) {
+ − 199 return cpu2_FirmwareData.versionFirst;
38
+ − 200 }
+ − 201
89
+ − 202 uint8_t firmwareVersionLow(void) {
+ − 203 return cpu2_FirmwareData.versionSecond;
38
+ − 204 }
+ − 205
+ − 206 /** @addtogroup OSTC4
+ − 207 * @{
+ − 208 */
+ − 209
+ − 210 /** @addtogroup CPU2
+ − 211 * @{
+ − 212 */
+ − 213
+ − 214 /* Private typedef -----------------------------------------------------------*/
+ − 215 /* Private define ------------------------------------------------------------*/
+ − 216 #define BUTTON_OSTC_GPIO_PIN GPIO_PIN_0
+ − 217 #define BUTTON_OSTC_GPIO_PORT GPIOA
+ − 218 #define BUTTON_OSTC_HAL_RCC_GPIO_CLK_ENABLE() __HAL_RCC_GPIOA_CLK_ENABLE()
+ − 219 #define BUTTON_OSTC_IRQn EXTI0_IRQn
+ − 220
662
+ − 221
38
+ − 222 /* Private macro -------------------------------------------------------------*/
+ − 223
+ − 224 /* Private variables ---------------------------------------------------------*/
+ − 225 uint32_t global_test_time_counter = 0;
+ − 226 SBackup backup;
+ − 227
+ − 228 /* Private function prototypes -----------------------------------------------*/
+ − 229 static void EXTI_Wakeup_Button_Init(void);
+ − 230 static void EXTI_Wakeup_Button_DeInit(void);
+ − 231
183
+ − 232 #ifdef DEBUG_I2C_LINES
38
+ − 233 void GPIO_test_I2C_lines(void);
183
+ − 234 #endif
38
+ − 235
+ − 236 void sleep_prepare(void);
+ − 237
+ − 238 void SystemClock_Config(void);
+ − 239 void SystemClock_Config_HSI(void);
+ − 240 void SystemClock_Config_HSE(void);
+ − 241 void SYSCLKConfig_STOP_HSI(void);
+ − 242 void SYSCLKConfig_STOP_HSE(void);
+ − 243
+ − 244 void GPIO_new_DEBUG_Init(void);
+ − 245 void GPIO_new_DEBUG_LOW(void);
+ − 246 void GPIO_new_DEBUG_HIGH(void);
+ − 247
+ − 248 #define REGULAR_RUN
+ − 249
89
+ − 250 int __io_putchar(int ch) {
+ − 251 ITM_SendChar(ch);
+ − 252 return ch;
38
+ − 253 }
+ − 254
+ − 255 /* Private functions ---------------------------------------------------------*/
+ − 256
+ − 257 /**
+ − 258 * @brief Main program
+ − 259 * @param None
+ − 260 * @retval None
+ − 261 */
120
+ − 262 /* #define DEBUG_RUNTIME TRUE */
+ − 263 #ifdef DEBUG_RUNTIME
+ − 264 #define MEASURECNT 60 /* number of measuremets to be stored */
+ − 265 static uint32_t loopcnt[MEASURECNT];
+ − 266 extern RTC_HandleTypeDef RTCHandle;
+ − 267 #endif
38
+ − 268
89
+ − 269 int main(void) {
120
+ − 270
+ − 271 #ifdef DEBUG_RUNTIME
+ − 272 RTC_TimeTypeDef Stime;
+ − 273 uint8_t measurementindex = 0;
+ − 274 uint8_t lastsecond = 0xFF;
+ − 275 #endif
+ − 276
917
+ − 277 uint8_t extInterfaceActive = 0;
936
+ − 278 uint32_t shutdownTick = 0;
917
+ − 279
89
+ − 280 HAL_Init();
+ − 281 SystemClock_Config();
38
+ − 282
89
+ − 283 HAL_SYSTICK_Config(HAL_RCC_GetHCLKFreq() / 1000);
+ − 284 HAL_SYSTICK_CLKSourceConfig( SYSTICK_CLKSOURCE_HCLK);
+ − 285 HAL_NVIC_SetPriority(SysTick_IRQn, 0, 0);
38
+ − 286
89
+ − 287 MX_RTC_init();
880
+ − 288 GPIO_LEDs_VIBRATION_Init();
938
+ − 289 GPIO_GNSS_Init();
89
+ − 290 GPIO_new_DEBUG_Init(); // added 170322 hw
+ − 291 initGlobals();
38
+ − 292
120
+ − 293 /* printf("CPU2-RTE running...\n"); */
38
+ − 294
329
+ − 295 HAL_Delay(100);
+ − 296
89
+ − 297 MX_I2C1_Init();
329
+ − 298 if (global.I2C_SystemStatus != HAL_OK)
+ − 299 {
89
+ − 300 if (MX_I2C1_TestAndClear() == GPIO_PIN_RESET) {
+ − 301 MX_I2C1_TestAndClear(); // do it a second time
+ − 302 }
488
+ − 303 HAL_Delay(100);
+ − 304 I2C_DeInit();
+ − 305 HAL_Delay(100);
89
+ − 306 MX_I2C1_Init();
488
+ − 307 HAL_Delay(100);
89
+ − 308 }
38
+ − 309
329
+ − 310
+ − 311
89
+ − 312 //dangerous: TM_OTP_Write(0,0, 0x01);
38
+ − 313 #ifdef REGULAR_RUN
89
+ − 314 global.sensorError[SENSOR_PRESSURE_ID] = init_pressure();
+ − 315 global.I2C_SystemStatus = global.sensorError[SENSOR_PRESSURE_ID];
329
+ − 316 if (global.I2C_SystemStatus != HAL_OK)
+ − 317 {
89
+ − 318 if (MX_I2C1_TestAndClear() == GPIO_PIN_RESET) {
+ − 319 MX_I2C1_TestAndClear(); // do it a second time
+ − 320 }
488
+ − 321 HAL_Delay(100);
+ − 322 I2C_DeInit();
+ − 323 HAL_Delay(100);
89
+ − 324 MX_I2C1_Init();
488
+ − 325 HAL_Delay(100);
89
+ − 326 global.sensorError[SENSOR_PRESSURE_ID] = init_pressure();
+ − 327 global.I2C_SystemStatus = global.sensorError[SENSOR_PRESSURE_ID];
+ − 328 }
38
+ − 329
89
+ − 330 global.dataSendToMaster.sensorErrors =
+ − 331 global.sensorError[SENSOR_PRESSURE_ID];
329
+ − 332
+ − 333 if(is_init_pressure_done())
+ − 334 {
339
37f45300bc2e
Apply averaging to pressure measurement: In pre versions calculated pressure value jittered +/-10hPa. Since we measure the pressure several time a second but only use one value a second, calc average including not used values
ideenmodellierer
diff
changeset
+ − 335 init_surface_ring(0);
329
+ − 336 }
89
+ − 337 init_battery_gas_gauge();
+ − 338 HAL_Delay(10);
+ − 339 battery_gas_gauge_get_data();
473
+ − 340
662
+ − 341 global.lifeData.battery_voltage = get_voltage();
+ − 342 global.lifeData.battery_charge = get_charge();
+ − 343 copyBatteryData();
+ − 344
473
+ − 345 MX_SPI3_Init();
+ − 346
+ − 347 if(coldstart != 0xA5) /* Not reading a 0xA5 means the memory cells has not been initialized before => cold start */
433
+ − 348 {
+ − 349 coldstart = 0xA5;
662
+ − 350
+ − 351 set_charge_state(Charger_ColdStart);
+ − 352
473
+ − 353 global.dataSendToMaster.power_on_reset = 1;
+ − 354 global.deviceDataSendToMaster.power_on_reset = 1;
+ − 355
+ − 356 if (!scheduleSetButtonResponsiveness())
+ − 357 {
763
+ − 358 HAL_Delay(10);
473
+ − 359 if (!scheduleSetButtonResponsiveness()) // send again, if problem it's not my problem here.
+ − 360 {
763
+ − 361 HAL_Delay(10);
473
+ − 362 scheduleSetButtonResponsiveness(); // init
763
+ − 363 HAL_Delay(10);
473
+ − 364 }
+ − 365 }
433
+ − 366 }
662
+ − 367 else
+ − 368 {
+ − 369 set_charge_state(Charger_NotConnected);
+ − 370 }
38
+ − 371
89
+ − 372 ADCx_Init();
+ − 373 GPIO_Power_MainCPU_Init();
662
+ − 374
+ − 375 externalInterface_InitPower33();
+ − 376
89
+ − 377 global.mode = MODE_POWERUP;
38
+ − 378 #else
89
+ − 379 init_pressure();
339
37f45300bc2e
Apply averaging to pressure measurement: In pre versions calculated pressure value jittered +/-10hPa. Since we measure the pressure several time a second but only use one value a second, calc average including not used values
ideenmodellierer
diff
changeset
+ − 380 init_surface_ring(0);
38
+ − 381
89
+ − 382 ADCx_Init();
+ − 383 GPIO_Power_MainCPU_Init();
+ − 384 global.mode = MODE_TEST;
38
+ − 385 #endif
89
+ − 386 while (1) {
120
+ − 387 /* printf("Global mode = %d\n", global.mode); */
38
+ − 388
89
+ − 389 switch (global.mode) {
+ − 390 case MODE_POWERUP:
+ − 391 case MODE_BOOT:
+ − 392 // ReInit_battery_charger_status_pins();
+ − 393 compass_init(0, 7);
+ − 394 accelerator_init();
554
+ − 395 externalInterface_Init();
181
+ − 396
89
+ − 397 if (global.mode == MODE_BOOT) {
+ − 398 GPIO_Power_MainCPU_OFF();
922
+ − 399 #ifdef ENABLE_GPIO_V2
880
+ − 400 GPIO_LED_GREEN_ON();
903
+ − 401 #endif
89
+ − 402 HAL_Delay(100); // for GPIO_Power_MainCPU_ON();
+ − 403 GPIO_Power_MainCPU_ON();
922
+ − 404 #ifdef ENABLE_GPIO_V2
880
+ − 405 GPIO_LED_GREEN_OFF();
+ − 406
+ − 407 GPIO_LED_RED_ON();
900
+ − 408 GPIO_VIBRATION_ON();
903
+ − 409 #endif
880
+ − 410 HAL_Delay(100);
922
+ − 411 #ifdef ENABLE_GPIO_V2
880
+ − 412 GPIO_LED_RED_OFF();
+ − 413 GPIO_VIBRATION_OFF();
903
+ − 414 #endif
89
+ − 415 }
922
+ − 416 #ifdef ENABLE_GPIO_V2
900
+ − 417 GPIO_LED_RED_OFF();
+ − 418 GPIO_LED_GREEN_OFF();
+ − 419 GPIO_VIBRATION_OFF();
903
+ − 420 #endif
89
+ − 421 SPI_synchronize_with_Master();
+ − 422 MX_DMA_Init();
+ − 423 MX_SPI1_Init();
134
+ − 424 SPI_Start_single_TxRx_with_Master(); /* be prepared for the first data exchange */
207
+ − 425 Scheduler_Request_sync_with_SPI(SPI_SYNC_METHOD_HARD);
889
+ − 426
922
+ − 427 #ifdef ENABLE_GPIO_V2
889
+ − 428 // GNSS tests
+ − 429 GNSS_IO_init();
900
+ − 430 GPIO_GPS_ON();
+ − 431 GPIO_GPS_BCKP_ON();
889
+ − 432 MX_USART6_UART_Init();
+ − 433 GNSS_Init(&GNSS_Handle, &huart6);
932
+ − 434 #else
+ − 435 #ifdef ENABLE_GNSS_SUPPORT
+ − 436 GNSS_Init(&GNSS_Handle, &huart1);
+ − 437 #endif
900
+ − 438 #endif
899
+ − 439
89
+ − 440 global.mode = MODE_SURFACE;
+ − 441 break;
38
+ − 442
89
+ − 443 case MODE_CALIB:
90
+ − 444 scheduleCompassCalibrationMode();
89
+ − 445 break;
+ − 446
+ − 447 case MODE_SURFACE:
+ − 448 scheduleSurfaceMode();
+ − 449 break;
38
+ − 450
89
+ − 451 case MODE_TEST:
+ − 452 break;
38
+ − 453
89
+ − 454 case MODE_DIVE:
90
+ − 455 backup.no_fly_time_minutes = global.no_fly_time_minutes;
+ − 456 backup.seconds_since_last_dive = global.seconds_since_last_dive;
+ − 457
+ − 458 vpm_init( &global.vpm, global.conservatism, global.repetitive_dive,
+ − 459 global.seconds_since_last_dive );
+ − 460 global.no_fly_time_minutes = 0;
+ − 461 global.lifeData.dive_time_seconds = 0;
+ − 462 global.lifeData.dive_time_seconds_without_surface_time = 0;
943
+ − 463 #if defined ENABLE_GNSS_SUPPORT || defined ENABLE_GPIO_V2
942
+ − 464 uartGnss_ReqPowerDown(1);
943
+ − 465 #endif
90
+ − 466 scheduleDiveMode();
+ − 467 // done now in scheduler prior to change mode: global.seconds_since_last_dive = 1;
+ − 468
+ − 469 if( global.lifeData.dive_time_seconds > 60 )
+ − 470 {
+ − 471 //No Fly time 60% of desaturationtime after dive
+ − 472 global.no_fly_time_minutes = decom_calc_desaturation_time(
+ − 473 global.lifeData.tissue_nitrogen_bar,
+ − 474 global.lifeData.tissue_helium_bar,
+ − 475 global.lifeData.pressure_surface_bar ) * 60 / 100;
+ − 476 if( global.no_fly_time_minutes < (24 * 60) )
+ − 477 global.no_fly_time_minutes = 24 * 60;
+ − 478 }
+ − 479 else
+ − 480 {
+ − 481 global.no_fly_time_minutes = backup.no_fly_time_minutes;
+ − 482 global.seconds_since_last_dive = backup.seconds_since_last_dive;
+ − 483 }
+ − 484
+ − 485 global.lifeData.dive_time_seconds = 0;
+ − 486 global.lifeData.dive_time_seconds_without_surface_time = 0;
+ − 487 global.lifeData.counterSecondsShallowDepth = 0;
+ − 488
+ − 489 backup.no_fly_time_minutes = 0;
+ − 490 backup.seconds_since_last_dive = 0;
943
+ − 491 #if defined ENABLE_GNSS_SUPPORT || defined ENABLE_GPIO_V2
942
+ − 492 uartGnss_ReqPowerDown(0);
943
+ − 493 #endif
89
+ − 494 break;
38
+ − 495
89
+ − 496 case MODE_SHUTDOWN:
+ − 497 HAL_Delay(200);
936
+ − 498
+ − 499 MX_SPI3_Init();
+ − 500
+ − 501 #if defined ENABLE_GNSS_SUPPORT || defined ENABLE_GPIO_V2
+ − 502 if(shutdownTick == 0)
+ − 503 {
+ − 504 shutdownTick = HAL_GetTick();
+ − 505 uartGnss_ReqPowerDown(1);
+ − 506 }
+ − 507 #ifdef ENABLE_GNSS_SUPPORT
+ − 508 externalInterface_HandleUART();
+ − 509 #else
+ − 510 UART6_HandleUART();
+ − 511 #endif
940
+ − 512 if((uartGnss_GetState() == UART_GNSS_INACTIVE) || (time_elapsed_ms(shutdownTick,HAL_GetTick()) > 3000))
936
+ − 513 {
+ − 514 global.mode = MODE_SLEEP;
938
+ − 515 uartGnss_ReqPowerDown(0); /* release power down request */
936
+ − 516 }
+ − 517 #else
89
+ − 518 global.mode = MODE_SLEEP;
936
+ − 519 #endif
+ − 520
+ − 521
89
+ − 522 break;
+ − 523
+ − 524 case MODE_SLEEP:
917
+ − 525 extInterfaceActive = externalInterface_isEnabledPower33();
839
+ − 526 externalInterface_SwitchUART(EXT_INTERFACE_UART_OFF);
662
+ − 527 externalInterface_SwitchPower33(false);
89
+ − 528 if (hasExternalClock())
+ − 529 SystemClock_Config_HSI();
887
+ − 530 GPIO_LEDs_VIBRATION_Init();
89
+ − 531 sleep_prepare();
38
+ − 532
940
+ − 533 while(time_elapsed_ms(shutdownTick,HAL_GetTick()) < 1000 ) /* delay shutdown till shutdown animation is finished */
+ − 534 {
+ − 535 HAL_Delay(10);
+ − 536 }
+ − 537 shutdownTick = 0;
89
+ − 538 scheduleSleepMode();
+ − 539 if (hasExternalClock())
+ − 540 SystemClock_Config_HSE();
+ − 541 EXTI_Wakeup_Button_DeInit();
+ − 542 ADCx_Init();
+ − 543 GPIO_Power_MainCPU_Init();
+ − 544 GPIO_Power_MainCPU_ON();
+ − 545 compass_init(0, 7);
+ − 546 accelerator_init();
148
+ − 547 SPI_synchronize_with_Master();
89
+ − 548 MX_DMA_Init();
+ − 549 MX_SPI1_Init();
148
+ − 550 SPI_Start_single_TxRx_with_Master();
89
+ − 551
917
+ − 552 if(extInterfaceActive)
662
+ − 553 {
+ − 554 externalInterface_SwitchPower33(true);
+ − 555 }
738
+ − 556 externalInterface_InitDatastruct();
89
+ − 557 // EXTILine0_Button_DeInit(); not now, later after testing
+ − 558 break;
+ − 559 }
120
+ − 560
+ − 561 #ifdef DEBUG_RUNTIME
+ − 562 HAL_RTC_GetTime(&RTCHandle, &Stime, RTC_FORMAT_BCD);
+ − 563
+ − 564 if(lastsecond == 0xFF)
+ − 565 {
+ − 566 measurementindex = 0;
+ − 567 loopcnt[measurementindex] = 0;
+ − 568 lastsecond = Stime.Seconds;
+ − 569 }
+ − 570 loopcnt[measurementindex]++;
+ − 571
+ − 572 if(lastsecond != Stime.Seconds)
+ − 573 {
+ − 574 measurementindex++;
+ − 575 if (measurementindex == MEASURECNT) measurementindex = 0;
+ − 576 loopcnt[measurementindex] = 0;
+ − 577 lastsecond = Stime.Seconds;
+ − 578 if(measurementindex +1 < MEASURECNT) loopcnt[measurementindex +1] = 0xffff; /* helps to identify the latest value */
+ − 579 }
+ − 580 #endif
89
+ − 581 }
38
+ − 582 }
+ − 583
+ − 584 /** @brief Button feedback - EXTI line detection callbacks
+ − 585 * @param GPIO_Pin: Specifies the pins connected EXTI line
+ − 586 * @retval None
+ − 587 */
89
+ − 588 void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin) {
38
+ − 589
89
+ − 590 if (GPIO_Pin == BUTTON_OSTC_GPIO_PIN) {
+ − 591 if (global.mode == MODE_SLEEP) {
+ − 592 global.mode = MODE_BOOT;
+ − 593 }
+ − 594 }
+ − 595 else
880
+ − 596 {
+ − 597
89
+ − 598 }
38
+ − 599 }
+ − 600
+ − 601 /**
+ − 602 * @brief System Clock Configuration
+ − 603 * The system Clock is configured as follow :
+ − 604 * System Clock source = PLL (HSI)
+ − 605 * SYSCLK(Hz) = 100 MHz
+ − 606 * HCLK(Hz) = 100 MHz
+ − 607 * AHB Prescaler = 1
+ − 608 * APB1 Prescaler = 2
+ − 609 * APB2 Prescaler = 1
+ − 610 * HSI Frequency(Hz) = 16 MHz
+ − 611 * PLL_M = 16
+ − 612 * PLL_N = 400
+ − 613 * PLL_P = 4
+ − 614 * PLL_Q = 7 // no USB
+ − 615 * VDD(V) = 3.3
+ − 616 * Main regulator output voltage = Scale1 mode
+ − 617 * Flash Latency(WS) = 3
+ − 618 * @param None
+ − 619 * @retval None
+ − 620 */
+ − 621
89
+ − 622 void SystemClock_Config(void) {
+ − 623 if (hasExternalClock())
+ − 624 SystemClock_Config_HSE();
+ − 625 else
+ − 626 SystemClock_Config_HSI();
38
+ − 627 }
+ − 628
89
+ − 629 void SYSCLKConfig_STOP(void) {
+ − 630 SYSCLKConfig_STOP_HSI();
38
+ − 631 }
+ − 632
89
+ − 633 void SystemClock_Config_HSE(void) {
+ − 634 RCC_OscInitTypeDef RCC_OscInitStruct;
+ − 635 RCC_ClkInitTypeDef RCC_ClkInitStruct;
38
+ − 636 // RCC_PeriphCLKInitTypeDef PeriphClkInitStruct;
+ − 637
89
+ − 638 __PWR_CLK_ENABLE(); // is identical to __HAL_RCC_PWR_CLK_ENABLE();
38
+ − 639
887
+ − 640 __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1);
38
+ − 641
89
+ − 642 RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE; //|RCC_OSCILLATORTYPE_LSE;
+ − 643 RCC_OscInitStruct.HSEState = RCC_HSE_ON;
+ − 644 //RCC_OscInitStruct.LSEState = RCC_LSE_ON;
+ − 645 RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
+ − 646 RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;
+ − 647 RCC_OscInitStruct.PLL.PLLM = 8;
+ − 648 RCC_OscInitStruct.PLL.PLLN = 320;
+ − 649 RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV4;
+ − 650 RCC_OscInitStruct.PLL.PLLQ = 4;
+ − 651 HAL_RCC_OscConfig(&RCC_OscInitStruct);
38
+ − 652
89
+ − 653 RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK | RCC_CLOCKTYPE_SYSCLK
+ − 654 | RCC_CLOCKTYPE_PCLK1 | RCC_CLOCKTYPE_PCLK2;
+ − 655 RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
+ − 656 RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
+ − 657 RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV2;
+ − 658 RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;
+ − 659 HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_2);
38
+ − 660
+ − 661 // PeriphClkInitStruct.PeriphClockSelection = RCC_PERIPHCLK_RTC;
+ − 662 // PeriphClkInitStruct.RTCClockSelection = RCC_RTCCLKSOURCE_LSE;
+ − 663 // HAL_RCCEx_PeriphCLKConfig(&PeriphClkInitStruct);
+ − 664
+ − 665 // HAL_SYSTICK_Config(HAL_RCC_GetHCLKFreq()/1000);
+ − 666
+ − 667 // HAL_SYSTICK_CLKSourceConfig(SYSTICK_CLKSOURCE_HCLK);
+ − 668
89
+ − 669 /* SysTick_IRQn interrupt configuration */
38
+ − 670 // HAL_NVIC_SetPriority(SysTick_IRQn, 0, 0);
+ − 671 }
+ − 672
89
+ − 673 void SystemClock_Config_HSI(void) {
+ − 674 RCC_ClkInitTypeDef RCC_ClkInitStruct;
+ − 675 RCC_OscInitTypeDef RCC_OscInitStruct;
38
+ − 676
89
+ − 677 /* Enable Power Control clock */
+ − 678 __HAL_RCC_PWR_CLK_ENABLE();
38
+ − 679
89
+ − 680 /* The voltage scaling allows optimizing the power consumption when the device is
+ − 681 clocked below the maximum system frequency, to update the voltage scaling value
+ − 682 regarding system frequency refer to product datasheet. */
887
+ − 683 __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1);
38
+ − 684
89
+ − 685 /* Enable HSI Oscillator and activate PLL with HSI as source */
+ − 686 RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI;
+ − 687 RCC_OscInitStruct.HSIState = RCC_HSI_ON;
+ − 688 RCC_OscInitStruct.HSICalibrationValue = 0x10;
+ − 689 RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
+ − 690 RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSI;
+ − 691 RCC_OscInitStruct.PLL.PLLM = 16;
+ − 692 RCC_OscInitStruct.PLL.PLLN = 320;
+ − 693 RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV4;
+ − 694 RCC_OscInitStruct.PLL.PLLQ = 4;
+ − 695 HAL_RCC_OscConfig(&RCC_OscInitStruct);
38
+ − 696
89
+ − 697 /* Select PLL as system clock source and configure the HCLK, PCLK1 and PCLK2
+ − 698 clocks dividers */
+ − 699 RCC_ClkInitStruct.ClockType = (RCC_CLOCKTYPE_SYSCLK | RCC_CLOCKTYPE_HCLK
+ − 700 | RCC_CLOCKTYPE_PCLK1 | RCC_CLOCKTYPE_PCLK2);
+ − 701 RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
+ − 702 RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
+ − 703 RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV2;
+ − 704 RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;
+ − 705 HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_2);
38
+ − 706 }
+ − 707
+ − 708
+ − 709 /**
+ − 710 * @brief Configures system clock after wake-up from STOP: enable HSI, PLL
+ − 711 * and select PLL as system clock source.
+ − 712 * @param None
+ − 713 * @retval None
+ − 714 */
89
+ − 715 void SYSCLKConfig_STOP_HSE(void) {
+ − 716 RCC_ClkInitTypeDef RCC_ClkInitStruct;
+ − 717 RCC_OscInitTypeDef RCC_OscInitStruct;
+ − 718 uint32_t pFLatency = 0;
38
+ − 719
89
+ − 720 /* Get the Oscillators configuration according to the internal RCC registers */
+ − 721 HAL_RCC_GetOscConfig(&RCC_OscInitStruct);
38
+ − 722
89
+ − 723 /* After wake-up from STOP reconfigure the system clock: Enable HSI and PLL */
+ − 724 RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;
+ − 725 RCC_OscInitStruct.HSIState = RCC_HSE_ON;
+ − 726 RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
+ − 727 HAL_RCC_OscConfig(&RCC_OscInitStruct);
38
+ − 728
89
+ − 729 /* Get the Clocks configuration according to the internal RCC registers */
+ − 730 HAL_RCC_GetClockConfig(&RCC_ClkInitStruct, &pFLatency);
38
+ − 731
89
+ − 732 /* Select PLL as system clock source and configure the HCLK, PCLK1 and PCLK2
+ − 733 clocks dividers */
+ − 734 RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_SYSCLK;
+ − 735 RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
+ − 736 HAL_RCC_ClockConfig(&RCC_ClkInitStruct, pFLatency);
38
+ − 737 }
+ − 738
89
+ − 739 void SYSCLKConfig_STOP_HSI(void) {
+ − 740 RCC_ClkInitTypeDef RCC_ClkInitStruct;
+ − 741 RCC_OscInitTypeDef RCC_OscInitStruct;
+ − 742 uint32_t pFLatency = 0;
38
+ − 743
89
+ − 744 /* Get the Oscillators configuration according to the internal RCC registers */
+ − 745 HAL_RCC_GetOscConfig(&RCC_OscInitStruct);
38
+ − 746
89
+ − 747 /* After wake-up from STOP reconfigure the system clock: Enable HSI and PLL */
+ − 748 RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI;
+ − 749 RCC_OscInitStruct.HSIState = RCC_HSI_ON;
+ − 750 RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
+ − 751 RCC_OscInitStruct.HSICalibrationValue = 0x10;
+ − 752 HAL_RCC_OscConfig(&RCC_OscInitStruct);
38
+ − 753
89
+ − 754 /* Get the Clocks configuration according to the internal RCC registers */
+ − 755 HAL_RCC_GetClockConfig(&RCC_ClkInitStruct, &pFLatency);
38
+ − 756
89
+ − 757 /* Select PLL as system clock source and configure the HCLK, PCLK1 and PCLK2
+ − 758 clocks dividers */
+ − 759 RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_SYSCLK;
+ − 760 RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
+ − 761 HAL_RCC_ClockConfig(&RCC_ClkInitStruct, pFLatency);
38
+ − 762 }
+ − 763
+ − 764 /**
+ − 765 * @brief SYSTICK callback
+ − 766 * @param None
+ − 767 * @retval None
+ − 768 */
89
+ − 769 void HAL_SYSTICK_Callback(void) {
+ − 770 HAL_IncTick();
38
+ − 771 }
+ − 772
+ − 773 /**
+ − 774 * @brief Configures GPIO for LED
+ − 775 * Might move with STM32Cube usage
+ − 776 * @param None
+ − 777 * @retval None
+ − 778 */
+ − 779 /*
+ − 780 void GPIO_test_I2C_lines(void)
+ − 781 {
+ − 782 GPIO_InitTypeDef GPIO_InitStructure;
+ − 783 __GPIOB_CLK_ENABLE();
+ − 784 GPIO_InitStructure.Pin = GPIO_PIN_8;
+ − 785 GPIO_InitStructure.Mode = GPIO_MODE_OUTPUT_PP;
+ − 786 GPIO_InitStructure.Pull = GPIO_PULLUP;
+ − 787 GPIO_InitStructure.Speed = GPIO_SPEED_LOW;
+ − 788 HAL_GPIO_Init(GPIOB, &GPIO_InitStructure);
+ − 789 GPIO_InitStructure.Pin = GPIO_PIN_9;
+ − 790 HAL_GPIO_Init(GPIOB, &GPIO_InitStructure);
+ − 791
+ − 792 HAL_GPIO_WritePin(GPIOB,GPIO_PIN_8,GPIO_PIN_SET);
+ − 793 HAL_GPIO_WritePin(GPIOB,GPIO_PIN_9,GPIO_PIN_RESET);
+ − 794 HAL_Delay(10);
+ − 795 HAL_GPIO_WritePin(GPIOB,GPIO_PIN_9,GPIO_PIN_SET);
+ − 796 HAL_GPIO_WritePin(GPIOB,GPIO_PIN_8,GPIO_PIN_RESET);
+ − 797 HAL_Delay(10);
+ − 798 }
+ − 799 */
+ − 800
89
+ − 801 void GPIO_new_DEBUG_Init(void) {
38
+ − 802 #ifdef DEBUG_PIN_ACTIVE
89
+ − 803 GPIO_InitTypeDef GPIO_InitStructure;
38
+ − 804
89
+ − 805 __GPIOC_CLK_ENABLE();
662
+ − 806 GPIO_InitStructure.Pin = LED_CONTROL_PIN;
89
+ − 807 GPIO_InitStructure.Mode = GPIO_MODE_OUTPUT_PP;
+ − 808 GPIO_InitStructure.Pull = GPIO_PULLUP;
+ − 809 GPIO_InitStructure.Speed = GPIO_SPEED_FAST;
+ − 810 HAL_GPIO_Init(GPIOA, &GPIO_InitStructure);
38
+ − 811 #endif
+ − 812 }
+ − 813
89
+ − 814 void GPIO_new_DEBUG_LOW(void) {
38
+ − 815 #ifdef DEBUG_PIN_ACTIVE
662
+ − 816 HAL_GPIO_WritePin(GPIOC,LED_CONTROL_PIN,GPIO_PIN_RESET);
38
+ − 817 #endif
+ − 818 }
+ − 819
89
+ − 820 void GPIO_new_DEBUG_HIGH(void) {
38
+ − 821 #ifdef DEBUG_PIN_ACTIVE
662
+ − 822 HAL_GPIO_WritePin(GPIOC,LED_CONTROL_PIN,GPIO_PIN_SET);
38
+ − 823 #endif
+ − 824 }
+ − 825
+ − 826 /**
+ − 827 * @brief Configures EXTI Line0 (connected to PA0 + PA1 pin) in interrupt mode
+ − 828 * @param None
+ − 829 * @retval None
+ − 830 */
+ − 831
89
+ − 832 static void EXTI_Wakeup_Button_Init(void) {
+ − 833 GPIO_InitTypeDef GPIO_InitStructure;
38
+ − 834
89
+ − 835 __HAL_RCC_GPIOA_CLK_ENABLE();
+ − 836 BUTTON_OSTC_HAL_RCC_GPIO_CLK_ENABLE();
+ − 837 GPIO_InitStructure.Pin = BUTTON_OSTC_GPIO_PIN;
+ − 838 GPIO_InitStructure.Mode = GPIO_MODE_IT_FALLING;
+ − 839 GPIO_InitStructure.Pull = GPIO_NOPULL;
+ − 840 HAL_GPIO_Init( BUTTON_OSTC_GPIO_PORT, &GPIO_InitStructure);
38
+ − 841
89
+ − 842 HAL_NVIC_SetPriority( BUTTON_OSTC_IRQn, 0x0F, 0);
+ − 843 HAL_NVIC_EnableIRQ( BUTTON_OSTC_IRQn);
38
+ − 844 }
+ − 845
89
+ − 846 static void EXTI_Wakeup_Button_DeInit(void) {
+ − 847 GPIO_InitTypeDef GPIO_InitStructure;
38
+ − 848
89
+ − 849 GPIO_InitStructure.Mode = GPIO_MODE_ANALOG;
+ − 850 GPIO_InitStructure.Speed = GPIO_SPEED_LOW;
+ − 851 GPIO_InitStructure.Pull = GPIO_NOPULL;
38
+ − 852
89
+ − 853 GPIO_InitStructure.Pin = BUTTON_OSTC_GPIO_PIN;
+ − 854 HAL_GPIO_Init( BUTTON_OSTC_GPIO_PORT, &GPIO_InitStructure);
+ − 855 HAL_NVIC_DisableIRQ( BUTTON_OSTC_IRQn);
38
+ − 856 }
+ − 857
+ − 858 /**
+ − 859 * @brief Wake Up Timer callback
+ − 860 * @param hrtc: RTC handle
+ − 861 * @retval None
+ − 862 */
+ − 863
+ − 864 /*
+ − 865 void HAL_RTCEx_WakeUpTimerEventCallback(RTC_HandleTypeDef *hrtc)
+ − 866 {
+ − 867 static uint8_t uwCounter = 0;
+ − 868 uwCounter = 1;
+ − 869 }
+ − 870 */
+ − 871
89
+ − 872 void HAL_I2C_MasterTxCpltCallback(I2C_HandleTypeDef *I2cHandle) {
38
+ − 873
+ − 874 }
+ − 875
89
+ − 876 void HAL_I2C_MasterRxCpltCallback(I2C_HandleTypeDef *I2cHandle) {
38
+ − 877
+ − 878 }
+ − 879
89
+ − 880 void HAL_I2C_ErrorCallback(I2C_HandleTypeDef *I2cHandle) {
38
+ − 881
+ − 882 }
+ − 883
89
+ − 884 void sleep_prepare(void) {
+ − 885 EXTI_Wakeup_Button_Init();
662
+ − 886
89
+ − 887 compass_sleep();
+ − 888 HAL_Delay(100);
+ − 889 accelerator_sleep();
+ − 890 HAL_Delay(100);
38
+ − 891
89
+ − 892 I2C_DeInit();
+ − 893 MX_SPI_DeInit();
+ − 894 MX_SPI3_DeInit();
+ − 895 ADCx_DeInit();
38
+ − 896
89
+ − 897 GPIO_InitTypeDef GPIO_InitStruct;
38
+ − 898
89
+ − 899 __HAL_RCC_GPIOA_CLK_ENABLE();
+ − 900 __HAL_RCC_GPIOB_CLK_ENABLE();
+ − 901 __HAL_RCC_GPIOC_CLK_ENABLE();
+ − 902 __HAL_RCC_GPIOH_CLK_ENABLE();
38
+ − 903
89
+ − 904 GPIO_InitStruct.Mode = GPIO_MODE_ANALOG;
887
+ − 905 GPIO_InitStruct.Speed = GPIO_SPEED_LOW;
89
+ − 906 GPIO_InitStruct.Pull = GPIO_NOPULL;
+ − 907 GPIO_InitStruct.Pin = GPIO_PIN_All;
+ − 908 HAL_GPIO_Init( GPIOH, &GPIO_InitStruct);
938
+ − 909 #ifdef ENABLE_SLEEP_DEBUG
89
+ − 910 GPIO_InitStruct.Pin = GPIO_PIN_All ^ ( GPIO_PIN_3 | GPIO_PIN_8 | GPIO_PIN_9); /* debug */
38
+ − 911 #endif
887
+ − 912
936
+ − 913 /*
887
+ − 914 GPIO_InitStruct.Pin = GPIO_PIN_All ^ (GPS_POWER_CONTROL_PIN | GPS_BCKP_CONTROL_PIN);
89
+ − 915 HAL_GPIO_Init( GPIOB, &GPIO_InitStruct);
936
+ − 916 */
887
+ − 917 GPIO_InitStruct.Pin = GPIO_PIN_All ^ ( MAINCPU_CONTROL_PIN | CHARGE_OUT_PIN | EXT33V_CONTROL_PIN); /* power off & charger in & charge out & OSC32 & ext33Volt */
662
+ − 918
89
+ − 919 HAL_GPIO_Init( GPIOC, &GPIO_InitStruct);
38
+ − 920
887
+ − 921 GPIO_InitStruct.Pin = GPIO_PIN_All ^ ( GPIO_PIN_0 | VIBRATION_CONTROL_PIN | LED_CONTROL_PIN_RED | LED_CONTROL_PIN_GREEN);
938
+ − 922 #ifdef ENABLE_SLEEP_DEBUG
89
+ − 923 GPIO_InitStruct.Pin = GPIO_PIN_All ^ ( GPIO_PIN_0 | GPIO_PIN_13 | GPIO_PIN_14); /* wake up button & debug */
38
+ − 924 #endif
89
+ − 925 HAL_GPIO_Init( GPIOA, &GPIO_InitStruct);
38
+ − 926
89
+ − 927 GPIO_InitStruct.Pin = GPIO_PIN_All;
+ − 928 HAL_GPIO_Init( GPIOH, &GPIO_InitStruct);
38
+ − 929
89
+ − 930 GPIO_Power_MainCPU_OFF();
922
+ − 931 #ifdef ENABLE_GPIO_V2
880
+ − 932 GPIO_LED_GREEN_OFF();
+ − 933 GPIO_LED_RED_OFF();
887
+ − 934 GPIO_VIBRATION_OFF();
+ − 935 GPIO_GPS_BCKP_ON(); // mH : costs 100µA in sleep - beware
938
+ − 936 /* GPIO_GPS_OFF(); will be done in transition sleep => deep sleep */
880
+ − 937
890
+ − 938 MX_USART6_UART_DeInit();
903
+ − 939 #endif
938
+ − 940 #ifndef ENABLE_SLEEP_DEBUG
+ − 941 /*
89
+ − 942 __HAL_RCC_GPIOB_CLK_DISABLE();
938
+ − 943 */
38
+ − 944 #endif
89
+ − 945 __HAL_RCC_GPIOH_CLK_DISABLE();
38
+ − 946 }
+ − 947
+ − 948 /*
+ − 949 void sleep_test(void)
+ − 950 {
+ − 951 GPIO_InitTypeDef GPIO_InitStruct;
+ − 952
+ − 953 __HAL_RCC_GPIOA_CLK_ENABLE();
+ − 954 __HAL_RCC_GPIOB_CLK_ENABLE();
+ − 955 __HAL_RCC_GPIOC_CLK_ENABLE();
+ − 956 __HAL_RCC_GPIOH_CLK_ENABLE();
+ − 957
+ − 958 GPIO_InitStruct.Mode = GPIO_MODE_ANALOG;
+ − 959 GPIO_InitStruct.Speed = GPIO_SPEED_HIGH;
+ − 960 GPIO_InitStruct.Pull = GPIO_NOPULL;
+ − 961 GPIO_InitStruct.Pin = GPIO_PIN_All;
+ − 962 HAL_GPIO_Init(GPIOH, &GPIO_InitStruct);
+ − 963 HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
+ − 964
+ − 965 GPIO_InitStruct.Pin = GPIO_PIN_All ^ ( GPIO_PIN_0 | GPIO_PIN_15 | GPIO_PIN_14);
+ − 966 HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);
+ − 967
+ − 968 GPIO_InitStruct.Pin = GPIO_PIN_All ^ ( GPIO_PIN_0);
+ − 969 HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
+ − 970
+ − 971 GPIO_Power_MainCPU_OFF();
+ − 972
+ − 973 GPIO_InitStruct.Pull = GPIO_PULLUP;
+ − 974 GPIO_InitStruct.Pin = GPIO_PIN_0;
+ − 975 HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
+ − 976
+ − 977 // __HAL_RCC_GPIOA_CLK_DISABLE();
+ − 978 __HAL_RCC_GPIOB_CLK_DISABLE();
+ − 979 // __HAL_RCC_GPIOC_CLK_DISABLE();
+ − 980 __HAL_RCC_GPIOH_CLK_DISABLE();
+ − 981
+ − 982
+ − 983 HAL_Delay(5000);
+ − 984 while(1)
+ − 985 {
+ − 986 RTC_StopMode_2seconds();
+ − 987 HAL_Delay(200);
+ − 988 }
+ − 989 }
+ − 990 */
+ − 991
+ − 992 #ifdef USE_FULL_ASSERT
+ − 993
+ − 994 /**
+ − 995 * @brief Reports the name of the source file and the source line number
+ − 996 * where the assert_param error has occurred.
+ − 997 * @param file: pointer to the source file name
+ − 998 * @param line: assert_param error line source number
+ − 999 * @retval None
+ − 1000 */
+ − 1001 void assert_failed(uint8_t* file, uint32_t line)
+ − 1002 {
89
+ − 1003 /* User can add his own implementation to report the file name and line number,
+ − 1004 ex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */
38
+ − 1005
89
+ − 1006 /* Infinite loop */
+ − 1007 while (1)
+ − 1008 {
+ − 1009 }
38
+ − 1010 }
+ − 1011 #endif
+ − 1012
+ − 1013 /**
+ − 1014 * @}
+ − 1015 */
104
+ − 1016 /**
+ − 1017 * @brief This function handles SysTick Handler.
+ − 1018 * @param None
+ − 1019 * @retval None
+ − 1020 */
38
+ − 1021
104
+ − 1022 /*TxRx only here. Every 100 ms.*/
+ − 1023 uint8_t ticks100ms=0;
+ − 1024 void SysTick_Handler(void)
+ − 1025 {
+ − 1026 HAL_IncTick();
+ − 1027 if(ticks100ms<100){
+ − 1028 ticks100ms++;
+ − 1029 }else
+ − 1030 {
+ − 1031 ticks100ms=0;
+ − 1032 }
+ − 1033 }
38
+ − 1034 /**
+ − 1035 * @}
+ − 1036 */
+ − 1037
+ − 1038 /************************ (C) COPYRIGHT heinrichs weikamp *****END OF FILE****/