Mercurial > public > ostc4
annotate Small_CPU/Src/baseCPU2.c @ 474:4be72d55b09a Improve_Button_Sleep
Added error detection for reading of ADC values in sleep mode:
ADC value were used for pressure calculation without making sure that the I2C operations used for reading the values were called successfully. As result a invalid pressure could be calculated causing the OSTC to wakeup or (worstcase) to enter dive mode. To avoid this the return values are now evaluated and pressure calculation is only done if I2C signaled no error during transmission
author | ideenmodellierer |
---|---|
date | Tue, 12 May 2020 22:42:52 +0200 |
parents | edfc1a464b42 |
children | 9eeab3fead8f |
rev | line source |
---|---|
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
733877ab87d9
Minor: Some Texts fixed, allign RTErequired* values with RTE firmware
heinrichsweikamp
parents:
280
diff
changeset
|
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
733877ab87d9
Minor: Some Texts fixed, allign RTErequired* values with RTE firmware
heinrichsweikamp
parents:
280
diff
changeset
|
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
e4207f0aaa4b
cleanup: factor out dataSendToSlaveStopEval
Jan Mulder <jlmulder@xs4all.nl>
parents:
207
diff
changeset
|
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
733877ab87d9
Minor: Some Texts fixed, allign RTErequired* values with RTE firmware
heinrichsweikamp
parents:
280
diff
changeset
|
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
733877ab87d9
Minor: Some Texts fixed, allign RTErequired* values with RTE firmware
heinrichsweikamp
parents:
280
diff
changeset
|
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
733877ab87d9
Minor: Some Texts fixed, allign RTErequired* values with RTE firmware
heinrichsweikamp
parents:
280
diff
changeset
|
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
733877ab87d9
Minor: Some Texts fixed, allign RTErequired* values with RTE firmware
heinrichsweikamp
parents:
280
diff
changeset
|
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
733877ab87d9
Minor: Some Texts fixed, allign RTErequired* values with RTE firmware
heinrichsweikamp
parents:
280
diff
changeset
|
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" | |
138 #include "compass.h" | |
139 #include "pressure.h" | |
140 #include "batteryGasGauge.h" | |
141 #include "batteryCharger.h" | |
142 #include "scheduler.h" | |
143 #include "tm_stm32f4_otp.h" | |
144 | |
145 // From Common/Inc: | |
146 #include "calc_crush.h" | |
147 #include "decom.h" | |
148 #include "FirmwareData.h" | |
149 | |
150 // From Common/Drivers/ | |
151 #include "stm32f4xx_hal.h" | |
152 #include <stdio.h> | |
153 | |
433 | 154 uint8_t coldstart __attribute__((section (".noinit"))); |
155 | |
89 | 156 uint8_t hasExternalClock(void) { |
157 if ((TM_OTP_Read(0, 0) > 0) && (TM_OTP_Read(0, 0) < 0xFF)) | |
158 return 1; | |
159 else | |
160 return 0; | |
38 | 161 } |
162 | |
163 // SHALL LOAD AT 0x08000000 + 0x00005000 = 0x08005000. | |
164 // See CPU2-RTE.ld | |
100 | 165 const SFirmwareData cpu2_FirmwareData __attribute__(( section(".firmware_data") ))= { |
341
591c03a1e68d
change max. allowed surface pressure to 1030hPa (As in the small OSTC)
heinrichsweikamp
parents:
339
diff
changeset
|
166 .versionFirst = 2, |
439 | 167 .versionSecond = 3, |
280
ae27d6185d51
Make RTE show as 1.8.0 beta, add update files for testing purposes
heinrichsweikamp
parents:
274
diff
changeset
|
168 .versionThird = 0, |
286
733877ab87d9
Minor: Some Texts fixed, allign RTErequired* values with RTE firmware
heinrichsweikamp
parents:
280
diff
changeset
|
169 .versionBeta = 0, |
38 | 170 |
89 | 171 /* 4 bytes with trailing 0 */ |
100 | 172 .signature = "mh", |
38 | 173 |
439 | 174 .release_year = 20, |
175 .release_month = 2, | |
176 .release_day = 26, | |
100 | 177 .release_sub = 0, |
38 | 178 |
89 | 179 /* max 48 with trailing 0 */ |
180 //release_info ="12345678901234567890123456789012345678901" | |
356 | 181 .release_info = "stable Nov'19", |
38 | 182 |
89 | 183 /* for safety reasons and coming functions */ |
184 .magic[0] = FIRMWARE_MAGIC_FIRST, .magic[1] = FIRMWARE_MAGIC_SECOND, | |
185 .magic[2] = FIRMWARE_MAGIC_CPU2_RTE, /* the magic byte for RTE */ | |
433 | 186 .magic[3] = FIRMWARE_MAGIC_END |
187 }; | |
188 | |
38 | 189 |
89 | 190 uint8_t firmwareVersionHigh(void) { |
191 return cpu2_FirmwareData.versionFirst; | |
38 | 192 } |
193 | |
89 | 194 uint8_t firmwareVersionLow(void) { |
195 return cpu2_FirmwareData.versionSecond; | |
38 | 196 } |
197 | |
198 /** @addtogroup OSTC4 | |
199 * @{ | |
200 */ | |
201 | |
202 /** @addtogroup CPU2 | |
203 * @{ | |
204 */ | |
205 | |
206 /* Private typedef -----------------------------------------------------------*/ | |
207 /* Private define ------------------------------------------------------------*/ | |
208 #define BUTTON_OSTC_GPIO_PIN GPIO_PIN_0 | |
209 #define BUTTON_OSTC_GPIO_PORT GPIOA | |
210 #define BUTTON_OSTC_HAL_RCC_GPIO_CLK_ENABLE() __HAL_RCC_GPIOA_CLK_ENABLE() | |
211 #define BUTTON_OSTC_IRQn EXTI0_IRQn | |
212 | |
213 #define BUTTON_TEST_GPIO_PIN GPIO_PIN_3 | |
214 #define BUTTON_TEST_GPIO_PORT GPIOA | |
215 #define BUTTON_TEST_GPIO_CLK_ENABLE() __GPIOA_CLK_ENABLE() | |
216 #define BUTTON_TEST_IRQn EXTI3_IRQn | |
217 | |
218 #define WIRELSS_RISING_GPIO_PIN GPIO_PIN_1 | |
219 #define WIRELSS_RISING_GPIO_PORT GPIOA | |
220 #define WIRELSS_RISING_HAL_RCC_GPIO_CLK_ENABLE() __HAL_RCC_GPIOA_CLK_ENABLE() | |
221 #define WIRELSS_RISING_IRQn EXTI1_IRQn | |
222 | |
223 #define WIRELSS_FALLING_GPIO_PIN GPIO_PIN_2 | |
224 #define WIRELSS_FALLING_GPIO_PORT GPIOA | |
225 #define WIRELSS_FALLING_HAL_RCC_GPIO_CLK_ENABLE() __HAL_RCC_GPIOA_CLK_ENABLE() | |
226 #define WIRELSS_FALLING_IRQn EXTI2_IRQn | |
227 | |
228 #define WIRELSS_POWER_GPIO_PIN GPIO_PIN_12 | |
229 #define WIRELSS_POWER_GPIO_PORT GPIOB | |
230 #define WIRELSS_POWER_HAL_RCC_GPIO_CLK_ENABLE() __HAL_RCC_GPIOB_CLK_ENABLE() | |
231 | |
232 /* Private macro -------------------------------------------------------------*/ | |
233 | |
234 /* Private variables ---------------------------------------------------------*/ | |
235 uint32_t global_test_time_counter = 0; | |
236 SBackup backup; | |
237 | |
238 /* Private function prototypes -----------------------------------------------*/ | |
239 static void EXTI_Wakeup_Button_Init(void); | |
240 static void EXTI_Wakeup_Button_DeInit(void); | |
241 | |
242 static void EXTI_Test_Button_Init(void); | |
243 static void EXTI_Test_Button_DeInit(void); | |
244 | |
245 static void GPIO_LED_Init(void); | |
246 static void GPIO_Power_MainCPU_Init(void); | |
247 static void GPIO_Power_MainCPU_ON(void); | |
248 static void GPIO_Power_MainCPU_OFF(void); | |
249 | |
183 | 250 #ifdef DEBUG_I2C_LINES |
38 | 251 void GPIO_test_I2C_lines(void); |
183 | 252 #endif |
38 | 253 |
254 void sleep_prepare(void); | |
255 | |
256 void SystemClock_Config(void); | |
257 void SystemClock_Config_HSI(void); | |
258 void SystemClock_Config_HSE(void); | |
259 void SYSCLKConfig_STOP_HSI(void); | |
260 void SYSCLKConfig_STOP_HSE(void); | |
261 | |
262 void GPIO_new_DEBUG_Init(void); | |
263 void GPIO_new_DEBUG_LOW(void); | |
264 void GPIO_new_DEBUG_HIGH(void); | |
265 | |
266 #define REGULAR_RUN | |
267 | |
89 | 268 int __io_putchar(int ch) { |
269 ITM_SendChar(ch); | |
270 return ch; | |
38 | 271 } |
272 | |
273 /* Private functions ---------------------------------------------------------*/ | |
274 | |
275 /** | |
276 * @brief Main program | |
277 * @param None | |
278 * @retval None | |
279 */ | |
120 | 280 /* #define DEBUG_RUNTIME TRUE */ |
281 #ifdef DEBUG_RUNTIME | |
282 #define MEASURECNT 60 /* number of measuremets to be stored */ | |
283 static uint32_t loopcnt[MEASURECNT]; | |
284 extern RTC_HandleTypeDef RTCHandle; | |
285 #endif | |
38 | 286 |
89 | 287 int main(void) { |
120 | 288 |
289 #ifdef DEBUG_RUNTIME | |
290 RTC_TimeTypeDef Stime; | |
291 uint8_t measurementindex = 0; | |
292 uint8_t lastsecond = 0xFF; | |
293 #endif | |
294 | |
89 | 295 HAL_Init(); |
296 SystemClock_Config(); | |
38 | 297 |
89 | 298 HAL_SYSTICK_Config(HAL_RCC_GetHCLKFreq() / 1000); |
299 HAL_SYSTICK_CLKSourceConfig( SYSTICK_CLKSOURCE_HCLK); | |
300 HAL_NVIC_SetPriority(SysTick_IRQn, 0, 0); | |
38 | 301 |
89 | 302 MX_RTC_init(); |
303 GPIO_LED_Init(); | |
304 GPIO_new_DEBUG_Init(); // added 170322 hw | |
305 initGlobals(); | |
38 | 306 |
120 | 307 /* printf("CPU2-RTE running...\n"); */ |
38 | 308 |
329 | 309 HAL_Delay(100); |
310 | |
89 | 311 MX_I2C1_Init(); |
329 | 312 if (global.I2C_SystemStatus != HAL_OK) |
313 { | |
89 | 314 if (MX_I2C1_TestAndClear() == GPIO_PIN_RESET) { |
315 MX_I2C1_TestAndClear(); // do it a second time | |
316 } | |
317 MX_I2C1_Init(); | |
318 } | |
38 | 319 |
329 | 320 |
321 | |
89 | 322 //dangerous: TM_OTP_Write(0,0, 0x01); |
38 | 323 #ifdef REGULAR_RUN |
89 | 324 global.sensorError[SENSOR_PRESSURE_ID] = init_pressure(); |
325 global.I2C_SystemStatus = global.sensorError[SENSOR_PRESSURE_ID]; | |
329 | 326 if (global.I2C_SystemStatus != HAL_OK) |
327 { | |
89 | 328 if (MX_I2C1_TestAndClear() == GPIO_PIN_RESET) { |
329 MX_I2C1_TestAndClear(); // do it a second time | |
330 } | |
331 MX_I2C1_Init(); | |
332 global.sensorError[SENSOR_PRESSURE_ID] = init_pressure(); | |
333 global.I2C_SystemStatus = global.sensorError[SENSOR_PRESSURE_ID]; | |
334 } | |
38 | 335 |
89 | 336 global.dataSendToMaster.sensorErrors = |
337 global.sensorError[SENSOR_PRESSURE_ID]; | |
329 | 338 |
339 if(is_init_pressure_done()) | |
340 { | |
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
parents:
334
diff
changeset
|
341 init_surface_ring(0); |
329 | 342 } |
89 | 343 init_battery_gas_gauge(); |
344 HAL_Delay(10); | |
345 battery_gas_gauge_get_data(); | |
473
edfc1a464b42
Do not signal power on reset in case of a "warm" reset:
ideenmodellierer
parents:
439
diff
changeset
|
346 |
edfc1a464b42
Do not signal power on reset in case of a "warm" reset:
ideenmodellierer
parents:
439
diff
changeset
|
347 MX_SPI3_Init(); |
edfc1a464b42
Do not signal power on reset in case of a "warm" reset:
ideenmodellierer
parents:
439
diff
changeset
|
348 |
edfc1a464b42
Do not signal power on reset in case of a "warm" reset:
ideenmodellierer
parents:
439
diff
changeset
|
349 if(coldstart != 0xA5) /* Not reading a 0xA5 means the memory cells has not been initialized before => cold start */ |
433 | 350 { |
351 coldstart = 0xA5; | |
352 battery_gas_gauge_set(0); | |
473
edfc1a464b42
Do not signal power on reset in case of a "warm" reset:
ideenmodellierer
parents:
439
diff
changeset
|
353 global.dataSendToMaster.power_on_reset = 1; |
edfc1a464b42
Do not signal power on reset in case of a "warm" reset:
ideenmodellierer
parents:
439
diff
changeset
|
354 global.deviceDataSendToMaster.power_on_reset = 1; |
edfc1a464b42
Do not signal power on reset in case of a "warm" reset:
ideenmodellierer
parents:
439
diff
changeset
|
355 |
edfc1a464b42
Do not signal power on reset in case of a "warm" reset:
ideenmodellierer
parents:
439
diff
changeset
|
356 if (!scheduleSetButtonResponsiveness()) |
edfc1a464b42
Do not signal power on reset in case of a "warm" reset:
ideenmodellierer
parents:
439
diff
changeset
|
357 { |
edfc1a464b42
Do not signal power on reset in case of a "warm" reset:
ideenmodellierer
parents:
439
diff
changeset
|
358 HAL_Delay(1); |
edfc1a464b42
Do not signal power on reset in case of a "warm" reset:
ideenmodellierer
parents:
439
diff
changeset
|
359 if (!scheduleSetButtonResponsiveness()) // send again, if problem it's not my problem here. |
edfc1a464b42
Do not signal power on reset in case of a "warm" reset:
ideenmodellierer
parents:
439
diff
changeset
|
360 { |
edfc1a464b42
Do not signal power on reset in case of a "warm" reset:
ideenmodellierer
parents:
439
diff
changeset
|
361 HAL_Delay(1); |
edfc1a464b42
Do not signal power on reset in case of a "warm" reset:
ideenmodellierer
parents:
439
diff
changeset
|
362 scheduleSetButtonResponsiveness(); // init |
edfc1a464b42
Do not signal power on reset in case of a "warm" reset:
ideenmodellierer
parents:
439
diff
changeset
|
363 HAL_Delay(1); |
edfc1a464b42
Do not signal power on reset in case of a "warm" reset:
ideenmodellierer
parents:
439
diff
changeset
|
364 } |
edfc1a464b42
Do not signal power on reset in case of a "warm" reset:
ideenmodellierer
parents:
439
diff
changeset
|
365 } |
433 | 366 } |
38 | 367 |
89 | 368 global.lifeData.battery_voltage = get_voltage(); |
369 global.lifeData.battery_charge = get_charge(); | |
370 copyBatteryData(); | |
38 | 371 |
89 | 372 ADCx_Init(); |
373 GPIO_Power_MainCPU_Init(); | |
374 global.mode = MODE_POWERUP; | |
38 | 375 #else |
89 | 376 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
parents:
334
diff
changeset
|
377 init_surface_ring(0); |
38 | 378 |
89 | 379 ADCx_Init(); |
380 GPIO_Power_MainCPU_Init(); | |
381 global.mode = MODE_TEST; | |
38 | 382 #endif |
89 | 383 while (1) { |
120 | 384 /* printf("Global mode = %d\n", global.mode); */ |
38 | 385 |
89 | 386 switch (global.mode) { |
387 case MODE_POWERUP: | |
388 case MODE_BOOT: | |
389 // ReInit_battery_charger_status_pins(); | |
390 compass_init(0, 7); | |
391 accelerator_init(); | |
181 | 392 |
89 | 393 if (global.mode == MODE_BOOT) { |
394 GPIO_Power_MainCPU_OFF(); | |
395 HAL_Delay(100); // for GPIO_Power_MainCPU_ON(); | |
396 GPIO_Power_MainCPU_ON(); | |
397 } | |
398 SPI_synchronize_with_Master(); | |
399 MX_DMA_Init(); | |
400 MX_SPI1_Init(); | |
134
0586ae83a243
Removed cyclic (by timer) send on slave side
Ideenmodellierer
parents:
120
diff
changeset
|
401 SPI_Start_single_TxRx_with_Master(); /* be prepared for the first data exchange */ |
207 | 402 Scheduler_Request_sync_with_SPI(SPI_SYNC_METHOD_HARD); |
89 | 403 EXTI_Test_Button_Init(); |
404 global.mode = MODE_SURFACE; | |
405 break; | |
38 | 406 |
89 | 407 case MODE_CALIB: |
90 | 408 scheduleCompassCalibrationMode(); |
89 | 409 break; |
410 | |
411 case MODE_SURFACE: | |
412 scheduleSurfaceMode(); | |
413 break; | |
38 | 414 |
89 | 415 case MODE_TEST: |
416 break; | |
38 | 417 |
89 | 418 case MODE_DIVE: |
90 | 419 backup.no_fly_time_minutes = global.no_fly_time_minutes; |
420 backup.seconds_since_last_dive = global.seconds_since_last_dive; | |
421 | |
422 vpm_init( &global.vpm, global.conservatism, global.repetitive_dive, | |
423 global.seconds_since_last_dive ); | |
424 global.no_fly_time_minutes = 0; | |
425 global.lifeData.dive_time_seconds = 0; | |
426 global.lifeData.dive_time_seconds_without_surface_time = 0; | |
427 scheduleDiveMode(); | |
428 // done now in scheduler prior to change mode: global.seconds_since_last_dive = 1; | |
429 | |
430 if( global.lifeData.dive_time_seconds > 60 ) | |
431 { | |
432 //No Fly time 60% of desaturationtime after dive | |
433 global.no_fly_time_minutes = decom_calc_desaturation_time( | |
434 global.lifeData.tissue_nitrogen_bar, | |
435 global.lifeData.tissue_helium_bar, | |
436 global.lifeData.pressure_surface_bar ) * 60 / 100; | |
437 if( global.no_fly_time_minutes < (24 * 60) ) | |
438 global.no_fly_time_minutes = 24 * 60; | |
439 } | |
440 else | |
441 { | |
442 global.no_fly_time_minutes = backup.no_fly_time_minutes; | |
443 global.seconds_since_last_dive = backup.seconds_since_last_dive; | |
444 } | |
445 | |
446 global.lifeData.dive_time_seconds = 0; | |
447 global.lifeData.dive_time_seconds_without_surface_time = 0; | |
448 global.lifeData.counterSecondsShallowDepth = 0; | |
449 | |
450 backup.no_fly_time_minutes = 0; | |
451 backup.seconds_since_last_dive = 0; | |
89 | 452 break; |
38 | 453 |
89 | 454 case MODE_SHUTDOWN: |
455 HAL_Delay(200); | |
456 global.mode = MODE_SLEEP; | |
457 MX_SPI3_Init(); | |
458 break; | |
459 | |
460 case MODE_SLEEP: | |
461 /* | |
462 sleep_prepare(); | |
463 scheduleSleepMode_test(); | |
464 */ | |
465 /* | |
466 GPIO_Power_MainCPU_OFF(); | |
467 EXTI_Test_Button_DeInit(); | |
468 EXTI_Wakeup_Button_Init(); | |
469 NOT_USED_AT_THE_MOMENT_scheduleSleepMode(); | |
470 */ | |
471 EXTI_Test_Button_DeInit(); | |
472 if (hasExternalClock()) | |
473 SystemClock_Config_HSI(); | |
474 sleep_prepare(); | |
38 | 475 |
89 | 476 GPIO_LED_Init(); |
38 | 477 |
89 | 478 scheduleSleepMode(); |
479 if (hasExternalClock()) | |
480 SystemClock_Config_HSE(); | |
481 GPIO_LED_Init(); | |
482 EXTI_Wakeup_Button_DeInit(); | |
483 ADCx_Init(); | |
484 GPIO_Power_MainCPU_Init(); | |
485 GPIO_Power_MainCPU_ON(); | |
486 compass_init(0, 7); | |
487 accelerator_init(); | |
148
ee744c7160ce
Use SPI TX callback to synchronize to main CPU
Ideenmodellierer
parents:
134
diff
changeset
|
488 SPI_synchronize_with_Master(); |
89 | 489 MX_DMA_Init(); |
490 MX_SPI1_Init(); | |
148
ee744c7160ce
Use SPI TX callback to synchronize to main CPU
Ideenmodellierer
parents:
134
diff
changeset
|
491 SPI_Start_single_TxRx_with_Master(); |
89 | 492 |
493 // EXTILine0_Button_DeInit(); not now, later after testing | |
494 break; | |
495 } | |
120 | 496 |
497 #ifdef DEBUG_RUNTIME | |
498 HAL_RTC_GetTime(&RTCHandle, &Stime, RTC_FORMAT_BCD); | |
499 | |
500 if(lastsecond == 0xFF) | |
501 { | |
502 measurementindex = 0; | |
503 loopcnt[measurementindex] = 0; | |
504 lastsecond = Stime.Seconds; | |
505 } | |
506 loopcnt[measurementindex]++; | |
507 | |
508 if(lastsecond != Stime.Seconds) | |
509 { | |
510 measurementindex++; | |
511 if (measurementindex == MEASURECNT) measurementindex = 0; | |
512 loopcnt[measurementindex] = 0; | |
513 lastsecond = Stime.Seconds; | |
514 if(measurementindex +1 < MEASURECNT) loopcnt[measurementindex +1] = 0xffff; /* helps to identify the latest value */ | |
515 } | |
516 #endif | |
89 | 517 } |
38 | 518 } |
519 | |
520 /** @brief Button feedback - EXTI line detection callbacks | |
521 * @param GPIO_Pin: Specifies the pins connected EXTI line | |
522 * @retval None | |
523 */ | |
89 | 524 void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin) { |
38 | 525 |
89 | 526 if (GPIO_Pin == BUTTON_OSTC_GPIO_PIN) { |
527 if (global.mode == MODE_SLEEP) { | |
528 global.mode = MODE_BOOT; | |
529 } | |
530 } | |
531 else | |
532 if (GPIO_Pin == BUTTON_TEST_GPIO_PIN) { | |
533 if (!global.demo_mode && (global.mode == MODE_SURFACE)) { | |
534 global.demo_mode = 1; | |
535 global.mode = MODE_DIVE; | |
536 } else if (global.demo_mode && (global.mode == MODE_DIVE) | |
537 && (global.lifeData.dive_time_seconds > 10)) { | |
538 global.demo_mode = 0; | |
539 global.dataSendToMaster.mode = MODE_ENDDIVE; | |
540 global.deviceDataSendToMaster.mode = MODE_ENDDIVE; | |
541 } | |
542 } | |
38 | 543 } |
544 | |
545 /** | |
546 * @brief System Clock Configuration | |
547 * The system Clock is configured as follow : | |
548 * System Clock source = PLL (HSI) | |
549 * SYSCLK(Hz) = 100 MHz | |
550 * HCLK(Hz) = 100 MHz | |
551 * AHB Prescaler = 1 | |
552 * APB1 Prescaler = 2 | |
553 * APB2 Prescaler = 1 | |
554 * HSI Frequency(Hz) = 16 MHz | |
555 * PLL_M = 16 | |
556 * PLL_N = 400 | |
557 * PLL_P = 4 | |
558 * PLL_Q = 7 // no USB | |
559 * VDD(V) = 3.3 | |
560 * Main regulator output voltage = Scale1 mode | |
561 * Flash Latency(WS) = 3 | |
562 * @param None | |
563 * @retval None | |
564 */ | |
565 | |
89 | 566 void SystemClock_Config(void) { |
567 if (hasExternalClock()) | |
568 SystemClock_Config_HSE(); | |
569 else | |
570 SystemClock_Config_HSI(); | |
38 | 571 } |
572 | |
89 | 573 void SYSCLKConfig_STOP(void) { |
574 SYSCLKConfig_STOP_HSI(); | |
38 | 575 } |
576 | |
89 | 577 void SystemClock_Config_HSE(void) { |
578 RCC_OscInitTypeDef RCC_OscInitStruct; | |
579 RCC_ClkInitTypeDef RCC_ClkInitStruct; | |
38 | 580 // RCC_PeriphCLKInitTypeDef PeriphClkInitStruct; |
581 | |
89 | 582 __PWR_CLK_ENABLE(); // is identical to __HAL_RCC_PWR_CLK_ENABLE(); |
38 | 583 |
89 | 584 __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE2); |
38 | 585 |
89 | 586 RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE; //|RCC_OSCILLATORTYPE_LSE; |
587 RCC_OscInitStruct.HSEState = RCC_HSE_ON; | |
588 //RCC_OscInitStruct.LSEState = RCC_LSE_ON; | |
589 RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON; | |
590 RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE; | |
591 RCC_OscInitStruct.PLL.PLLM = 8; | |
592 RCC_OscInitStruct.PLL.PLLN = 320; | |
593 RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV4; | |
594 RCC_OscInitStruct.PLL.PLLQ = 4; | |
595 HAL_RCC_OscConfig(&RCC_OscInitStruct); | |
38 | 596 |
89 | 597 RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK | RCC_CLOCKTYPE_SYSCLK |
598 | RCC_CLOCKTYPE_PCLK1 | RCC_CLOCKTYPE_PCLK2; | |
599 RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK; | |
600 RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1; | |
601 RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV2; | |
602 RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1; | |
603 HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_2); | |
38 | 604 |
605 // PeriphClkInitStruct.PeriphClockSelection = RCC_PERIPHCLK_RTC; | |
606 // PeriphClkInitStruct.RTCClockSelection = RCC_RTCCLKSOURCE_LSE; | |
607 // HAL_RCCEx_PeriphCLKConfig(&PeriphClkInitStruct); | |
608 | |
609 // HAL_SYSTICK_Config(HAL_RCC_GetHCLKFreq()/1000); | |
610 | |
611 // HAL_SYSTICK_CLKSourceConfig(SYSTICK_CLKSOURCE_HCLK); | |
612 | |
89 | 613 /* SysTick_IRQn interrupt configuration */ |
38 | 614 // HAL_NVIC_SetPriority(SysTick_IRQn, 0, 0); |
615 } | |
616 | |
89 | 617 void SystemClock_Config_HSI(void) { |
618 RCC_ClkInitTypeDef RCC_ClkInitStruct; | |
619 RCC_OscInitTypeDef RCC_OscInitStruct; | |
38 | 620 |
89 | 621 /* Enable Power Control clock */ |
622 __HAL_RCC_PWR_CLK_ENABLE(); | |
38 | 623 |
89 | 624 /* The voltage scaling allows optimizing the power consumption when the device is |
625 clocked below the maximum system frequency, to update the voltage scaling value | |
626 regarding system frequency refer to product datasheet. */ | |
627 __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE2); | |
38 | 628 |
89 | 629 /* Enable HSI Oscillator and activate PLL with HSI as source */ |
630 RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI; | |
631 RCC_OscInitStruct.HSIState = RCC_HSI_ON; | |
632 RCC_OscInitStruct.HSICalibrationValue = 0x10; | |
633 RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON; | |
634 RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSI; | |
635 RCC_OscInitStruct.PLL.PLLM = 16; | |
636 RCC_OscInitStruct.PLL.PLLN = 320; | |
637 RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV4; | |
638 RCC_OscInitStruct.PLL.PLLQ = 4; | |
639 HAL_RCC_OscConfig(&RCC_OscInitStruct); | |
38 | 640 |
89 | 641 /* Select PLL as system clock source and configure the HCLK, PCLK1 and PCLK2 |
642 clocks dividers */ | |
643 RCC_ClkInitStruct.ClockType = (RCC_CLOCKTYPE_SYSCLK | RCC_CLOCKTYPE_HCLK | |
644 | RCC_CLOCKTYPE_PCLK1 | RCC_CLOCKTYPE_PCLK2); | |
645 RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK; | |
646 RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1; | |
647 RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV2; | |
648 RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1; | |
649 HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_2); | |
38 | 650 } |
651 /* | |
652 RCC_OscInitTypeDef RCC_OscInitStruct; | |
653 RCC_ClkInitTypeDef RCC_ClkInitStruct; | |
654 | |
655 __HAL_RCC_PWR_CLK_ENABLE(); | |
656 | |
657 //__PWR_CLK_ENABLE(); | |
658 | |
659 __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE2); | |
660 | |
661 RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI|RCC_OSCILLATORTYPE_LSE; | |
662 RCC_OscInitStruct.LSEState = RCC_LSE_ON; | |
663 RCC_OscInitStruct.HSIState = RCC_HSI_ON; | |
664 RCC_OscInitStruct.HSICalibrationValue = 16; | |
665 RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON; | |
666 RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSI; | |
667 RCC_OscInitStruct.PLL.PLLM = 16; | |
668 RCC_OscInitStruct.PLL.PLLN = 320; | |
669 RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV4; | |
670 RCC_OscInitStruct.PLL.PLLQ = 4; | |
671 HAL_RCC_OscConfig(&RCC_OscInitStruct); | |
672 | |
673 RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_SYSCLK|RCC_CLOCKTYPE_PCLK1; | |
674 RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK; | |
675 RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1; | |
676 RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV2; | |
677 RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1; | |
678 HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_2); | |
679 } | |
680 | |
681 static void RtcClock_Config(void) | |
682 { | |
683 RCC_PeriphCLKInitTypeDef PeriphClkInitStruct; | |
684 PeriphClkInitStruct.PeriphClockSelection = RCC_PERIPHCLK_RTC; | |
685 PeriphClkInitStruct.RTCClockSelection = RCC_RTCCLKSOURCE_LSE; | |
686 HAL_RCCEx_PeriphCLKConfig(&PeriphClkInitStruct); | |
687 } | |
688 */ | |
689 | |
690 /** | |
691 * @brief Configures system clock after wake-up from STOP: enable HSI, PLL | |
692 * and select PLL as system clock source. | |
693 * @param None | |
694 * @retval None | |
695 */ | |
89 | 696 void SYSCLKConfig_STOP_HSE(void) { |
697 RCC_ClkInitTypeDef RCC_ClkInitStruct; | |
698 RCC_OscInitTypeDef RCC_OscInitStruct; | |
699 uint32_t pFLatency = 0; | |
38 | 700 |
89 | 701 /* Get the Oscillators configuration according to the internal RCC registers */ |
702 HAL_RCC_GetOscConfig(&RCC_OscInitStruct); | |
38 | 703 |
89 | 704 /* After wake-up from STOP reconfigure the system clock: Enable HSI and PLL */ |
705 RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE; | |
706 RCC_OscInitStruct.HSIState = RCC_HSE_ON; | |
707 RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON; | |
708 HAL_RCC_OscConfig(&RCC_OscInitStruct); | |
38 | 709 |
89 | 710 /* Get the Clocks configuration according to the internal RCC registers */ |
711 HAL_RCC_GetClockConfig(&RCC_ClkInitStruct, &pFLatency); | |
38 | 712 |
89 | 713 /* Select PLL as system clock source and configure the HCLK, PCLK1 and PCLK2 |
714 clocks dividers */ | |
715 RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_SYSCLK; | |
716 RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK; | |
717 HAL_RCC_ClockConfig(&RCC_ClkInitStruct, pFLatency); | |
38 | 718 } |
719 | |
89 | 720 void SYSCLKConfig_STOP_HSI(void) { |
721 RCC_ClkInitTypeDef RCC_ClkInitStruct; | |
722 RCC_OscInitTypeDef RCC_OscInitStruct; | |
723 uint32_t pFLatency = 0; | |
38 | 724 |
89 | 725 /* Get the Oscillators configuration according to the internal RCC registers */ |
726 HAL_RCC_GetOscConfig(&RCC_OscInitStruct); | |
38 | 727 |
89 | 728 /* After wake-up from STOP reconfigure the system clock: Enable HSI and PLL */ |
729 RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI; | |
730 RCC_OscInitStruct.HSIState = RCC_HSI_ON; | |
731 RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON; | |
732 RCC_OscInitStruct.HSICalibrationValue = 0x10; | |
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 | |
745 /** | |
746 * @brief SYSTICK callback | |
747 * @param None | |
748 * @retval None | |
749 */ | |
89 | 750 void HAL_SYSTICK_Callback(void) { |
751 HAL_IncTick(); | |
38 | 752 } |
753 | |
754 /** | |
755 * @brief Configures GPIO for LED | |
756 * Might move with STM32Cube usage | |
757 * @param None | |
758 * @retval None | |
759 */ | |
760 /* | |
761 void GPIO_test_I2C_lines(void) | |
762 { | |
763 GPIO_InitTypeDef GPIO_InitStructure; | |
764 __GPIOB_CLK_ENABLE(); | |
765 GPIO_InitStructure.Pin = GPIO_PIN_8; | |
766 GPIO_InitStructure.Mode = GPIO_MODE_OUTPUT_PP; | |
767 GPIO_InitStructure.Pull = GPIO_PULLUP; | |
768 GPIO_InitStructure.Speed = GPIO_SPEED_LOW; | |
769 HAL_GPIO_Init(GPIOB, &GPIO_InitStructure); | |
770 GPIO_InitStructure.Pin = GPIO_PIN_9; | |
771 HAL_GPIO_Init(GPIOB, &GPIO_InitStructure); | |
772 | |
773 HAL_GPIO_WritePin(GPIOB,GPIO_PIN_8,GPIO_PIN_SET); | |
774 HAL_GPIO_WritePin(GPIOB,GPIO_PIN_9,GPIO_PIN_RESET); | |
775 HAL_Delay(10); | |
776 HAL_GPIO_WritePin(GPIOB,GPIO_PIN_9,GPIO_PIN_SET); | |
777 HAL_GPIO_WritePin(GPIOB,GPIO_PIN_8,GPIO_PIN_RESET); | |
778 HAL_Delay(10); | |
779 } | |
780 */ | |
781 | |
89 | 782 static void GPIO_LED_Init(void) { |
783 GPIO_InitTypeDef GPIO_InitStructure; | |
38 | 784 |
89 | 785 __GPIOC_CLK_ENABLE(); |
786 GPIO_InitStructure.Pin = GPIO_PIN_3; | |
787 GPIO_InitStructure.Mode = GPIO_MODE_OUTPUT_PP; | |
788 GPIO_InitStructure.Pull = GPIO_PULLUP; | |
789 GPIO_InitStructure.Speed = GPIO_SPEED_FAST; | |
790 HAL_GPIO_Init( GPIOC, &GPIO_InitStructure); | |
38 | 791 } |
792 | |
89 | 793 void GPIO_new_DEBUG_Init(void) { |
38 | 794 #ifdef DEBUG_PIN_ACTIVE |
89 | 795 GPIO_InitTypeDef GPIO_InitStructure; |
38 | 796 |
89 | 797 __GPIOC_CLK_ENABLE(); |
798 GPIO_InitStructure.Pin = GPIO_PIN_3; | |
799 GPIO_InitStructure.Mode = GPIO_MODE_OUTPUT_PP; | |
800 GPIO_InitStructure.Pull = GPIO_PULLUP; | |
801 GPIO_InitStructure.Speed = GPIO_SPEED_FAST; | |
802 HAL_GPIO_Init(GPIOA, &GPIO_InitStructure); | |
38 | 803 #endif |
804 } | |
805 | |
89 | 806 void GPIO_new_DEBUG_LOW(void) { |
38 | 807 #ifdef DEBUG_PIN_ACTIVE |
89 | 808 HAL_GPIO_WritePin(GPIOC,GPIO_PIN_3,GPIO_PIN_RESET); |
38 | 809 #endif |
810 } | |
811 | |
89 | 812 void GPIO_new_DEBUG_HIGH(void) { |
38 | 813 #ifdef DEBUG_PIN_ACTIVE |
89 | 814 HAL_GPIO_WritePin(GPIOC,GPIO_PIN_3,GPIO_PIN_SET); |
38 | 815 #endif |
816 } | |
817 | |
89 | 818 static void GPIO_Power_MainCPU_Init(void) { |
819 GPIO_InitTypeDef GPIO_InitStructure; | |
820 __GPIOC_CLK_ENABLE(); | |
821 GPIO_InitStructure.Pin = GPIO_PIN_0; | |
822 GPIO_InitStructure.Mode = GPIO_MODE_OUTPUT_PP; | |
823 GPIO_InitStructure.Pull = GPIO_PULLUP; | |
824 GPIO_InitStructure.Speed = GPIO_SPEED_LOW; | |
825 HAL_GPIO_Init( GPIOC, &GPIO_InitStructure); | |
826 HAL_GPIO_WritePin( GPIOC, GPIO_PIN_0, GPIO_PIN_RESET); | |
38 | 827 } |
828 | |
89 | 829 static void GPIO_Power_MainCPU_ON(void) { |
830 HAL_GPIO_WritePin( GPIOC, GPIO_PIN_0, GPIO_PIN_RESET); | |
38 | 831 } |
832 | |
89 | 833 static void GPIO_Power_MainCPU_OFF(void) { |
834 HAL_GPIO_WritePin( GPIOC, GPIO_PIN_0, GPIO_PIN_SET); | |
38 | 835 } |
836 | |
837 /** | |
838 * @brief Configures EXTI Line0 (connected to PA0 + PA1 pin) in interrupt mode | |
839 * @param None | |
840 * @retval None | |
841 */ | |
842 | |
89 | 843 static void EXTI_Wakeup_Button_Init(void) { |
844 GPIO_InitTypeDef GPIO_InitStructure; | |
38 | 845 |
89 | 846 __HAL_RCC_GPIOA_CLK_ENABLE(); |
847 BUTTON_OSTC_HAL_RCC_GPIO_CLK_ENABLE(); | |
848 GPIO_InitStructure.Pin = BUTTON_OSTC_GPIO_PIN; | |
849 GPIO_InitStructure.Mode = GPIO_MODE_IT_FALLING; | |
850 GPIO_InitStructure.Pull = GPIO_NOPULL; | |
851 HAL_GPIO_Init( BUTTON_OSTC_GPIO_PORT, &GPIO_InitStructure); | |
38 | 852 |
89 | 853 HAL_NVIC_SetPriority( BUTTON_OSTC_IRQn, 0x0F, 0); |
854 HAL_NVIC_EnableIRQ( BUTTON_OSTC_IRQn); | |
38 | 855 } |
856 | |
89 | 857 static void EXTI_Wakeup_Button_DeInit(void) { |
858 GPIO_InitTypeDef GPIO_InitStructure; | |
38 | 859 |
89 | 860 GPIO_InitStructure.Mode = GPIO_MODE_ANALOG; |
861 GPIO_InitStructure.Speed = GPIO_SPEED_LOW; | |
862 GPIO_InitStructure.Pull = GPIO_NOPULL; | |
38 | 863 |
89 | 864 GPIO_InitStructure.Pin = BUTTON_OSTC_GPIO_PIN; |
865 HAL_GPIO_Init( BUTTON_OSTC_GPIO_PORT, &GPIO_InitStructure); | |
866 HAL_NVIC_DisableIRQ( BUTTON_OSTC_IRQn); | |
38 | 867 } |
868 | |
89 | 869 static void EXTI_Test_Button_Init(void) { |
870 GPIO_InitTypeDef GPIO_InitStructure; | |
38 | 871 |
89 | 872 BUTTON_TEST_GPIO_CLK_ENABLE(); |
873 GPIO_InitStructure.Pin = BUTTON_TEST_GPIO_PIN; | |
874 GPIO_InitStructure.Mode = GPIO_MODE_IT_FALLING; | |
875 GPIO_InitStructure.Pull = GPIO_PULLUP; | |
876 HAL_GPIO_Init( BUTTON_TEST_GPIO_PORT, &GPIO_InitStructure); | |
877 HAL_NVIC_SetPriority( BUTTON_TEST_IRQn, 0x0F, 0); | |
878 HAL_NVIC_EnableIRQ( BUTTON_TEST_IRQn); | |
38 | 879 } |
880 | |
89 | 881 static void EXTI_Test_Button_DeInit(void) { |
882 GPIO_InitTypeDef GPIO_InitStructure; | |
38 | 883 |
89 | 884 GPIO_InitStructure.Mode = GPIO_MODE_ANALOG; |
885 GPIO_InitStructure.Speed = GPIO_SPEED_LOW; | |
886 GPIO_InitStructure.Pull = GPIO_NOPULL; | |
38 | 887 |
89 | 888 GPIO_InitStructure.Pin = BUTTON_TEST_GPIO_PIN; |
889 HAL_GPIO_Init( BUTTON_TEST_GPIO_PORT, &GPIO_InitStructure); | |
890 HAL_NVIC_DisableIRQ( BUTTON_TEST_IRQn); | |
38 | 891 } |
892 | |
893 /* NUCLEO C 13 | |
894 KEY_BUTTON_GPIO_CLK_ENABLE(); | |
895 GPIO_InitStructure.Mode = GPIO_MODE_IT_FALLING; | |
896 GPIO_InitStructure.Pull = GPIO_NOPULL; | |
897 GPIO_InitStructure.Pin = KEY_BUTTON_PIN; | |
898 HAL_GPIO_Init(KEY_BUTTON_GPIO_PORT, &GPIO_InitStructure); | |
899 HAL_NVIC_SetPriority(KEY_BUTTON_EXTI_IRQn, 2, 0); | |
900 HAL_NVIC_EnableIRQ(KEY_BUTTON_EXTI_IRQn); | |
901 */ | |
902 | |
903 /** | |
904 * @brief Wake Up Timer callback | |
905 * @param hrtc: RTC handle | |
906 * @retval None | |
907 */ | |
908 | |
909 /* | |
910 void HAL_RTCEx_WakeUpTimerEventCallback(RTC_HandleTypeDef *hrtc) | |
911 { | |
912 static uint8_t uwCounter = 0; | |
913 uwCounter = 1; | |
914 } | |
915 */ | |
916 | |
89 | 917 void HAL_I2C_MasterTxCpltCallback(I2C_HandleTypeDef *I2cHandle) { |
38 | 918 |
919 } | |
920 | |
89 | 921 void HAL_I2C_MasterRxCpltCallback(I2C_HandleTypeDef *I2cHandle) { |
38 | 922 |
923 } | |
924 | |
89 | 925 void HAL_I2C_ErrorCallback(I2C_HandleTypeDef *I2cHandle) { |
38 | 926 |
927 } | |
928 | |
89 | 929 void sleep_prepare(void) { |
930 EXTI_Wakeup_Button_Init(); | |
931 /* | |
932 GPIO_InitStruct.Pull = GPIO_PULLUP; | |
933 GPIO_InitStruct.Pin = GPIO_PIN_0; | |
934 HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); | |
935 */ | |
936 compass_sleep(); | |
937 HAL_Delay(100); | |
938 accelerator_sleep(); | |
939 HAL_Delay(100); | |
38 | 940 |
89 | 941 I2C_DeInit(); |
942 MX_SPI_DeInit(); | |
943 MX_SPI3_DeInit(); | |
944 ADCx_DeInit(); | |
38 | 945 |
89 | 946 GPIO_InitTypeDef GPIO_InitStruct; |
38 | 947 |
89 | 948 __HAL_RCC_GPIOA_CLK_ENABLE(); |
949 __HAL_RCC_GPIOB_CLK_ENABLE(); | |
950 __HAL_RCC_GPIOC_CLK_ENABLE(); | |
951 __HAL_RCC_GPIOH_CLK_ENABLE(); | |
38 | 952 |
89 | 953 GPIO_InitStruct.Mode = GPIO_MODE_ANALOG; |
954 GPIO_InitStruct.Speed = GPIO_SPEED_HIGH; | |
955 GPIO_InitStruct.Pull = GPIO_NOPULL; | |
956 GPIO_InitStruct.Pin = GPIO_PIN_All; | |
957 HAL_GPIO_Init( GPIOH, &GPIO_InitStruct); | |
38 | 958 #ifdef DEBUGMODE |
89 | 959 GPIO_InitStruct.Pin = GPIO_PIN_All ^ ( GPIO_PIN_3 | GPIO_PIN_8 | GPIO_PIN_9); /* debug */ |
38 | 960 #endif |
89 | 961 HAL_GPIO_Init( GPIOB, &GPIO_InitStruct); |
38 | 962 |
89 | 963 GPIO_InitStruct.Pin = |
964 GPIO_PIN_All | |
965 ^ ( GPIO_PIN_0 | GPIO_PIN_1 | GPIO_PIN_2 | GPIO_PIN_14 | |
966 | GPIO_PIN_15); /* power off & charger in & charge out & OSC32*/ | |
967 HAL_GPIO_Init( GPIOC, &GPIO_InitStruct); | |
38 | 968 |
89 | 969 GPIO_InitStruct.Pin = GPIO_PIN_All ^ ( GPIO_PIN_0); |
38 | 970 #ifdef DEBUGMODE |
89 | 971 GPIO_InitStruct.Pin = GPIO_PIN_All ^ ( GPIO_PIN_0 | GPIO_PIN_13 | GPIO_PIN_14); /* wake up button & debug */ |
38 | 972 #endif |
89 | 973 HAL_GPIO_Init( GPIOA, &GPIO_InitStruct); |
38 | 974 |
89 | 975 GPIO_InitStruct.Pin = GPIO_PIN_All; |
976 HAL_GPIO_Init( GPIOH, &GPIO_InitStruct); | |
38 | 977 |
89 | 978 GPIO_Power_MainCPU_OFF(); |
38 | 979 |
980 #ifndef DEBUGMODE | |
89 | 981 __HAL_RCC_GPIOB_CLK_DISABLE(); |
38 | 982 #endif |
89 | 983 __HAL_RCC_GPIOH_CLK_DISABLE(); |
38 | 984 |
89 | 985 HAL_Delay(1000); |
38 | 986 } |
987 | |
988 /* | |
989 void sleep_test(void) | |
990 { | |
991 GPIO_InitTypeDef GPIO_InitStruct; | |
992 | |
993 __HAL_RCC_GPIOA_CLK_ENABLE(); | |
994 __HAL_RCC_GPIOB_CLK_ENABLE(); | |
995 __HAL_RCC_GPIOC_CLK_ENABLE(); | |
996 __HAL_RCC_GPIOH_CLK_ENABLE(); | |
997 | |
998 GPIO_InitStruct.Mode = GPIO_MODE_ANALOG; | |
999 GPIO_InitStruct.Speed = GPIO_SPEED_HIGH; | |
1000 GPIO_InitStruct.Pull = GPIO_NOPULL; | |
1001 GPIO_InitStruct.Pin = GPIO_PIN_All; | |
1002 HAL_GPIO_Init(GPIOH, &GPIO_InitStruct); | |
1003 HAL_GPIO_Init(GPIOB, &GPIO_InitStruct); | |
1004 | |
1005 GPIO_InitStruct.Pin = GPIO_PIN_All ^ ( GPIO_PIN_0 | GPIO_PIN_15 | GPIO_PIN_14); | |
1006 HAL_GPIO_Init(GPIOC, &GPIO_InitStruct); | |
1007 | |
1008 GPIO_InitStruct.Pin = GPIO_PIN_All ^ ( GPIO_PIN_0); | |
1009 HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); | |
1010 | |
1011 GPIO_Power_MainCPU_OFF(); | |
1012 | |
1013 GPIO_InitStruct.Pull = GPIO_PULLUP; | |
1014 GPIO_InitStruct.Pin = GPIO_PIN_0; | |
1015 HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); | |
1016 | |
1017 // __HAL_RCC_GPIOA_CLK_DISABLE(); | |
1018 __HAL_RCC_GPIOB_CLK_DISABLE(); | |
1019 // __HAL_RCC_GPIOC_CLK_DISABLE(); | |
1020 __HAL_RCC_GPIOH_CLK_DISABLE(); | |
1021 | |
1022 | |
1023 HAL_Delay(5000); | |
1024 while(1) | |
1025 { | |
1026 RTC_StopMode_2seconds(); | |
1027 HAL_Delay(200); | |
1028 } | |
1029 } | |
1030 */ | |
1031 | |
1032 #ifdef USE_FULL_ASSERT | |
1033 | |
1034 /** | |
1035 * @brief Reports the name of the source file and the source line number | |
1036 * where the assert_param error has occurred. | |
1037 * @param file: pointer to the source file name | |
1038 * @param line: assert_param error line source number | |
1039 * @retval None | |
1040 */ | |
1041 void assert_failed(uint8_t* file, uint32_t line) | |
1042 { | |
89 | 1043 /* User can add his own implementation to report the file name and line number, |
1044 ex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */ | |
38 | 1045 |
89 | 1046 /* Infinite loop */ |
1047 while (1) | |
1048 { | |
1049 } | |
38 | 1050 } |
1051 #endif | |
1052 | |
1053 /** | |
1054 * @} | |
1055 */ | |
104 | 1056 /** |
1057 * @brief This function handles SysTick Handler. | |
1058 * @param None | |
1059 * @retval None | |
1060 */ | |
38 | 1061 |
104 | 1062 /*TxRx only here. Every 100 ms.*/ |
1063 uint8_t ticks100ms=0; | |
1064 void SysTick_Handler(void) | |
1065 { | |
1066 HAL_IncTick(); | |
1067 if(ticks100ms<100){ | |
1068 ticks100ms++; | |
1069 }else | |
1070 { | |
1071 ticks100ms=0; | |
1072 } | |
1073 } | |
38 | 1074 /** |
1075 * @} | |
1076 */ | |
1077 | |
1078 /************************ (C) COPYRIGHT heinrichs weikamp *****END OF FILE****/ |