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,
843
+ − 177 .versionBeta = 1,
38
+ − 178
89
+ − 179 /* 4 bytes with trailing 0 */
100
+ − 180 .signature = "mh",
38
+ − 181
762
+ − 182 .release_year = 23,
818
+ − 183 .release_month = 9,
+ − 184 .release_day = 14,
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
955
+ − 386
+ − 387 GNSS_Handle.alive = 0; /* only init at startup (outside init function) */
+ − 388 GNSS_Handle.last_fLat = 0.0;
+ − 389 GNSS_Handle.last_fLon = 0.0;
+ − 390 GNSS_Handle.last_hour = 0;
+ − 391
89
+ − 392 while (1) {
120
+ − 393 /* printf("Global mode = %d\n", global.mode); */
38
+ − 394
89
+ − 395 switch (global.mode) {
+ − 396 case MODE_POWERUP:
+ − 397 case MODE_BOOT:
+ − 398 // ReInit_battery_charger_status_pins();
+ − 399 compass_init(0, 7);
+ − 400 accelerator_init();
554
+ − 401 externalInterface_Init();
181
+ − 402
89
+ − 403 if (global.mode == MODE_BOOT) {
+ − 404 GPIO_Power_MainCPU_OFF();
922
+ − 405 #ifdef ENABLE_GPIO_V2
880
+ − 406 GPIO_LED_GREEN_ON();
903
+ − 407 #endif
89
+ − 408 HAL_Delay(100); // for GPIO_Power_MainCPU_ON();
+ − 409 GPIO_Power_MainCPU_ON();
922
+ − 410 #ifdef ENABLE_GPIO_V2
880
+ − 411 GPIO_LED_GREEN_OFF();
+ − 412
+ − 413 GPIO_LED_RED_ON();
900
+ − 414 GPIO_VIBRATION_ON();
903
+ − 415 #endif
880
+ − 416 HAL_Delay(100);
922
+ − 417 #ifdef ENABLE_GPIO_V2
880
+ − 418 GPIO_LED_RED_OFF();
+ − 419 GPIO_VIBRATION_OFF();
903
+ − 420 #endif
89
+ − 421 }
922
+ − 422 #ifdef ENABLE_GPIO_V2
900
+ − 423 GPIO_LED_RED_OFF();
+ − 424 GPIO_LED_GREEN_OFF();
+ − 425 GPIO_VIBRATION_OFF();
903
+ − 426 #endif
89
+ − 427 SPI_synchronize_with_Master();
+ − 428 MX_DMA_Init();
+ − 429 MX_SPI1_Init();
134
+ − 430 SPI_Start_single_TxRx_with_Master(); /* be prepared for the first data exchange */
207
+ − 431 Scheduler_Request_sync_with_SPI(SPI_SYNC_METHOD_HARD);
889
+ − 432
922
+ − 433 #ifdef ENABLE_GPIO_V2
889
+ − 434 // GNSS tests
+ − 435 GNSS_IO_init();
900
+ − 436 GPIO_GPS_ON();
+ − 437 GPIO_GPS_BCKP_ON();
889
+ − 438 MX_USART6_UART_Init();
+ − 439 GNSS_Init(&GNSS_Handle, &huart6);
932
+ − 440 #else
+ − 441 #ifdef ENABLE_GNSS_SUPPORT
+ − 442 GNSS_Init(&GNSS_Handle, &huart1);
+ − 443 #endif
900
+ − 444 #endif
899
+ − 445
89
+ − 446 global.mode = MODE_SURFACE;
+ − 447 break;
38
+ − 448
89
+ − 449 case MODE_CALIB:
90
+ − 450 scheduleCompassCalibrationMode();
89
+ − 451 break;
+ − 452
+ − 453 case MODE_SURFACE:
+ − 454 scheduleSurfaceMode();
+ − 455 break;
38
+ − 456
89
+ − 457 case MODE_TEST:
+ − 458 break;
38
+ − 459
89
+ − 460 case MODE_DIVE:
90
+ − 461 backup.no_fly_time_minutes = global.no_fly_time_minutes;
+ − 462 backup.seconds_since_last_dive = global.seconds_since_last_dive;
+ − 463
+ − 464 vpm_init( &global.vpm, global.conservatism, global.repetitive_dive,
+ − 465 global.seconds_since_last_dive );
+ − 466 global.no_fly_time_minutes = 0;
+ − 467 global.lifeData.dive_time_seconds = 0;
+ − 468 global.lifeData.dive_time_seconds_without_surface_time = 0;
943
+ − 469 #if defined ENABLE_GNSS_SUPPORT || defined ENABLE_GPIO_V2
942
+ − 470 uartGnss_ReqPowerDown(1);
943
+ − 471 #endif
90
+ − 472 scheduleDiveMode();
+ − 473 // done now in scheduler prior to change mode: global.seconds_since_last_dive = 1;
+ − 474
+ − 475 if( global.lifeData.dive_time_seconds > 60 )
+ − 476 {
+ − 477 //No Fly time 60% of desaturationtime after dive
+ − 478 global.no_fly_time_minutes = decom_calc_desaturation_time(
+ − 479 global.lifeData.tissue_nitrogen_bar,
+ − 480 global.lifeData.tissue_helium_bar,
+ − 481 global.lifeData.pressure_surface_bar ) * 60 / 100;
+ − 482 if( global.no_fly_time_minutes < (24 * 60) )
+ − 483 global.no_fly_time_minutes = 24 * 60;
+ − 484 }
+ − 485 else
+ − 486 {
+ − 487 global.no_fly_time_minutes = backup.no_fly_time_minutes;
+ − 488 global.seconds_since_last_dive = backup.seconds_since_last_dive;
+ − 489 }
+ − 490
+ − 491 global.lifeData.dive_time_seconds = 0;
+ − 492 global.lifeData.dive_time_seconds_without_surface_time = 0;
+ − 493 global.lifeData.counterSecondsShallowDepth = 0;
+ − 494
+ − 495 backup.no_fly_time_minutes = 0;
+ − 496 backup.seconds_since_last_dive = 0;
943
+ − 497 #if defined ENABLE_GNSS_SUPPORT || defined ENABLE_GPIO_V2
942
+ − 498 uartGnss_ReqPowerDown(0);
943
+ − 499 #endif
89
+ − 500 break;
38
+ − 501
89
+ − 502 case MODE_SHUTDOWN:
+ − 503 HAL_Delay(200);
936
+ − 504
+ − 505 MX_SPI3_Init();
+ − 506
+ − 507 #if defined ENABLE_GNSS_SUPPORT || defined ENABLE_GPIO_V2
+ − 508 if(shutdownTick == 0)
+ − 509 {
+ − 510 shutdownTick = HAL_GetTick();
+ − 511 uartGnss_ReqPowerDown(1);
+ − 512 }
+ − 513 #ifdef ENABLE_GNSS_SUPPORT
+ − 514 externalInterface_HandleUART();
+ − 515 #else
+ − 516 UART6_HandleUART();
+ − 517 #endif
940
+ − 518 if((uartGnss_GetState() == UART_GNSS_INACTIVE) || (time_elapsed_ms(shutdownTick,HAL_GetTick()) > 3000))
936
+ − 519 {
+ − 520 global.mode = MODE_SLEEP;
938
+ − 521 uartGnss_ReqPowerDown(0); /* release power down request */
936
+ − 522 }
+ − 523 #else
89
+ − 524 global.mode = MODE_SLEEP;
936
+ − 525 #endif
+ − 526
+ − 527
89
+ − 528 break;
+ − 529
+ − 530 case MODE_SLEEP:
917
+ − 531 extInterfaceActive = externalInterface_isEnabledPower33();
839
+ − 532 externalInterface_SwitchUART(EXT_INTERFACE_UART_OFF);
662
+ − 533 externalInterface_SwitchPower33(false);
89
+ − 534 if (hasExternalClock())
+ − 535 SystemClock_Config_HSI();
887
+ − 536 GPIO_LEDs_VIBRATION_Init();
89
+ − 537 sleep_prepare();
38
+ − 538
940
+ − 539 while(time_elapsed_ms(shutdownTick,HAL_GetTick()) < 1000 ) /* delay shutdown till shutdown animation is finished */
+ − 540 {
+ − 541 HAL_Delay(10);
+ − 542 }
+ − 543 shutdownTick = 0;
89
+ − 544 scheduleSleepMode();
+ − 545 if (hasExternalClock())
+ − 546 SystemClock_Config_HSE();
+ − 547 EXTI_Wakeup_Button_DeInit();
+ − 548 ADCx_Init();
+ − 549 GPIO_Power_MainCPU_Init();
+ − 550 GPIO_Power_MainCPU_ON();
+ − 551 compass_init(0, 7);
+ − 552 accelerator_init();
148
+ − 553 SPI_synchronize_with_Master();
89
+ − 554 MX_DMA_Init();
+ − 555 MX_SPI1_Init();
148
+ − 556 SPI_Start_single_TxRx_with_Master();
89
+ − 557
917
+ − 558 if(extInterfaceActive)
662
+ − 559 {
+ − 560 externalInterface_SwitchPower33(true);
+ − 561 }
738
+ − 562 externalInterface_InitDatastruct();
89
+ − 563 // EXTILine0_Button_DeInit(); not now, later after testing
+ − 564 break;
+ − 565 }
120
+ − 566
+ − 567 #ifdef DEBUG_RUNTIME
+ − 568 HAL_RTC_GetTime(&RTCHandle, &Stime, RTC_FORMAT_BCD);
+ − 569
+ − 570 if(lastsecond == 0xFF)
+ − 571 {
+ − 572 measurementindex = 0;
+ − 573 loopcnt[measurementindex] = 0;
+ − 574 lastsecond = Stime.Seconds;
+ − 575 }
+ − 576 loopcnt[measurementindex]++;
+ − 577
+ − 578 if(lastsecond != Stime.Seconds)
+ − 579 {
+ − 580 measurementindex++;
+ − 581 if (measurementindex == MEASURECNT) measurementindex = 0;
+ − 582 loopcnt[measurementindex] = 0;
+ − 583 lastsecond = Stime.Seconds;
+ − 584 if(measurementindex +1 < MEASURECNT) loopcnt[measurementindex +1] = 0xffff; /* helps to identify the latest value */
+ − 585 }
+ − 586 #endif
89
+ − 587 }
38
+ − 588 }
+ − 589
+ − 590 /** @brief Button feedback - EXTI line detection callbacks
+ − 591 * @param GPIO_Pin: Specifies the pins connected EXTI line
+ − 592 * @retval None
+ − 593 */
89
+ − 594 void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin) {
38
+ − 595
89
+ − 596 if (GPIO_Pin == BUTTON_OSTC_GPIO_PIN) {
+ − 597 if (global.mode == MODE_SLEEP) {
+ − 598 global.mode = MODE_BOOT;
+ − 599 }
+ − 600 }
+ − 601 else
880
+ − 602 {
+ − 603
89
+ − 604 }
38
+ − 605 }
+ − 606
+ − 607 /**
+ − 608 * @brief System Clock Configuration
+ − 609 * The system Clock is configured as follow :
+ − 610 * System Clock source = PLL (HSI)
+ − 611 * SYSCLK(Hz) = 100 MHz
+ − 612 * HCLK(Hz) = 100 MHz
+ − 613 * AHB Prescaler = 1
+ − 614 * APB1 Prescaler = 2
+ − 615 * APB2 Prescaler = 1
+ − 616 * HSI Frequency(Hz) = 16 MHz
+ − 617 * PLL_M = 16
+ − 618 * PLL_N = 400
+ − 619 * PLL_P = 4
+ − 620 * PLL_Q = 7 // no USB
+ − 621 * VDD(V) = 3.3
+ − 622 * Main regulator output voltage = Scale1 mode
+ − 623 * Flash Latency(WS) = 3
+ − 624 * @param None
+ − 625 * @retval None
+ − 626 */
+ − 627
89
+ − 628 void SystemClock_Config(void) {
+ − 629 if (hasExternalClock())
+ − 630 SystemClock_Config_HSE();
+ − 631 else
+ − 632 SystemClock_Config_HSI();
38
+ − 633 }
+ − 634
89
+ − 635 void SYSCLKConfig_STOP(void) {
+ − 636 SYSCLKConfig_STOP_HSI();
38
+ − 637 }
+ − 638
89
+ − 639 void SystemClock_Config_HSE(void) {
+ − 640 RCC_OscInitTypeDef RCC_OscInitStruct;
+ − 641 RCC_ClkInitTypeDef RCC_ClkInitStruct;
38
+ − 642 // RCC_PeriphCLKInitTypeDef PeriphClkInitStruct;
+ − 643
89
+ − 644 __PWR_CLK_ENABLE(); // is identical to __HAL_RCC_PWR_CLK_ENABLE();
38
+ − 645
887
+ − 646 __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1);
38
+ − 647
89
+ − 648 RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE; //|RCC_OSCILLATORTYPE_LSE;
+ − 649 RCC_OscInitStruct.HSEState = RCC_HSE_ON;
+ − 650 //RCC_OscInitStruct.LSEState = RCC_LSE_ON;
+ − 651 RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
+ − 652 RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;
+ − 653 RCC_OscInitStruct.PLL.PLLM = 8;
+ − 654 RCC_OscInitStruct.PLL.PLLN = 320;
+ − 655 RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV4;
+ − 656 RCC_OscInitStruct.PLL.PLLQ = 4;
+ − 657 HAL_RCC_OscConfig(&RCC_OscInitStruct);
38
+ − 658
89
+ − 659 RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK | RCC_CLOCKTYPE_SYSCLK
+ − 660 | RCC_CLOCKTYPE_PCLK1 | RCC_CLOCKTYPE_PCLK2;
+ − 661 RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
+ − 662 RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
+ − 663 RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV2;
+ − 664 RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;
+ − 665 HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_2);
38
+ − 666
+ − 667 // PeriphClkInitStruct.PeriphClockSelection = RCC_PERIPHCLK_RTC;
+ − 668 // PeriphClkInitStruct.RTCClockSelection = RCC_RTCCLKSOURCE_LSE;
+ − 669 // HAL_RCCEx_PeriphCLKConfig(&PeriphClkInitStruct);
+ − 670
+ − 671 // HAL_SYSTICK_Config(HAL_RCC_GetHCLKFreq()/1000);
+ − 672
+ − 673 // HAL_SYSTICK_CLKSourceConfig(SYSTICK_CLKSOURCE_HCLK);
+ − 674
89
+ − 675 /* SysTick_IRQn interrupt configuration */
38
+ − 676 // HAL_NVIC_SetPriority(SysTick_IRQn, 0, 0);
+ − 677 }
+ − 678
89
+ − 679 void SystemClock_Config_HSI(void) {
+ − 680 RCC_ClkInitTypeDef RCC_ClkInitStruct;
+ − 681 RCC_OscInitTypeDef RCC_OscInitStruct;
38
+ − 682
89
+ − 683 /* Enable Power Control clock */
+ − 684 __HAL_RCC_PWR_CLK_ENABLE();
38
+ − 685
89
+ − 686 /* The voltage scaling allows optimizing the power consumption when the device is
+ − 687 clocked below the maximum system frequency, to update the voltage scaling value
+ − 688 regarding system frequency refer to product datasheet. */
887
+ − 689 __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1);
38
+ − 690
89
+ − 691 /* Enable HSI Oscillator and activate PLL with HSI as source */
+ − 692 RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI;
+ − 693 RCC_OscInitStruct.HSIState = RCC_HSI_ON;
+ − 694 RCC_OscInitStruct.HSICalibrationValue = 0x10;
+ − 695 RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
+ − 696 RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSI;
+ − 697 RCC_OscInitStruct.PLL.PLLM = 16;
+ − 698 RCC_OscInitStruct.PLL.PLLN = 320;
+ − 699 RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV4;
+ − 700 RCC_OscInitStruct.PLL.PLLQ = 4;
+ − 701 HAL_RCC_OscConfig(&RCC_OscInitStruct);
38
+ − 702
89
+ − 703 /* Select PLL as system clock source and configure the HCLK, PCLK1 and PCLK2
+ − 704 clocks dividers */
+ − 705 RCC_ClkInitStruct.ClockType = (RCC_CLOCKTYPE_SYSCLK | RCC_CLOCKTYPE_HCLK
+ − 706 | RCC_CLOCKTYPE_PCLK1 | RCC_CLOCKTYPE_PCLK2);
+ − 707 RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
+ − 708 RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
+ − 709 RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV2;
+ − 710 RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;
+ − 711 HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_2);
38
+ − 712 }
+ − 713
+ − 714
+ − 715 /**
+ − 716 * @brief Configures system clock after wake-up from STOP: enable HSI, PLL
+ − 717 * and select PLL as system clock source.
+ − 718 * @param None
+ − 719 * @retval None
+ − 720 */
89
+ − 721 void SYSCLKConfig_STOP_HSE(void) {
+ − 722 RCC_ClkInitTypeDef RCC_ClkInitStruct;
+ − 723 RCC_OscInitTypeDef RCC_OscInitStruct;
+ − 724 uint32_t pFLatency = 0;
38
+ − 725
89
+ − 726 /* Get the Oscillators configuration according to the internal RCC registers */
+ − 727 HAL_RCC_GetOscConfig(&RCC_OscInitStruct);
38
+ − 728
89
+ − 729 /* After wake-up from STOP reconfigure the system clock: Enable HSI and PLL */
+ − 730 RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;
+ − 731 RCC_OscInitStruct.HSIState = RCC_HSE_ON;
+ − 732 RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
+ − 733 HAL_RCC_OscConfig(&RCC_OscInitStruct);
38
+ − 734
89
+ − 735 /* Get the Clocks configuration according to the internal RCC registers */
+ − 736 HAL_RCC_GetClockConfig(&RCC_ClkInitStruct, &pFLatency);
38
+ − 737
89
+ − 738 /* Select PLL as system clock source and configure the HCLK, PCLK1 and PCLK2
+ − 739 clocks dividers */
+ − 740 RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_SYSCLK;
+ − 741 RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
+ − 742 HAL_RCC_ClockConfig(&RCC_ClkInitStruct, pFLatency);
38
+ − 743 }
+ − 744
89
+ − 745 void SYSCLKConfig_STOP_HSI(void) {
+ − 746 RCC_ClkInitTypeDef RCC_ClkInitStruct;
+ − 747 RCC_OscInitTypeDef RCC_OscInitStruct;
+ − 748 uint32_t pFLatency = 0;
38
+ − 749
89
+ − 750 /* Get the Oscillators configuration according to the internal RCC registers */
+ − 751 HAL_RCC_GetOscConfig(&RCC_OscInitStruct);
38
+ − 752
89
+ − 753 /* After wake-up from STOP reconfigure the system clock: Enable HSI and PLL */
+ − 754 RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI;
+ − 755 RCC_OscInitStruct.HSIState = RCC_HSI_ON;
+ − 756 RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
+ − 757 RCC_OscInitStruct.HSICalibrationValue = 0x10;
+ − 758 HAL_RCC_OscConfig(&RCC_OscInitStruct);
38
+ − 759
89
+ − 760 /* Get the Clocks configuration according to the internal RCC registers */
+ − 761 HAL_RCC_GetClockConfig(&RCC_ClkInitStruct, &pFLatency);
38
+ − 762
89
+ − 763 /* Select PLL as system clock source and configure the HCLK, PCLK1 and PCLK2
+ − 764 clocks dividers */
+ − 765 RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_SYSCLK;
+ − 766 RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
+ − 767 HAL_RCC_ClockConfig(&RCC_ClkInitStruct, pFLatency);
38
+ − 768 }
+ − 769
+ − 770 /**
+ − 771 * @brief SYSTICK callback
+ − 772 * @param None
+ − 773 * @retval None
+ − 774 */
89
+ − 775 void HAL_SYSTICK_Callback(void) {
+ − 776 HAL_IncTick();
38
+ − 777 }
+ − 778
+ − 779 /**
+ − 780 * @brief Configures GPIO for LED
+ − 781 * Might move with STM32Cube usage
+ − 782 * @param None
+ − 783 * @retval None
+ − 784 */
+ − 785 /*
+ − 786 void GPIO_test_I2C_lines(void)
+ − 787 {
+ − 788 GPIO_InitTypeDef GPIO_InitStructure;
+ − 789 __GPIOB_CLK_ENABLE();
+ − 790 GPIO_InitStructure.Pin = GPIO_PIN_8;
+ − 791 GPIO_InitStructure.Mode = GPIO_MODE_OUTPUT_PP;
+ − 792 GPIO_InitStructure.Pull = GPIO_PULLUP;
+ − 793 GPIO_InitStructure.Speed = GPIO_SPEED_LOW;
+ − 794 HAL_GPIO_Init(GPIOB, &GPIO_InitStructure);
+ − 795 GPIO_InitStructure.Pin = GPIO_PIN_9;
+ − 796 HAL_GPIO_Init(GPIOB, &GPIO_InitStructure);
+ − 797
+ − 798 HAL_GPIO_WritePin(GPIOB,GPIO_PIN_8,GPIO_PIN_SET);
+ − 799 HAL_GPIO_WritePin(GPIOB,GPIO_PIN_9,GPIO_PIN_RESET);
+ − 800 HAL_Delay(10);
+ − 801 HAL_GPIO_WritePin(GPIOB,GPIO_PIN_9,GPIO_PIN_SET);
+ − 802 HAL_GPIO_WritePin(GPIOB,GPIO_PIN_8,GPIO_PIN_RESET);
+ − 803 HAL_Delay(10);
+ − 804 }
+ − 805 */
+ − 806
89
+ − 807 void GPIO_new_DEBUG_Init(void) {
38
+ − 808 #ifdef DEBUG_PIN_ACTIVE
89
+ − 809 GPIO_InitTypeDef GPIO_InitStructure;
38
+ − 810
89
+ − 811 __GPIOC_CLK_ENABLE();
662
+ − 812 GPIO_InitStructure.Pin = LED_CONTROL_PIN;
89
+ − 813 GPIO_InitStructure.Mode = GPIO_MODE_OUTPUT_PP;
+ − 814 GPIO_InitStructure.Pull = GPIO_PULLUP;
+ − 815 GPIO_InitStructure.Speed = GPIO_SPEED_FAST;
+ − 816 HAL_GPIO_Init(GPIOA, &GPIO_InitStructure);
38
+ − 817 #endif
+ − 818 }
+ − 819
89
+ − 820 void GPIO_new_DEBUG_LOW(void) {
38
+ − 821 #ifdef DEBUG_PIN_ACTIVE
662
+ − 822 HAL_GPIO_WritePin(GPIOC,LED_CONTROL_PIN,GPIO_PIN_RESET);
38
+ − 823 #endif
+ − 824 }
+ − 825
89
+ − 826 void GPIO_new_DEBUG_HIGH(void) {
38
+ − 827 #ifdef DEBUG_PIN_ACTIVE
662
+ − 828 HAL_GPIO_WritePin(GPIOC,LED_CONTROL_PIN,GPIO_PIN_SET);
38
+ − 829 #endif
+ − 830 }
+ − 831
+ − 832 /**
+ − 833 * @brief Configures EXTI Line0 (connected to PA0 + PA1 pin) in interrupt mode
+ − 834 * @param None
+ − 835 * @retval None
+ − 836 */
+ − 837
89
+ − 838 static void EXTI_Wakeup_Button_Init(void) {
+ − 839 GPIO_InitTypeDef GPIO_InitStructure;
38
+ − 840
89
+ − 841 __HAL_RCC_GPIOA_CLK_ENABLE();
+ − 842 BUTTON_OSTC_HAL_RCC_GPIO_CLK_ENABLE();
+ − 843 GPIO_InitStructure.Pin = BUTTON_OSTC_GPIO_PIN;
+ − 844 GPIO_InitStructure.Mode = GPIO_MODE_IT_FALLING;
+ − 845 GPIO_InitStructure.Pull = GPIO_NOPULL;
+ − 846 HAL_GPIO_Init( BUTTON_OSTC_GPIO_PORT, &GPIO_InitStructure);
38
+ − 847
89
+ − 848 HAL_NVIC_SetPriority( BUTTON_OSTC_IRQn, 0x0F, 0);
+ − 849 HAL_NVIC_EnableIRQ( BUTTON_OSTC_IRQn);
38
+ − 850 }
+ − 851
89
+ − 852 static void EXTI_Wakeup_Button_DeInit(void) {
+ − 853 GPIO_InitTypeDef GPIO_InitStructure;
38
+ − 854
89
+ − 855 GPIO_InitStructure.Mode = GPIO_MODE_ANALOG;
+ − 856 GPIO_InitStructure.Speed = GPIO_SPEED_LOW;
+ − 857 GPIO_InitStructure.Pull = GPIO_NOPULL;
38
+ − 858
89
+ − 859 GPIO_InitStructure.Pin = BUTTON_OSTC_GPIO_PIN;
+ − 860 HAL_GPIO_Init( BUTTON_OSTC_GPIO_PORT, &GPIO_InitStructure);
+ − 861 HAL_NVIC_DisableIRQ( BUTTON_OSTC_IRQn);
38
+ − 862 }
+ − 863
+ − 864 /**
+ − 865 * @brief Wake Up Timer callback
+ − 866 * @param hrtc: RTC handle
+ − 867 * @retval None
+ − 868 */
+ − 869
+ − 870 /*
+ − 871 void HAL_RTCEx_WakeUpTimerEventCallback(RTC_HandleTypeDef *hrtc)
+ − 872 {
+ − 873 static uint8_t uwCounter = 0;
+ − 874 uwCounter = 1;
+ − 875 }
+ − 876 */
+ − 877
89
+ − 878 void HAL_I2C_MasterTxCpltCallback(I2C_HandleTypeDef *I2cHandle) {
38
+ − 879
+ − 880 }
+ − 881
89
+ − 882 void HAL_I2C_MasterRxCpltCallback(I2C_HandleTypeDef *I2cHandle) {
38
+ − 883
+ − 884 }
+ − 885
89
+ − 886 void HAL_I2C_ErrorCallback(I2C_HandleTypeDef *I2cHandle) {
38
+ − 887
+ − 888 }
+ − 889
89
+ − 890 void sleep_prepare(void) {
+ − 891 EXTI_Wakeup_Button_Init();
662
+ − 892
89
+ − 893 compass_sleep();
+ − 894 HAL_Delay(100);
+ − 895 accelerator_sleep();
+ − 896 HAL_Delay(100);
38
+ − 897
89
+ − 898 I2C_DeInit();
+ − 899 MX_SPI_DeInit();
+ − 900 MX_SPI3_DeInit();
+ − 901 ADCx_DeInit();
38
+ − 902
89
+ − 903 GPIO_InitTypeDef GPIO_InitStruct;
38
+ − 904
89
+ − 905 __HAL_RCC_GPIOA_CLK_ENABLE();
+ − 906 __HAL_RCC_GPIOB_CLK_ENABLE();
+ − 907 __HAL_RCC_GPIOC_CLK_ENABLE();
+ − 908 __HAL_RCC_GPIOH_CLK_ENABLE();
38
+ − 909
89
+ − 910 GPIO_InitStruct.Mode = GPIO_MODE_ANALOG;
887
+ − 911 GPIO_InitStruct.Speed = GPIO_SPEED_LOW;
89
+ − 912 GPIO_InitStruct.Pull = GPIO_NOPULL;
+ − 913 GPIO_InitStruct.Pin = GPIO_PIN_All;
+ − 914 HAL_GPIO_Init( GPIOH, &GPIO_InitStruct);
938
+ − 915 #ifdef ENABLE_SLEEP_DEBUG
89
+ − 916 GPIO_InitStruct.Pin = GPIO_PIN_All ^ ( GPIO_PIN_3 | GPIO_PIN_8 | GPIO_PIN_9); /* debug */
38
+ − 917 #endif
887
+ − 918
936
+ − 919 /*
887
+ − 920 GPIO_InitStruct.Pin = GPIO_PIN_All ^ (GPS_POWER_CONTROL_PIN | GPS_BCKP_CONTROL_PIN);
89
+ − 921 HAL_GPIO_Init( GPIOB, &GPIO_InitStruct);
936
+ − 922 */
887
+ − 923 GPIO_InitStruct.Pin = GPIO_PIN_All ^ ( MAINCPU_CONTROL_PIN | CHARGE_OUT_PIN | EXT33V_CONTROL_PIN); /* power off & charger in & charge out & OSC32 & ext33Volt */
662
+ − 924
89
+ − 925 HAL_GPIO_Init( GPIOC, &GPIO_InitStruct);
38
+ − 926
887
+ − 927 GPIO_InitStruct.Pin = GPIO_PIN_All ^ ( GPIO_PIN_0 | VIBRATION_CONTROL_PIN | LED_CONTROL_PIN_RED | LED_CONTROL_PIN_GREEN);
938
+ − 928 #ifdef ENABLE_SLEEP_DEBUG
89
+ − 929 GPIO_InitStruct.Pin = GPIO_PIN_All ^ ( GPIO_PIN_0 | GPIO_PIN_13 | GPIO_PIN_14); /* wake up button & debug */
38
+ − 930 #endif
89
+ − 931 HAL_GPIO_Init( GPIOA, &GPIO_InitStruct);
38
+ − 932
89
+ − 933 GPIO_InitStruct.Pin = GPIO_PIN_All;
+ − 934 HAL_GPIO_Init( GPIOH, &GPIO_InitStruct);
38
+ − 935
89
+ − 936 GPIO_Power_MainCPU_OFF();
922
+ − 937 #ifdef ENABLE_GPIO_V2
880
+ − 938 GPIO_LED_GREEN_OFF();
+ − 939 GPIO_LED_RED_OFF();
887
+ − 940 GPIO_VIBRATION_OFF();
+ − 941 GPIO_GPS_BCKP_ON(); // mH : costs 100µA in sleep - beware
938
+ − 942 /* GPIO_GPS_OFF(); will be done in transition sleep => deep sleep */
880
+ − 943
890
+ − 944 MX_USART6_UART_DeInit();
903
+ − 945 #endif
938
+ − 946 #ifndef ENABLE_SLEEP_DEBUG
+ − 947 /*
89
+ − 948 __HAL_RCC_GPIOB_CLK_DISABLE();
938
+ − 949 */
38
+ − 950 #endif
89
+ − 951 __HAL_RCC_GPIOH_CLK_DISABLE();
38
+ − 952 }
+ − 953
+ − 954 /*
+ − 955 void sleep_test(void)
+ − 956 {
+ − 957 GPIO_InitTypeDef GPIO_InitStruct;
+ − 958
+ − 959 __HAL_RCC_GPIOA_CLK_ENABLE();
+ − 960 __HAL_RCC_GPIOB_CLK_ENABLE();
+ − 961 __HAL_RCC_GPIOC_CLK_ENABLE();
+ − 962 __HAL_RCC_GPIOH_CLK_ENABLE();
+ − 963
+ − 964 GPIO_InitStruct.Mode = GPIO_MODE_ANALOG;
+ − 965 GPIO_InitStruct.Speed = GPIO_SPEED_HIGH;
+ − 966 GPIO_InitStruct.Pull = GPIO_NOPULL;
+ − 967 GPIO_InitStruct.Pin = GPIO_PIN_All;
+ − 968 HAL_GPIO_Init(GPIOH, &GPIO_InitStruct);
+ − 969 HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
+ − 970
+ − 971 GPIO_InitStruct.Pin = GPIO_PIN_All ^ ( GPIO_PIN_0 | GPIO_PIN_15 | GPIO_PIN_14);
+ − 972 HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);
+ − 973
+ − 974 GPIO_InitStruct.Pin = GPIO_PIN_All ^ ( GPIO_PIN_0);
+ − 975 HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
+ − 976
+ − 977 GPIO_Power_MainCPU_OFF();
+ − 978
+ − 979 GPIO_InitStruct.Pull = GPIO_PULLUP;
+ − 980 GPIO_InitStruct.Pin = GPIO_PIN_0;
+ − 981 HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
+ − 982
+ − 983 // __HAL_RCC_GPIOA_CLK_DISABLE();
+ − 984 __HAL_RCC_GPIOB_CLK_DISABLE();
+ − 985 // __HAL_RCC_GPIOC_CLK_DISABLE();
+ − 986 __HAL_RCC_GPIOH_CLK_DISABLE();
+ − 987
+ − 988
+ − 989 HAL_Delay(5000);
+ − 990 while(1)
+ − 991 {
+ − 992 RTC_StopMode_2seconds();
+ − 993 HAL_Delay(200);
+ − 994 }
+ − 995 }
+ − 996 */
+ − 997
+ − 998 #ifdef USE_FULL_ASSERT
+ − 999
+ − 1000 /**
+ − 1001 * @brief Reports the name of the source file and the source line number
+ − 1002 * where the assert_param error has occurred.
+ − 1003 * @param file: pointer to the source file name
+ − 1004 * @param line: assert_param error line source number
+ − 1005 * @retval None
+ − 1006 */
+ − 1007 void assert_failed(uint8_t* file, uint32_t line)
+ − 1008 {
89
+ − 1009 /* User can add his own implementation to report the file name and line number,
+ − 1010 ex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */
38
+ − 1011
89
+ − 1012 /* Infinite loop */
+ − 1013 while (1)
+ − 1014 {
+ − 1015 }
38
+ − 1016 }
+ − 1017 #endif
+ − 1018
+ − 1019 /**
+ − 1020 * @}
+ − 1021 */
104
+ − 1022 /**
+ − 1023 * @brief This function handles SysTick Handler.
+ − 1024 * @param None
+ − 1025 * @retval None
+ − 1026 */
38
+ − 1027
104
+ − 1028 /*TxRx only here. Every 100 ms.*/
+ − 1029 uint8_t ticks100ms=0;
+ − 1030 void SysTick_Handler(void)
+ − 1031 {
+ − 1032 HAL_IncTick();
+ − 1033 if(ticks100ms<100){
+ − 1034 ticks100ms++;
+ − 1035 }else
+ − 1036 {
+ − 1037 ticks100ms=0;
+ − 1038 }
+ − 1039 }
38
+ − 1040 /**
+ − 1041 * @}
+ − 1042 */
+ − 1043
+ − 1044 /************************ (C) COPYRIGHT heinrichs weikamp *****END OF FILE****/