Mercurial > public > ostc4
annotate Small_CPU/Src/baseCPU2.c @ 902:d4622533271d Evo_2_23
VPM table mode:
Because of the model maths, usage of float data type and so on it may happen that the TTS decreases during ascent and continues calculation of the vpm. To keep the values stable the vpm table mode has been introduces. Instead of continously calculation of the stops the stop time is decreased if the diver is close to a deco stop. If the table is violated (e.g. by not doing gas change) the table will be updated to the new, longer runtime. The table will not be switch back to a shorter version in case e.g. the missed gas change is performed
author | Ideenmodellierer |
---|---|
date | Wed, 02 Oct 2024 22:18:19 +0200 |
parents | 6a7701f66b16 |
children | 0f2e5a166d40 |
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" | |
554
3328189786e7
Added external ADC interface functionality (MCP3424):
Ideenmodellierer
parents:
533
diff
changeset
|
144 #include "externalInterface.h" |
662 | 145 #include "uart.h" |
889 | 146 #include "GNSS.h" |
147 | |
38 | 148 |
149 // From Common/Inc: | |
150 #include "calc_crush.h" | |
151 #include "decom.h" | |
152 #include "FirmwareData.h" | |
153 | |
154 // From Common/Drivers/ | |
155 #include <stdio.h> | |
156 | |
889 | 157 |
433 | 158 uint8_t coldstart __attribute__((section (".noinit"))); |
159 | |
89 | 160 uint8_t hasExternalClock(void) { |
161 if ((TM_OTP_Read(0, 0) > 0) && (TM_OTP_Read(0, 0) < 0xFF)) | |
162 return 1; | |
163 else | |
164 return 0; | |
38 | 165 } |
166 | |
167 // SHALL LOAD AT 0x08000000 + 0x00005000 = 0x08005000. | |
168 // See CPU2-RTE.ld | |
100 | 169 const SFirmwareData cpu2_FirmwareData __attribute__(( section(".firmware_data") ))= { |
728
5143e927219f
Added sensor map to Firmware <=> RTE inferface:
Ideenmodellierer
parents:
713
diff
changeset
|
170 .versionFirst = 3, |
899
2225c467f1e9
Added data path and visualization for position data:
Ideenmodellierer
parents:
890
diff
changeset
|
171 .versionSecond = 4, |
762 | 172 .versionThird = 0, |
843 | 173 .versionBeta = 1, |
38 | 174 |
89 | 175 /* 4 bytes with trailing 0 */ |
100 | 176 .signature = "mh", |
38 | 177 |
762 | 178 .release_year = 23, |
818 | 179 .release_month = 9, |
180 .release_day = 14, | |
100 | 181 .release_sub = 0, |
38 | 182 |
89 | 183 /* max 48 with trailing 0 */ |
184 //release_info ="12345678901234567890123456789012345678901" | |
768 | 185 .release_info = "stable April 2023", |
38 | 186 |
89 | 187 /* for safety reasons and coming functions */ |
188 .magic[0] = FIRMWARE_MAGIC_FIRST, .magic[1] = FIRMWARE_MAGIC_SECOND, | |
189 .magic[2] = FIRMWARE_MAGIC_CPU2_RTE, /* the magic byte for RTE */ | |
433 | 190 .magic[3] = FIRMWARE_MAGIC_END |
191 }; | |
192 | |
38 | 193 |
89 | 194 uint8_t firmwareVersionHigh(void) { |
195 return cpu2_FirmwareData.versionFirst; | |
38 | 196 } |
197 | |
89 | 198 uint8_t firmwareVersionLow(void) { |
199 return cpu2_FirmwareData.versionSecond; | |
38 | 200 } |
201 | |
202 /** @addtogroup OSTC4 | |
203 * @{ | |
204 */ | |
205 | |
206 /** @addtogroup CPU2 | |
207 * @{ | |
208 */ | |
209 | |
210 /* Private typedef -----------------------------------------------------------*/ | |
211 /* Private define ------------------------------------------------------------*/ | |
212 #define BUTTON_OSTC_GPIO_PIN GPIO_PIN_0 | |
213 #define BUTTON_OSTC_GPIO_PORT GPIOA | |
214 #define BUTTON_OSTC_HAL_RCC_GPIO_CLK_ENABLE() __HAL_RCC_GPIOA_CLK_ENABLE() | |
215 #define BUTTON_OSTC_IRQn EXTI0_IRQn | |
216 | |
880 | 217 #define VIBRATION_CONTROL_PIN GPIO_PIN_3 /* PortA */ |
218 #define LED_CONTROL_PIN_RED GPIO_PIN_2 /* PortA */ | |
219 #define LED_CONTROL_PIN_GREEN GPIO_PIN_1 /* PortA */ | |
662 | 220 #define MAINCPU_CONTROL_PIN GPIO_PIN_0 /* PortC */ |
887 | 221 #define GPS_POWER_CONTROL_PIN GPIO_PIN_15 /* PortB */ |
222 #define GPS_BCKP_CONTROL_PIN GPIO_PIN_14 /* PortB */ | |
662 | 223 |
38 | 224 /* Private macro -------------------------------------------------------------*/ |
225 | |
226 /* Private variables ---------------------------------------------------------*/ | |
227 uint32_t global_test_time_counter = 0; | |
228 SBackup backup; | |
229 | |
230 /* Private function prototypes -----------------------------------------------*/ | |
231 static void EXTI_Wakeup_Button_Init(void); | |
232 static void EXTI_Wakeup_Button_DeInit(void); | |
233 | |
880 | 234 static void GPIO_LEDs_VIBRATION_Init(void); |
38 | 235 static void GPIO_Power_MainCPU_Init(void); |
236 static void GPIO_Power_MainCPU_ON(void); | |
237 static void GPIO_Power_MainCPU_OFF(void); | |
880 | 238 static void GPIO_LED_RED_OFF(void); |
239 static void GPIO_LED_RED_ON(void); | |
240 static void GPIO_LED_GREEN_OFF(void); | |
241 static void GPIO_LED_GREEN_ON(void); | |
242 static void GPIO_VIBRATION_OFF(void); | |
243 static void GPIO_VIBRATION_ON(void); | |
887 | 244 static void GPIO_GPS_OFF(void); |
245 static void GPIO_GPS_ON(void); | |
246 static void GPIO_GPS_BCKP_OFF(void); | |
247 static void GPIO_GPS_BCKP_ON(void); | |
38 | 248 |
183 | 249 #ifdef DEBUG_I2C_LINES |
38 | 250 void GPIO_test_I2C_lines(void); |
183 | 251 #endif |
38 | 252 |
253 void sleep_prepare(void); | |
254 | |
255 void SystemClock_Config(void); | |
256 void SystemClock_Config_HSI(void); | |
257 void SystemClock_Config_HSE(void); | |
258 void SYSCLKConfig_STOP_HSI(void); | |
259 void SYSCLKConfig_STOP_HSE(void); | |
260 | |
261 void GPIO_new_DEBUG_Init(void); | |
262 void GPIO_new_DEBUG_LOW(void); | |
263 void GPIO_new_DEBUG_HIGH(void); | |
264 | |
265 #define REGULAR_RUN | |
266 | |
89 | 267 int __io_putchar(int ch) { |
268 ITM_SendChar(ch); | |
269 return ch; | |
38 | 270 } |
271 | |
272 /* Private functions ---------------------------------------------------------*/ | |
273 | |
274 /** | |
275 * @brief Main program | |
276 * @param None | |
277 * @retval None | |
278 */ | |
120 | 279 /* #define DEBUG_RUNTIME TRUE */ |
280 #ifdef DEBUG_RUNTIME | |
281 #define MEASURECNT 60 /* number of measuremets to be stored */ | |
282 static uint32_t loopcnt[MEASURECNT]; | |
283 extern RTC_HandleTypeDef RTCHandle; | |
284 #endif | |
38 | 285 |
89 | 286 int main(void) { |
120 | 287 |
288 #ifdef DEBUG_RUNTIME | |
289 RTC_TimeTypeDef Stime; | |
290 uint8_t measurementindex = 0; | |
291 uint8_t lastsecond = 0xFF; | |
292 #endif | |
293 | |
89 | 294 HAL_Init(); |
295 SystemClock_Config(); | |
38 | 296 |
89 | 297 HAL_SYSTICK_Config(HAL_RCC_GetHCLKFreq() / 1000); |
298 HAL_SYSTICK_CLKSourceConfig( SYSTICK_CLKSOURCE_HCLK); | |
299 HAL_NVIC_SetPriority(SysTick_IRQn, 0, 0); | |
38 | 300 |
89 | 301 MX_RTC_init(); |
880 | 302 GPIO_LEDs_VIBRATION_Init(); |
89 | 303 GPIO_new_DEBUG_Init(); // added 170322 hw |
304 initGlobals(); | |
38 | 305 |
120 | 306 /* printf("CPU2-RTE running...\n"); */ |
38 | 307 |
329 | 308 HAL_Delay(100); |
309 | |
89 | 310 MX_I2C1_Init(); |
329 | 311 if (global.I2C_SystemStatus != HAL_OK) |
312 { | |
89 | 313 if (MX_I2C1_TestAndClear() == GPIO_PIN_RESET) { |
314 MX_I2C1_TestAndClear(); // do it a second time | |
315 } | |
488
9eeab3fead8f
Added "I2C_DeInit();" in hardware detection routines. It's the recommended way
heinrichsweikamp
parents:
473
diff
changeset
|
316 HAL_Delay(100); |
9eeab3fead8f
Added "I2C_DeInit();" in hardware detection routines. It's the recommended way
heinrichsweikamp
parents:
473
diff
changeset
|
317 I2C_DeInit(); |
9eeab3fead8f
Added "I2C_DeInit();" in hardware detection routines. It's the recommended way
heinrichsweikamp
parents:
473
diff
changeset
|
318 HAL_Delay(100); |
89 | 319 MX_I2C1_Init(); |
488
9eeab3fead8f
Added "I2C_DeInit();" in hardware detection routines. It's the recommended way
heinrichsweikamp
parents:
473
diff
changeset
|
320 HAL_Delay(100); |
89 | 321 } |
38 | 322 |
329 | 323 |
324 | |
89 | 325 //dangerous: TM_OTP_Write(0,0, 0x01); |
38 | 326 #ifdef REGULAR_RUN |
89 | 327 global.sensorError[SENSOR_PRESSURE_ID] = init_pressure(); |
328 global.I2C_SystemStatus = global.sensorError[SENSOR_PRESSURE_ID]; | |
329 | 329 if (global.I2C_SystemStatus != HAL_OK) |
330 { | |
89 | 331 if (MX_I2C1_TestAndClear() == GPIO_PIN_RESET) { |
332 MX_I2C1_TestAndClear(); // do it a second time | |
333 } | |
488
9eeab3fead8f
Added "I2C_DeInit();" in hardware detection routines. It's the recommended way
heinrichsweikamp
parents:
473
diff
changeset
|
334 HAL_Delay(100); |
9eeab3fead8f
Added "I2C_DeInit();" in hardware detection routines. It's the recommended way
heinrichsweikamp
parents:
473
diff
changeset
|
335 I2C_DeInit(); |
9eeab3fead8f
Added "I2C_DeInit();" in hardware detection routines. It's the recommended way
heinrichsweikamp
parents:
473
diff
changeset
|
336 HAL_Delay(100); |
89 | 337 MX_I2C1_Init(); |
488
9eeab3fead8f
Added "I2C_DeInit();" in hardware detection routines. It's the recommended way
heinrichsweikamp
parents:
473
diff
changeset
|
338 HAL_Delay(100); |
89 | 339 global.sensorError[SENSOR_PRESSURE_ID] = init_pressure(); |
340 global.I2C_SystemStatus = global.sensorError[SENSOR_PRESSURE_ID]; | |
341 } | |
38 | 342 |
89 | 343 global.dataSendToMaster.sensorErrors = |
344 global.sensorError[SENSOR_PRESSURE_ID]; | |
329 | 345 |
346 if(is_init_pressure_done()) | |
347 { | |
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
|
348 init_surface_ring(0); |
329 | 349 } |
89 | 350 init_battery_gas_gauge(); |
351 HAL_Delay(10); | |
352 battery_gas_gauge_get_data(); | |
473
edfc1a464b42
Do not signal power on reset in case of a "warm" reset:
ideenmodellierer
parents:
439
diff
changeset
|
353 |
662 | 354 global.lifeData.battery_voltage = get_voltage(); |
355 global.lifeData.battery_charge = get_charge(); | |
356 copyBatteryData(); | |
357 | |
473
edfc1a464b42
Do not signal power on reset in case of a "warm" reset:
ideenmodellierer
parents:
439
diff
changeset
|
358 MX_SPI3_Init(); |
edfc1a464b42
Do not signal power on reset in case of a "warm" reset:
ideenmodellierer
parents:
439
diff
changeset
|
359 |
edfc1a464b42
Do not signal power on reset in case of a "warm" reset:
ideenmodellierer
parents:
439
diff
changeset
|
360 if(coldstart != 0xA5) /* Not reading a 0xA5 means the memory cells has not been initialized before => cold start */ |
433 | 361 { |
362 coldstart = 0xA5; | |
662 | 363 |
364 set_charge_state(Charger_ColdStart); | |
365 | |
473
edfc1a464b42
Do not signal power on reset in case of a "warm" reset:
ideenmodellierer
parents:
439
diff
changeset
|
366 global.dataSendToMaster.power_on_reset = 1; |
edfc1a464b42
Do not signal power on reset in case of a "warm" reset:
ideenmodellierer
parents:
439
diff
changeset
|
367 global.deviceDataSendToMaster.power_on_reset = 1; |
edfc1a464b42
Do not signal power on reset in case of a "warm" reset:
ideenmodellierer
parents:
439
diff
changeset
|
368 |
edfc1a464b42
Do not signal power on reset in case of a "warm" reset:
ideenmodellierer
parents:
439
diff
changeset
|
369 if (!scheduleSetButtonResponsiveness()) |
edfc1a464b42
Do not signal power on reset in case of a "warm" reset:
ideenmodellierer
parents:
439
diff
changeset
|
370 { |
763
aa6006975e76
increase HAL_Delay to 10ms for cold-start-button reset
heinrichsweikamp
parents:
762
diff
changeset
|
371 HAL_Delay(10); |
473
edfc1a464b42
Do not signal power on reset in case of a "warm" reset:
ideenmodellierer
parents:
439
diff
changeset
|
372 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
|
373 { |
763
aa6006975e76
increase HAL_Delay to 10ms for cold-start-button reset
heinrichsweikamp
parents:
762
diff
changeset
|
374 HAL_Delay(10); |
473
edfc1a464b42
Do not signal power on reset in case of a "warm" reset:
ideenmodellierer
parents:
439
diff
changeset
|
375 scheduleSetButtonResponsiveness(); // init |
763
aa6006975e76
increase HAL_Delay to 10ms for cold-start-button reset
heinrichsweikamp
parents:
762
diff
changeset
|
376 HAL_Delay(10); |
473
edfc1a464b42
Do not signal power on reset in case of a "warm" reset:
ideenmodellierer
parents:
439
diff
changeset
|
377 } |
edfc1a464b42
Do not signal power on reset in case of a "warm" reset:
ideenmodellierer
parents:
439
diff
changeset
|
378 } |
433 | 379 } |
662 | 380 else |
381 { | |
382 set_charge_state(Charger_NotConnected); | |
383 } | |
38 | 384 |
89 | 385 ADCx_Init(); |
386 GPIO_Power_MainCPU_Init(); | |
662 | 387 |
388 externalInterface_InitPower33(); | |
389 | |
89 | 390 global.mode = MODE_POWERUP; |
38 | 391 #else |
89 | 392 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
|
393 init_surface_ring(0); |
38 | 394 |
89 | 395 ADCx_Init(); |
396 GPIO_Power_MainCPU_Init(); | |
397 global.mode = MODE_TEST; | |
38 | 398 #endif |
89 | 399 while (1) { |
120 | 400 /* printf("Global mode = %d\n", global.mode); */ |
38 | 401 |
89 | 402 switch (global.mode) { |
403 case MODE_POWERUP: | |
404 case MODE_BOOT: | |
405 // ReInit_battery_charger_status_pins(); | |
406 compass_init(0, 7); | |
407 accelerator_init(); | |
554
3328189786e7
Added external ADC interface functionality (MCP3424):
Ideenmodellierer
parents:
533
diff
changeset
|
408 externalInterface_Init(); |
181 | 409 |
89 | 410 if (global.mode == MODE_BOOT) { |
411 GPIO_Power_MainCPU_OFF(); | |
880 | 412 |
413 GPIO_LED_GREEN_ON(); | |
89 | 414 HAL_Delay(100); // for GPIO_Power_MainCPU_ON(); |
415 GPIO_Power_MainCPU_ON(); | |
880 | 416 |
417 GPIO_LED_GREEN_OFF(); | |
418 | |
419 GPIO_LED_RED_ON(); | |
900 | 420 GPIO_VIBRATION_ON(); |
880 | 421 HAL_Delay(100); |
422 GPIO_LED_RED_OFF(); | |
423 GPIO_VIBRATION_OFF(); | |
89 | 424 } |
900 | 425 GPIO_LED_RED_OFF(); |
426 GPIO_LED_GREEN_OFF(); | |
427 GPIO_VIBRATION_OFF(); | |
89 | 428 SPI_synchronize_with_Master(); |
429 MX_DMA_Init(); | |
430 MX_SPI1_Init(); | |
134
0586ae83a243
Removed cyclic (by timer) send on slave side
Ideenmodellierer
parents:
120
diff
changeset
|
431 SPI_Start_single_TxRx_with_Master(); /* be prepared for the first data exchange */ |
207 | 432 Scheduler_Request_sync_with_SPI(SPI_SYNC_METHOD_HARD); |
889 | 433 |
900 | 434 #ifdef ENABLE_GNSS |
889 | 435 // GNSS tests |
436 GNSS_IO_init(); | |
900 | 437 GPIO_GPS_ON(); |
438 GPIO_GPS_BCKP_ON(); | |
889 | 439 MX_USART6_UART_Init(); |
440 GNSS_Init(&GNSS_Handle, &huart6); | |
900 | 441 #endif |
899
2225c467f1e9
Added data path and visualization for position data:
Ideenmodellierer
parents:
890
diff
changeset
|
442 |
2225c467f1e9
Added data path and visualization for position data:
Ideenmodellierer
parents:
890
diff
changeset
|
443 #if 0 |
889 | 444 HAL_Delay(1000); |
445 GNSS_LoadConfig(&GNSS_Handle); | |
890
651d21777b61
cleanup and disable function for GNSS uart and DMA
heinrichsweikamp
parents:
889
diff
changeset
|
446 HAL_Delay(250); |
889 | 447 GNSS_GetUniqID(&GNSS_Handle); |
448 GNSS_ParseBuffer(&GNSS_Handle); | |
890
651d21777b61
cleanup and disable function for GNSS uart and DMA
heinrichsweikamp
parents:
889
diff
changeset
|
449 HAL_Delay(250); |
889 | 450 GNSS_GetPVTData(&GNSS_Handle); |
451 GNSS_ParseBuffer(&GNSS_Handle); | |
899
2225c467f1e9
Added data path and visualization for position data:
Ideenmodellierer
parents:
890
diff
changeset
|
452 #endif |
890
651d21777b61
cleanup and disable function for GNSS uart and DMA
heinrichsweikamp
parents:
889
diff
changeset
|
453 /* |
651d21777b61
cleanup and disable function for GNSS uart and DMA
heinrichsweikamp
parents:
889
diff
changeset
|
454 * Demo code from SimpleMethod |
651d21777b61
cleanup and disable function for GNSS uart and DMA
heinrichsweikamp
parents:
889
diff
changeset
|
455 * called 1/second |
651d21777b61
cleanup and disable function for GNSS uart and DMA
heinrichsweikamp
parents:
889
diff
changeset
|
456 while (1) { |
651d21777b61
cleanup and disable function for GNSS uart and DMA
heinrichsweikamp
parents:
889
diff
changeset
|
457 |
651d21777b61
cleanup and disable function for GNSS uart and DMA
heinrichsweikamp
parents:
889
diff
changeset
|
458 if ((HAL_GetTick() - Timer) > 1000) { |
651d21777b61
cleanup and disable function for GNSS uart and DMA
heinrichsweikamp
parents:
889
diff
changeset
|
459 GNSS_GetUniqID(&GNSS_Handle); |
651d21777b61
cleanup and disable function for GNSS uart and DMA
heinrichsweikamp
parents:
889
diff
changeset
|
460 GNSS_ParseBuffer(&GNSS_Handle); |
651d21777b61
cleanup and disable function for GNSS uart and DMA
heinrichsweikamp
parents:
889
diff
changeset
|
461 HAL_Delay(250); |
651d21777b61
cleanup and disable function for GNSS uart and DMA
heinrichsweikamp
parents:
889
diff
changeset
|
462 GNSS_GetPVTData(&GNSS_Handle); |
651d21777b61
cleanup and disable function for GNSS uart and DMA
heinrichsweikamp
parents:
889
diff
changeset
|
463 GNSS_ParseBuffer(&GNSS_Handle); |
651d21777b61
cleanup and disable function for GNSS uart and DMA
heinrichsweikamp
parents:
889
diff
changeset
|
464 printf("Day: %d-%d-%d \r\n", GNSS_Handle.day, GNSS_Handle.month,GNSS_Handle.year); |
651d21777b61
cleanup and disable function for GNSS uart and DMA
heinrichsweikamp
parents:
889
diff
changeset
|
465 printf("Time: %d:%d:%d \r\n", GNSS_Handle.hour, GNSS_Handle.min,GNSS_Handle.sec); |
651d21777b61
cleanup and disable function for GNSS uart and DMA
heinrichsweikamp
parents:
889
diff
changeset
|
466 printf("Status of fix: %d \r\n", GNSS_Handle.fixType); |
651d21777b61
cleanup and disable function for GNSS uart and DMA
heinrichsweikamp
parents:
889
diff
changeset
|
467 printf("Latitude: %f \r\n", GNSS_Handle.fLat); |
651d21777b61
cleanup and disable function for GNSS uart and DMA
heinrichsweikamp
parents:
889
diff
changeset
|
468 printf("Longitude: %f \r\n",(float) GNSS_Handle.lon / 10000000.0); |
651d21777b61
cleanup and disable function for GNSS uart and DMA
heinrichsweikamp
parents:
889
diff
changeset
|
469 printf("Height above ellipsoid: %d \r\n", GNSS_Handle.height); |
651d21777b61
cleanup and disable function for GNSS uart and DMA
heinrichsweikamp
parents:
889
diff
changeset
|
470 printf("Height above mean sea level: %d \r\n", GNSS_Handle.hMSL); |
651d21777b61
cleanup and disable function for GNSS uart and DMA
heinrichsweikamp
parents:
889
diff
changeset
|
471 printf("Ground Speed (2-D): %d \r\n", GNSS_Handle.gSpeed); |
651d21777b61
cleanup and disable function for GNSS uart and DMA
heinrichsweikamp
parents:
889
diff
changeset
|
472 printf("Unique ID: %04X %04X %04X %04X %04X \n\r", |
651d21777b61
cleanup and disable function for GNSS uart and DMA
heinrichsweikamp
parents:
889
diff
changeset
|
473 GNSS_Handle.uniqueID[0], GNSS_Handle.uniqueID[1], |
651d21777b61
cleanup and disable function for GNSS uart and DMA
heinrichsweikamp
parents:
889
diff
changeset
|
474 GNSS_Handle.uniqueID[2], GNSS_Handle.uniqueID[3], |
651d21777b61
cleanup and disable function for GNSS uart and DMA
heinrichsweikamp
parents:
889
diff
changeset
|
475 GNSS_Handle.uniqueID[4], GNSS_Handle.uniqueID[5]); |
651d21777b61
cleanup and disable function for GNSS uart and DMA
heinrichsweikamp
parents:
889
diff
changeset
|
476 Timer = HAL_GetTick(); |
651d21777b61
cleanup and disable function for GNSS uart and DMA
heinrichsweikamp
parents:
889
diff
changeset
|
477 } |
651d21777b61
cleanup and disable function for GNSS uart and DMA
heinrichsweikamp
parents:
889
diff
changeset
|
478 */ |
889 | 479 |
89 | 480 global.mode = MODE_SURFACE; |
481 break; | |
38 | 482 |
89 | 483 case MODE_CALIB: |
90 | 484 scheduleCompassCalibrationMode(); |
89 | 485 break; |
486 | |
487 case MODE_SURFACE: | |
488 scheduleSurfaceMode(); | |
489 break; | |
38 | 490 |
89 | 491 case MODE_TEST: |
492 break; | |
38 | 493 |
89 | 494 case MODE_DIVE: |
90 | 495 backup.no_fly_time_minutes = global.no_fly_time_minutes; |
496 backup.seconds_since_last_dive = global.seconds_since_last_dive; | |
497 | |
498 vpm_init( &global.vpm, global.conservatism, global.repetitive_dive, | |
499 global.seconds_since_last_dive ); | |
500 global.no_fly_time_minutes = 0; | |
501 global.lifeData.dive_time_seconds = 0; | |
502 global.lifeData.dive_time_seconds_without_surface_time = 0; | |
503 scheduleDiveMode(); | |
504 // done now in scheduler prior to change mode: global.seconds_since_last_dive = 1; | |
505 | |
506 if( global.lifeData.dive_time_seconds > 60 ) | |
507 { | |
508 //No Fly time 60% of desaturationtime after dive | |
509 global.no_fly_time_minutes = decom_calc_desaturation_time( | |
510 global.lifeData.tissue_nitrogen_bar, | |
511 global.lifeData.tissue_helium_bar, | |
512 global.lifeData.pressure_surface_bar ) * 60 / 100; | |
513 if( global.no_fly_time_minutes < (24 * 60) ) | |
514 global.no_fly_time_minutes = 24 * 60; | |
515 } | |
516 else | |
517 { | |
518 global.no_fly_time_minutes = backup.no_fly_time_minutes; | |
519 global.seconds_since_last_dive = backup.seconds_since_last_dive; | |
520 } | |
521 | |
522 global.lifeData.dive_time_seconds = 0; | |
523 global.lifeData.dive_time_seconds_without_surface_time = 0; | |
524 global.lifeData.counterSecondsShallowDepth = 0; | |
525 | |
526 backup.no_fly_time_minutes = 0; | |
527 backup.seconds_since_last_dive = 0; | |
89 | 528 break; |
38 | 529 |
89 | 530 case MODE_SHUTDOWN: |
531 HAL_Delay(200); | |
532 global.mode = MODE_SLEEP; | |
533 MX_SPI3_Init(); | |
534 break; | |
535 | |
536 case MODE_SLEEP: | |
839 | 537 externalInterface_SwitchUART(EXT_INTERFACE_UART_OFF); |
662 | 538 externalInterface_SwitchPower33(false); |
89 | 539 if (hasExternalClock()) |
540 SystemClock_Config_HSI(); | |
887 | 541 GPIO_LEDs_VIBRATION_Init(); |
89 | 542 sleep_prepare(); |
38 | 543 |
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
ee744c7160ce
Use SPI TX callback to synchronize to main CPU
Ideenmodellierer
parents:
134
diff
changeset
|
553 SPI_synchronize_with_Master(); |
89 | 554 MX_DMA_Init(); |
555 MX_SPI1_Init(); | |
148
ee744c7160ce
Use SPI TX callback to synchronize to main CPU
Ideenmodellierer
parents:
134
diff
changeset
|
556 SPI_Start_single_TxRx_with_Master(); |
89 | 557 |
662 | 558 if(externalInterface_isEnabledPower33()) |
559 { | |
560 externalInterface_SwitchPower33(true); | |
561 } | |
738
30717de00f3a
Added data init function for external interface:
Ideenmodellierer
parents:
728
diff
changeset
|
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 | |
880 | 807 static void GPIO_LEDs_VIBRATION_Init(void) { |
89 | 808 GPIO_InitTypeDef GPIO_InitStructure; |
38 | 809 |
880 | 810 __GPIOA_CLK_ENABLE(); |
811 GPIO_InitStructure.Pin = LED_CONTROL_PIN_RED; | |
89 | 812 GPIO_InitStructure.Mode = GPIO_MODE_OUTPUT_PP; |
813 GPIO_InitStructure.Pull = GPIO_PULLUP; | |
880 | 814 GPIO_InitStructure.Speed = GPIO_SPEED_LOW; |
815 HAL_GPIO_Init( GPIOA, &GPIO_InitStructure); | |
816 | |
817 GPIO_InitStructure.Pin = LED_CONTROL_PIN_GREEN; | |
818 GPIO_InitStructure.Mode = GPIO_MODE_OUTPUT_PP; | |
819 GPIO_InitStructure.Pull = GPIO_PULLUP; | |
820 GPIO_InitStructure.Speed = GPIO_SPEED_LOW; | |
821 HAL_GPIO_Init( GPIOA, &GPIO_InitStructure); | |
822 | |
823 GPIO_InitStructure.Pin = VIBRATION_CONTROL_PIN; | |
824 GPIO_InitStructure.Mode = GPIO_MODE_OUTPUT_PP; | |
825 GPIO_InitStructure.Pull = GPIO_PULLDOWN; | |
826 GPIO_InitStructure.Speed = GPIO_SPEED_LOW; | |
827 HAL_GPIO_Init( GPIOA, &GPIO_InitStructure); | |
887 | 828 |
829 __GPIOB_CLK_ENABLE(); | |
830 GPIO_InitStructure.Pin = GPS_POWER_CONTROL_PIN; | |
831 GPIO_InitStructure.Mode = GPIO_MODE_OUTPUT_PP; | |
832 GPIO_InitStructure.Pull = GPIO_PULLUP; | |
833 GPIO_InitStructure.Speed = GPIO_SPEED_LOW; | |
834 HAL_GPIO_Init( GPIOB, &GPIO_InitStructure); | |
835 | |
836 GPIO_InitStructure.Pin = GPS_BCKP_CONTROL_PIN; | |
837 GPIO_InitStructure.Mode = GPIO_MODE_OUTPUT_PP; | |
838 GPIO_InitStructure.Pull = GPIO_PULLDOWN; | |
839 GPIO_InitStructure.Speed = GPIO_SPEED_LOW; | |
840 HAL_GPIO_Init( GPIOB, &GPIO_InitStructure); | |
841 | |
38 | 842 } |
843 | |
89 | 844 void GPIO_new_DEBUG_Init(void) { |
38 | 845 #ifdef DEBUG_PIN_ACTIVE |
89 | 846 GPIO_InitTypeDef GPIO_InitStructure; |
38 | 847 |
89 | 848 __GPIOC_CLK_ENABLE(); |
662 | 849 GPIO_InitStructure.Pin = LED_CONTROL_PIN; |
89 | 850 GPIO_InitStructure.Mode = GPIO_MODE_OUTPUT_PP; |
851 GPIO_InitStructure.Pull = GPIO_PULLUP; | |
852 GPIO_InitStructure.Speed = GPIO_SPEED_FAST; | |
853 HAL_GPIO_Init(GPIOA, &GPIO_InitStructure); | |
38 | 854 #endif |
855 } | |
856 | |
89 | 857 void GPIO_new_DEBUG_LOW(void) { |
38 | 858 #ifdef DEBUG_PIN_ACTIVE |
662 | 859 HAL_GPIO_WritePin(GPIOC,LED_CONTROL_PIN,GPIO_PIN_RESET); |
38 | 860 #endif |
861 } | |
862 | |
89 | 863 void GPIO_new_DEBUG_HIGH(void) { |
38 | 864 #ifdef DEBUG_PIN_ACTIVE |
662 | 865 HAL_GPIO_WritePin(GPIOC,LED_CONTROL_PIN,GPIO_PIN_SET); |
38 | 866 #endif |
867 } | |
868 | |
89 | 869 static void GPIO_Power_MainCPU_Init(void) { |
870 GPIO_InitTypeDef GPIO_InitStructure; | |
871 __GPIOC_CLK_ENABLE(); | |
662 | 872 GPIO_InitStructure.Pin = MAINCPU_CONTROL_PIN; |
89 | 873 GPIO_InitStructure.Mode = GPIO_MODE_OUTPUT_PP; |
874 GPIO_InitStructure.Pull = GPIO_PULLUP; | |
875 GPIO_InitStructure.Speed = GPIO_SPEED_LOW; | |
876 HAL_GPIO_Init( GPIOC, &GPIO_InitStructure); | |
662 | 877 HAL_GPIO_WritePin( GPIOC, MAINCPU_CONTROL_PIN, GPIO_PIN_RESET); |
38 | 878 } |
879 | |
89 | 880 static void GPIO_Power_MainCPU_ON(void) { |
662 | 881 HAL_GPIO_WritePin( GPIOC, MAINCPU_CONTROL_PIN, GPIO_PIN_RESET); |
38 | 882 } |
883 | |
89 | 884 static void GPIO_Power_MainCPU_OFF(void) { |
662 | 885 HAL_GPIO_WritePin( GPIOC, MAINCPU_CONTROL_PIN, GPIO_PIN_SET); |
38 | 886 } |
887 | |
880 | 888 static void GPIO_LED_GREEN_ON(void) { |
889 HAL_GPIO_WritePin( GPIOA, LED_CONTROL_PIN_GREEN, GPIO_PIN_RESET); | |
890 } | |
891 | |
892 static void GPIO_LED_GREEN_OFF(void) { | |
893 HAL_GPIO_WritePin( GPIOA, LED_CONTROL_PIN_GREEN, GPIO_PIN_SET); | |
894 } | |
895 | |
896 static void GPIO_LED_RED_ON(void) { | |
897 HAL_GPIO_WritePin( GPIOA, LED_CONTROL_PIN_RED, GPIO_PIN_RESET); | |
898 } | |
899 | |
900 static void GPIO_LED_RED_OFF(void) { | |
901 HAL_GPIO_WritePin( GPIOA, LED_CONTROL_PIN_RED, GPIO_PIN_SET); | |
902 } | |
903 | |
904 static void GPIO_VIBRATION_ON(void) { | |
905 HAL_GPIO_WritePin( GPIOA, VIBRATION_CONTROL_PIN, GPIO_PIN_SET); | |
906 } | |
907 | |
908 static void GPIO_VIBRATION_OFF(void) { | |
909 HAL_GPIO_WritePin( GPIOA, VIBRATION_CONTROL_PIN, GPIO_PIN_RESET); | |
910 } | |
911 | |
887 | 912 static void GPIO_GPS_ON(void) { |
913 HAL_GPIO_WritePin( GPIOB, GPS_POWER_CONTROL_PIN, GPIO_PIN_RESET); | |
914 } | |
915 | |
916 static void GPIO_GPS_OFF(void) { | |
917 HAL_GPIO_WritePin( GPIOB, GPS_POWER_CONTROL_PIN, GPIO_PIN_SET); | |
918 } | |
919 | |
920 static void GPIO_GPS_BCKP_ON(void) { | |
921 HAL_GPIO_WritePin( GPIOB, GPS_BCKP_CONTROL_PIN, GPIO_PIN_SET); | |
922 } | |
923 | |
924 static void GPIO_GPS_BCKP_OFF(void) { | |
925 HAL_GPIO_WritePin( GPIOB, GPS_BCKP_CONTROL_PIN, GPIO_PIN_RESET); | |
926 } | |
927 | |
880 | 928 |
38 | 929 /** |
930 * @brief Configures EXTI Line0 (connected to PA0 + PA1 pin) in interrupt mode | |
931 * @param None | |
932 * @retval None | |
933 */ | |
934 | |
89 | 935 static void EXTI_Wakeup_Button_Init(void) { |
936 GPIO_InitTypeDef GPIO_InitStructure; | |
38 | 937 |
89 | 938 __HAL_RCC_GPIOA_CLK_ENABLE(); |
939 BUTTON_OSTC_HAL_RCC_GPIO_CLK_ENABLE(); | |
940 GPIO_InitStructure.Pin = BUTTON_OSTC_GPIO_PIN; | |
941 GPIO_InitStructure.Mode = GPIO_MODE_IT_FALLING; | |
942 GPIO_InitStructure.Pull = GPIO_NOPULL; | |
943 HAL_GPIO_Init( BUTTON_OSTC_GPIO_PORT, &GPIO_InitStructure); | |
38 | 944 |
89 | 945 HAL_NVIC_SetPriority( BUTTON_OSTC_IRQn, 0x0F, 0); |
946 HAL_NVIC_EnableIRQ( BUTTON_OSTC_IRQn); | |
38 | 947 } |
948 | |
89 | 949 static void EXTI_Wakeup_Button_DeInit(void) { |
950 GPIO_InitTypeDef GPIO_InitStructure; | |
38 | 951 |
89 | 952 GPIO_InitStructure.Mode = GPIO_MODE_ANALOG; |
953 GPIO_InitStructure.Speed = GPIO_SPEED_LOW; | |
954 GPIO_InitStructure.Pull = GPIO_NOPULL; | |
38 | 955 |
89 | 956 GPIO_InitStructure.Pin = BUTTON_OSTC_GPIO_PIN; |
957 HAL_GPIO_Init( BUTTON_OSTC_GPIO_PORT, &GPIO_InitStructure); | |
958 HAL_NVIC_DisableIRQ( BUTTON_OSTC_IRQn); | |
38 | 959 } |
960 | |
961 /** | |
962 * @brief Wake Up Timer callback | |
963 * @param hrtc: RTC handle | |
964 * @retval None | |
965 */ | |
966 | |
967 /* | |
968 void HAL_RTCEx_WakeUpTimerEventCallback(RTC_HandleTypeDef *hrtc) | |
969 { | |
970 static uint8_t uwCounter = 0; | |
971 uwCounter = 1; | |
972 } | |
973 */ | |
974 | |
89 | 975 void HAL_I2C_MasterTxCpltCallback(I2C_HandleTypeDef *I2cHandle) { |
38 | 976 |
977 } | |
978 | |
89 | 979 void HAL_I2C_MasterRxCpltCallback(I2C_HandleTypeDef *I2cHandle) { |
38 | 980 |
981 } | |
982 | |
89 | 983 void HAL_I2C_ErrorCallback(I2C_HandleTypeDef *I2cHandle) { |
38 | 984 |
985 } | |
986 | |
89 | 987 void sleep_prepare(void) { |
988 EXTI_Wakeup_Button_Init(); | |
662 | 989 |
89 | 990 compass_sleep(); |
991 HAL_Delay(100); | |
992 accelerator_sleep(); | |
993 HAL_Delay(100); | |
38 | 994 |
89 | 995 I2C_DeInit(); |
996 MX_SPI_DeInit(); | |
997 MX_SPI3_DeInit(); | |
998 ADCx_DeInit(); | |
38 | 999 |
89 | 1000 GPIO_InitTypeDef GPIO_InitStruct; |
38 | 1001 |
89 | 1002 __HAL_RCC_GPIOA_CLK_ENABLE(); |
1003 __HAL_RCC_GPIOB_CLK_ENABLE(); | |
1004 __HAL_RCC_GPIOC_CLK_ENABLE(); | |
1005 __HAL_RCC_GPIOH_CLK_ENABLE(); | |
38 | 1006 |
89 | 1007 GPIO_InitStruct.Mode = GPIO_MODE_ANALOG; |
887 | 1008 GPIO_InitStruct.Speed = GPIO_SPEED_LOW; |
89 | 1009 GPIO_InitStruct.Pull = GPIO_NOPULL; |
1010 GPIO_InitStruct.Pin = GPIO_PIN_All; | |
1011 HAL_GPIO_Init( GPIOH, &GPIO_InitStruct); | |
38 | 1012 #ifdef DEBUGMODE |
89 | 1013 GPIO_InitStruct.Pin = GPIO_PIN_All ^ ( GPIO_PIN_3 | GPIO_PIN_8 | GPIO_PIN_9); /* debug */ |
38 | 1014 #endif |
887 | 1015 |
1016 GPIO_InitStruct.Pin = GPIO_PIN_All ^ (GPS_POWER_CONTROL_PIN | GPS_BCKP_CONTROL_PIN); | |
89 | 1017 HAL_GPIO_Init( GPIOB, &GPIO_InitStruct); |
38 | 1018 |
887 | 1019 GPIO_InitStruct.Pin = GPIO_PIN_All ^ ( MAINCPU_CONTROL_PIN | CHARGE_OUT_PIN | EXT33V_CONTROL_PIN); /* power off & charger in & charge out & OSC32 & ext33Volt */ |
662 | 1020 |
89 | 1021 HAL_GPIO_Init( GPIOC, &GPIO_InitStruct); |
38 | 1022 |
887 | 1023 GPIO_InitStruct.Pin = GPIO_PIN_All ^ ( GPIO_PIN_0 | VIBRATION_CONTROL_PIN | LED_CONTROL_PIN_RED | LED_CONTROL_PIN_GREEN); |
38 | 1024 #ifdef DEBUGMODE |
89 | 1025 GPIO_InitStruct.Pin = GPIO_PIN_All ^ ( GPIO_PIN_0 | GPIO_PIN_13 | GPIO_PIN_14); /* wake up button & debug */ |
38 | 1026 #endif |
89 | 1027 HAL_GPIO_Init( GPIOA, &GPIO_InitStruct); |
38 | 1028 |
89 | 1029 GPIO_InitStruct.Pin = GPIO_PIN_All; |
1030 HAL_GPIO_Init( GPIOH, &GPIO_InitStruct); | |
38 | 1031 |
89 | 1032 GPIO_Power_MainCPU_OFF(); |
880 | 1033 GPIO_LED_GREEN_OFF(); |
1034 GPIO_LED_RED_OFF(); | |
887 | 1035 GPIO_VIBRATION_OFF(); |
1036 GPIO_GPS_BCKP_ON(); // mH : costs 100µA in sleep - beware | |
1037 GPIO_GPS_OFF(); | |
880 | 1038 |
890
651d21777b61
cleanup and disable function for GNSS uart and DMA
heinrichsweikamp
parents:
889
diff
changeset
|
1039 MX_USART6_UART_DeInit(); |
38 | 1040 |
1041 #ifndef DEBUGMODE | |
89 | 1042 __HAL_RCC_GPIOB_CLK_DISABLE(); |
38 | 1043 #endif |
89 | 1044 __HAL_RCC_GPIOH_CLK_DISABLE(); |
38 | 1045 |
89 | 1046 HAL_Delay(1000); |
38 | 1047 } |
1048 | |
1049 /* | |
1050 void sleep_test(void) | |
1051 { | |
1052 GPIO_InitTypeDef GPIO_InitStruct; | |
1053 | |
1054 __HAL_RCC_GPIOA_CLK_ENABLE(); | |
1055 __HAL_RCC_GPIOB_CLK_ENABLE(); | |
1056 __HAL_RCC_GPIOC_CLK_ENABLE(); | |
1057 __HAL_RCC_GPIOH_CLK_ENABLE(); | |
1058 | |
1059 GPIO_InitStruct.Mode = GPIO_MODE_ANALOG; | |
1060 GPIO_InitStruct.Speed = GPIO_SPEED_HIGH; | |
1061 GPIO_InitStruct.Pull = GPIO_NOPULL; | |
1062 GPIO_InitStruct.Pin = GPIO_PIN_All; | |
1063 HAL_GPIO_Init(GPIOH, &GPIO_InitStruct); | |
1064 HAL_GPIO_Init(GPIOB, &GPIO_InitStruct); | |
1065 | |
1066 GPIO_InitStruct.Pin = GPIO_PIN_All ^ ( GPIO_PIN_0 | GPIO_PIN_15 | GPIO_PIN_14); | |
1067 HAL_GPIO_Init(GPIOC, &GPIO_InitStruct); | |
1068 | |
1069 GPIO_InitStruct.Pin = GPIO_PIN_All ^ ( GPIO_PIN_0); | |
1070 HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); | |
1071 | |
1072 GPIO_Power_MainCPU_OFF(); | |
1073 | |
1074 GPIO_InitStruct.Pull = GPIO_PULLUP; | |
1075 GPIO_InitStruct.Pin = GPIO_PIN_0; | |
1076 HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); | |
1077 | |
1078 // __HAL_RCC_GPIOA_CLK_DISABLE(); | |
1079 __HAL_RCC_GPIOB_CLK_DISABLE(); | |
1080 // __HAL_RCC_GPIOC_CLK_DISABLE(); | |
1081 __HAL_RCC_GPIOH_CLK_DISABLE(); | |
1082 | |
1083 | |
1084 HAL_Delay(5000); | |
1085 while(1) | |
1086 { | |
1087 RTC_StopMode_2seconds(); | |
1088 HAL_Delay(200); | |
1089 } | |
1090 } | |
1091 */ | |
1092 | |
1093 #ifdef USE_FULL_ASSERT | |
1094 | |
1095 /** | |
1096 * @brief Reports the name of the source file and the source line number | |
1097 * where the assert_param error has occurred. | |
1098 * @param file: pointer to the source file name | |
1099 * @param line: assert_param error line source number | |
1100 * @retval None | |
1101 */ | |
1102 void assert_failed(uint8_t* file, uint32_t line) | |
1103 { | |
89 | 1104 /* User can add his own implementation to report the file name and line number, |
1105 ex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */ | |
38 | 1106 |
89 | 1107 /* Infinite loop */ |
1108 while (1) | |
1109 { | |
1110 } | |
38 | 1111 } |
1112 #endif | |
1113 | |
1114 /** | |
1115 * @} | |
1116 */ | |
104 | 1117 /** |
1118 * @brief This function handles SysTick Handler. | |
1119 * @param None | |
1120 * @retval None | |
1121 */ | |
38 | 1122 |
104 | 1123 /*TxRx only here. Every 100 ms.*/ |
1124 uint8_t ticks100ms=0; | |
1125 void SysTick_Handler(void) | |
1126 { | |
1127 HAL_IncTick(); | |
1128 if(ticks100ms<100){ | |
1129 ticks100ms++; | |
1130 }else | |
1131 { | |
1132 ticks100ms=0; | |
1133 } | |
1134 } | |
38 | 1135 /** |
1136 * @} | |
1137 */ | |
1138 | |
1139 /************************ (C) COPYRIGHT heinrichs weikamp *****END OF FILE****/ |