Mercurial > public > ostc4
annotate Small_CPU/Src/baseCPU2.c @ 916:4832981f9af8 Evo_2_23
External sensor UART: Switch to DMA TX transfers:
The previous version used polling tx function to transfer data. Because of the short command length of the protocols supported this was no big issue. New protocolls (like GNSS) have longer command sequence which have an impact to the program flow. That's why the implementation has been changed to DMA transmission.
author | Ideenmodellierer |
---|---|
date | Mon, 28 Oct 2024 20:34:58 +0100 |
parents | 6902bb4b6b2e |
children | 0d6c4b40fae4 |
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); | |
903
0f2e5a166d40
Disable GNSS operations using compile switch:
Ideenmodellierer
parents:
900
diff
changeset
|
238 #ifdef ENABLE_GNSS |
880 | 239 static void GPIO_LED_RED_OFF(void); |
240 static void GPIO_LED_RED_ON(void); | |
241 static void GPIO_LED_GREEN_OFF(void); | |
242 static void GPIO_LED_GREEN_ON(void); | |
243 static void GPIO_VIBRATION_OFF(void); | |
244 static void GPIO_VIBRATION_ON(void); | |
887 | 245 static void GPIO_GPS_OFF(void); |
246 static void GPIO_GPS_ON(void); | |
247 static void GPIO_GPS_BCKP_OFF(void); | |
248 static void GPIO_GPS_BCKP_ON(void); | |
903
0f2e5a166d40
Disable GNSS operations using compile switch:
Ideenmodellierer
parents:
900
diff
changeset
|
249 #endif |
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(); |
880 | 303 GPIO_LEDs_VIBRATION_Init(); |
89 | 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 } | |
488
9eeab3fead8f
Added "I2C_DeInit();" in hardware detection routines. It's the recommended way
heinrichsweikamp
parents:
473
diff
changeset
|
317 HAL_Delay(100); |
9eeab3fead8f
Added "I2C_DeInit();" in hardware detection routines. It's the recommended way
heinrichsweikamp
parents:
473
diff
changeset
|
318 I2C_DeInit(); |
9eeab3fead8f
Added "I2C_DeInit();" in hardware detection routines. It's the recommended way
heinrichsweikamp
parents:
473
diff
changeset
|
319 HAL_Delay(100); |
89 | 320 MX_I2C1_Init(); |
488
9eeab3fead8f
Added "I2C_DeInit();" in hardware detection routines. It's the recommended way
heinrichsweikamp
parents:
473
diff
changeset
|
321 HAL_Delay(100); |
89 | 322 } |
38 | 323 |
329 | 324 |
325 | |
89 | 326 //dangerous: TM_OTP_Write(0,0, 0x01); |
38 | 327 #ifdef REGULAR_RUN |
89 | 328 global.sensorError[SENSOR_PRESSURE_ID] = init_pressure(); |
329 global.I2C_SystemStatus = global.sensorError[SENSOR_PRESSURE_ID]; | |
329 | 330 if (global.I2C_SystemStatus != HAL_OK) |
331 { | |
89 | 332 if (MX_I2C1_TestAndClear() == GPIO_PIN_RESET) { |
333 MX_I2C1_TestAndClear(); // do it a second time | |
334 } | |
488
9eeab3fead8f
Added "I2C_DeInit();" in hardware detection routines. It's the recommended way
heinrichsweikamp
parents:
473
diff
changeset
|
335 HAL_Delay(100); |
9eeab3fead8f
Added "I2C_DeInit();" in hardware detection routines. It's the recommended way
heinrichsweikamp
parents:
473
diff
changeset
|
336 I2C_DeInit(); |
9eeab3fead8f
Added "I2C_DeInit();" in hardware detection routines. It's the recommended way
heinrichsweikamp
parents:
473
diff
changeset
|
337 HAL_Delay(100); |
89 | 338 MX_I2C1_Init(); |
488
9eeab3fead8f
Added "I2C_DeInit();" in hardware detection routines. It's the recommended way
heinrichsweikamp
parents:
473
diff
changeset
|
339 HAL_Delay(100); |
89 | 340 global.sensorError[SENSOR_PRESSURE_ID] = init_pressure(); |
341 global.I2C_SystemStatus = global.sensorError[SENSOR_PRESSURE_ID]; | |
342 } | |
38 | 343 |
89 | 344 global.dataSendToMaster.sensorErrors = |
345 global.sensorError[SENSOR_PRESSURE_ID]; | |
329 | 346 |
347 if(is_init_pressure_done()) | |
348 { | |
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
|
349 init_surface_ring(0); |
329 | 350 } |
89 | 351 init_battery_gas_gauge(); |
352 HAL_Delay(10); | |
353 battery_gas_gauge_get_data(); | |
473
edfc1a464b42
Do not signal power on reset in case of a "warm" reset:
ideenmodellierer
parents:
439
diff
changeset
|
354 |
662 | 355 global.lifeData.battery_voltage = get_voltage(); |
356 global.lifeData.battery_charge = get_charge(); | |
357 copyBatteryData(); | |
358 | |
473
edfc1a464b42
Do not signal power on reset in case of a "warm" reset:
ideenmodellierer
parents:
439
diff
changeset
|
359 MX_SPI3_Init(); |
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 if(coldstart != 0xA5) /* Not reading a 0xA5 means the memory cells has not been initialized before => cold start */ |
433 | 362 { |
363 coldstart = 0xA5; | |
662 | 364 |
365 set_charge_state(Charger_ColdStart); | |
366 | |
473
edfc1a464b42
Do not signal power on reset in case of a "warm" reset:
ideenmodellierer
parents:
439
diff
changeset
|
367 global.dataSendToMaster.power_on_reset = 1; |
edfc1a464b42
Do not signal power on reset in case of a "warm" reset:
ideenmodellierer
parents:
439
diff
changeset
|
368 global.deviceDataSendToMaster.power_on_reset = 1; |
edfc1a464b42
Do not signal power on reset in case of a "warm" reset:
ideenmodellierer
parents:
439
diff
changeset
|
369 |
edfc1a464b42
Do not signal power on reset in case of a "warm" reset:
ideenmodellierer
parents:
439
diff
changeset
|
370 if (!scheduleSetButtonResponsiveness()) |
edfc1a464b42
Do not signal power on reset in case of a "warm" reset:
ideenmodellierer
parents:
439
diff
changeset
|
371 { |
763
aa6006975e76
increase HAL_Delay to 10ms for cold-start-button reset
heinrichsweikamp
parents:
762
diff
changeset
|
372 HAL_Delay(10); |
473
edfc1a464b42
Do not signal power on reset in case of a "warm" reset:
ideenmodellierer
parents:
439
diff
changeset
|
373 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
|
374 { |
763
aa6006975e76
increase HAL_Delay to 10ms for cold-start-button reset
heinrichsweikamp
parents:
762
diff
changeset
|
375 HAL_Delay(10); |
473
edfc1a464b42
Do not signal power on reset in case of a "warm" reset:
ideenmodellierer
parents:
439
diff
changeset
|
376 scheduleSetButtonResponsiveness(); // init |
763
aa6006975e76
increase HAL_Delay to 10ms for cold-start-button reset
heinrichsweikamp
parents:
762
diff
changeset
|
377 HAL_Delay(10); |
473
edfc1a464b42
Do not signal power on reset in case of a "warm" reset:
ideenmodellierer
parents:
439
diff
changeset
|
378 } |
edfc1a464b42
Do not signal power on reset in case of a "warm" reset:
ideenmodellierer
parents:
439
diff
changeset
|
379 } |
433 | 380 } |
662 | 381 else |
382 { | |
383 set_charge_state(Charger_NotConnected); | |
384 } | |
38 | 385 |
89 | 386 ADCx_Init(); |
387 GPIO_Power_MainCPU_Init(); | |
662 | 388 |
389 externalInterface_InitPower33(); | |
390 | |
89 | 391 global.mode = MODE_POWERUP; |
38 | 392 #else |
89 | 393 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
|
394 init_surface_ring(0); |
38 | 395 |
89 | 396 ADCx_Init(); |
397 GPIO_Power_MainCPU_Init(); | |
398 global.mode = MODE_TEST; | |
38 | 399 #endif |
89 | 400 while (1) { |
120 | 401 /* printf("Global mode = %d\n", global.mode); */ |
38 | 402 |
89 | 403 switch (global.mode) { |
404 case MODE_POWERUP: | |
405 case MODE_BOOT: | |
406 // ReInit_battery_charger_status_pins(); | |
407 compass_init(0, 7); | |
408 accelerator_init(); | |
554
3328189786e7
Added external ADC interface functionality (MCP3424):
Ideenmodellierer
parents:
533
diff
changeset
|
409 externalInterface_Init(); |
181 | 410 |
89 | 411 if (global.mode == MODE_BOOT) { |
412 GPIO_Power_MainCPU_OFF(); | |
903
0f2e5a166d40
Disable GNSS operations using compile switch:
Ideenmodellierer
parents:
900
diff
changeset
|
413 #ifdef ENABLE_GNSS |
880 | 414 GPIO_LED_GREEN_ON(); |
903
0f2e5a166d40
Disable GNSS operations using compile switch:
Ideenmodellierer
parents:
900
diff
changeset
|
415 #endif |
89 | 416 HAL_Delay(100); // for GPIO_Power_MainCPU_ON(); |
417 GPIO_Power_MainCPU_ON(); | |
903
0f2e5a166d40
Disable GNSS operations using compile switch:
Ideenmodellierer
parents:
900
diff
changeset
|
418 #ifdef ENABLE_GNSS |
880 | 419 GPIO_LED_GREEN_OFF(); |
420 | |
421 GPIO_LED_RED_ON(); | |
900 | 422 GPIO_VIBRATION_ON(); |
903
0f2e5a166d40
Disable GNSS operations using compile switch:
Ideenmodellierer
parents:
900
diff
changeset
|
423 #endif |
880 | 424 HAL_Delay(100); |
903
0f2e5a166d40
Disable GNSS operations using compile switch:
Ideenmodellierer
parents:
900
diff
changeset
|
425 #ifdef ENABLE_GNSS |
880 | 426 GPIO_LED_RED_OFF(); |
427 GPIO_VIBRATION_OFF(); | |
903
0f2e5a166d40
Disable GNSS operations using compile switch:
Ideenmodellierer
parents:
900
diff
changeset
|
428 #endif |
89 | 429 } |
903
0f2e5a166d40
Disable GNSS operations using compile switch:
Ideenmodellierer
parents:
900
diff
changeset
|
430 #ifdef ENABLE_GNSS |
900 | 431 GPIO_LED_RED_OFF(); |
432 GPIO_LED_GREEN_OFF(); | |
433 GPIO_VIBRATION_OFF(); | |
903
0f2e5a166d40
Disable GNSS operations using compile switch:
Ideenmodellierer
parents:
900
diff
changeset
|
434 #endif |
89 | 435 SPI_synchronize_with_Master(); |
436 MX_DMA_Init(); | |
437 MX_SPI1_Init(); | |
134
0586ae83a243
Removed cyclic (by timer) send on slave side
Ideenmodellierer
parents:
120
diff
changeset
|
438 SPI_Start_single_TxRx_with_Master(); /* be prepared for the first data exchange */ |
207 | 439 Scheduler_Request_sync_with_SPI(SPI_SYNC_METHOD_HARD); |
889 | 440 |
900 | 441 #ifdef ENABLE_GNSS |
889 | 442 // GNSS tests |
443 GNSS_IO_init(); | |
900 | 444 GPIO_GPS_ON(); |
445 GPIO_GPS_BCKP_ON(); | |
889 | 446 MX_USART6_UART_Init(); |
447 GNSS_Init(&GNSS_Handle, &huart6); | |
900 | 448 #endif |
899
2225c467f1e9
Added data path and visualization for position data:
Ideenmodellierer
parents:
890
diff
changeset
|
449 |
2225c467f1e9
Added data path and visualization for position data:
Ideenmodellierer
parents:
890
diff
changeset
|
450 #if 0 |
889 | 451 HAL_Delay(1000); |
452 GNSS_LoadConfig(&GNSS_Handle); | |
890
651d21777b61
cleanup and disable function for GNSS uart and DMA
heinrichsweikamp
parents:
889
diff
changeset
|
453 HAL_Delay(250); |
889 | 454 GNSS_GetUniqID(&GNSS_Handle); |
455 GNSS_ParseBuffer(&GNSS_Handle); | |
890
651d21777b61
cleanup and disable function for GNSS uart and DMA
heinrichsweikamp
parents:
889
diff
changeset
|
456 HAL_Delay(250); |
889 | 457 GNSS_GetPVTData(&GNSS_Handle); |
458 GNSS_ParseBuffer(&GNSS_Handle); | |
899
2225c467f1e9
Added data path and visualization for position data:
Ideenmodellierer
parents:
890
diff
changeset
|
459 #endif |
890
651d21777b61
cleanup and disable function for GNSS uart and DMA
heinrichsweikamp
parents:
889
diff
changeset
|
460 /* |
651d21777b61
cleanup and disable function for GNSS uart and DMA
heinrichsweikamp
parents:
889
diff
changeset
|
461 * Demo code from SimpleMethod |
651d21777b61
cleanup and disable function for GNSS uart and DMA
heinrichsweikamp
parents:
889
diff
changeset
|
462 * called 1/second |
651d21777b61
cleanup and disable function for GNSS uart and DMA
heinrichsweikamp
parents:
889
diff
changeset
|
463 while (1) { |
651d21777b61
cleanup and disable function for GNSS uart and DMA
heinrichsweikamp
parents:
889
diff
changeset
|
464 |
651d21777b61
cleanup and disable function for GNSS uart and DMA
heinrichsweikamp
parents:
889
diff
changeset
|
465 if ((HAL_GetTick() - Timer) > 1000) { |
651d21777b61
cleanup and disable function for GNSS uart and DMA
heinrichsweikamp
parents:
889
diff
changeset
|
466 GNSS_GetUniqID(&GNSS_Handle); |
651d21777b61
cleanup and disable function for GNSS uart and DMA
heinrichsweikamp
parents:
889
diff
changeset
|
467 GNSS_ParseBuffer(&GNSS_Handle); |
651d21777b61
cleanup and disable function for GNSS uart and DMA
heinrichsweikamp
parents:
889
diff
changeset
|
468 HAL_Delay(250); |
651d21777b61
cleanup and disable function for GNSS uart and DMA
heinrichsweikamp
parents:
889
diff
changeset
|
469 GNSS_GetPVTData(&GNSS_Handle); |
651d21777b61
cleanup and disable function for GNSS uart and DMA
heinrichsweikamp
parents:
889
diff
changeset
|
470 GNSS_ParseBuffer(&GNSS_Handle); |
651d21777b61
cleanup and disable function for GNSS uart and DMA
heinrichsweikamp
parents:
889
diff
changeset
|
471 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
|
472 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
|
473 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
|
474 printf("Latitude: %f \r\n", GNSS_Handle.fLat); |
651d21777b61
cleanup and disable function for GNSS uart and DMA
heinrichsweikamp
parents:
889
diff
changeset
|
475 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
|
476 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
|
477 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
|
478 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
|
479 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
|
480 GNSS_Handle.uniqueID[0], GNSS_Handle.uniqueID[1], |
651d21777b61
cleanup and disable function for GNSS uart and DMA
heinrichsweikamp
parents:
889
diff
changeset
|
481 GNSS_Handle.uniqueID[2], GNSS_Handle.uniqueID[3], |
651d21777b61
cleanup and disable function for GNSS uart and DMA
heinrichsweikamp
parents:
889
diff
changeset
|
482 GNSS_Handle.uniqueID[4], GNSS_Handle.uniqueID[5]); |
651d21777b61
cleanup and disable function for GNSS uart and DMA
heinrichsweikamp
parents:
889
diff
changeset
|
483 Timer = HAL_GetTick(); |
651d21777b61
cleanup and disable function for GNSS uart and DMA
heinrichsweikamp
parents:
889
diff
changeset
|
484 } |
651d21777b61
cleanup and disable function for GNSS uart and DMA
heinrichsweikamp
parents:
889
diff
changeset
|
485 */ |
889 | 486 |
89 | 487 global.mode = MODE_SURFACE; |
488 break; | |
38 | 489 |
89 | 490 case MODE_CALIB: |
90 | 491 scheduleCompassCalibrationMode(); |
89 | 492 break; |
493 | |
494 case MODE_SURFACE: | |
495 scheduleSurfaceMode(); | |
496 break; | |
38 | 497 |
89 | 498 case MODE_TEST: |
499 break; | |
38 | 500 |
89 | 501 case MODE_DIVE: |
90 | 502 backup.no_fly_time_minutes = global.no_fly_time_minutes; |
503 backup.seconds_since_last_dive = global.seconds_since_last_dive; | |
504 | |
505 vpm_init( &global.vpm, global.conservatism, global.repetitive_dive, | |
506 global.seconds_since_last_dive ); | |
507 global.no_fly_time_minutes = 0; | |
508 global.lifeData.dive_time_seconds = 0; | |
509 global.lifeData.dive_time_seconds_without_surface_time = 0; | |
510 scheduleDiveMode(); | |
511 // done now in scheduler prior to change mode: global.seconds_since_last_dive = 1; | |
512 | |
513 if( global.lifeData.dive_time_seconds > 60 ) | |
514 { | |
515 //No Fly time 60% of desaturationtime after dive | |
516 global.no_fly_time_minutes = decom_calc_desaturation_time( | |
517 global.lifeData.tissue_nitrogen_bar, | |
518 global.lifeData.tissue_helium_bar, | |
519 global.lifeData.pressure_surface_bar ) * 60 / 100; | |
520 if( global.no_fly_time_minutes < (24 * 60) ) | |
521 global.no_fly_time_minutes = 24 * 60; | |
522 } | |
523 else | |
524 { | |
525 global.no_fly_time_minutes = backup.no_fly_time_minutes; | |
526 global.seconds_since_last_dive = backup.seconds_since_last_dive; | |
527 } | |
528 | |
529 global.lifeData.dive_time_seconds = 0; | |
530 global.lifeData.dive_time_seconds_without_surface_time = 0; | |
531 global.lifeData.counterSecondsShallowDepth = 0; | |
532 | |
533 backup.no_fly_time_minutes = 0; | |
534 backup.seconds_since_last_dive = 0; | |
89 | 535 break; |
38 | 536 |
89 | 537 case MODE_SHUTDOWN: |
538 HAL_Delay(200); | |
539 global.mode = MODE_SLEEP; | |
540 MX_SPI3_Init(); | |
541 break; | |
542 | |
543 case MODE_SLEEP: | |
839 | 544 externalInterface_SwitchUART(EXT_INTERFACE_UART_OFF); |
662 | 545 externalInterface_SwitchPower33(false); |
89 | 546 if (hasExternalClock()) |
547 SystemClock_Config_HSI(); | |
887 | 548 GPIO_LEDs_VIBRATION_Init(); |
89 | 549 sleep_prepare(); |
38 | 550 |
89 | 551 scheduleSleepMode(); |
552 if (hasExternalClock()) | |
553 SystemClock_Config_HSE(); | |
554 EXTI_Wakeup_Button_DeInit(); | |
555 ADCx_Init(); | |
556 GPIO_Power_MainCPU_Init(); | |
557 GPIO_Power_MainCPU_ON(); | |
558 compass_init(0, 7); | |
559 accelerator_init(); | |
148
ee744c7160ce
Use SPI TX callback to synchronize to main CPU
Ideenmodellierer
parents:
134
diff
changeset
|
560 SPI_synchronize_with_Master(); |
89 | 561 MX_DMA_Init(); |
562 MX_SPI1_Init(); | |
148
ee744c7160ce
Use SPI TX callback to synchronize to main CPU
Ideenmodellierer
parents:
134
diff
changeset
|
563 SPI_Start_single_TxRx_with_Master(); |
89 | 564 |
662 | 565 if(externalInterface_isEnabledPower33()) |
566 { | |
567 externalInterface_SwitchPower33(true); | |
568 } | |
738
30717de00f3a
Added data init function for external interface:
Ideenmodellierer
parents:
728
diff
changeset
|
569 externalInterface_InitDatastruct(); |
89 | 570 // EXTILine0_Button_DeInit(); not now, later after testing |
571 break; | |
572 } | |
120 | 573 |
574 #ifdef DEBUG_RUNTIME | |
575 HAL_RTC_GetTime(&RTCHandle, &Stime, RTC_FORMAT_BCD); | |
576 | |
577 if(lastsecond == 0xFF) | |
578 { | |
579 measurementindex = 0; | |
580 loopcnt[measurementindex] = 0; | |
581 lastsecond = Stime.Seconds; | |
582 } | |
583 loopcnt[measurementindex]++; | |
584 | |
585 if(lastsecond != Stime.Seconds) | |
586 { | |
587 measurementindex++; | |
588 if (measurementindex == MEASURECNT) measurementindex = 0; | |
589 loopcnt[measurementindex] = 0; | |
590 lastsecond = Stime.Seconds; | |
591 if(measurementindex +1 < MEASURECNT) loopcnt[measurementindex +1] = 0xffff; /* helps to identify the latest value */ | |
592 } | |
593 #endif | |
89 | 594 } |
38 | 595 } |
596 | |
597 /** @brief Button feedback - EXTI line detection callbacks | |
598 * @param GPIO_Pin: Specifies the pins connected EXTI line | |
599 * @retval None | |
600 */ | |
89 | 601 void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin) { |
38 | 602 |
89 | 603 if (GPIO_Pin == BUTTON_OSTC_GPIO_PIN) { |
604 if (global.mode == MODE_SLEEP) { | |
605 global.mode = MODE_BOOT; | |
606 } | |
607 } | |
608 else | |
880 | 609 { |
610 | |
89 | 611 } |
38 | 612 } |
613 | |
614 /** | |
615 * @brief System Clock Configuration | |
616 * The system Clock is configured as follow : | |
617 * System Clock source = PLL (HSI) | |
618 * SYSCLK(Hz) = 100 MHz | |
619 * HCLK(Hz) = 100 MHz | |
620 * AHB Prescaler = 1 | |
621 * APB1 Prescaler = 2 | |
622 * APB2 Prescaler = 1 | |
623 * HSI Frequency(Hz) = 16 MHz | |
624 * PLL_M = 16 | |
625 * PLL_N = 400 | |
626 * PLL_P = 4 | |
627 * PLL_Q = 7 // no USB | |
628 * VDD(V) = 3.3 | |
629 * Main regulator output voltage = Scale1 mode | |
630 * Flash Latency(WS) = 3 | |
631 * @param None | |
632 * @retval None | |
633 */ | |
634 | |
89 | 635 void SystemClock_Config(void) { |
636 if (hasExternalClock()) | |
637 SystemClock_Config_HSE(); | |
638 else | |
639 SystemClock_Config_HSI(); | |
38 | 640 } |
641 | |
89 | 642 void SYSCLKConfig_STOP(void) { |
643 SYSCLKConfig_STOP_HSI(); | |
38 | 644 } |
645 | |
89 | 646 void SystemClock_Config_HSE(void) { |
647 RCC_OscInitTypeDef RCC_OscInitStruct; | |
648 RCC_ClkInitTypeDef RCC_ClkInitStruct; | |
38 | 649 // RCC_PeriphCLKInitTypeDef PeriphClkInitStruct; |
650 | |
89 | 651 __PWR_CLK_ENABLE(); // is identical to __HAL_RCC_PWR_CLK_ENABLE(); |
38 | 652 |
887 | 653 __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1); |
38 | 654 |
89 | 655 RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE; //|RCC_OSCILLATORTYPE_LSE; |
656 RCC_OscInitStruct.HSEState = RCC_HSE_ON; | |
657 //RCC_OscInitStruct.LSEState = RCC_LSE_ON; | |
658 RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON; | |
659 RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE; | |
660 RCC_OscInitStruct.PLL.PLLM = 8; | |
661 RCC_OscInitStruct.PLL.PLLN = 320; | |
662 RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV4; | |
663 RCC_OscInitStruct.PLL.PLLQ = 4; | |
664 HAL_RCC_OscConfig(&RCC_OscInitStruct); | |
38 | 665 |
89 | 666 RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK | RCC_CLOCKTYPE_SYSCLK |
667 | RCC_CLOCKTYPE_PCLK1 | RCC_CLOCKTYPE_PCLK2; | |
668 RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK; | |
669 RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1; | |
670 RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV2; | |
671 RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1; | |
672 HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_2); | |
38 | 673 |
674 // PeriphClkInitStruct.PeriphClockSelection = RCC_PERIPHCLK_RTC; | |
675 // PeriphClkInitStruct.RTCClockSelection = RCC_RTCCLKSOURCE_LSE; | |
676 // HAL_RCCEx_PeriphCLKConfig(&PeriphClkInitStruct); | |
677 | |
678 // HAL_SYSTICK_Config(HAL_RCC_GetHCLKFreq()/1000); | |
679 | |
680 // HAL_SYSTICK_CLKSourceConfig(SYSTICK_CLKSOURCE_HCLK); | |
681 | |
89 | 682 /* SysTick_IRQn interrupt configuration */ |
38 | 683 // HAL_NVIC_SetPriority(SysTick_IRQn, 0, 0); |
684 } | |
685 | |
89 | 686 void SystemClock_Config_HSI(void) { |
687 RCC_ClkInitTypeDef RCC_ClkInitStruct; | |
688 RCC_OscInitTypeDef RCC_OscInitStruct; | |
38 | 689 |
89 | 690 /* Enable Power Control clock */ |
691 __HAL_RCC_PWR_CLK_ENABLE(); | |
38 | 692 |
89 | 693 /* The voltage scaling allows optimizing the power consumption when the device is |
694 clocked below the maximum system frequency, to update the voltage scaling value | |
695 regarding system frequency refer to product datasheet. */ | |
887 | 696 __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1); |
38 | 697 |
89 | 698 /* Enable HSI Oscillator and activate PLL with HSI as source */ |
699 RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI; | |
700 RCC_OscInitStruct.HSIState = RCC_HSI_ON; | |
701 RCC_OscInitStruct.HSICalibrationValue = 0x10; | |
702 RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON; | |
703 RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSI; | |
704 RCC_OscInitStruct.PLL.PLLM = 16; | |
705 RCC_OscInitStruct.PLL.PLLN = 320; | |
706 RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV4; | |
707 RCC_OscInitStruct.PLL.PLLQ = 4; | |
708 HAL_RCC_OscConfig(&RCC_OscInitStruct); | |
38 | 709 |
89 | 710 /* Select PLL as system clock source and configure the HCLK, PCLK1 and PCLK2 |
711 clocks dividers */ | |
712 RCC_ClkInitStruct.ClockType = (RCC_CLOCKTYPE_SYSCLK | RCC_CLOCKTYPE_HCLK | |
713 | RCC_CLOCKTYPE_PCLK1 | RCC_CLOCKTYPE_PCLK2); | |
714 RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK; | |
715 RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1; | |
716 RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV2; | |
717 RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1; | |
718 HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_2); | |
38 | 719 } |
720 | |
721 | |
722 /** | |
723 * @brief Configures system clock after wake-up from STOP: enable HSI, PLL | |
724 * and select PLL as system clock source. | |
725 * @param None | |
726 * @retval None | |
727 */ | |
89 | 728 void SYSCLKConfig_STOP_HSE(void) { |
729 RCC_ClkInitTypeDef RCC_ClkInitStruct; | |
730 RCC_OscInitTypeDef RCC_OscInitStruct; | |
731 uint32_t pFLatency = 0; | |
38 | 732 |
89 | 733 /* Get the Oscillators configuration according to the internal RCC registers */ |
734 HAL_RCC_GetOscConfig(&RCC_OscInitStruct); | |
38 | 735 |
89 | 736 /* After wake-up from STOP reconfigure the system clock: Enable HSI and PLL */ |
737 RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE; | |
738 RCC_OscInitStruct.HSIState = RCC_HSE_ON; | |
739 RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON; | |
740 HAL_RCC_OscConfig(&RCC_OscInitStruct); | |
38 | 741 |
89 | 742 /* Get the Clocks configuration according to the internal RCC registers */ |
743 HAL_RCC_GetClockConfig(&RCC_ClkInitStruct, &pFLatency); | |
38 | 744 |
89 | 745 /* Select PLL as system clock source and configure the HCLK, PCLK1 and PCLK2 |
746 clocks dividers */ | |
747 RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_SYSCLK; | |
748 RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK; | |
749 HAL_RCC_ClockConfig(&RCC_ClkInitStruct, pFLatency); | |
38 | 750 } |
751 | |
89 | 752 void SYSCLKConfig_STOP_HSI(void) { |
753 RCC_ClkInitTypeDef RCC_ClkInitStruct; | |
754 RCC_OscInitTypeDef RCC_OscInitStruct; | |
755 uint32_t pFLatency = 0; | |
38 | 756 |
89 | 757 /* Get the Oscillators configuration according to the internal RCC registers */ |
758 HAL_RCC_GetOscConfig(&RCC_OscInitStruct); | |
38 | 759 |
89 | 760 /* After wake-up from STOP reconfigure the system clock: Enable HSI and PLL */ |
761 RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI; | |
762 RCC_OscInitStruct.HSIState = RCC_HSI_ON; | |
763 RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON; | |
764 RCC_OscInitStruct.HSICalibrationValue = 0x10; | |
765 HAL_RCC_OscConfig(&RCC_OscInitStruct); | |
38 | 766 |
89 | 767 /* Get the Clocks configuration according to the internal RCC registers */ |
768 HAL_RCC_GetClockConfig(&RCC_ClkInitStruct, &pFLatency); | |
38 | 769 |
89 | 770 /* Select PLL as system clock source and configure the HCLK, PCLK1 and PCLK2 |
771 clocks dividers */ | |
772 RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_SYSCLK; | |
773 RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK; | |
774 HAL_RCC_ClockConfig(&RCC_ClkInitStruct, pFLatency); | |
38 | 775 } |
776 | |
777 /** | |
778 * @brief SYSTICK callback | |
779 * @param None | |
780 * @retval None | |
781 */ | |
89 | 782 void HAL_SYSTICK_Callback(void) { |
783 HAL_IncTick(); | |
38 | 784 } |
785 | |
786 /** | |
787 * @brief Configures GPIO for LED | |
788 * Might move with STM32Cube usage | |
789 * @param None | |
790 * @retval None | |
791 */ | |
792 /* | |
793 void GPIO_test_I2C_lines(void) | |
794 { | |
795 GPIO_InitTypeDef GPIO_InitStructure; | |
796 __GPIOB_CLK_ENABLE(); | |
797 GPIO_InitStructure.Pin = GPIO_PIN_8; | |
798 GPIO_InitStructure.Mode = GPIO_MODE_OUTPUT_PP; | |
799 GPIO_InitStructure.Pull = GPIO_PULLUP; | |
800 GPIO_InitStructure.Speed = GPIO_SPEED_LOW; | |
801 HAL_GPIO_Init(GPIOB, &GPIO_InitStructure); | |
802 GPIO_InitStructure.Pin = GPIO_PIN_9; | |
803 HAL_GPIO_Init(GPIOB, &GPIO_InitStructure); | |
804 | |
805 HAL_GPIO_WritePin(GPIOB,GPIO_PIN_8,GPIO_PIN_SET); | |
806 HAL_GPIO_WritePin(GPIOB,GPIO_PIN_9,GPIO_PIN_RESET); | |
807 HAL_Delay(10); | |
808 HAL_GPIO_WritePin(GPIOB,GPIO_PIN_9,GPIO_PIN_SET); | |
809 HAL_GPIO_WritePin(GPIOB,GPIO_PIN_8,GPIO_PIN_RESET); | |
810 HAL_Delay(10); | |
811 } | |
812 */ | |
813 | |
880 | 814 static void GPIO_LEDs_VIBRATION_Init(void) { |
89 | 815 GPIO_InitTypeDef GPIO_InitStructure; |
38 | 816 |
880 | 817 __GPIOA_CLK_ENABLE(); |
818 GPIO_InitStructure.Pin = LED_CONTROL_PIN_RED; | |
89 | 819 GPIO_InitStructure.Mode = GPIO_MODE_OUTPUT_PP; |
820 GPIO_InitStructure.Pull = GPIO_PULLUP; | |
880 | 821 GPIO_InitStructure.Speed = GPIO_SPEED_LOW; |
822 HAL_GPIO_Init( GPIOA, &GPIO_InitStructure); | |
909 | 823 HAL_GPIO_WritePin( GPIOA, LED_CONTROL_PIN_RED, GPIO_PIN_SET); |
880 | 824 |
825 GPIO_InitStructure.Pin = LED_CONTROL_PIN_GREEN; | |
826 GPIO_InitStructure.Mode = GPIO_MODE_OUTPUT_PP; | |
827 GPIO_InitStructure.Pull = GPIO_PULLUP; | |
828 GPIO_InitStructure.Speed = GPIO_SPEED_LOW; | |
829 HAL_GPIO_Init( GPIOA, &GPIO_InitStructure); | |
909 | 830 HAL_GPIO_WritePin( GPIOA, LED_CONTROL_PIN_GREEN, GPIO_PIN_SET); |
880 | 831 |
832 GPIO_InitStructure.Pin = VIBRATION_CONTROL_PIN; | |
833 GPIO_InitStructure.Mode = GPIO_MODE_OUTPUT_PP; | |
834 GPIO_InitStructure.Pull = GPIO_PULLDOWN; | |
835 GPIO_InitStructure.Speed = GPIO_SPEED_LOW; | |
836 HAL_GPIO_Init( GPIOA, &GPIO_InitStructure); | |
909 | 837 HAL_GPIO_WritePin( GPIOA, VIBRATION_CONTROL_PIN, GPIO_PIN_RESET); |
887 | 838 |
839 __GPIOB_CLK_ENABLE(); | |
840 GPIO_InitStructure.Pin = GPS_POWER_CONTROL_PIN; | |
841 GPIO_InitStructure.Mode = GPIO_MODE_OUTPUT_PP; | |
842 GPIO_InitStructure.Pull = GPIO_PULLUP; | |
843 GPIO_InitStructure.Speed = GPIO_SPEED_LOW; | |
844 HAL_GPIO_Init( GPIOB, &GPIO_InitStructure); | |
909 | 845 HAL_GPIO_WritePin( GPIOB, GPS_POWER_CONTROL_PIN, GPIO_PIN_SET); |
887 | 846 |
847 GPIO_InitStructure.Pin = GPS_BCKP_CONTROL_PIN; | |
848 GPIO_InitStructure.Mode = GPIO_MODE_OUTPUT_PP; | |
849 GPIO_InitStructure.Pull = GPIO_PULLDOWN; | |
850 GPIO_InitStructure.Speed = GPIO_SPEED_LOW; | |
851 HAL_GPIO_Init( GPIOB, &GPIO_InitStructure); | |
909 | 852 HAL_GPIO_WritePin( GPIOB, GPS_BCKP_CONTROL_PIN, GPIO_PIN_RESET); |
38 | 853 } |
854 | |
89 | 855 void GPIO_new_DEBUG_Init(void) { |
38 | 856 #ifdef DEBUG_PIN_ACTIVE |
89 | 857 GPIO_InitTypeDef GPIO_InitStructure; |
38 | 858 |
89 | 859 __GPIOC_CLK_ENABLE(); |
662 | 860 GPIO_InitStructure.Pin = LED_CONTROL_PIN; |
89 | 861 GPIO_InitStructure.Mode = GPIO_MODE_OUTPUT_PP; |
862 GPIO_InitStructure.Pull = GPIO_PULLUP; | |
863 GPIO_InitStructure.Speed = GPIO_SPEED_FAST; | |
864 HAL_GPIO_Init(GPIOA, &GPIO_InitStructure); | |
38 | 865 #endif |
866 } | |
867 | |
89 | 868 void GPIO_new_DEBUG_LOW(void) { |
38 | 869 #ifdef DEBUG_PIN_ACTIVE |
662 | 870 HAL_GPIO_WritePin(GPIOC,LED_CONTROL_PIN,GPIO_PIN_RESET); |
38 | 871 #endif |
872 } | |
873 | |
89 | 874 void GPIO_new_DEBUG_HIGH(void) { |
38 | 875 #ifdef DEBUG_PIN_ACTIVE |
662 | 876 HAL_GPIO_WritePin(GPIOC,LED_CONTROL_PIN,GPIO_PIN_SET); |
38 | 877 #endif |
878 } | |
879 | |
89 | 880 static void GPIO_Power_MainCPU_Init(void) { |
881 GPIO_InitTypeDef GPIO_InitStructure; | |
882 __GPIOC_CLK_ENABLE(); | |
662 | 883 GPIO_InitStructure.Pin = MAINCPU_CONTROL_PIN; |
89 | 884 GPIO_InitStructure.Mode = GPIO_MODE_OUTPUT_PP; |
885 GPIO_InitStructure.Pull = GPIO_PULLUP; | |
886 GPIO_InitStructure.Speed = GPIO_SPEED_LOW; | |
887 HAL_GPIO_Init( GPIOC, &GPIO_InitStructure); | |
662 | 888 HAL_GPIO_WritePin( GPIOC, MAINCPU_CONTROL_PIN, GPIO_PIN_RESET); |
38 | 889 } |
890 | |
89 | 891 static void GPIO_Power_MainCPU_ON(void) { |
662 | 892 HAL_GPIO_WritePin( GPIOC, MAINCPU_CONTROL_PIN, GPIO_PIN_RESET); |
38 | 893 } |
894 | |
89 | 895 static void GPIO_Power_MainCPU_OFF(void) { |
662 | 896 HAL_GPIO_WritePin( GPIOC, MAINCPU_CONTROL_PIN, GPIO_PIN_SET); |
38 | 897 } |
898 | |
903
0f2e5a166d40
Disable GNSS operations using compile switch:
Ideenmodellierer
parents:
900
diff
changeset
|
899 #ifdef ENABLE_GNSS |
880 | 900 static void GPIO_LED_GREEN_ON(void) { |
901 HAL_GPIO_WritePin( GPIOA, LED_CONTROL_PIN_GREEN, GPIO_PIN_RESET); | |
902 } | |
903 | |
904 static void GPIO_LED_GREEN_OFF(void) { | |
905 HAL_GPIO_WritePin( GPIOA, LED_CONTROL_PIN_GREEN, GPIO_PIN_SET); | |
906 } | |
907 | |
908 static void GPIO_LED_RED_ON(void) { | |
909 HAL_GPIO_WritePin( GPIOA, LED_CONTROL_PIN_RED, GPIO_PIN_RESET); | |
910 } | |
911 | |
912 static void GPIO_LED_RED_OFF(void) { | |
913 HAL_GPIO_WritePin( GPIOA, LED_CONTROL_PIN_RED, GPIO_PIN_SET); | |
914 } | |
915 | |
916 static void GPIO_VIBRATION_ON(void) { | |
917 HAL_GPIO_WritePin( GPIOA, VIBRATION_CONTROL_PIN, GPIO_PIN_SET); | |
918 } | |
919 | |
920 static void GPIO_VIBRATION_OFF(void) { | |
921 HAL_GPIO_WritePin( GPIOA, VIBRATION_CONTROL_PIN, GPIO_PIN_RESET); | |
922 } | |
923 | |
887 | 924 static void GPIO_GPS_ON(void) { |
925 HAL_GPIO_WritePin( GPIOB, GPS_POWER_CONTROL_PIN, GPIO_PIN_RESET); | |
926 } | |
927 | |
928 static void GPIO_GPS_OFF(void) { | |
929 HAL_GPIO_WritePin( GPIOB, GPS_POWER_CONTROL_PIN, GPIO_PIN_SET); | |
930 } | |
931 | |
932 static void GPIO_GPS_BCKP_ON(void) { | |
933 HAL_GPIO_WritePin( GPIOB, GPS_BCKP_CONTROL_PIN, GPIO_PIN_SET); | |
934 } | |
935 | |
936 static void GPIO_GPS_BCKP_OFF(void) { | |
937 HAL_GPIO_WritePin( GPIOB, GPS_BCKP_CONTROL_PIN, GPIO_PIN_RESET); | |
938 } | |
903
0f2e5a166d40
Disable GNSS operations using compile switch:
Ideenmodellierer
parents:
900
diff
changeset
|
939 #endif |
880 | 940 |
38 | 941 /** |
942 * @brief Configures EXTI Line0 (connected to PA0 + PA1 pin) in interrupt mode | |
943 * @param None | |
944 * @retval None | |
945 */ | |
946 | |
89 | 947 static void EXTI_Wakeup_Button_Init(void) { |
948 GPIO_InitTypeDef GPIO_InitStructure; | |
38 | 949 |
89 | 950 __HAL_RCC_GPIOA_CLK_ENABLE(); |
951 BUTTON_OSTC_HAL_RCC_GPIO_CLK_ENABLE(); | |
952 GPIO_InitStructure.Pin = BUTTON_OSTC_GPIO_PIN; | |
953 GPIO_InitStructure.Mode = GPIO_MODE_IT_FALLING; | |
954 GPIO_InitStructure.Pull = GPIO_NOPULL; | |
955 HAL_GPIO_Init( BUTTON_OSTC_GPIO_PORT, &GPIO_InitStructure); | |
38 | 956 |
89 | 957 HAL_NVIC_SetPriority( BUTTON_OSTC_IRQn, 0x0F, 0); |
958 HAL_NVIC_EnableIRQ( BUTTON_OSTC_IRQn); | |
38 | 959 } |
960 | |
89 | 961 static void EXTI_Wakeup_Button_DeInit(void) { |
962 GPIO_InitTypeDef GPIO_InitStructure; | |
38 | 963 |
89 | 964 GPIO_InitStructure.Mode = GPIO_MODE_ANALOG; |
965 GPIO_InitStructure.Speed = GPIO_SPEED_LOW; | |
966 GPIO_InitStructure.Pull = GPIO_NOPULL; | |
38 | 967 |
89 | 968 GPIO_InitStructure.Pin = BUTTON_OSTC_GPIO_PIN; |
969 HAL_GPIO_Init( BUTTON_OSTC_GPIO_PORT, &GPIO_InitStructure); | |
970 HAL_NVIC_DisableIRQ( BUTTON_OSTC_IRQn); | |
38 | 971 } |
972 | |
973 /** | |
974 * @brief Wake Up Timer callback | |
975 * @param hrtc: RTC handle | |
976 * @retval None | |
977 */ | |
978 | |
979 /* | |
980 void HAL_RTCEx_WakeUpTimerEventCallback(RTC_HandleTypeDef *hrtc) | |
981 { | |
982 static uint8_t uwCounter = 0; | |
983 uwCounter = 1; | |
984 } | |
985 */ | |
986 | |
89 | 987 void HAL_I2C_MasterTxCpltCallback(I2C_HandleTypeDef *I2cHandle) { |
38 | 988 |
989 } | |
990 | |
89 | 991 void HAL_I2C_MasterRxCpltCallback(I2C_HandleTypeDef *I2cHandle) { |
38 | 992 |
993 } | |
994 | |
89 | 995 void HAL_I2C_ErrorCallback(I2C_HandleTypeDef *I2cHandle) { |
38 | 996 |
997 } | |
998 | |
89 | 999 void sleep_prepare(void) { |
1000 EXTI_Wakeup_Button_Init(); | |
662 | 1001 |
89 | 1002 compass_sleep(); |
1003 HAL_Delay(100); | |
1004 accelerator_sleep(); | |
1005 HAL_Delay(100); | |
38 | 1006 |
89 | 1007 I2C_DeInit(); |
1008 MX_SPI_DeInit(); | |
1009 MX_SPI3_DeInit(); | |
1010 ADCx_DeInit(); | |
38 | 1011 |
89 | 1012 GPIO_InitTypeDef GPIO_InitStruct; |
38 | 1013 |
89 | 1014 __HAL_RCC_GPIOA_CLK_ENABLE(); |
1015 __HAL_RCC_GPIOB_CLK_ENABLE(); | |
1016 __HAL_RCC_GPIOC_CLK_ENABLE(); | |
1017 __HAL_RCC_GPIOH_CLK_ENABLE(); | |
38 | 1018 |
89 | 1019 GPIO_InitStruct.Mode = GPIO_MODE_ANALOG; |
887 | 1020 GPIO_InitStruct.Speed = GPIO_SPEED_LOW; |
89 | 1021 GPIO_InitStruct.Pull = GPIO_NOPULL; |
1022 GPIO_InitStruct.Pin = GPIO_PIN_All; | |
1023 HAL_GPIO_Init( GPIOH, &GPIO_InitStruct); | |
38 | 1024 #ifdef DEBUGMODE |
89 | 1025 GPIO_InitStruct.Pin = GPIO_PIN_All ^ ( GPIO_PIN_3 | GPIO_PIN_8 | GPIO_PIN_9); /* debug */ |
38 | 1026 #endif |
887 | 1027 |
1028 GPIO_InitStruct.Pin = GPIO_PIN_All ^ (GPS_POWER_CONTROL_PIN | GPS_BCKP_CONTROL_PIN); | |
89 | 1029 HAL_GPIO_Init( GPIOB, &GPIO_InitStruct); |
38 | 1030 |
887 | 1031 GPIO_InitStruct.Pin = GPIO_PIN_All ^ ( MAINCPU_CONTROL_PIN | CHARGE_OUT_PIN | EXT33V_CONTROL_PIN); /* power off & charger in & charge out & OSC32 & ext33Volt */ |
662 | 1032 |
89 | 1033 HAL_GPIO_Init( GPIOC, &GPIO_InitStruct); |
38 | 1034 |
887 | 1035 GPIO_InitStruct.Pin = GPIO_PIN_All ^ ( GPIO_PIN_0 | VIBRATION_CONTROL_PIN | LED_CONTROL_PIN_RED | LED_CONTROL_PIN_GREEN); |
38 | 1036 #ifdef DEBUGMODE |
89 | 1037 GPIO_InitStruct.Pin = GPIO_PIN_All ^ ( GPIO_PIN_0 | GPIO_PIN_13 | GPIO_PIN_14); /* wake up button & debug */ |
38 | 1038 #endif |
89 | 1039 HAL_GPIO_Init( GPIOA, &GPIO_InitStruct); |
38 | 1040 |
89 | 1041 GPIO_InitStruct.Pin = GPIO_PIN_All; |
1042 HAL_GPIO_Init( GPIOH, &GPIO_InitStruct); | |
38 | 1043 |
89 | 1044 GPIO_Power_MainCPU_OFF(); |
903
0f2e5a166d40
Disable GNSS operations using compile switch:
Ideenmodellierer
parents:
900
diff
changeset
|
1045 #ifdef ENABLE_GNSS |
880 | 1046 GPIO_LED_GREEN_OFF(); |
1047 GPIO_LED_RED_OFF(); | |
887 | 1048 GPIO_VIBRATION_OFF(); |
1049 GPIO_GPS_BCKP_ON(); // mH : costs 100µA in sleep - beware | |
1050 GPIO_GPS_OFF(); | |
880 | 1051 |
890
651d21777b61
cleanup and disable function for GNSS uart and DMA
heinrichsweikamp
parents:
889
diff
changeset
|
1052 MX_USART6_UART_DeInit(); |
903
0f2e5a166d40
Disable GNSS operations using compile switch:
Ideenmodellierer
parents:
900
diff
changeset
|
1053 #endif |
38 | 1054 #ifndef DEBUGMODE |
89 | 1055 __HAL_RCC_GPIOB_CLK_DISABLE(); |
38 | 1056 #endif |
89 | 1057 __HAL_RCC_GPIOH_CLK_DISABLE(); |
38 | 1058 |
89 | 1059 HAL_Delay(1000); |
38 | 1060 } |
1061 | |
1062 /* | |
1063 void sleep_test(void) | |
1064 { | |
1065 GPIO_InitTypeDef GPIO_InitStruct; | |
1066 | |
1067 __HAL_RCC_GPIOA_CLK_ENABLE(); | |
1068 __HAL_RCC_GPIOB_CLK_ENABLE(); | |
1069 __HAL_RCC_GPIOC_CLK_ENABLE(); | |
1070 __HAL_RCC_GPIOH_CLK_ENABLE(); | |
1071 | |
1072 GPIO_InitStruct.Mode = GPIO_MODE_ANALOG; | |
1073 GPIO_InitStruct.Speed = GPIO_SPEED_HIGH; | |
1074 GPIO_InitStruct.Pull = GPIO_NOPULL; | |
1075 GPIO_InitStruct.Pin = GPIO_PIN_All; | |
1076 HAL_GPIO_Init(GPIOH, &GPIO_InitStruct); | |
1077 HAL_GPIO_Init(GPIOB, &GPIO_InitStruct); | |
1078 | |
1079 GPIO_InitStruct.Pin = GPIO_PIN_All ^ ( GPIO_PIN_0 | GPIO_PIN_15 | GPIO_PIN_14); | |
1080 HAL_GPIO_Init(GPIOC, &GPIO_InitStruct); | |
1081 | |
1082 GPIO_InitStruct.Pin = GPIO_PIN_All ^ ( GPIO_PIN_0); | |
1083 HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); | |
1084 | |
1085 GPIO_Power_MainCPU_OFF(); | |
1086 | |
1087 GPIO_InitStruct.Pull = GPIO_PULLUP; | |
1088 GPIO_InitStruct.Pin = GPIO_PIN_0; | |
1089 HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); | |
1090 | |
1091 // __HAL_RCC_GPIOA_CLK_DISABLE(); | |
1092 __HAL_RCC_GPIOB_CLK_DISABLE(); | |
1093 // __HAL_RCC_GPIOC_CLK_DISABLE(); | |
1094 __HAL_RCC_GPIOH_CLK_DISABLE(); | |
1095 | |
1096 | |
1097 HAL_Delay(5000); | |
1098 while(1) | |
1099 { | |
1100 RTC_StopMode_2seconds(); | |
1101 HAL_Delay(200); | |
1102 } | |
1103 } | |
1104 */ | |
1105 | |
1106 #ifdef USE_FULL_ASSERT | |
1107 | |
1108 /** | |
1109 * @brief Reports the name of the source file and the source line number | |
1110 * where the assert_param error has occurred. | |
1111 * @param file: pointer to the source file name | |
1112 * @param line: assert_param error line source number | |
1113 * @retval None | |
1114 */ | |
1115 void assert_failed(uint8_t* file, uint32_t line) | |
1116 { | |
89 | 1117 /* User can add his own implementation to report the file name and line number, |
1118 ex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */ | |
38 | 1119 |
89 | 1120 /* Infinite loop */ |
1121 while (1) | |
1122 { | |
1123 } | |
38 | 1124 } |
1125 #endif | |
1126 | |
1127 /** | |
1128 * @} | |
1129 */ | |
104 | 1130 /** |
1131 * @brief This function handles SysTick Handler. | |
1132 * @param None | |
1133 * @retval None | |
1134 */ | |
38 | 1135 |
104 | 1136 /*TxRx only here. Every 100 ms.*/ |
1137 uint8_t ticks100ms=0; | |
1138 void SysTick_Handler(void) | |
1139 { | |
1140 HAL_IncTick(); | |
1141 if(ticks100ms<100){ | |
1142 ticks100ms++; | |
1143 }else | |
1144 { | |
1145 ticks100ms=0; | |
1146 } | |
1147 } | |
38 | 1148 /** |
1149 * @} | |
1150 */ | |
1151 | |
1152 /************************ (C) COPYRIGHT heinrichs weikamp *****END OF FILE****/ |