From aceb30a2371dc67e7e7be434c0c370832fc7dedf Mon Sep 17 00:00:00 2001 From: Alice Date: Fri, 8 Jan 2021 13:38:16 +0100 Subject: [PATCH] Funktionierende Version --- stepper/steppermotor_F401RE/.cproject | 177 + stepper/steppermotor_F401RE/.mxproject | 25 + stepper/steppermotor_F401RE/.project | 33 + .../.settings/language.settings.xml | 27 + .../.settings/stm32cubeide.project.prefs | 4 + stepper/steppermotor_F401RE/Core/Inc/l6208.h | 383 + .../Core/Inc/l6208_target_config.h | 120 + stepper/steppermotor_F401RE/Core/Inc/main.h | 66 + stepper/steppermotor_F401RE/Core/Inc/motor.h | 441 + .../Core/Inc/stm32f4xx_hal_conf.h | 418 + .../Core/Inc/stm32f4xx_it.h | 73 + .../Core/Inc/stm32f4xx_nucleo.h | 302 + .../Core/Inc/x_nucleo_ihm05a1_stm32f4xx.h | 209 + .../Core/Inc/x_nucleo_ihmxx.h | 241 + .../steppermotor_F401RE/Core/Src/clock_f4.c | 111 + stepper/steppermotor_F401RE/Core/Src/l6208.c | 2183 +++ stepper/steppermotor_F401RE/Core/Src/main.c | 539 + .../Core/Src/stm32f4xx_hal_msp.c | 177 + .../Core/Src/stm32f4xx_it.c | 200 + .../Core/Src/stm32f4xx_nucleo.c | 863 + .../steppermotor_F401RE/Core/Src/syscalls.c | 159 + stepper/steppermotor_F401RE/Core/Src/sysmem.c | 80 + .../Core/Src/system_stm32f4xx.c | 278 + .../Core/Src/x_nucleo_ihm05a1_stm32f4xx.c | 631 + .../Core/Src/x_nucleo_ihmxx.c | 1943 ++ .../Core/Startup/startup_stm32f401retx.s | 432 + .../Debug/Core/Src/clock_f4.d | 105 + .../Debug/Core/Src/clock_f4.o | Bin 0 -> 759872 bytes .../Debug/Core/Src/clock_f4.su | 1 + .../Debug/Core/Src/l6208.d | 8 + .../Debug/Core/Src/l6208.o | Bin 0 -> 107948 bytes .../Debug/Core/Src/l6208.su | 75 + .../steppermotor_F401RE/Debug/Core/Src/main.d | 105 + .../steppermotor_F401RE/Debug/Core/Src/main.o | Bin 0 -> 766996 bytes .../Debug/Core/Src/main.su | 4 + .../Debug/Core/Src/stm32f4xx_hal_msp.d | 105 + .../Debug/Core/Src/stm32f4xx_hal_msp.o | Bin 0 -> 766500 bytes .../Debug/Core/Src/stm32f4xx_hal_msp.su | 4 + .../Debug/Core/Src/stm32f4xx_it.d | 108 + .../Debug/Core/Src/stm32f4xx_it.o | Bin 0 -> 763904 bytes .../Debug/Core/Src/stm32f4xx_it.su | 11 + .../Debug/Core/Src/stm32f4xx_nucleo.d | 91 + .../Debug/Core/Src/stm32f4xx_nucleo.o | Bin 0 -> 777632 bytes .../Debug/Core/Src/stm32f4xx_nucleo.su | 30 + .../Debug/Core/Src/subdir.mk | 69 + .../Debug/Core/Src/syscalls.d | 1 + .../Debug/Core/Src/syscalls.o | Bin 0 -> 78356 bytes .../Debug/Core/Src/syscalls.su | 18 + .../Debug/Core/Src/sysmem.d | 1 + .../Debug/Core/Src/sysmem.o | Bin 0 -> 49316 bytes .../Debug/Core/Src/sysmem.su | 1 + .../Debug/Core/Src/system_stm32f4xx.d | 88 + .../Debug/Core/Src/system_stm32f4xx.o | Bin 0 -> 750128 bytes .../Debug/Core/Src/system_stm32f4xx.su | 2 + .../Core/Src/x_nucleo_ihm05a1_stm32f4xx.d | 97 + .../Core/Src/x_nucleo_ihm05a1_stm32f4xx.o | Bin 0 -> 777008 bytes .../Core/Src/x_nucleo_ihm05a1_stm32f4xx.su | 27 + .../Debug/Core/Src/x_nucleo_ihmxx.d | 6 + .../Debug/Core/Src/x_nucleo_ihmxx.o | Bin 0 -> 87876 bytes .../Debug/Core/Src/x_nucleo_ihmxx.su | 97 + .../Core/Startup/startup_stm32f401retx.d | 2 + .../Core/Startup/startup_stm32f401retx.o | Bin 0 -> 5972 bytes .../Debug/Core/Startup/subdir.mk | 19 + .../STM32F4xx_HAL_Driver/Src/stm32f4xx_hal.d | 89 + .../STM32F4xx_HAL_Driver/Src/stm32f4xx_hal.o | Bin 0 -> 787108 bytes .../STM32F4xx_HAL_Driver/Src/stm32f4xx_hal.su | 25 + .../Src/stm32f4xx_hal_adc.d | 89 + .../Src/stm32f4xx_hal_adc.o | Bin 0 -> 766056 bytes .../Src/stm32f4xx_hal_adc.su | 26 + .../Src/stm32f4xx_hal_adc_ex.d | 89 + .../Src/stm32f4xx_hal_adc_ex.o | Bin 0 -> 761552 bytes .../Src/stm32f4xx_hal_adc_ex.su | 15 + .../Src/stm32f4xx_hal_can.d | 89 + .../Src/stm32f4xx_hal_can.o | Bin 0 -> 771544 bytes .../Src/stm32f4xx_hal_can.su | 0 .../Src/stm32f4xx_hal_cec.d | 89 + .../Src/stm32f4xx_hal_cec.o | Bin 0 -> 771544 bytes .../Src/stm32f4xx_hal_cec.su | 0 .../Src/stm32f4xx_hal_cortex.d | 89 + .../Src/stm32f4xx_hal_cortex.o | Bin 0 -> 790764 bytes .../Src/stm32f4xx_hal_cortex.su | 32 + .../Src/stm32f4xx_hal_crc.d | 89 + .../Src/stm32f4xx_hal_crc.o | Bin 0 -> 771544 bytes .../Src/stm32f4xx_hal_crc.su | 0 .../Src/stm32f4xx_hal_cryp.d | 89 + .../Src/stm32f4xx_hal_cryp.o | Bin 0 -> 771548 bytes .../Src/stm32f4xx_hal_cryp.su | 0 .../Src/stm32f4xx_hal_cryp_ex.d | 89 + .../Src/stm32f4xx_hal_cryp_ex.o | Bin 0 -> 771556 bytes .../Src/stm32f4xx_hal_cryp_ex.su | 0 .../Src/stm32f4xx_hal_dac.d | 89 + .../Src/stm32f4xx_hal_dac.o | Bin 0 -> 771544 bytes .../Src/stm32f4xx_hal_dac.su | 0 .../Src/stm32f4xx_hal_dac_ex.d | 89 + .../Src/stm32f4xx_hal_dac_ex.o | Bin 0 -> 771552 bytes .../Src/stm32f4xx_hal_dac_ex.su | 0 .../Src/stm32f4xx_hal_dcmi.d | 89 + .../Src/stm32f4xx_hal_dcmi.o | Bin 0 -> 771548 bytes .../Src/stm32f4xx_hal_dcmi.su | 0 .../Src/stm32f4xx_hal_dcmi_ex.d | 89 + .../Src/stm32f4xx_hal_dcmi_ex.o | Bin 0 -> 771556 bytes .../Src/stm32f4xx_hal_dcmi_ex.su | 0 .../Src/stm32f4xx_hal_dfsdm.d | 89 + .../Src/stm32f4xx_hal_dfsdm.o | Bin 0 -> 771552 bytes .../Src/stm32f4xx_hal_dfsdm.su | 0 .../Src/stm32f4xx_hal_dma.d | 89 + .../Src/stm32f4xx_hal_dma.o | Bin 0 -> 785396 bytes .../Src/stm32f4xx_hal_dma.su | 15 + .../Src/stm32f4xx_hal_dma2d.d | 89 + .../Src/stm32f4xx_hal_dma2d.o | Bin 0 -> 771552 bytes .../Src/stm32f4xx_hal_dma2d.su | 0 .../Src/stm32f4xx_hal_dma_ex.d | 89 + .../Src/stm32f4xx_hal_dma_ex.o | Bin 0 -> 784048 bytes .../Src/stm32f4xx_hal_dma_ex.su | 4 + .../Src/stm32f4xx_hal_dsi.d | 89 + .../Src/stm32f4xx_hal_dsi.o | Bin 0 -> 771544 bytes .../Src/stm32f4xx_hal_dsi.su | 0 .../Src/stm32f4xx_hal_eth.d | 89 + .../Src/stm32f4xx_hal_eth.o | Bin 0 -> 771544 bytes .../Src/stm32f4xx_hal_eth.su | 0 .../Src/stm32f4xx_hal_exti.d | 89 + .../Src/stm32f4xx_hal_exti.o | Bin 0 -> 771548 bytes .../Src/stm32f4xx_hal_exti.su | 0 .../Src/stm32f4xx_hal_flash.d | 89 + .../Src/stm32f4xx_hal_flash.o | Bin 0 -> 781988 bytes .../Src/stm32f4xx_hal_flash.su | 17 + .../Src/stm32f4xx_hal_flash_ex.d | 89 + .../Src/stm32f4xx_hal_flash_ex.o | Bin 0 -> 785056 bytes .../Src/stm32f4xx_hal_flash_ex.su | 22 + .../Src/stm32f4xx_hal_flash_ramfunc.d | 89 + .../Src/stm32f4xx_hal_flash_ramfunc.o | Bin 0 -> 771576 bytes .../Src/stm32f4xx_hal_flash_ramfunc.su | 0 .../Src/stm32f4xx_hal_fmpi2c.d | 89 + .../Src/stm32f4xx_hal_fmpi2c.o | Bin 0 -> 771552 bytes .../Src/stm32f4xx_hal_fmpi2c.su | 0 .../Src/stm32f4xx_hal_fmpi2c_ex.d | 89 + .../Src/stm32f4xx_hal_fmpi2c_ex.o | Bin 0 -> 771564 bytes .../Src/stm32f4xx_hal_fmpi2c_ex.su | 0 .../Src/stm32f4xx_hal_gpio.d | 89 + .../Src/stm32f4xx_hal_gpio.o | Bin 0 -> 779592 bytes .../Src/stm32f4xx_hal_gpio.su | 8 + .../Src/stm32f4xx_hal_hash.d | 89 + .../Src/stm32f4xx_hal_hash.o | Bin 0 -> 771548 bytes .../Src/stm32f4xx_hal_hash.su | 0 .../Src/stm32f4xx_hal_hash_ex.d | 89 + .../Src/stm32f4xx_hal_hash_ex.o | Bin 0 -> 771556 bytes .../Src/stm32f4xx_hal_hash_ex.su | 0 .../Src/stm32f4xx_hal_hcd.d | 89 + .../Src/stm32f4xx_hal_hcd.o | Bin 0 -> 771544 bytes .../Src/stm32f4xx_hal_hcd.su | 0 .../Src/stm32f4xx_hal_i2c.d | 89 + .../Src/stm32f4xx_hal_i2c.o | Bin 0 -> 771544 bytes .../Src/stm32f4xx_hal_i2c.su | 0 .../Src/stm32f4xx_hal_i2c_ex.d | 89 + .../Src/stm32f4xx_hal_i2c_ex.o | Bin 0 -> 771552 bytes .../Src/stm32f4xx_hal_i2c_ex.su | 0 .../Src/stm32f4xx_hal_i2s.d | 89 + .../Src/stm32f4xx_hal_i2s.o | Bin 0 -> 771544 bytes .../Src/stm32f4xx_hal_i2s.su | 0 .../Src/stm32f4xx_hal_i2s_ex.d | 89 + .../Src/stm32f4xx_hal_i2s_ex.o | Bin 0 -> 771552 bytes .../Src/stm32f4xx_hal_i2s_ex.su | 0 .../Src/stm32f4xx_hal_irda.d | 89 + .../Src/stm32f4xx_hal_irda.o | Bin 0 -> 771548 bytes .../Src/stm32f4xx_hal_irda.su | 0 .../Src/stm32f4xx_hal_iwdg.d | 89 + .../Src/stm32f4xx_hal_iwdg.o | Bin 0 -> 771548 bytes .../Src/stm32f4xx_hal_iwdg.su | 0 .../Src/stm32f4xx_hal_lptim.d | 89 + .../Src/stm32f4xx_hal_lptim.o | Bin 0 -> 771552 bytes .../Src/stm32f4xx_hal_lptim.su | 0 .../Src/stm32f4xx_hal_ltdc.d | 89 + .../Src/stm32f4xx_hal_ltdc.o | Bin 0 -> 771548 bytes .../Src/stm32f4xx_hal_ltdc.su | 0 .../Src/stm32f4xx_hal_ltdc_ex.d | 89 + .../Src/stm32f4xx_hal_ltdc_ex.o | Bin 0 -> 771556 bytes .../Src/stm32f4xx_hal_ltdc_ex.su | 0 .../Src/stm32f4xx_hal_mmc.d | 89 + .../Src/stm32f4xx_hal_mmc.o | Bin 0 -> 771544 bytes .../Src/stm32f4xx_hal_mmc.su | 0 .../Src/stm32f4xx_hal_msp_template.d | 89 + .../Src/stm32f4xx_hal_msp_template.o | Bin 0 -> 773108 bytes .../Src/stm32f4xx_hal_msp_template.su | 4 + .../Src/stm32f4xx_hal_nand.d | 89 + .../Src/stm32f4xx_hal_nand.o | Bin 0 -> 771548 bytes .../Src/stm32f4xx_hal_nand.su | 0 .../Src/stm32f4xx_hal_nor.d | 89 + .../Src/stm32f4xx_hal_nor.o | Bin 0 -> 771544 bytes .../Src/stm32f4xx_hal_nor.su | 0 .../Src/stm32f4xx_hal_pccard.d | 89 + .../Src/stm32f4xx_hal_pccard.o | Bin 0 -> 771552 bytes .../Src/stm32f4xx_hal_pccard.su | 0 .../Src/stm32f4xx_hal_pcd.d | 89 + .../Src/stm32f4xx_hal_pcd.o | Bin 0 -> 771544 bytes .../Src/stm32f4xx_hal_pcd.su | 0 .../Src/stm32f4xx_hal_pcd_ex.d | 89 + .../Src/stm32f4xx_hal_pcd_ex.o | Bin 0 -> 771552 bytes .../Src/stm32f4xx_hal_pcd_ex.su | 0 .../Src/stm32f4xx_hal_pwr.d | 89 + .../Src/stm32f4xx_hal_pwr.o | Bin 0 -> 780884 bytes .../Src/stm32f4xx_hal_pwr.su | 17 + .../Src/stm32f4xx_hal_pwr_ex.d | 89 + .../Src/stm32f4xx_hal_pwr_ex.o | Bin 0 -> 778284 bytes .../Src/stm32f4xx_hal_pwr_ex.su | 10 + .../Src/stm32f4xx_hal_qspi.d | 89 + .../Src/stm32f4xx_hal_qspi.o | Bin 0 -> 771548 bytes .../Src/stm32f4xx_hal_qspi.su | 0 .../Src/stm32f4xx_hal_rcc.d | 89 + .../Src/stm32f4xx_hal_rcc.o | Bin 0 -> 784568 bytes .../Src/stm32f4xx_hal_rcc.su | 14 + .../Src/stm32f4xx_hal_rcc_ex.d | 89 + .../Src/stm32f4xx_hal_rcc_ex.o | Bin 0 -> 778260 bytes .../Src/stm32f4xx_hal_rcc_ex.su | 6 + .../Src/stm32f4xx_hal_rng.d | 89 + .../Src/stm32f4xx_hal_rng.o | Bin 0 -> 771544 bytes .../Src/stm32f4xx_hal_rng.su | 0 .../Src/stm32f4xx_hal_rtc.d | 89 + .../Src/stm32f4xx_hal_rtc.o | Bin 0 -> 771544 bytes .../Src/stm32f4xx_hal_rtc.su | 0 .../Src/stm32f4xx_hal_rtc_ex.d | 89 + .../Src/stm32f4xx_hal_rtc_ex.o | Bin 0 -> 771552 bytes .../Src/stm32f4xx_hal_rtc_ex.su | 0 .../Src/stm32f4xx_hal_sai.d | 89 + .../Src/stm32f4xx_hal_sai.o | Bin 0 -> 771544 bytes .../Src/stm32f4xx_hal_sai.su | 0 .../Src/stm32f4xx_hal_sai_ex.d | 89 + .../Src/stm32f4xx_hal_sai_ex.o | Bin 0 -> 771552 bytes .../Src/stm32f4xx_hal_sai_ex.su | 0 .../Src/stm32f4xx_hal_sd.d | 89 + .../Src/stm32f4xx_hal_sd.o | Bin 0 -> 771540 bytes .../Src/stm32f4xx_hal_sd.su | 0 .../Src/stm32f4xx_hal_sdram.d | 89 + .../Src/stm32f4xx_hal_sdram.o | Bin 0 -> 771552 bytes .../Src/stm32f4xx_hal_sdram.su | 0 .../Src/stm32f4xx_hal_smartcard.d | 89 + .../Src/stm32f4xx_hal_smartcard.o | Bin 0 -> 771564 bytes .../Src/stm32f4xx_hal_smartcard.su | 0 .../Src/stm32f4xx_hal_spdifrx.d | 89 + .../Src/stm32f4xx_hal_spdifrx.o | Bin 0 -> 771556 bytes .../Src/stm32f4xx_hal_spdifrx.su | 0 .../Src/stm32f4xx_hal_spi.d | 89 + .../Src/stm32f4xx_hal_spi.o | Bin 0 -> 788120 bytes .../Src/stm32f4xx_hal_spi.su | 58 + .../Src/stm32f4xx_hal_sram.d | 89 + .../Src/stm32f4xx_hal_sram.o | Bin 0 -> 771548 bytes .../Src/stm32f4xx_hal_sram.su | 0 .../Src/stm32f4xx_hal_tim.d | 89 + .../Src/stm32f4xx_hal_tim.o | Bin 0 -> 841672 bytes .../Src/stm32f4xx_hal_tim.su | 106 + .../Src/stm32f4xx_hal_tim_ex.d | 89 + .../Src/stm32f4xx_hal_tim_ex.o | Bin 0 -> 799508 bytes .../Src/stm32f4xx_hal_tim_ex.su | 37 + ...m32f4xx_hal_timebase_rtc_alarm_template.su | 0 ...32f4xx_hal_timebase_rtc_wakeup_template.su | 0 .../stm32f4xx_hal_timebase_tim_template.su | 0 .../Src/stm32f4xx_hal_uart.d | 89 + .../Src/stm32f4xx_hal_uart.o | Bin 0 -> 771548 bytes .../Src/stm32f4xx_hal_uart.su | 0 .../Src/stm32f4xx_hal_usart.d | 89 + .../Src/stm32f4xx_hal_usart.o | Bin 0 -> 771552 bytes .../Src/stm32f4xx_hal_usart.su | 0 .../STM32F4xx_HAL_Driver/Src/subdir.mk | 109 + stepper/steppermotor_F401RE/Debug/makefile | 94 + .../steppermotor_F401RE/Debug/objects.list | 31 + stepper/steppermotor_F401RE/Debug/objects.mk | 8 + stepper/steppermotor_F401RE/Debug/sources.mk | 25 + .../Debug/steppermotor_F401RE.bin | Bin 0 -> 22996 bytes .../Debug/steppermotor_F401RE.elf | Bin 0 -> 1034204 bytes .../Debug/steppermotor_F401RE.list | 15132 ++++++++++++++++ .../Debug/steppermotor_F401RE.map | 5705 ++++++ .../Device/ST/STM32F4xx/Include/stm32f401xe.h | 8634 +++++++++ .../Device/ST/STM32F4xx/Include/stm32f4xx.h | 253 + .../ST/STM32F4xx/Include/system_stm32f4xx.h | 122 + .../Drivers/CMSIS/Include/cmsis_armcc.h | 865 + .../Drivers/CMSIS/Include/cmsis_armclang.h | 1869 ++ .../Drivers/CMSIS/Include/cmsis_compiler.h | 266 + .../Drivers/CMSIS/Include/cmsis_gcc.h | 2085 +++ .../Drivers/CMSIS/Include/cmsis_iccarm.h | 935 + .../Drivers/CMSIS/Include/cmsis_version.h | 39 + .../Drivers/CMSIS/Include/core_armv8mbl.h | 1918 ++ .../Drivers/CMSIS/Include/core_armv8mml.h | 2927 +++ .../Drivers/CMSIS/Include/core_cm0.h | 949 + .../Drivers/CMSIS/Include/core_cm0plus.h | 1083 ++ .../Drivers/CMSIS/Include/core_cm1.h | 976 + .../Drivers/CMSIS/Include/core_cm23.h | 1993 ++ .../Drivers/CMSIS/Include/core_cm3.h | 1941 ++ .../Drivers/CMSIS/Include/core_cm33.h | 3002 +++ .../Drivers/CMSIS/Include/core_cm4.h | 2129 +++ .../Drivers/CMSIS/Include/core_cm7.h | 2671 +++ .../Drivers/CMSIS/Include/core_sc000.h | 1022 ++ .../Drivers/CMSIS/Include/core_sc300.h | 1915 ++ .../Drivers/CMSIS/Include/mpu_armv7.h | 270 + .../Drivers/CMSIS/Include/mpu_armv8.h | 333 + .../Drivers/CMSIS/Include/tz_context.h | 70 + .../Inc/Legacy/stm32_hal_legacy.h | 3776 ++++ .../STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal.h | 298 + .../Inc/stm32f4xx_hal_adc.h | 858 + .../Inc/stm32f4xx_hal_adc_ex.h | 428 + .../Inc/stm32f4xx_hal_cortex.h | 410 + .../Inc/stm32f4xx_hal_def.h | 197 + .../Inc/stm32f4xx_hal_dma.h | 804 + .../Inc/stm32f4xx_hal_dma_ex.h | 104 + .../Inc/stm32f4xx_hal_exti.h | 368 + .../Inc/stm32f4xx_hal_flash.h | 428 + .../Inc/stm32f4xx_hal_flash_ex.h | 1066 ++ .../Inc/stm32f4xx_hal_flash_ramfunc.h | 79 + .../Inc/stm32f4xx_hal_gpio.h | 309 + .../Inc/stm32f4xx_hal_gpio_ex.h | 1592 ++ .../Inc/stm32f4xx_hal_pwr.h | 431 + .../Inc/stm32f4xx_hal_pwr_ex.h | 344 + .../Inc/stm32f4xx_hal_rcc.h | 1464 ++ .../Inc/stm32f4xx_hal_rcc_ex.h | 7138 ++++++++ .../Inc/stm32f4xx_hal_spi.h | 585 + .../Inc/stm32f4xx_hal_tim.h | 2030 +++ .../Inc/stm32f4xx_hal_tim_ex.h | 356 + .../Inc/stm32f4xx_hal_uart.h | 846 + .../STM32F4xx_HAL_Driver/Src/stm32f4xx_hal.c | 615 + .../Src/stm32f4xx_hal_adc.c | 1701 ++ .../Src/stm32f4xx_hal_adc_ex.c | 1114 ++ .../Src/stm32f4xx_hal_cortex.c | 505 + .../Src/stm32f4xx_hal_dma.c | 1305 ++ .../Src/stm32f4xx_hal_dma_ex.c | 315 + .../Src/stm32f4xx_hal_exti.c | 559 + .../Src/stm32f4xx_hal_flash.c | 778 + .../Src/stm32f4xx_hal_flash_ex.c | 1350 ++ .../Src/stm32f4xx_hal_flash_ramfunc.c | 175 + .../Src/stm32f4xx_hal_gpio.c | 537 + .../Src/stm32f4xx_hal_pwr.c | 559 + .../Src/stm32f4xx_hal_pwr_ex.c | 604 + .../Src/stm32f4xx_hal_rcc.c | 1114 ++ .../Src/stm32f4xx_hal_rcc_ex.c | 3754 ++++ .../Src/stm32f4xx_hal_spi.c | 3204 ++++ .../Src/stm32f4xx_hal_tim.c | 6654 +++++++ .../Src/stm32f4xx_hal_tim_ex.c | 1978 ++ .../Src/stm32f4xx_hal_uart.c | 3165 ++++ .../Release/Core/Src/clock_f4.d | 105 + .../Release/Core/Src/clock_f4.o | Bin 0 -> 1272 bytes .../Release/Core/Src/clock_f4.su | 1 + .../Release/Core/Src/l6208.d | 8 + .../Release/Core/Src/l6208.o | Bin 0 -> 23432 bytes .../Release/Core/Src/l6208.su | 75 + .../Release/Core/Src/main.d | 105 + .../Release/Core/Src/main.o | Bin 0 -> 5560 bytes .../Release/Core/Src/main.su | 4 + .../Release/Core/Src/stm32f4xx_hal_msp.d | 105 + .../Release/Core/Src/stm32f4xx_hal_msp.o | Bin 0 -> 2360 bytes .../Release/Core/Src/stm32f4xx_hal_msp.su | 4 + .../Release/Core/Src/stm32f4xx_it.d | 108 + .../Release/Core/Src/stm32f4xx_it.o | Bin 0 -> 2568 bytes .../Release/Core/Src/stm32f4xx_it.su | 11 + .../Release/Core/Src/stm32f4xx_nucleo.d | 91 + .../Release/Core/Src/stm32f4xx_nucleo.o | Bin 0 -> 8836 bytes .../Release/Core/Src/stm32f4xx_nucleo.su | 23 + .../Release/Core/Src/subdir.mk | 69 + .../Release/Core/Src/syscalls.d | 1 + .../Release/Core/Src/syscalls.o | Bin 0 -> 3812 bytes .../Release/Core/Src/syscalls.su | 18 + .../Release/Core/Src/sysmem.d | 1 + .../Release/Core/Src/sysmem.o | Bin 0 -> 1288 bytes .../Release/Core/Src/sysmem.su | 1 + .../Release/Core/Src/system_stm32f4xx.d | 88 + .../Release/Core/Src/system_stm32f4xx.o | Bin 0 -> 1712 bytes .../Release/Core/Src/system_stm32f4xx.su | 2 + .../Core/Src/x_nucleo_ihm05a1_stm32f4xx.d | 97 + .../Core/Src/x_nucleo_ihm05a1_stm32f4xx.o | Bin 0 -> 9184 bytes .../Core/Src/x_nucleo_ihm05a1_stm32f4xx.su | 27 + .../Release/Core/Src/x_nucleo_ihmxx.d | 6 + .../Release/Core/Src/x_nucleo_ihmxx.o | Bin 0 -> 25720 bytes .../Release/Core/Src/x_nucleo_ihmxx.su | 97 + .../Core/Startup/startup_stm32f401retx.d | 2 + .../Core/Startup/startup_stm32f401retx.o | Bin 0 -> 4868 bytes .../Release/Core/Startup/subdir.mk | 19 + .../STM32F4xx_HAL_Driver/Src/stm32f4xx_hal.d | 89 + .../STM32F4xx_HAL_Driver/Src/stm32f4xx_hal.o | Bin 0 -> 6216 bytes .../STM32F4xx_HAL_Driver/Src/stm32f4xx_hal.su | 27 + .../Src/stm32f4xx_hal_adc.d | 89 + .../Src/stm32f4xx_hal_adc.o | Bin 0 -> 7468 bytes .../Src/stm32f4xx_hal_adc.su | 25 + .../Src/stm32f4xx_hal_adc_ex.d | 89 + .../Src/stm32f4xx_hal_adc_ex.o | Bin 0 -> 5612 bytes .../Src/stm32f4xx_hal_adc_ex.su | 15 + .../Src/stm32f4xx_hal_cortex.d | 89 + .../Src/stm32f4xx_hal_cortex.o | Bin 0 -> 4308 bytes .../Src/stm32f4xx_hal_cortex.su | 18 + .../Src/stm32f4xx_hal_dma.d | 89 + .../Src/stm32f4xx_hal_dma.o | Bin 0 -> 4836 bytes .../Src/stm32f4xx_hal_dma.su | 13 + .../Src/stm32f4xx_hal_dma_ex.d | 89 + .../Src/stm32f4xx_hal_dma_ex.o | Bin 0 -> 4192 bytes .../Src/stm32f4xx_hal_dma_ex.su | 3 + .../Src/stm32f4xx_hal_exti.d | 89 + .../Src/stm32f4xx_hal_exti.o | Bin 0 -> 800 bytes .../Src/stm32f4xx_hal_exti.su | 0 .../Src/stm32f4xx_hal_flash.d | 89 + .../Src/stm32f4xx_hal_flash.o | Bin 0 -> 4816 bytes .../Src/stm32f4xx_hal_flash.su | 16 + .../Src/stm32f4xx_hal_flash_ex.d | 89 + .../Src/stm32f4xx_hal_flash_ex.o | Bin 0 -> 3724 bytes .../Src/stm32f4xx_hal_flash_ex.su | 11 + .../Src/stm32f4xx_hal_flash_ramfunc.d | 89 + .../Src/stm32f4xx_hal_flash_ramfunc.o | Bin 0 -> 808 bytes .../Src/stm32f4xx_hal_flash_ramfunc.su | 0 .../Src/stm32f4xx_hal_gpio.d | 89 + .../Src/stm32f4xx_hal_gpio.o | Bin 0 -> 2712 bytes .../Src/stm32f4xx_hal_gpio.su | 8 + .../Src/stm32f4xx_hal_pwr.d | 89 + .../Src/stm32f4xx_hal_pwr.o | Bin 0 -> 3912 bytes .../Src/stm32f4xx_hal_pwr.su | 17 + .../Src/stm32f4xx_hal_pwr_ex.d | 89 + .../Src/stm32f4xx_hal_pwr_ex.o | Bin 0 -> 3176 bytes .../Src/stm32f4xx_hal_pwr_ex.su | 10 + .../Src/stm32f4xx_hal_rcc.d | 89 + .../Src/stm32f4xx_hal_rcc.o | Bin 0 -> 5584 bytes .../Src/stm32f4xx_hal_rcc.su | 14 + .../Src/stm32f4xx_hal_rcc_ex.d | 89 + .../Src/stm32f4xx_hal_rcc_ex.o | Bin 0 -> 3172 bytes .../Src/stm32f4xx_hal_rcc_ex.su | 6 + .../Src/stm32f4xx_hal_spi.d | 89 + .../Src/stm32f4xx_hal_spi.o | Bin 0 -> 17760 bytes .../Src/stm32f4xx_hal_spi.su | 58 + .../Src/stm32f4xx_hal_tim.d | 89 + .../Src/stm32f4xx_hal_tim.o | Bin 0 -> 28028 bytes .../Src/stm32f4xx_hal_tim.su | 108 + .../Src/stm32f4xx_hal_tim_ex.d | 89 + .../Src/stm32f4xx_hal_tim_ex.o | Bin 0 -> 10580 bytes .../Src/stm32f4xx_hal_tim_ex.su | 39 + .../Src/stm32f4xx_hal_uart.d | 89 + .../Src/stm32f4xx_hal_uart.o | Bin 0 -> 800 bytes .../Src/stm32f4xx_hal_uart.su | 0 .../STM32F4xx_HAL_Driver/Src/subdir.mk | 109 + stepper/steppermotor_F401RE/Release/makefile | 94 + .../steppermotor_F401RE/Release/objects.list | 31 + .../steppermotor_F401RE/Release/objects.mk | 8 + .../steppermotor_F401RE/Release/sources.mk | 25 + .../Release/steppermotor_F401RE.bin | Bin 0 -> 13468 bytes .../Release/steppermotor_F401RE.elf | Bin 0 -> 152344 bytes .../Release/steppermotor_F401RE.list | 5145 ++++++ .../Release/steppermotor_F401RE.map | 2161 +++ .../STM32F401RETX_FLASH.ld | 177 + .../steppermotor_F401RE/STM32F401RETX_RAM.ld | 177 + .../steppermotor_F401RE.cfg | 44 + .../steppermotor_F401RE.ioc | 162 + .../steppermotor_F401RE.launch | 88 + 443 files changed, 142027 insertions(+) create mode 100644 stepper/steppermotor_F401RE/.cproject create mode 100644 stepper/steppermotor_F401RE/.mxproject create mode 100644 stepper/steppermotor_F401RE/.project create mode 100644 stepper/steppermotor_F401RE/.settings/language.settings.xml create mode 100644 stepper/steppermotor_F401RE/.settings/stm32cubeide.project.prefs create mode 100644 stepper/steppermotor_F401RE/Core/Inc/l6208.h create mode 100644 stepper/steppermotor_F401RE/Core/Inc/l6208_target_config.h create mode 100644 stepper/steppermotor_F401RE/Core/Inc/main.h create mode 100644 stepper/steppermotor_F401RE/Core/Inc/motor.h create mode 100644 stepper/steppermotor_F401RE/Core/Inc/stm32f4xx_hal_conf.h create mode 100644 stepper/steppermotor_F401RE/Core/Inc/stm32f4xx_it.h create mode 100644 stepper/steppermotor_F401RE/Core/Inc/stm32f4xx_nucleo.h create mode 100644 stepper/steppermotor_F401RE/Core/Inc/x_nucleo_ihm05a1_stm32f4xx.h create mode 100644 stepper/steppermotor_F401RE/Core/Inc/x_nucleo_ihmxx.h create mode 100644 stepper/steppermotor_F401RE/Core/Src/clock_f4.c create mode 100644 stepper/steppermotor_F401RE/Core/Src/l6208.c create mode 100644 stepper/steppermotor_F401RE/Core/Src/main.c create mode 100644 stepper/steppermotor_F401RE/Core/Src/stm32f4xx_hal_msp.c create mode 100644 stepper/steppermotor_F401RE/Core/Src/stm32f4xx_it.c create mode 100644 stepper/steppermotor_F401RE/Core/Src/stm32f4xx_nucleo.c create mode 100644 stepper/steppermotor_F401RE/Core/Src/syscalls.c create mode 100644 stepper/steppermotor_F401RE/Core/Src/sysmem.c create mode 100644 stepper/steppermotor_F401RE/Core/Src/system_stm32f4xx.c create mode 100644 stepper/steppermotor_F401RE/Core/Src/x_nucleo_ihm05a1_stm32f4xx.c create mode 100644 stepper/steppermotor_F401RE/Core/Src/x_nucleo_ihmxx.c create mode 100644 stepper/steppermotor_F401RE/Core/Startup/startup_stm32f401retx.s create mode 100644 stepper/steppermotor_F401RE/Debug/Core/Src/clock_f4.d create mode 100644 stepper/steppermotor_F401RE/Debug/Core/Src/clock_f4.o create mode 100644 stepper/steppermotor_F401RE/Debug/Core/Src/clock_f4.su create mode 100644 stepper/steppermotor_F401RE/Debug/Core/Src/l6208.d create mode 100644 stepper/steppermotor_F401RE/Debug/Core/Src/l6208.o create mode 100644 stepper/steppermotor_F401RE/Debug/Core/Src/l6208.su create mode 100644 stepper/steppermotor_F401RE/Debug/Core/Src/main.d create mode 100644 stepper/steppermotor_F401RE/Debug/Core/Src/main.o create mode 100644 stepper/steppermotor_F401RE/Debug/Core/Src/main.su create mode 100644 stepper/steppermotor_F401RE/Debug/Core/Src/stm32f4xx_hal_msp.d create mode 100644 stepper/steppermotor_F401RE/Debug/Core/Src/stm32f4xx_hal_msp.o create mode 100644 stepper/steppermotor_F401RE/Debug/Core/Src/stm32f4xx_hal_msp.su create mode 100644 stepper/steppermotor_F401RE/Debug/Core/Src/stm32f4xx_it.d create mode 100644 stepper/steppermotor_F401RE/Debug/Core/Src/stm32f4xx_it.o create mode 100644 stepper/steppermotor_F401RE/Debug/Core/Src/stm32f4xx_it.su create mode 100644 stepper/steppermotor_F401RE/Debug/Core/Src/stm32f4xx_nucleo.d create mode 100644 stepper/steppermotor_F401RE/Debug/Core/Src/stm32f4xx_nucleo.o create mode 100644 stepper/steppermotor_F401RE/Debug/Core/Src/stm32f4xx_nucleo.su create mode 100644 stepper/steppermotor_F401RE/Debug/Core/Src/subdir.mk create mode 100644 stepper/steppermotor_F401RE/Debug/Core/Src/syscalls.d create mode 100644 stepper/steppermotor_F401RE/Debug/Core/Src/syscalls.o create mode 100644 stepper/steppermotor_F401RE/Debug/Core/Src/syscalls.su create mode 100644 stepper/steppermotor_F401RE/Debug/Core/Src/sysmem.d create mode 100644 stepper/steppermotor_F401RE/Debug/Core/Src/sysmem.o create mode 100644 stepper/steppermotor_F401RE/Debug/Core/Src/sysmem.su create mode 100644 stepper/steppermotor_F401RE/Debug/Core/Src/system_stm32f4xx.d create mode 100644 stepper/steppermotor_F401RE/Debug/Core/Src/system_stm32f4xx.o create mode 100644 stepper/steppermotor_F401RE/Debug/Core/Src/system_stm32f4xx.su create mode 100644 stepper/steppermotor_F401RE/Debug/Core/Src/x_nucleo_ihm05a1_stm32f4xx.d create mode 100644 stepper/steppermotor_F401RE/Debug/Core/Src/x_nucleo_ihm05a1_stm32f4xx.o create mode 100644 stepper/steppermotor_F401RE/Debug/Core/Src/x_nucleo_ihm05a1_stm32f4xx.su create mode 100644 stepper/steppermotor_F401RE/Debug/Core/Src/x_nucleo_ihmxx.d create mode 100644 stepper/steppermotor_F401RE/Debug/Core/Src/x_nucleo_ihmxx.o create mode 100644 stepper/steppermotor_F401RE/Debug/Core/Src/x_nucleo_ihmxx.su create mode 100644 stepper/steppermotor_F401RE/Debug/Core/Startup/startup_stm32f401retx.d create mode 100644 stepper/steppermotor_F401RE/Debug/Core/Startup/startup_stm32f401retx.o create mode 100644 stepper/steppermotor_F401RE/Debug/Core/Startup/subdir.mk create mode 100644 stepper/steppermotor_F401RE/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal.d create mode 100644 stepper/steppermotor_F401RE/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal.o create mode 100644 stepper/steppermotor_F401RE/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal.su create mode 100644 stepper/steppermotor_F401RE/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_adc.d create mode 100644 stepper/steppermotor_F401RE/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_adc.o create mode 100644 stepper/steppermotor_F401RE/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_adc.su create mode 100644 stepper/steppermotor_F401RE/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_adc_ex.d create mode 100644 stepper/steppermotor_F401RE/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_adc_ex.o create mode 100644 stepper/steppermotor_F401RE/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_adc_ex.su create mode 100644 stepper/steppermotor_F401RE/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_can.d create mode 100644 stepper/steppermotor_F401RE/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_can.o create mode 100644 stepper/steppermotor_F401RE/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_can.su create mode 100644 stepper/steppermotor_F401RE/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_cec.d create mode 100644 stepper/steppermotor_F401RE/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_cec.o create mode 100644 stepper/steppermotor_F401RE/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_cec.su create mode 100644 stepper/steppermotor_F401RE/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_cortex.d create mode 100644 stepper/steppermotor_F401RE/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_cortex.o create mode 100644 stepper/steppermotor_F401RE/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_cortex.su create mode 100644 stepper/steppermotor_F401RE/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_crc.d create mode 100644 stepper/steppermotor_F401RE/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_crc.o create mode 100644 stepper/steppermotor_F401RE/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_crc.su create mode 100644 stepper/steppermotor_F401RE/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_cryp.d create mode 100644 stepper/steppermotor_F401RE/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_cryp.o create mode 100644 stepper/steppermotor_F401RE/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_cryp.su create mode 100644 stepper/steppermotor_F401RE/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_cryp_ex.d create mode 100644 stepper/steppermotor_F401RE/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_cryp_ex.o create mode 100644 stepper/steppermotor_F401RE/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_cryp_ex.su create mode 100644 stepper/steppermotor_F401RE/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dac.d create mode 100644 stepper/steppermotor_F401RE/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dac.o create mode 100644 stepper/steppermotor_F401RE/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dac.su create mode 100644 stepper/steppermotor_F401RE/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dac_ex.d create mode 100644 stepper/steppermotor_F401RE/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dac_ex.o create mode 100644 stepper/steppermotor_F401RE/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dac_ex.su create mode 100644 stepper/steppermotor_F401RE/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dcmi.d create mode 100644 stepper/steppermotor_F401RE/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dcmi.o create mode 100644 stepper/steppermotor_F401RE/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dcmi.su create mode 100644 stepper/steppermotor_F401RE/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dcmi_ex.d create mode 100644 stepper/steppermotor_F401RE/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dcmi_ex.o create mode 100644 stepper/steppermotor_F401RE/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dcmi_ex.su create mode 100644 stepper/steppermotor_F401RE/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dfsdm.d create mode 100644 stepper/steppermotor_F401RE/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dfsdm.o create mode 100644 stepper/steppermotor_F401RE/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dfsdm.su create mode 100644 stepper/steppermotor_F401RE/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma.d create mode 100644 stepper/steppermotor_F401RE/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma.o create mode 100644 stepper/steppermotor_F401RE/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma.su create mode 100644 stepper/steppermotor_F401RE/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma2d.d create mode 100644 stepper/steppermotor_F401RE/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma2d.o create mode 100644 stepper/steppermotor_F401RE/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma2d.su create mode 100644 stepper/steppermotor_F401RE/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma_ex.d create mode 100644 stepper/steppermotor_F401RE/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma_ex.o create mode 100644 stepper/steppermotor_F401RE/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma_ex.su create mode 100644 stepper/steppermotor_F401RE/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dsi.d create mode 100644 stepper/steppermotor_F401RE/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dsi.o create mode 100644 stepper/steppermotor_F401RE/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dsi.su create mode 100644 stepper/steppermotor_F401RE/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_eth.d create mode 100644 stepper/steppermotor_F401RE/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_eth.o create mode 100644 stepper/steppermotor_F401RE/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_eth.su create mode 100644 stepper/steppermotor_F401RE/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_exti.d create mode 100644 stepper/steppermotor_F401RE/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_exti.o create mode 100644 stepper/steppermotor_F401RE/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_exti.su create mode 100644 stepper/steppermotor_F401RE/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash.d create mode 100644 stepper/steppermotor_F401RE/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash.o create mode 100644 stepper/steppermotor_F401RE/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash.su create mode 100644 stepper/steppermotor_F401RE/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ex.d create mode 100644 stepper/steppermotor_F401RE/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ex.o create mode 100644 stepper/steppermotor_F401RE/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ex.su create mode 100644 stepper/steppermotor_F401RE/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ramfunc.d create mode 100644 stepper/steppermotor_F401RE/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ramfunc.o create mode 100644 stepper/steppermotor_F401RE/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ramfunc.su create mode 100644 stepper/steppermotor_F401RE/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_fmpi2c.d create mode 100644 stepper/steppermotor_F401RE/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_fmpi2c.o create mode 100644 stepper/steppermotor_F401RE/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_fmpi2c.su create mode 100644 stepper/steppermotor_F401RE/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_fmpi2c_ex.d create mode 100644 stepper/steppermotor_F401RE/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_fmpi2c_ex.o create mode 100644 stepper/steppermotor_F401RE/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_fmpi2c_ex.su create mode 100644 stepper/steppermotor_F401RE/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_gpio.d create mode 100644 stepper/steppermotor_F401RE/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_gpio.o create mode 100644 stepper/steppermotor_F401RE/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_gpio.su create mode 100644 stepper/steppermotor_F401RE/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_hash.d create mode 100644 stepper/steppermotor_F401RE/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_hash.o create mode 100644 stepper/steppermotor_F401RE/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_hash.su create mode 100644 stepper/steppermotor_F401RE/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_hash_ex.d create mode 100644 stepper/steppermotor_F401RE/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_hash_ex.o create mode 100644 stepper/steppermotor_F401RE/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_hash_ex.su create mode 100644 stepper/steppermotor_F401RE/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_hcd.d create mode 100644 stepper/steppermotor_F401RE/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_hcd.o create mode 100644 stepper/steppermotor_F401RE/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_hcd.su create mode 100644 stepper/steppermotor_F401RE/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_i2c.d create mode 100644 stepper/steppermotor_F401RE/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_i2c.o create mode 100644 stepper/steppermotor_F401RE/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_i2c.su create mode 100644 stepper/steppermotor_F401RE/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_i2c_ex.d create mode 100644 stepper/steppermotor_F401RE/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_i2c_ex.o create mode 100644 stepper/steppermotor_F401RE/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_i2c_ex.su create mode 100644 stepper/steppermotor_F401RE/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_i2s.d create mode 100644 stepper/steppermotor_F401RE/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_i2s.o create mode 100644 stepper/steppermotor_F401RE/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_i2s.su create mode 100644 stepper/steppermotor_F401RE/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_i2s_ex.d create mode 100644 stepper/steppermotor_F401RE/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_i2s_ex.o create mode 100644 stepper/steppermotor_F401RE/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_i2s_ex.su create mode 100644 stepper/steppermotor_F401RE/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_irda.d create mode 100644 stepper/steppermotor_F401RE/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_irda.o create mode 100644 stepper/steppermotor_F401RE/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_irda.su create mode 100644 stepper/steppermotor_F401RE/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_iwdg.d create mode 100644 stepper/steppermotor_F401RE/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_iwdg.o create mode 100644 stepper/steppermotor_F401RE/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_iwdg.su create mode 100644 stepper/steppermotor_F401RE/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_lptim.d create mode 100644 stepper/steppermotor_F401RE/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_lptim.o create mode 100644 stepper/steppermotor_F401RE/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_lptim.su create mode 100644 stepper/steppermotor_F401RE/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_ltdc.d create mode 100644 stepper/steppermotor_F401RE/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_ltdc.o create mode 100644 stepper/steppermotor_F401RE/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_ltdc.su create mode 100644 stepper/steppermotor_F401RE/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_ltdc_ex.d create mode 100644 stepper/steppermotor_F401RE/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_ltdc_ex.o create mode 100644 stepper/steppermotor_F401RE/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_ltdc_ex.su create mode 100644 stepper/steppermotor_F401RE/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_mmc.d create mode 100644 stepper/steppermotor_F401RE/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_mmc.o create mode 100644 stepper/steppermotor_F401RE/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_mmc.su create mode 100644 stepper/steppermotor_F401RE/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_msp_template.d create mode 100644 stepper/steppermotor_F401RE/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_msp_template.o create mode 100644 stepper/steppermotor_F401RE/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_msp_template.su create mode 100644 stepper/steppermotor_F401RE/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_nand.d create mode 100644 stepper/steppermotor_F401RE/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_nand.o create mode 100644 stepper/steppermotor_F401RE/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_nand.su create mode 100644 stepper/steppermotor_F401RE/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_nor.d create mode 100644 stepper/steppermotor_F401RE/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_nor.o create mode 100644 stepper/steppermotor_F401RE/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_nor.su create mode 100644 stepper/steppermotor_F401RE/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pccard.d create mode 100644 stepper/steppermotor_F401RE/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pccard.o create mode 100644 stepper/steppermotor_F401RE/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pccard.su create mode 100644 stepper/steppermotor_F401RE/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pcd.d create mode 100644 stepper/steppermotor_F401RE/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pcd.o create mode 100644 stepper/steppermotor_F401RE/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pcd.su create mode 100644 stepper/steppermotor_F401RE/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pcd_ex.d create mode 100644 stepper/steppermotor_F401RE/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pcd_ex.o create mode 100644 stepper/steppermotor_F401RE/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pcd_ex.su create mode 100644 stepper/steppermotor_F401RE/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr.d create mode 100644 stepper/steppermotor_F401RE/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr.o create mode 100644 stepper/steppermotor_F401RE/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr.su create mode 100644 stepper/steppermotor_F401RE/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr_ex.d create mode 100644 stepper/steppermotor_F401RE/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr_ex.o create mode 100644 stepper/steppermotor_F401RE/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr_ex.su create mode 100644 stepper/steppermotor_F401RE/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_qspi.d create mode 100644 stepper/steppermotor_F401RE/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_qspi.o create mode 100644 stepper/steppermotor_F401RE/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_qspi.su create mode 100644 stepper/steppermotor_F401RE/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc.d create mode 100644 stepper/steppermotor_F401RE/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc.o create mode 100644 stepper/steppermotor_F401RE/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc.su create mode 100644 stepper/steppermotor_F401RE/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc_ex.d create mode 100644 stepper/steppermotor_F401RE/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc_ex.o create mode 100644 stepper/steppermotor_F401RE/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc_ex.su create mode 100644 stepper/steppermotor_F401RE/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rng.d create mode 100644 stepper/steppermotor_F401RE/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rng.o create mode 100644 stepper/steppermotor_F401RE/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rng.su create mode 100644 stepper/steppermotor_F401RE/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rtc.d create mode 100644 stepper/steppermotor_F401RE/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rtc.o create mode 100644 stepper/steppermotor_F401RE/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rtc.su create mode 100644 stepper/steppermotor_F401RE/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rtc_ex.d create mode 100644 stepper/steppermotor_F401RE/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rtc_ex.o create mode 100644 stepper/steppermotor_F401RE/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rtc_ex.su create mode 100644 stepper/steppermotor_F401RE/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_sai.d create mode 100644 stepper/steppermotor_F401RE/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_sai.o create mode 100644 stepper/steppermotor_F401RE/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_sai.su create mode 100644 stepper/steppermotor_F401RE/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_sai_ex.d create mode 100644 stepper/steppermotor_F401RE/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_sai_ex.o create mode 100644 stepper/steppermotor_F401RE/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_sai_ex.su create mode 100644 stepper/steppermotor_F401RE/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_sd.d create mode 100644 stepper/steppermotor_F401RE/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_sd.o create mode 100644 stepper/steppermotor_F401RE/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_sd.su create mode 100644 stepper/steppermotor_F401RE/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_sdram.d create mode 100644 stepper/steppermotor_F401RE/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_sdram.o create mode 100644 stepper/steppermotor_F401RE/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_sdram.su create mode 100644 stepper/steppermotor_F401RE/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_smartcard.d create mode 100644 stepper/steppermotor_F401RE/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_smartcard.o create mode 100644 stepper/steppermotor_F401RE/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_smartcard.su create mode 100644 stepper/steppermotor_F401RE/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_spdifrx.d create mode 100644 stepper/steppermotor_F401RE/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_spdifrx.o create mode 100644 stepper/steppermotor_F401RE/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_spdifrx.su create mode 100644 stepper/steppermotor_F401RE/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_spi.d create mode 100644 stepper/steppermotor_F401RE/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_spi.o create mode 100644 stepper/steppermotor_F401RE/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_spi.su create mode 100644 stepper/steppermotor_F401RE/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_sram.d create mode 100644 stepper/steppermotor_F401RE/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_sram.o create mode 100644 stepper/steppermotor_F401RE/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_sram.su create mode 100644 stepper/steppermotor_F401RE/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim.d create mode 100644 stepper/steppermotor_F401RE/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim.o create mode 100644 stepper/steppermotor_F401RE/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim.su create mode 100644 stepper/steppermotor_F401RE/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim_ex.d create mode 100644 stepper/steppermotor_F401RE/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim_ex.o create mode 100644 stepper/steppermotor_F401RE/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim_ex.su create mode 100644 stepper/steppermotor_F401RE/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_timebase_rtc_alarm_template.su create mode 100644 stepper/steppermotor_F401RE/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_timebase_rtc_wakeup_template.su create mode 100644 stepper/steppermotor_F401RE/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_timebase_tim_template.su create mode 100644 stepper/steppermotor_F401RE/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_uart.d create mode 100644 stepper/steppermotor_F401RE/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_uart.o create mode 100644 stepper/steppermotor_F401RE/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_uart.su create mode 100644 stepper/steppermotor_F401RE/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_usart.d create mode 100644 stepper/steppermotor_F401RE/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_usart.o create mode 100644 stepper/steppermotor_F401RE/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_usart.su create mode 100644 stepper/steppermotor_F401RE/Debug/Drivers/STM32F4xx_HAL_Driver/Src/subdir.mk create mode 100644 stepper/steppermotor_F401RE/Debug/makefile create mode 100644 stepper/steppermotor_F401RE/Debug/objects.list create mode 100644 stepper/steppermotor_F401RE/Debug/objects.mk create mode 100644 stepper/steppermotor_F401RE/Debug/sources.mk create mode 100644 stepper/steppermotor_F401RE/Debug/steppermotor_F401RE.bin create mode 100644 stepper/steppermotor_F401RE/Debug/steppermotor_F401RE.elf create mode 100644 stepper/steppermotor_F401RE/Debug/steppermotor_F401RE.list create mode 100644 stepper/steppermotor_F401RE/Debug/steppermotor_F401RE.map create mode 100644 stepper/steppermotor_F401RE/Drivers/CMSIS/Device/ST/STM32F4xx/Include/stm32f401xe.h create mode 100644 stepper/steppermotor_F401RE/Drivers/CMSIS/Device/ST/STM32F4xx/Include/stm32f4xx.h create mode 100644 stepper/steppermotor_F401RE/Drivers/CMSIS/Device/ST/STM32F4xx/Include/system_stm32f4xx.h create mode 100644 stepper/steppermotor_F401RE/Drivers/CMSIS/Include/cmsis_armcc.h create mode 100644 stepper/steppermotor_F401RE/Drivers/CMSIS/Include/cmsis_armclang.h create mode 100644 stepper/steppermotor_F401RE/Drivers/CMSIS/Include/cmsis_compiler.h create mode 100644 stepper/steppermotor_F401RE/Drivers/CMSIS/Include/cmsis_gcc.h create mode 100644 stepper/steppermotor_F401RE/Drivers/CMSIS/Include/cmsis_iccarm.h create mode 100644 stepper/steppermotor_F401RE/Drivers/CMSIS/Include/cmsis_version.h create mode 100644 stepper/steppermotor_F401RE/Drivers/CMSIS/Include/core_armv8mbl.h create mode 100644 stepper/steppermotor_F401RE/Drivers/CMSIS/Include/core_armv8mml.h create mode 100644 stepper/steppermotor_F401RE/Drivers/CMSIS/Include/core_cm0.h create mode 100644 stepper/steppermotor_F401RE/Drivers/CMSIS/Include/core_cm0plus.h create mode 100644 stepper/steppermotor_F401RE/Drivers/CMSIS/Include/core_cm1.h create mode 100644 stepper/steppermotor_F401RE/Drivers/CMSIS/Include/core_cm23.h create mode 100644 stepper/steppermotor_F401RE/Drivers/CMSIS/Include/core_cm3.h create mode 100644 stepper/steppermotor_F401RE/Drivers/CMSIS/Include/core_cm33.h create mode 100644 stepper/steppermotor_F401RE/Drivers/CMSIS/Include/core_cm4.h create mode 100644 stepper/steppermotor_F401RE/Drivers/CMSIS/Include/core_cm7.h create mode 100644 stepper/steppermotor_F401RE/Drivers/CMSIS/Include/core_sc000.h create mode 100644 stepper/steppermotor_F401RE/Drivers/CMSIS/Include/core_sc300.h create mode 100644 stepper/steppermotor_F401RE/Drivers/CMSIS/Include/mpu_armv7.h create mode 100644 stepper/steppermotor_F401RE/Drivers/CMSIS/Include/mpu_armv8.h create mode 100644 stepper/steppermotor_F401RE/Drivers/CMSIS/Include/tz_context.h create mode 100644 stepper/steppermotor_F401RE/Drivers/STM32F4xx_HAL_Driver/Inc/Legacy/stm32_hal_legacy.h create mode 100644 stepper/steppermotor_F401RE/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal.h create mode 100644 stepper/steppermotor_F401RE/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_adc.h create mode 100644 stepper/steppermotor_F401RE/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_adc_ex.h create mode 100644 stepper/steppermotor_F401RE/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_cortex.h create mode 100644 stepper/steppermotor_F401RE/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_def.h create mode 100644 stepper/steppermotor_F401RE/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_dma.h create mode 100644 stepper/steppermotor_F401RE/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_dma_ex.h create mode 100644 stepper/steppermotor_F401RE/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_exti.h create mode 100644 stepper/steppermotor_F401RE/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_flash.h create mode 100644 stepper/steppermotor_F401RE/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_flash_ex.h create mode 100644 stepper/steppermotor_F401RE/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_flash_ramfunc.h create mode 100644 stepper/steppermotor_F401RE/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_gpio.h create mode 100644 stepper/steppermotor_F401RE/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_gpio_ex.h create mode 100644 stepper/steppermotor_F401RE/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_pwr.h create mode 100644 stepper/steppermotor_F401RE/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_pwr_ex.h create mode 100644 stepper/steppermotor_F401RE/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_rcc.h create mode 100644 stepper/steppermotor_F401RE/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_rcc_ex.h create mode 100644 stepper/steppermotor_F401RE/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_spi.h create mode 100644 stepper/steppermotor_F401RE/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_tim.h create mode 100644 stepper/steppermotor_F401RE/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_tim_ex.h create mode 100644 stepper/steppermotor_F401RE/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_uart.h create mode 100644 stepper/steppermotor_F401RE/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal.c create mode 100644 stepper/steppermotor_F401RE/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_adc.c create mode 100644 stepper/steppermotor_F401RE/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_adc_ex.c create mode 100644 stepper/steppermotor_F401RE/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_cortex.c create mode 100644 stepper/steppermotor_F401RE/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma.c create mode 100644 stepper/steppermotor_F401RE/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma_ex.c create mode 100644 stepper/steppermotor_F401RE/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_exti.c create mode 100644 stepper/steppermotor_F401RE/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash.c create mode 100644 stepper/steppermotor_F401RE/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ex.c create mode 100644 stepper/steppermotor_F401RE/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ramfunc.c create mode 100644 stepper/steppermotor_F401RE/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_gpio.c create mode 100644 stepper/steppermotor_F401RE/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr.c create mode 100644 stepper/steppermotor_F401RE/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr_ex.c create mode 100644 stepper/steppermotor_F401RE/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc.c create mode 100644 stepper/steppermotor_F401RE/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc_ex.c create mode 100644 stepper/steppermotor_F401RE/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_spi.c create mode 100644 stepper/steppermotor_F401RE/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim.c create mode 100644 stepper/steppermotor_F401RE/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim_ex.c create mode 100644 stepper/steppermotor_F401RE/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_uart.c create mode 100644 stepper/steppermotor_F401RE/Release/Core/Src/clock_f4.d create mode 100644 stepper/steppermotor_F401RE/Release/Core/Src/clock_f4.o create mode 100644 stepper/steppermotor_F401RE/Release/Core/Src/clock_f4.su create mode 100644 stepper/steppermotor_F401RE/Release/Core/Src/l6208.d create mode 100644 stepper/steppermotor_F401RE/Release/Core/Src/l6208.o create mode 100644 stepper/steppermotor_F401RE/Release/Core/Src/l6208.su create mode 100644 stepper/steppermotor_F401RE/Release/Core/Src/main.d create mode 100644 stepper/steppermotor_F401RE/Release/Core/Src/main.o create mode 100644 stepper/steppermotor_F401RE/Release/Core/Src/main.su create mode 100644 stepper/steppermotor_F401RE/Release/Core/Src/stm32f4xx_hal_msp.d create mode 100644 stepper/steppermotor_F401RE/Release/Core/Src/stm32f4xx_hal_msp.o create mode 100644 stepper/steppermotor_F401RE/Release/Core/Src/stm32f4xx_hal_msp.su create mode 100644 stepper/steppermotor_F401RE/Release/Core/Src/stm32f4xx_it.d create mode 100644 stepper/steppermotor_F401RE/Release/Core/Src/stm32f4xx_it.o create mode 100644 stepper/steppermotor_F401RE/Release/Core/Src/stm32f4xx_it.su create mode 100644 stepper/steppermotor_F401RE/Release/Core/Src/stm32f4xx_nucleo.d create mode 100644 stepper/steppermotor_F401RE/Release/Core/Src/stm32f4xx_nucleo.o create mode 100644 stepper/steppermotor_F401RE/Release/Core/Src/stm32f4xx_nucleo.su create mode 100644 stepper/steppermotor_F401RE/Release/Core/Src/subdir.mk create mode 100644 stepper/steppermotor_F401RE/Release/Core/Src/syscalls.d create mode 100644 stepper/steppermotor_F401RE/Release/Core/Src/syscalls.o create mode 100644 stepper/steppermotor_F401RE/Release/Core/Src/syscalls.su create mode 100644 stepper/steppermotor_F401RE/Release/Core/Src/sysmem.d create mode 100644 stepper/steppermotor_F401RE/Release/Core/Src/sysmem.o create mode 100644 stepper/steppermotor_F401RE/Release/Core/Src/sysmem.su create mode 100644 stepper/steppermotor_F401RE/Release/Core/Src/system_stm32f4xx.d create mode 100644 stepper/steppermotor_F401RE/Release/Core/Src/system_stm32f4xx.o create mode 100644 stepper/steppermotor_F401RE/Release/Core/Src/system_stm32f4xx.su create mode 100644 stepper/steppermotor_F401RE/Release/Core/Src/x_nucleo_ihm05a1_stm32f4xx.d create mode 100644 stepper/steppermotor_F401RE/Release/Core/Src/x_nucleo_ihm05a1_stm32f4xx.o create mode 100644 stepper/steppermotor_F401RE/Release/Core/Src/x_nucleo_ihm05a1_stm32f4xx.su create mode 100644 stepper/steppermotor_F401RE/Release/Core/Src/x_nucleo_ihmxx.d create mode 100644 stepper/steppermotor_F401RE/Release/Core/Src/x_nucleo_ihmxx.o create mode 100644 stepper/steppermotor_F401RE/Release/Core/Src/x_nucleo_ihmxx.su create mode 100644 stepper/steppermotor_F401RE/Release/Core/Startup/startup_stm32f401retx.d create mode 100644 stepper/steppermotor_F401RE/Release/Core/Startup/startup_stm32f401retx.o create mode 100644 stepper/steppermotor_F401RE/Release/Core/Startup/subdir.mk create mode 100644 stepper/steppermotor_F401RE/Release/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal.d create mode 100644 stepper/steppermotor_F401RE/Release/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal.o create mode 100644 stepper/steppermotor_F401RE/Release/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal.su create mode 100644 stepper/steppermotor_F401RE/Release/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_adc.d create mode 100644 stepper/steppermotor_F401RE/Release/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_adc.o create mode 100644 stepper/steppermotor_F401RE/Release/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_adc.su create mode 100644 stepper/steppermotor_F401RE/Release/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_adc_ex.d create mode 100644 stepper/steppermotor_F401RE/Release/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_adc_ex.o create mode 100644 stepper/steppermotor_F401RE/Release/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_adc_ex.su create mode 100644 stepper/steppermotor_F401RE/Release/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_cortex.d create mode 100644 stepper/steppermotor_F401RE/Release/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_cortex.o create mode 100644 stepper/steppermotor_F401RE/Release/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_cortex.su create mode 100644 stepper/steppermotor_F401RE/Release/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma.d create mode 100644 stepper/steppermotor_F401RE/Release/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma.o create mode 100644 stepper/steppermotor_F401RE/Release/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma.su create mode 100644 stepper/steppermotor_F401RE/Release/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma_ex.d create mode 100644 stepper/steppermotor_F401RE/Release/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma_ex.o create mode 100644 stepper/steppermotor_F401RE/Release/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma_ex.su create mode 100644 stepper/steppermotor_F401RE/Release/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_exti.d create mode 100644 stepper/steppermotor_F401RE/Release/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_exti.o create mode 100644 stepper/steppermotor_F401RE/Release/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_exti.su create mode 100644 stepper/steppermotor_F401RE/Release/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash.d create mode 100644 stepper/steppermotor_F401RE/Release/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash.o create mode 100644 stepper/steppermotor_F401RE/Release/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash.su create mode 100644 stepper/steppermotor_F401RE/Release/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ex.d create mode 100644 stepper/steppermotor_F401RE/Release/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ex.o create mode 100644 stepper/steppermotor_F401RE/Release/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ex.su create mode 100644 stepper/steppermotor_F401RE/Release/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ramfunc.d create mode 100644 stepper/steppermotor_F401RE/Release/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ramfunc.o create mode 100644 stepper/steppermotor_F401RE/Release/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ramfunc.su create mode 100644 stepper/steppermotor_F401RE/Release/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_gpio.d create mode 100644 stepper/steppermotor_F401RE/Release/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_gpio.o create mode 100644 stepper/steppermotor_F401RE/Release/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_gpio.su create mode 100644 stepper/steppermotor_F401RE/Release/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr.d create mode 100644 stepper/steppermotor_F401RE/Release/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr.o create mode 100644 stepper/steppermotor_F401RE/Release/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr.su create mode 100644 stepper/steppermotor_F401RE/Release/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr_ex.d create mode 100644 stepper/steppermotor_F401RE/Release/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr_ex.o create mode 100644 stepper/steppermotor_F401RE/Release/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr_ex.su create mode 100644 stepper/steppermotor_F401RE/Release/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc.d create mode 100644 stepper/steppermotor_F401RE/Release/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc.o create mode 100644 stepper/steppermotor_F401RE/Release/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc.su create mode 100644 stepper/steppermotor_F401RE/Release/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc_ex.d create mode 100644 stepper/steppermotor_F401RE/Release/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc_ex.o create mode 100644 stepper/steppermotor_F401RE/Release/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc_ex.su create mode 100644 stepper/steppermotor_F401RE/Release/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_spi.d create mode 100644 stepper/steppermotor_F401RE/Release/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_spi.o create mode 100644 stepper/steppermotor_F401RE/Release/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_spi.su create mode 100644 stepper/steppermotor_F401RE/Release/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim.d create mode 100644 stepper/steppermotor_F401RE/Release/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim.o create mode 100644 stepper/steppermotor_F401RE/Release/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim.su create mode 100644 stepper/steppermotor_F401RE/Release/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim_ex.d create mode 100644 stepper/steppermotor_F401RE/Release/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim_ex.o create mode 100644 stepper/steppermotor_F401RE/Release/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim_ex.su create mode 100644 stepper/steppermotor_F401RE/Release/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_uart.d create mode 100644 stepper/steppermotor_F401RE/Release/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_uart.o create mode 100644 stepper/steppermotor_F401RE/Release/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_uart.su create mode 100644 stepper/steppermotor_F401RE/Release/Drivers/STM32F4xx_HAL_Driver/Src/subdir.mk create mode 100644 stepper/steppermotor_F401RE/Release/makefile create mode 100644 stepper/steppermotor_F401RE/Release/objects.list create mode 100644 stepper/steppermotor_F401RE/Release/objects.mk create mode 100644 stepper/steppermotor_F401RE/Release/sources.mk create mode 100644 stepper/steppermotor_F401RE/Release/steppermotor_F401RE.bin create mode 100644 stepper/steppermotor_F401RE/Release/steppermotor_F401RE.elf create mode 100644 stepper/steppermotor_F401RE/Release/steppermotor_F401RE.list create mode 100644 stepper/steppermotor_F401RE/Release/steppermotor_F401RE.map create mode 100644 stepper/steppermotor_F401RE/STM32F401RETX_FLASH.ld create mode 100644 stepper/steppermotor_F401RE/STM32F401RETX_RAM.ld create mode 100644 stepper/steppermotor_F401RE/steppermotor_F401RE.cfg create mode 100644 stepper/steppermotor_F401RE/steppermotor_F401RE.ioc create mode 100644 stepper/steppermotor_F401RE/steppermotor_F401RE.launch diff --git a/stepper/steppermotor_F401RE/.cproject b/stepper/steppermotor_F401RE/.cproject new file mode 100644 index 0000000..f948644 --- /dev/null +++ b/stepper/steppermotor_F401RE/.cproject @@ -0,0 +1,177 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/stepper/steppermotor_F401RE/.mxproject b/stepper/steppermotor_F401RE/.mxproject new file mode 100644 index 0000000..50916ff --- /dev/null +++ b/stepper/steppermotor_F401RE/.mxproject @@ -0,0 +1,25 @@ +[PreviousGenFiles] +AdvancedFolderStructure=true +HeaderFileListSize=3 +HeaderFiles#0=C:/Users/Gregor/STM32CubeIDE/workspace_1.0/steppermotor_F401RE/Core/Inc/stm32f4xx_it.h +HeaderFiles#1=C:/Users/Gregor/STM32CubeIDE/workspace_1.0/steppermotor_F401RE/Core/Inc/stm32f4xx_hal_conf.h +HeaderFiles#2=C:/Users/Gregor/STM32CubeIDE/workspace_1.0/steppermotor_F401RE/Core/Inc/main.h +HeaderFolderListSize=1 +HeaderPath#0=C:/Users/Gregor/STM32CubeIDE/workspace_1.0/steppermotor_F401RE/Core/Inc +HeaderFiles=; +SourceFileListSize=3 +SourceFiles#0=C:/Users/Gregor/STM32CubeIDE/workspace_1.0/steppermotor_F401RE/Core/Src/stm32f4xx_it.c +SourceFiles#1=C:/Users/Gregor/STM32CubeIDE/workspace_1.0/steppermotor_F401RE/Core/Src/stm32f4xx_hal_msp.c +SourceFiles#2=C:/Users/Gregor/STM32CubeIDE/workspace_1.0/steppermotor_F401RE/Core/Src/main.c +SourceFolderListSize=1 +SourcePath#0=C:/Users/Gregor/STM32CubeIDE/workspace_1.0/steppermotor_F401RE/Core/Src +SourceFiles=; + +[PreviousLibFiles] +LibFiles=Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_tim.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_tim_ex.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_uart.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_rcc.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_rcc_ex.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_flash.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_flash_ex.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_flash_ramfunc.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_gpio.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_gpio_ex.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_dma_ex.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_dma.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_pwr.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_pwr_ex.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_cortex.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal.h;Drivers/STM32F4xx_HAL_Driver/Inc/Legacy/stm32_hal_legacy.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_def.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_exti.h;Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim.c;Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim_ex.c;Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_uart.c;Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc.c;Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc_ex.c;Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash.c;Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ex.c;Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ramfunc.c;Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_gpio.c;Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma_ex.c;Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma.c;Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr.c;Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr_ex.c;Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_cortex.c;Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal.c;Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_exti.c;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_tim.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_tim_ex.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_uart.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_rcc.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_rcc_ex.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_flash.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_flash_ex.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_flash_ramfunc.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_gpio.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_gpio_ex.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_dma_ex.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_dma.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_pwr.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_pwr_ex.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_cortex.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal.h;Drivers/STM32F4xx_HAL_Driver/Inc/Legacy/stm32_hal_legacy.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_def.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_exti.h;Drivers/CMSIS/Device/ST/STM32F4xx/Include/stm32f401xe.h;Drivers/CMSIS/Device/ST/STM32F4xx/Include/stm32f4xx.h;Drivers/CMSIS/Device/ST/STM32F4xx/Include/system_stm32f4xx.h;Drivers/CMSIS/Device/ST/STM32F4xx/Source/Templates/system_stm32f4xx.c;Drivers/CMSIS/Include/cmsis_armcc.h;Drivers/CMSIS/Include/cmsis_armclang.h;Drivers/CMSIS/Include/cmsis_compiler.h;Drivers/CMSIS/Include/cmsis_gcc.h;Drivers/CMSIS/Include/cmsis_iccarm.h;Drivers/CMSIS/Include/cmsis_version.h;Drivers/CMSIS/Include/core_armv8mbl.h;Drivers/CMSIS/Include/core_armv8mml.h;Drivers/CMSIS/Include/core_cm0.h;Drivers/CMSIS/Include/core_cm0plus.h;Drivers/CMSIS/Include/core_cm1.h;Drivers/CMSIS/Include/core_cm23.h;Drivers/CMSIS/Include/core_cm3.h;Drivers/CMSIS/Include/core_cm33.h;Drivers/CMSIS/Include/core_cm4.h;Drivers/CMSIS/Include/core_cm7.h;Drivers/CMSIS/Include/core_sc000.h;Drivers/CMSIS/Include/core_sc300.h;Drivers/CMSIS/Include/mpu_armv7.h;Drivers/CMSIS/Include/mpu_armv8.h;Drivers/CMSIS/Include/tz_context.h; + +[PreviousUsedCubeIDEFiles] +SourceFiles=Core\Src\main.c;Core\Src\stm32f4xx_it.c;Core\Src\stm32f4xx_hal_msp.c;Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim.c;Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim_ex.c;Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_uart.c;Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc.c;Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc_ex.c;Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash.c;Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ex.c;Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ramfunc.c;Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_gpio.c;Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma_ex.c;Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma.c;Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr.c;Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr_ex.c;Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_cortex.c;Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal.c;Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_exti.c;Core\Src/system_stm32f4xx.c;Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim.c;Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim_ex.c;Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_uart.c;Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc.c;Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc_ex.c;Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash.c;Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ex.c;Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ramfunc.c;Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_gpio.c;Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma_ex.c;Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma.c;Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr.c;Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr_ex.c;Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_cortex.c;Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal.c;Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_exti.c;Core\Src/system_stm32f4xx.c;Drivers/CMSIS/Device/ST/STM32F4xx/Source/Templates/system_stm32f4xx.c;; +HeaderPath=Drivers\STM32F4xx_HAL_Driver\Inc;Drivers\STM32F4xx_HAL_Driver\Inc\Legacy;Drivers\CMSIS\Device\ST\STM32F4xx\Include;Drivers\CMSIS\Include;Core\Inc; +CDefines=USE_HAL_DRIVER;STM32F401xE;USE_HAL_DRIVER;USE_HAL_DRIVER; + diff --git a/stepper/steppermotor_F401RE/.project b/stepper/steppermotor_F401RE/.project new file mode 100644 index 0000000..b0a333d --- /dev/null +++ b/stepper/steppermotor_F401RE/.project @@ -0,0 +1,33 @@ + + + steppermotor_F401RE + + + + + + org.eclipse.cdt.managedbuilder.core.genmakebuilder + clean,full,incremental, + + + + + org.eclipse.cdt.managedbuilder.core.ScannerConfigBuilder + full,incremental, + + + + + + com.st.stm32cube.ide.mcu.MCUProjectNature + com.st.stm32cube.ide.mcu.MCUCubeProjectNature + org.eclipse.cdt.core.cnature + com.st.stm32cube.ide.mcu.MCUCubeIdeServicesRevAev2ProjectNature + com.st.stm32cube.ide.mcu.MCUAdvancedStructureProjectNature + com.st.stm32cube.ide.mcu.MCUEndUserDisabledTrustZoneProjectNature + com.st.stm32cube.ide.mcu.MCUSingleCpuProjectNature + com.st.stm32cube.ide.mcu.MCURootProjectNature + org.eclipse.cdt.managedbuilder.core.managedBuildNature + org.eclipse.cdt.managedbuilder.core.ScannerConfigNature + + diff --git a/stepper/steppermotor_F401RE/.settings/language.settings.xml b/stepper/steppermotor_F401RE/.settings/language.settings.xml new file mode 100644 index 0000000..dee8543 --- /dev/null +++ b/stepper/steppermotor_F401RE/.settings/language.settings.xml @@ -0,0 +1,27 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/stepper/steppermotor_F401RE/.settings/stm32cubeide.project.prefs b/stepper/steppermotor_F401RE/.settings/stm32cubeide.project.prefs new file mode 100644 index 0000000..6cc080e --- /dev/null +++ b/stepper/steppermotor_F401RE/.settings/stm32cubeide.project.prefs @@ -0,0 +1,4 @@ +635E684B79701B039C64EA45C3F84D30=06D6BDB73C214833FC1C613EA37D5A96 +8DF89ED150041C4CBC7CB9A9CAA90856=7E7998FE6928AC5B09C3B82F4A5F71B9 +DC22A860405A8BF2F2C095E5B6529F12=7E7998FE6928AC5B09C3B82F4A5F71B9 +eclipse.preferences.version=1 diff --git a/stepper/steppermotor_F401RE/Core/Inc/l6208.h b/stepper/steppermotor_F401RE/Core/Inc/l6208.h new file mode 100644 index 0000000..c602b03 --- /dev/null +++ b/stepper/steppermotor_F401RE/Core/Inc/l6208.h @@ -0,0 +1,383 @@ +/******************************************************//** + * @file l6208.h + * @author IPC Rennes + * @version V1.5.0 + * @date June 1st, 2018 + * @brief Header for l6208.c module + * @note (C) COPYRIGHT 2016 STMicroelectronics + ****************************************************************************** + * @attention + * + *

© COPYRIGHT(c) 2016 STMicroelectronics

+ * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. Neither the name of STMicroelectronics nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + ****************************************************************************** + */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef _L6208_H_INCLUDED +#define _L6208_H_INCLUDED + +#ifdef __cplusplus + extern "C" { +#endif + +/* Includes ------------------------------------------------------------------*/ +#include "l6208_target_config.h" +#include "motor.h" + +/** @addtogroup BSP + * @{ + */ + +/** @addtogroup L6208 + * @{ + */ + +/* Exported Constants --------------------------------------------------------*/ + +/** @addtogroup L6208_Exported_Constants + * @{ + */ +/// Current FW major version +#define L6208_FW_MAJOR_VERSION (uint8_t)(1) +/// Current FW minor version +#define L6208_FW_MINOR_VERSION (uint8_t)(4) +/// Current FW patch version +#define L6208_FW_PATCH_VERSION (uint8_t)(0) +/// Current FW version +#define L6208_FW_VERSION (uint32_t)((L6208_FW_MAJOR_VERSION<<16)|\ + (L6208_FW_MINOR_VERSION<<8)|\ + (L6208_FW_PATCH_VERSION)) + +/// Max position +#define L6208_MAX_POSITION (0x7FFFFFFF) + +/// Min position +#define L6208_MIN_POSITION (0x80000000) + +/// Position range +#define L6208_POSITION_RANGE ((uint32_t)(L6208_MAX_POSITION -\ + L6208_MIN_POSITION)) +/// micro step samples per period/4 +#define L6208_USTEPS_PER_QUARTER_PERIOD (16) + +/// minimum speed +#define L6208_MIN_SPEED (16) + +/// minimum acceleration and deceleration rate +#define L6208_MIN_ACC_DEC_RATE (24) + +/// Mask for HiZ bit in motorDecayMode_t enum +#define L6208_FAST_DECAY_MODE_MASK (0x1) + +/// L6208 error base number +#define L6208_ERROR_BASE (0x9000) +/** + * @} + */ + +/* Exported types ------------------------------------------------------------*/ + +/** @defgroup Error_Types Error Types + * @{ + */ +/// Errors +typedef enum { + L6208_ERROR_SET_HOME = L6208_ERROR_BASE, /// Error while setting home position + L6208_ERROR_SET_MAX_SPEED = L6208_ERROR_BASE + 1, /// Error while setting max speed + L6208_ERROR_SET_MIN_SPEED = L6208_ERROR_BASE + 2, /// Error while setting min speed + L6208_ERROR_SET_ACCELERATION = L6208_ERROR_BASE + 3, /// Error while setting acceleration + L6208_ERROR_SET_DECELERATION = L6208_ERROR_BASE + 4, /// Error while setting decelaration + L6208_ERROR_MCU_OSC_CONFIG = L6208_ERROR_BASE + 5, /// Error while configuring mcu oscillator + L6208_ERROR_MCU_CLOCK_CONFIG = L6208_ERROR_BASE + 6, /// Error while configuring mcu clock + L6208_ERROR_POSITION = L6208_ERROR_BASE + 7, /// Unexpected current position (wrong number of steps) + L6208_ERROR_SPEED = L6208_ERROR_BASE + 8, /// Unexpected current speed + L6208_ERROR_INIT = L6208_ERROR_BASE + 9, /// Unexpected number of devices + L6208_ERROR_SET_DIRECTION = L6208_ERROR_BASE + 10,/// Error while setting direction + L6208_ERROR_SET_STEP_MODE = L6208_ERROR_BASE + 11,/// Attempt to set an unsupported step mode + L6208_ERROR_SET_PWM = L6208_ERROR_BASE + 12,/// Error while setting a PWM parameter +}errorTypes_t; +/** + * @} + */ + +/** @defgroup Device_Parameters Device Parameters + * @{ + */ +/// Device Parameters Structure Type +typedef struct +{ + /// dwelling waiting time counter (tick) + volatile uint32_t dwellCounter; + /// motor position indicator (tick) + uint32_t ticks; + /// LSByte copy of the previous position (tick) + uint8_t lsbOldTicks; + /// LSByte copy of the previous position (tick) ( micro stepping ) + uint8_t lsbOldUSteppingTicks; + /// LSByte copy of the current position (tick) + uint8_t lsbTicks; + /// P1 = acceleration phase steps number (motor position control mode) + uint32_t positionTarget1; + /// P2 = constant speed steps number (motor position control mode) + uint32_t positionTarget2; + /// P3 = deceleration phase steps number (motor position control mode) + uint32_t positionTarget3; + /// P = total move distance in steps (motor position control mode) + uint32_t positionTarget; + /// absolute motor position in microsteps (motor position control mode) + volatile int32_t absolutePos; + /// mark position in microsteps (motor position control mode) + volatile int32_t markPos; + /// motor position in microsteps (motor position control mode) + volatile uint32_t step; + /// dwelling time after position got (ms) + volatile uint16_t moveDwellTime; + /// number of micro stepping waveform samples to be rescaled according to selected torque value + volatile uint8_t uStepsample2scale; + /// number of micro stepping waveform samples to be updated into the waveform scanning table + volatile uint8_t uStepsample2update; + /// microstepping waveform sample index + volatile uint8_t uStepSample; + /// system status flags + volatile uint32_t flags; + /// current stepper state machine index + volatile motorState_t motionState; + /// current step mode + volatile motorStepMode_t stepMode; + /// micro stepping waveform scanning sample index increment + uint8_t uStepInc; + /// frequency of the VREFA and VREFB PWM + uint32_t vrefPwmFreq; + /// current selected torque value + volatile uint8_t curTorqueScaler; + /// constant speed phase torque value (%) + volatile uint8_t runTorque; + /// acceleration phase torque value (%) + volatile uint8_t accelTorque; + /// deceleration phase torque value (%) + volatile uint8_t decelTorque; + /// holding phase torque value (%) + volatile uint8_t holdTorque; + /// acceleration (steps/s^2) + volatile uint16_t accelerationSps2; + /// deceleration (steps/s^2) + volatile uint16_t decelerationSps2; + /// acceleration (steps/tick^2) + volatile uint16_t accelerationSpt2; + /// deceleration (steps/tick^2) + volatile uint16_t decelerationSpt2; + /// maximum speed (steps/s) + volatile uint16_t maxSpeedSps; + /// minimum speed (steps/s) + volatile uint16_t minSpeedSps; + /// current speed (steps/s) + volatile uint16_t speedSps; + /// maximum speed (steps/tick) + volatile uint32_t maxSpeedSpt; + /// minimum speed (steps/tick) + volatile uint32_t minSpeedSpt; + /// current speed (steps/tick) + volatile uint32_t speedSpt; +}deviceParams_t; +/** + * @} + */ + +/// Motor driver initialization structure definition +typedef struct +{ + /// acceleration (steps/s^2) + uint16_t accelerationSps2; + /// acceleration phase torque value (%) + uint8_t accelTorque; + /// deceleration (steps/s^2) + uint16_t decelerationSps2; + /// deceleration phase torque value (%) + uint8_t decelTorque; + /// maximum speed (steps/s) + uint16_t maxSpeedSps; + /// constant speed phase torque value (%) + uint8_t runTorque; + /// holding phase torque value (%) + uint8_t holdTorque; + /// current step mode + motorStepMode_t stepMode; + /// current decay mode (SLOW_DECAY or FAST_DECAY) + motorDecayMode_t decayMode; + /// dwelling time after position got (ms) + uint16_t moveDwellTime; + /// automatic HiZ on stop + bool autoHiZstop; + /// frequency of the VREFA and VREFB PWM + uint32_t vrefPwmFreq; +} l6208_Init_t; + + + +/* Exported functions --------------------------------------------------------*/ + +/** @defgroup L6208_Exported_Functions L6208 Exported Functions + * @{ + */ +motorDrv_t* L6208_GetMotorHandle(void); //Return handle of the motor driver handle +void L6208_Init(void* pInit); //Start the L6208 library +uint16_t L6208_ReadId(void); //Read Id to get driver instance +void L6208_AttachErrorHandler(void (*callback)(uint16_t error)); //Attach a user callback to the error Handler +void L6208_AttachFlagInterrupt(void (*callback)(void)); //Attach a user callback to the flag Interrupt +uint8_t L6208_CheckStatusHw(void); //Check if L6208 has a fault by reading EN pin position +void L6208_Disable(uint8_t deviceId); //Disable the power bridge +void L6208_ErrorHandler(uint16_t error); //Error handler which calls the user callback +void L6208_Enable(uint8_t deviceId); //Enable the power bridge +void L6208_FlagInterruptHandler(void); //Handler of the flag interrupt which calls the user callback (if defined) +uint16_t L6208_GetAcceleration(uint8_t deviceId); //Return the acceleration in pps^2 +uint16_t L6208_GetCurrentSpeed(uint8_t deviceId); //Return the current speed in pps +motorDecayMode_t L6208_GetDecayMode(uint8_t deviceId); //Get the motor decay mode +uint16_t L6208_GetDeceleration(uint8_t deviceId); //Return the deceleration in pps^2 +motorDir_t L6208_GetDirection(uint8_t deviceId); //Get the motor current direction +uint32_t L6208_GetFwVersion(void); //Return the FW version +int32_t L6208_GetMark(uint8_t deviceId); //Get the mark position (32b signed) +uint16_t L6208_GetMaxSpeed(uint8_t deviceId); //Return the max speed in pps +uint16_t L6208_GetMinSpeed(uint8_t deviceId); //Return the min speed in pps +motorState_t L6208_GetMotionState(uint8_t deviceId); //Return the motion state +int32_t L6208_GetPosition(uint8_t deviceId); //Get the current position (32b signed) +motorStepMode_t L6208_GetStepMode(uint8_t deviceId); //Get the motor step mode +motorStopMode_t L6208_GetStopMode(uint8_t deviceId); //Get the selected mode to stop the motor +uint8_t L6208_GetTorque(uint8_t deviceId, motorTorqueMode_t torqueMode); //Get the torque value according to the torque mode +void L6208_GoHome(uint8_t deviceId); //Go to the home position +void L6208_GoMark(uint8_t deviceId); //Go to the Mark position +void L6208_GoTo(uint8_t deviceId, int32_t abs_pos); //Go to the specified position +void L6208_GoToDir(uint8_t deviceId, motorDir_t direction, int32_t abs_pos); //Go to the specified position using the specified direction +void L6208_HardHiZ(uint8_t deviceId); //Stop the motor by using the device deceleration and disables the power bridges +void L6208_HardStop(uint8_t deviceId); //Stop the motor and keeps holding torque +void L6208_Move(uint8_t deviceId, motorDir_t direction, uint32_t stepCount); //Move the motor by the specified number of steps in the specified direction +void L6208_ReleaseReset(uint8_t deviceId); //Release the reset pin +void L6208_Reset(uint8_t deviceId); //Set the reset pin +void L6208_ResetDevice(void); //Reset L6208 device +void L6208_Run(uint8_t deviceId, motorDir_t direction); //Run the motor in the specified direction +bool L6208_SetAcceleration(uint8_t deviceId, uint16_t newAcc); //Set the acceleration in pps^2 +void L6208_SetDecayMode(uint8_t deviceId, motorDecayMode_t decayMode); //Set the motor decay mode +bool L6208_SetDeceleration(uint8_t deviceId, uint16_t newDec); //Set the deceleration in pps^2 +void L6208_SetDirection(uint8_t deviceId, motorDir_t direction); //Set the motor direction +void L6208_SetHome(uint8_t deviceId, int32_t homePos); //Set the home position +void L6208_SetMark(uint8_t deviceId, int32_t markPos); //Set the mark position +bool L6208_SetMaxSpeed(uint8_t deviceId, uint16_t volatile newSpeed); //Set the max speed value in pps +bool L6208_SetMinSpeed(uint8_t deviceId, uint16_t volatile newSpeed); //Set the max speed value in pps +bool L6208_SetNbDevices(uint8_t nbDevices); //Set the number of devices +bool L6208_SetStepMode(uint8_t deviceId, motorStepMode_t stepMode); //Set the motor step mode +void L6208_SetStopMode(uint8_t deviceId, motorStopMode_t stopMode); //Select the mode to stop the motor +void L6208_SetTorque(uint8_t deviceId, motorTorqueMode_t torqueMode, uint8_t torqueValue); //Set the torque value according to the torque mode +bool L6208_SoftStop(uint8_t deviceId); //Progressively stop the motor by using the device deceleration and set deceleration torque +void L6208_TickHandler(uint8_t deviceId); //Handle the device state machine at each tick timer pulse end +uint32_t L6208_VrefPwmGetFreq(uint8_t deviceId); //Get the frequency of VREFA and VREFB PWM +void L6208_VrefPwmSetFreq(uint8_t deviceId, uint32_t newFreq); //Set the frequency of the VREFA and VREFB PWM +void L6208_WaitWhileActive(uint8_t deviceId); //Wait for the device state becomes Inactive + + + + +/** + * @} + */ + +/** @defgroup MotorControl_Board_Linked_Functions MotorControl Board Linked Functions + * @{ + */ +///Delay of the requested number of milliseconds +extern void L6208_Board_Delay(uint32_t delay); +///Enable Irq +extern void L6208_Board_EnableIrq(void); +///Disable Irq +extern void L6208_Board_DisableIrq(void); +///Initialise GPIOs used for L6208 +extern void L6208_Board_GpioInit(void); +//Initialize the VREFA or VREFB PWM +extern bool L6208_Board_VrefPwmInit(uint8_t bridgeId, uint32_t pwmFreq); +///Set duty cycle of VREFA or VREFB PWM +extern bool L6208_Board_VrefPwmSetDutyCycle(uint8_t bridgeId,\ + uint16_t value,\ + bool valueIsPwmDutyCycle); +///Start the timer for the VREFA or VREFB PWM +extern bool L6208_Board_VrefPwmStart(uint8_t bridgeId,\ + uint32_t pwmFreq); +///Stop the timer for the VREFA or VREFB PWM +extern bool L6208_Board_VrefPwmStop(uint8_t bridgeId); +///Get the period of VREFA and VREFB PWM +extern uint32_t L6208_Board_VrefPwmGetPeriod(void); +///Check that the new VREFA and VREFB PWM frequency is nor too low nor too high +bool L6208_Board_VrefPwmFreqCheck(uint32_t newFreq); +///Initialize the tick +extern void L6208_Board_TickInit(void); +///Start the timer for the tick by using the set tick frequency +extern void L6208_Board_TickStart(void); +///Stop the timer for the tick +extern void L6208_Board_TickStop(void); +///Get the tick frequency in Hz +extern uint32_t L6208_Board_TickGetFreq(void); +///Release the reset pin +extern void L6208_Board_ReleaseReset(void); +///Set the reset pin +extern void L6208_Board_Reset(void); +///Set the control pin +extern void L6208_Board_CONTROL_PIN_Set(void); +///Reset the control pin +extern void L6208_Board_CONTROL_PIN_Reset(void); +///Set the clock pin +extern void L6208_Board_CLOCK_PIN_Set(void); +///Reset the clock pin +extern void L6208_Board_CLOCK_PIN_Reset(void); +///Set the half full pin +extern void L6208_Board_HALF_FULL_PIN_Set(void); +///Reset the half full pin +extern void L6208_Board_HALF_FULL_PIN_Reset(void); +///Set the dir pin +extern void L6208_Board_DIR_PIN_Set(void); +///Reset the dir pin +extern void L6208_Board_DIR_PIN_Reset(void); +///Returns the EN pin state +extern uint32_t L6208_Board_FLAG_PIN_GetState(void); +///Enable the power bridges (leave the output bridges HiZ) +extern void L6208_Board_Enable(void); +///Disable the power bridges (leave the output bridges HiZ) +extern void L6208_Board_Disable(void); +/** + * @} + */ + + /** + * @} + */ + +/** + * @} + */ + +#ifdef __cplusplus + } +#endif + +#endif /* __L6208_H */ + +/******************* (C) COPYRIGHT 2016 STMicroelectronics *****END OF FILE****/ diff --git a/stepper/steppermotor_F401RE/Core/Inc/l6208_target_config.h b/stepper/steppermotor_F401RE/Core/Inc/l6208_target_config.h new file mode 100644 index 0000000..e2f9c17 --- /dev/null +++ b/stepper/steppermotor_F401RE/Core/Inc/l6208_target_config.h @@ -0,0 +1,120 @@ +/******************************************************//** + * @file l6208_target_config.h + * @author IPC Rennes + * @version V1.5.0 + * @date June 1st, 2018 + * @brief Predefines values for the L6208 parameters + * @note (C) COPYRIGHT 2016 STMicroelectronics + ****************************************************************************** + * @attention + * + *

© COPYRIGHT(c) 2016 STMicroelectronics

+ * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. Neither the name of STMicroelectronics nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + ****************************************************************************** + */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __L6208_TARGET_CONFIG_H +#define __L6208_TARGET_CONFIG_H + +#ifdef __cplusplus + extern "C" { +#endif + +/** @addtogroup BSP + * @{ + */ + +/** @addtogroup L6208 + * @{ + */ + +/** @addtogroup L6208_Exported_Constants + * @{ + */ + +/** @defgroup Predefined_L6208_Parameters_Values Predefined L6208 Parameters Values + * @{ + */ + +/// Acceleration rate in step/s^2 or (1/16)th step/s^2 for microstep modes +#define L6208_CONF_PARAM_ACC_RATE (1000) + +/// Acceleration current torque in % (from 0 to 100) +#define L6208_CONF_PARAM_ACC_CURRENT (10) + +/// Deceleration rate in step/s^2 or (1/16)th step/s^2 for microstep modes +#define L6208_CONF_PARAM_DEC_RATE (1000) + +/// Deceleration current torque in % (from 0 to 100) +#define L6208_CONF_PARAM_DEC_CURRENT (10) + +/// Running speed in step/s or (1/16)th step/s for microstep modes +#define L6208_CONF_PARAM_RUNNING_SPEED (1000) + +/// Running current torque in % (from 0 to 100) +#define L6208_CONF_PARAM_RUNNING_CURRENT (10) + +/// Holding current torque in % (from 0 to 100) +#define L6208_CONF_PARAM_HOLDING_CURRENT (10) + +/// Step mode via enum motorStepMode_t +#define L6208_CONF_PARAM_STEP_MODE (STEP_MODE_1_16) + +/// Decay mode via enum motorDecayMode_t +#define L6208_CONF_PARAM_DECAY_MODE (FAST_DECAY) + +/// Dwelling time in ms +#define L6208_CONF_PARAM_DWELL_TIME (0) + +/// Automatic HIZ STOP +#define L6208_CONF_PARAM_AUTO_HIZ_STOP (FALSE) + +/// VREFA and VREFB PWM frequency (Hz) +#define L6208_CONF_VREF_PWM_FREQUENCY (100000) + +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ + +#ifdef __cplusplus + } +#endif + +#endif /* __L6208_TARGET_CONFIG_H */ + +/******************* (C) COPYRIGHT 2016 STMicroelectronics *****END OF FILE****/ diff --git a/stepper/steppermotor_F401RE/Core/Inc/main.h b/stepper/steppermotor_F401RE/Core/Inc/main.h new file mode 100644 index 0000000..3d72c33 --- /dev/null +++ b/stepper/steppermotor_F401RE/Core/Inc/main.h @@ -0,0 +1,66 @@ +/** + ****************************************************************************** + * @file Multi/Examples/MotionControl/IHM05A1_ExampleFor1Motor/Inc/main.h + * @author IPC Rennes + * @version V1.5.0 + * @date June 1st, 2018 + * @brief Header for main.c module + ****************************************************************************** + * @attention + * + *

© COPYRIGHT(c) 2016 STMicroelectronics

+ * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. Neither the name of STMicroelectronics nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + ****************************************************************************** + */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __MAIN_H +#define __MAIN_H + +/* Includes ------------------------------------------------------------------*/ +#include "x_nucleo_ihmxx.h" +#include "l6208.h" +#include "x_nucleo_ihm05a1_stm32f4xx.h" +#ifdef USE_STM32F4XX_NUCLEO +#include "x_nucleo_ihm05a1_stm32f4xx.h" +#endif +#ifdef USE_STM32F3XX_NUCLEO +#include "x_nucleo_ihm05a1_stm32f3xx.h" +#endif +#ifdef USE_STM32F0XX_NUCLEO +#include "x_nucleo_ihm05a1_stm32f0xx.h" +#endif +#ifdef USE_STM32L0XX_NUCLEO +#include "x_nucleo_ihm05a1_stm32l0xx.h" +#endif +/* Exported types ------------------------------------------------------------*/ +/* Exported constants --------------------------------------------------------*/ +/* Exported functions ------------------------------------------------------- */ +void SystemClock_Config(void); +void MyErrorHandler(uint16_t error); + +#endif /* __MAIN_H */ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/stepper/steppermotor_F401RE/Core/Inc/motor.h b/stepper/steppermotor_F401RE/Core/Inc/motor.h new file mode 100644 index 0000000..bf37d4c --- /dev/null +++ b/stepper/steppermotor_F401RE/Core/Inc/motor.h @@ -0,0 +1,441 @@ +/** + ****************************************************************************** + * @file motor.h + * @author IPC Rennes + * @version V1.7.0 + * @date March 16th, 2018 + * @brief This file contains all the functions prototypes for motor drivers. + ****************************************************************************** + * @attention + * + *

© COPYRIGHT(c) 2016 STMicroelectronics

+ * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. Neither the name of STMicroelectronics nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + ****************************************************************************** + */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __MOTOR_H +#define __MOTOR_H + +#ifdef __cplusplus + extern "C" { +#endif + +/* Includes ------------------------------------------------------------------*/ +#include + +/** @addtogroup BSP + * @{ + */ + +/** @addtogroup Components + * @{ + */ + +/** @defgroup Motor Motor + * @{ + */ + +/** @defgroup Motor_Exported_Constants Motor Exported Constants + * @{ + */ + +/// boolean for false condition +#ifndef FALSE +#define FALSE (0) +#endif +/// boolean for true condition +#ifndef TRUE +#define TRUE (1) +#endif + + /** + * @} + */ + +/** @defgroup Motor_Exported_Types Motor Exported Types + * @{ + */ + +/** @defgroup Motor_Boolean_Type Motor Boolean Type + * @{ + */ +///bool Type +typedef uint8_t bool; +/** + * @} + */ + +/** @defgroup Device_Direction_Options Device Direction Options + * @{ + */ +/// Direction options +typedef enum { + BACKWARD = 0, + FORWARD = 1, + UNKNOW_DIR = ((uint8_t)0xFF) +} motorDir_t; +/** + * @} + */ + +/** @defgroup Device_Action_Options Device Action Options + * @{ + */ +/// Action options +typedef enum { + ACTION_RESET = ((uint8_t)0x00), + ACTION_COPY = ((uint8_t)0x08) +} motorAction_t; +/** + * @} + */ + +/** @defgroup Device_States Device States + * @{ + */ +/// Device states +typedef enum { + ACCELERATING = 0, + DECELERATINGTOSTOP = 1, + DECELERATING = 2, + STEADY = 3, + INDEX_ACCEL = 4, + INDEX_RUN = 5, + INDEX_DECEL = 6, + INDEX_DWELL = 7, + INACTIVE = 8, + STANDBY = 9, + STANDBYTOINACTIVE = 10 +} motorState_t; +/** + * @} + */ + +/** @defgroup Device_Step_mode Device Step mode + * @{ + */ + /// Stepping options +typedef enum { + STEP_MODE_FULL = ((uint8_t)0x00), + STEP_MODE_HALF = ((uint8_t)0x01), + STEP_MODE_1_4 = ((uint8_t)0x02), + STEP_MODE_1_8 = ((uint8_t)0x03), + STEP_MODE_1_16 = ((uint8_t)0x04), + STEP_MODE_1_32 = ((uint8_t)0x05), + STEP_MODE_1_64 = ((uint8_t)0x06), + STEP_MODE_1_128 = ((uint8_t)0x07), + STEP_MODE_1_256 = ((uint8_t)0x08), + STEP_MODE_UNKNOW = ((uint8_t)0xFE), + STEP_MODE_WAVE = ((uint8_t)0xFF) +} motorStepMode_t; + +/** + * @} + */ + +/** @defgroup Decay_mode Decay mode + * @{ + */ +/// Decay Mode +typedef enum { + SLOW_DECAY = 0, + FAST_DECAY = 1, + UNKNOW_DECAY = ((uint8_t)0xFF) +} motorDecayMode_t; +/** + * @} + */ + +/** @defgroup Stop_mode Stop mode + * @{ + */ +/// Stop mode +typedef enum +{ + HOLD_MODE = 0, + HIZ_MODE = 1, + STANDBY_MODE = 2, + UNKNOW_STOP_MODE = ((uint8_t)0xFF) +} motorStopMode_t; +/** + * @} + */ + +/** @defgroup Torque_mode Torque mode + * @{ + */ +/// Torque mode +typedef enum +{ + ACC_TORQUE = 0, + DEC_TORQUE = 1, + RUN_TORQUE = 2, + HOLD_TORQUE = 3, + CURRENT_TORQUE = 4, + UNKNOW_TORQUE = ((uint8_t)0xFF) +} motorTorqueMode_t; +/** + * @} + */ + +/** @defgroup Dual_Full_Bridge_Configuration Dual Full Bridge Configuration + * @{ + */ +///Dual full bridge configurations for brush DC motors +typedef enum { + PARALLELING_NONE___1_BIDIR_MOTOR_BRIDGE_A__1_BIDIR_MOTOR_BRIDGE_B = 0, + PARALLELING_NONE___1_BIDIR_MOTOR_BRIDGE_A__2_UNDIR_MOTOR_BRIDGE_B = 1, + PARALLELING_NONE___2_UNDIR_MOTOR_BRIDGE_A__1_BIDIR_MOTOR_BRIDGE_B = 2, + PARALLELING_NONE___2_UNDIR_MOTOR_BRIDGE_A__2_UNDIR_MOTOR_BRIDGE_B = 3, + PARALLELING_IN1A_IN2A__1_UNDIR_MOTOR_BRIDGE_A__1_BIDIR_MOTOR_BRIDGE_B = 4, + PARALLELING_IN1A_IN2A__1_UNDIR_MOTOR_BRIDGE_A__2_UNDIR_MOTOR_BRIDGE_B = 5, + PARALLELING_IN1B_IN2B__1_BIDIR_MOTOR_BRIDGE_A__1_UNDIR_MOTOR_BRIDGE_B = 6, + PARALLELING_IN1B_IN2B__2_UNDIR_MOTOR_BRIDGE_A__1_UNDIR_MOTOR_BRIDGE_B = 7, + PARALLELING_IN1A_IN2A__IN1B_IN2B__1_UNDIR_MOTOR_BRIDGE_A__1_UNDIR_MOTOR_BRIDGE_B = 8, + PARALLELING_IN1A_IN2A__IN1B_IN2B__1_BIDIR_MOTOR = 9, + PARALLELING_IN1A_IN1B__IN2A_IN2B__1_UNDIR_MOTOR_BRIDGE_1A__1_UNDIR_MOTOR_BRIDGE_2A = 10, + PARALLELING_IN1A_IN1B__IN2A_IN2B__1_BIDIR_MOTOR = 11, + PARALLELING_ALL_WITH_IN1A___1_UNDIR_MOTOR = 12, + PARALLELING_END_ENUM = 13 +} dualFullBridgeConfig_t; +/** + * @} + */ + +/** @defgroup Motor_Driver_Structure Motor Driver Structure + * @{ + */ +/// Motor driver structure definition +typedef struct +{ + /// Function pointer to Init + void (*Init)(void*); + /// Function pointer to ReadID + uint16_t (*ReadID)(void); + /// Function pointer to AttachErrorHandler + void(*AttachErrorHandler)(void (*callback)(uint16_t)); + /// Function pointer to AttachFlagInterrupt + void (*AttachFlagInterrupt)(void (*callback)(void)); + /// Function pointer to AttachBusyInterrupt + void (*AttachBusyInterrupt)(void (*callback)(void)); + /// Function pointer to FlagInterruptHandler + void (*FlagInterruptHandler)(void); + /// Function pointer to GetAcceleration + uint16_t (*GetAcceleration)(uint8_t); + /// Function pointer to GetCurrentSpeed + uint16_t (*GetCurrentSpeed)(uint8_t); + /// Function pointer to GetDeceleration + uint16_t (*GetDeceleration)(uint8_t); + /// Function pointer to GetDeviceState + motorState_t(*GetDeviceState)(uint8_t); + /// Function pointer to GetFwVersion + uint32_t (*GetFwVersion)(void); + /// Function pointer to GetMark + int32_t (*GetMark)(uint8_t); + /// Function pointer to GetMaxSpeed + uint16_t (*GetMaxSpeed)(uint8_t); + /// Function pointer to GetMinSpeed + uint16_t (*GetMinSpeed)(uint8_t); + /// Function pointer to GetPosition + int32_t (*GetPosition)(uint8_t); + /// Function pointer to GoHome + void (*GoHome)(uint8_t); + /// Function pointer to GoMark + void (*GoMark)(uint8_t); + /// Function pointer to GoTo + void (*GoTo)(uint8_t, int32_t); + /// Function pointer to HardStop + void (*HardStop)(uint8_t); + /// Function pointer to Move + void (*Move)(uint8_t, motorDir_t, uint32_t ); + /// Function pointer to ResetAllDevices + void (*ResetAllDevices)(void); + /// Function pointer to Run + void (*Run)(uint8_t, motorDir_t); + /// Function pointer to SetAcceleration + bool(*SetAcceleration)(uint8_t ,uint16_t ); + /// Function pointer to SetDeceleration + bool(*SetDeceleration)(uint8_t , uint16_t ); + /// Function pointer to SetHome + void (*SetHome)(uint8_t, int32_t); + /// Function pointer to SetMark + void (*SetMark)(uint8_t, int32_t); + /// Function pointer to SetMaxSpeed + bool (*SetMaxSpeed)(uint8_t, uint16_t ); + /// Function pointer to SetMinSpeed + bool (*SetMinSpeed)(uint8_t, uint16_t ); + /// Function pointer to SoftStop + bool (*SoftStop)(uint8_t); + /// Function pointer to StepClockHandler + void (*StepClockHandler)(uint8_t deviceId); + /// Function pointer to WaitWhileActive + void (*WaitWhileActive)(uint8_t); + /// Function pointer to CmdDisable + void (*CmdDisable)(uint8_t); + /// Function pointer to CmdEnable + void (*CmdEnable)(uint8_t); + /// Function pointer to CmdGetParam + uint32_t (*CmdGetParam)(uint8_t, uint32_t); + /// Function pointer to CmdGetStatus + uint16_t (*CmdGetStatus)(uint8_t); + /// Function pointer to CmdNop + void (*CmdNop)(uint8_t); + /// Function pointer to CmdSetParam + void (*CmdSetParam)(uint8_t, uint32_t, uint32_t); + /// Function pointer to ReadStatusRegister + uint16_t (*ReadStatusRegister)(uint8_t); + /// Function pointer to ReleaseReset + void (*ReleaseReset)(uint8_t); + /// Function pointer to Reset + void (*Reset)(uint8_t); + /// Function pointer to SelectStepMode + bool (*SelectStepMode)(uint8_t deviceId, motorStepMode_t); + /// Function pointer to SetDirection + void (*SetDirection)(uint8_t, motorDir_t); + /// Function pointer to CmdGoToDir + void (*CmdGoToDir)(uint8_t, motorDir_t, int32_t); + /// Function pointer to CheckBusyHw + uint8_t (*CheckBusyHw)(void); + /// Function pointer to CheckStatusHw + uint8_t (*CheckStatusHw)(void); + /// Function pointer to CmdGoUntil + void (*CmdGoUntil)(uint8_t, motorAction_t, motorDir_t, uint32_t); + /// Function pointer to CmdHardHiZ + void (*CmdHardHiZ)(uint8_t); + /// Function pointer to CmdReleaseSw + void (*CmdReleaseSw)(uint8_t, motorAction_t, motorDir_t); + /// Function pointer to CmdResetDevice + void (*CmdResetDevice)(uint8_t); + /// Function pointer to CmdResetPos + void (*CmdResetPos)(uint8_t); + /// Function pointer to CmdRun + void (*CmdRun)(uint8_t, motorDir_t, uint32_t); + /// Function pointer to CmdSoftHiZ + void (*CmdSoftHiZ)(uint8_t); + /// Function pointer to CmdStepClock + void (*CmdStepClock)(uint8_t, motorDir_t); + /// Function pointer to FetchAndClearAllStatus + void (*FetchAndClearAllStatus)(void); + /// Function pointer to GetFetchedStatus + uint16_t (*GetFetchedStatus)(uint8_t); + /// Function pointer to GetNbDevices + uint8_t (*GetNbDevices)(void); + /// Function pointer to IsDeviceBusy + bool (*IsDeviceBusy)(uint8_t); + /// Function pointer to SendQueuedCommands + void (*SendQueuedCommands)(void); + /// Function pointer to QueueCommands + void (*QueueCommands)(uint8_t, uint8_t, int32_t); + /// Function pointer to WaitForAllDevicesNotBusy + void (*WaitForAllDevicesNotBusy)(void); + /// Function pointer to ErrorHandler + void (*ErrorHandler)(uint16_t); + /// Function pointer to BusyInterruptHandler + void (*BusyInterruptHandler)(void); + /// Function pointer to CmdSoftStop + void (*CmdSoftStop)(uint8_t); + /// Function pointer to StartStepClock + void (*StartStepClock)(uint16_t); + /// Function pointer to StopStepClock + void (*StopStepClock)(void); + /// Function pointer to SetDualFullBridgeConfig + void (*SetDualFullBridgeConfig)(uint8_t); + /// Function pointer to GetBridgeInputPwmFreq + uint32_t (*GetBridgeInputPwmFreq)(uint8_t); + /// Function pointer to SetBridgeInputPwmFreq + void (*SetBridgeInputPwmFreq)(uint8_t, uint32_t); + /// Function pointer to SetStopMode + void (*SetStopMode)(uint8_t, motorStopMode_t); + /// Function pointer to GetStopMode + motorStopMode_t (*GetStopMode)(uint8_t); + /// Function pointer to SetDecayMode + void (*SetDecayMode)(uint8_t, motorDecayMode_t); + /// Function pointer to GetDecayMode + motorDecayMode_t (*GetDecayMode)(uint8_t); + /// Function pointer to GetStepMode + motorStepMode_t (*GetStepMode)(uint8_t); + /// Function pointer to GetDirection + motorDir_t (*GetDirection)(uint8_t); + /// Function pointer to ExitDeviceFromReset + void (*ExitDeviceFromReset)(uint8_t); + /// Function pointer to SetTorque + void (*SetTorque)(uint8_t, motorTorqueMode_t, uint8_t); + /// Function pointer to GetTorque + uint8_t (*GetTorque)(uint8_t, motorTorqueMode_t); + /// Function pointer to SetVRefFreq + void (*SetRefFreq)(uint8_t, uint32_t); + /// Function pointer to GetVRefFreq + uint32_t (*GetRefFreq)(uint8_t); + /// Function pointer to SetVRefDc + void (*SetRefDc)(uint8_t, uint8_t); + /// Function pointer to GetVRefDc + uint8_t (*GetRefDc)(uint8_t); + /// Function pointer to SetNbDevices + bool (*SetNbDevices)(uint8_t); + /// Function pointer to SetAnalogValue + bool (*SetAnalogValue)(uint8_t, uint32_t, float); + /// Function pointer to GetAnalogValue + float (*GetAnalogValue)(uint8_t, uint32_t); + /// Function pointer to SetTorqueBoostEnable + void (*SetTorqueBoostEnable) (uint8_t, bool); + /// Function pointer to GetTorqueBoostEnable + bool (*GetTorqueBoostEnable) (uint8_t); + /// Function pointer to SetTorqueBoostThreshold + void (*SetTorqueBoostThreshold) (uint8_t, uint16_t); + /// Function pointer to GetTorqueBoostThreshold + uint16_t (*GetTorqueBoostThreshold) (uint8_t); + /// Function pointer to GetDualFullBridgeConfig + uint8_t (*GetDualFullBridgeConfig) (void); +}motorDrv_t; + +/** + +* @} + */ + +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ + +#ifdef __cplusplus +} +#endif + +#endif /* __MOTOR_H */ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/stepper/steppermotor_F401RE/Core/Inc/stm32f4xx_hal_conf.h b/stepper/steppermotor_F401RE/Core/Inc/stm32f4xx_hal_conf.h new file mode 100644 index 0000000..83e385c --- /dev/null +++ b/stepper/steppermotor_F401RE/Core/Inc/stm32f4xx_hal_conf.h @@ -0,0 +1,418 @@ +/** + ****************************************************************************** + * @file Multi/Examples/MotionControl/IHM05A1_ExampleFor1Motor/Inc/stm32f4xx_hal_conf.h + * @author IPC Rennes + * @version V1.5.0 + * @date June 1st, 2018 + * @brief HAL configuration file + ****************************************************************************** + * @attention + * + *

© COPYRIGHT(c) 2016 STMicroelectronics

+ * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. Neither the name of STMicroelectronics nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + ****************************************************************************** + */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __STM32F4xx_HAL_CONF_H +#define __STM32F4xx_HAL_CONF_H + +#ifdef __cplusplus + extern "C" { +#endif + +/* Exported types ------------------------------------------------------------*/ +/* Exported constants --------------------------------------------------------*/ + +/* ########################## Module Selection ############################## */ +/** + * @brief This is the list of modules to be used in the HAL driver + */ +#define HAL_MODULE_ENABLED +#define HAL_ADC_MODULE_ENABLED +/* #define HAL_CAN_MODULE_ENABLED */ +/* #define HAL_CRC_MODULE_ENABLED */ +/* #define HAL_CEC_MODULE_ENABLED */ +/* #define HAL_CRYP_MODULE_ENABLED */ +/* #define HAL_DAC_MODULE_ENABLED */ +#define HAL_DMA_MODULE_ENABLED +/* #define HAL_DMA2D_MODULE_ENABLED */ +/* #define HAL_ETH_MODULE_ENABLED */ +#define HAL_FLASH_MODULE_ENABLED +/* #define HAL_NAND_MODULE_ENABLED */ +/* #define HAL_NOR_MODULE_ENABLED */ +/* #define HAL_PCCARD_MODULE_ENABLED */ +/* #define HAL_SRAM_MODULE_ENABLED */ +/* #define HAL_SDRAM_MODULE_ENABLED */ +/* #define HAL_HASH_MODULE_ENABLED */ +#define HAL_GPIO_MODULE_ENABLED +/* #define HAL_I2C_MODULE_ENABLED */ +/* #define HAL_I2S_MODULE_ENABLED */ +/* #define HAL_IWDG_MODULE_ENABLED */ +/* #define HAL_LTDC_MODULE_ENABLED */ +#define HAL_PWR_MODULE_ENABLED +#define HAL_RCC_MODULE_ENABLED +/* #define HAL_RNG_MODULE_ENABLED */ +/* #define HAL_RTC_MODULE_ENABLED */ +/* #define HAL_SAI_MODULE_ENABLED */ +/* #define HAL_SD_MODULE_ENABLED */ +#define HAL_SPI_MODULE_ENABLED +#define HAL_TIM_MODULE_ENABLED +/* #define HAL_UART_MODULE_ENABLED */ +/* #define HAL_USART_MODULE_ENABLED */ +/* #define HAL_IRDA_MODULE_ENABLED */ +/* #define HAL_SMARTCARD_MODULE_ENABLED*/ +/* #define HAL_WWDG_MODULE_ENABLED */ +#define HAL_CORTEX_MODULE_ENABLED +/* #define HAL_PCD_MODULE_ENABLED */ +/* #define HAL_HCD_MODULE_ENABLED */ + + +/* ########################## HSE/HSI Values adaptation ##################### */ +/** + * @brief Adjust the value of External High Speed oscillator (HSE) used in your application. + * This value is used by the RCC HAL module to compute the system frequency + * (when HSE is used as system clock source, directly or through the PLL). + */ +#if !defined (HSE_VALUE) + #define HSE_VALUE ((uint32_t)8000000) /*!< Value of the External oscillator in Hz */ +#endif /* HSE_VALUE */ + +#if !defined (HSE_STARTUP_TIMEOUT) + #define HSE_STARTUP_TIMEOUT ((uint32_t)100) /*!< Time out for HSE start up, in ms */ +#endif /* HSE_STARTUP_TIMEOUT */ + +/** + * @brief Internal High Speed oscillator (HSI) value. + * This value is used by the RCC HAL module to compute the system frequency + * (when HSI is used as system clock source, directly or through the PLL). + */ +#if !defined (HSI_VALUE) + #define HSI_VALUE ((uint32_t)16000000) /*!< Value of the Internal oscillator in Hz*/ +#endif /* HSI_VALUE */ + +/** + * @brief Internal Low Speed oscillator (LSI) value. + */ +#if !defined (LSI_VALUE) + #define LSI_VALUE ((uint32_t)32000) +#endif /* LSI_VALUE */ /*!< Value of the Internal Low Speed oscillator in Hz + The real value may vary depending on the variations + in voltage and temperature. */ +/** + * @brief External Low Speed oscillator (LSE) value. + */ +#if !defined (LSE_VALUE) + #define LSE_VALUE ((uint32_t)32768) /*!< Value of the External Low Speed oscillator in Hz */ +#endif /* LSE_VALUE */ + +#if !defined (LSE_STARTUP_TIMEOUT) + #define LSE_STARTUP_TIMEOUT ((uint32_t)5000) /*!< Time out for LSE start up, in ms */ +#endif /* LSE_STARTUP_TIMEOUT */ + +/** + * @brief External clock source for I2S peripheral + * This value is used by the I2S HAL module to compute the I2S clock source + * frequency, this source is inserted directly through I2S_CKIN pad. + */ +#if !defined (EXTERNAL_CLOCK_VALUE) + #define EXTERNAL_CLOCK_VALUE ((uint32_t)12288000) /*!< Value of the Internal oscillator in Hz*/ +#endif /* EXTERNAL_CLOCK_VALUE */ + +/* Tip: To avoid modifying this file each time you need to use different HSE, + === you can define the HSE value in your toolchain compiler preprocessor. */ + +/* ########################### System Configuration ######################### */ +/** + * @brief This is the HAL system configuration section + */ +#define VDD_VALUE ((uint32_t)3300) /*!< Value of VDD in mv */ +#define TICK_INT_PRIORITY ((uint32_t)0x0F) /*!< tick interrupt priority */ +#define USE_RTOS 0 +#define PREFETCH_ENABLE 1 +#define INSTRUCTION_CACHE_ENABLE 1 +#define DATA_CACHE_ENABLE 1 + +/* ########################## Assert Selection ############################## */ +/** + * @brief Uncomment the line below to expanse the "assert_param" macro in the + * HAL drivers code + */ +/* #define USE_FULL_ASSERT 1 */ + +/* ################## Ethernet peripheral configuration ##################### */ + +/* Section 1 : Ethernet peripheral configuration */ + +/* MAC ADDRESS: MAC_ADDR0:MAC_ADDR1:MAC_ADDR2:MAC_ADDR3:MAC_ADDR4:MAC_ADDR5 */ +#define MAC_ADDR0 2 +#define MAC_ADDR1 0 +#define MAC_ADDR2 0 +#define MAC_ADDR3 0 +#define MAC_ADDR4 0 +#define MAC_ADDR5 0 + +/* Definition of the Ethernet driver buffers size and count */ +#define ETH_RX_BUF_SIZE ETH_MAX_PACKET_SIZE /* buffer size for receive */ +#define ETH_TX_BUF_SIZE ETH_MAX_PACKET_SIZE /* buffer size for transmit */ +#define ETH_RXBUFNB ((uint32_t)4) /* 4 Rx buffers of size ETH_RX_BUF_SIZE */ +#define ETH_TXBUFNB ((uint32_t)4) /* 4 Tx buffers of size ETH_TX_BUF_SIZE */ + +/* Section 2: PHY configuration section */ + +/* DP83848 PHY Address*/ +#define DP83848_PHY_ADDRESS 0x01 +/* PHY Reset delay these values are based on a 1 ms Systick interrupt*/ +#define PHY_RESET_DELAY ((uint32_t)0x000000FF) +/* PHY Configuration delay */ +#define PHY_CONFIG_DELAY ((uint32_t)0x00000FFF) + +#define PHY_READ_TO ((uint32_t)0x0000FFFF) +#define PHY_WRITE_TO ((uint32_t)0x0000FFFF) + +/* Section 3: Common PHY Registers */ + +#define PHY_BCR ((uint16_t)0x00) /*!< Transceiver Basic Control Register */ +#define PHY_BSR ((uint16_t)0x01) /*!< Transceiver Basic Status Register */ + +#define PHY_RESET ((uint16_t)0x8000) /*!< PHY Reset */ +#define PHY_LOOPBACK ((uint16_t)0x4000) /*!< Select loop-back mode */ +#define PHY_FULLDUPLEX_100M ((uint16_t)0x2100) /*!< Set the full-duplex mode at 100 Mb/s */ +#define PHY_HALFDUPLEX_100M ((uint16_t)0x2000) /*!< Set the half-duplex mode at 100 Mb/s */ +#define PHY_FULLDUPLEX_10M ((uint16_t)0x0100) /*!< Set the full-duplex mode at 10 Mb/s */ +#define PHY_HALFDUPLEX_10M ((uint16_t)0x0000) /*!< Set the half-duplex mode at 10 Mb/s */ +#define PHY_AUTONEGOTIATION ((uint16_t)0x1000) /*!< Enable auto-negotiation function */ +#define PHY_RESTART_AUTONEGOTIATION ((uint16_t)0x0200) /*!< Restart auto-negotiation function */ +#define PHY_POWERDOWN ((uint16_t)0x0800) /*!< Select the power down mode */ +#define PHY_ISOLATE ((uint16_t)0x0400) /*!< Isolate PHY from MII */ + +#define PHY_AUTONEGO_COMPLETE ((uint16_t)0x0020) /*!< Auto-Negotiation process completed */ +#define PHY_LINKED_STATUS ((uint16_t)0x0004) /*!< Valid link established */ +#define PHY_JABBER_DETECTION ((uint16_t)0x0002) /*!< Jabber condition detected */ + +/* Section 4: Extended PHY Registers */ + +#define PHY_SR ((uint16_t)0x10) /*!< PHY status register Offset */ +#define PHY_MICR ((uint16_t)0x11) /*!< MII Interrupt Control Register */ +#define PHY_MISR ((uint16_t)0x12) /*!< MII Interrupt Status and Misc. Control Register */ + +#define PHY_LINK_STATUS ((uint16_t)0x0001) /*!< PHY Link mask */ +#define PHY_SPEED_STATUS ((uint16_t)0x0002) /*!< PHY Speed mask */ +#define PHY_DUPLEX_STATUS ((uint16_t)0x0004) /*!< PHY Duplex mask */ + +#define PHY_MICR_INT_EN ((uint16_t)0x0002) /*!< PHY Enable interrupts */ +#define PHY_MICR_INT_OE ((uint16_t)0x0001) /*!< PHY Enable output interrupt events */ + +#define PHY_MISR_LINK_INT_EN ((uint16_t)0x0020U) /*!< Enable Interrupt on change of link status */ +#define PHY_LINK_INTERRUPT ((uint16_t)0x2000U) /*!< PHY link status interrupt mask */ + +/* ################## SPI peripheral configuration ########################## */ + +/* CRC FEATURE: Use to activate CRC feature inside HAL SPI Driver +* Activated: CRC code is present inside driver +* Deactivated: CRC code cleaned from driver +*/ + +#define USE_SPI_CRC 1U + +/* Includes ------------------------------------------------------------------*/ +/** + * @brief Include module's header file + */ + +#ifdef HAL_RCC_MODULE_ENABLED + #include "stm32f4xx_hal_rcc.h" +#endif /* HAL_RCC_MODULE_ENABLED */ + +#ifdef HAL_GPIO_MODULE_ENABLED + #include "stm32f4xx_hal_gpio.h" +#endif /* HAL_GPIO_MODULE_ENABLED */ + +#ifdef HAL_DMA_MODULE_ENABLED + #include "stm32f4xx_hal_dma.h" +#endif /* HAL_DMA_MODULE_ENABLED */ + +#ifdef HAL_CORTEX_MODULE_ENABLED + #include "stm32f4xx_hal_cortex.h" +#endif /* HAL_CORTEX_MODULE_ENABLED */ + +#ifdef HAL_ADC_MODULE_ENABLED + #include "stm32f4xx_hal_adc.h" +#endif /* HAL_ADC_MODULE_ENABLED */ + +#ifdef HAL_CAN_MODULE_ENABLED + #include "stm32f4xx_hal_can.h" +#endif /* HAL_CAN_MODULE_ENABLED */ + +#ifdef HAL_CRC_MODULE_ENABLED + #include "stm32f4xx_hal_crc.h" +#endif /* HAL_CRC_MODULE_ENABLED */ + +#ifdef HAL_CRYP_MODULE_ENABLED + #include "stm32f4xx_hal_cryp.h" +#endif /* HAL_CRYP_MODULE_ENABLED */ + +#ifdef HAL_DMA2D_MODULE_ENABLED + #include "stm32f4xx_hal_dma2d.h" +#endif /* HAL_DMA2D_MODULE_ENABLED */ + +#ifdef HAL_DAC_MODULE_ENABLED + #include "stm32f4xx_hal_dac.h" +#endif /* HAL_DAC_MODULE_ENABLED */ + +#ifdef HAL_DCMI_MODULE_ENABLED + #include "stm32f4xx_hal_dcmi.h" +#endif /* HAL_DCMI_MODULE_ENABLED */ + +#ifdef HAL_ETH_MODULE_ENABLED + #include "stm32f4xx_hal_eth.h" +#endif /* HAL_ETH_MODULE_ENABLED */ + +#ifdef HAL_FLASH_MODULE_ENABLED + #include "stm32f4xx_hal_flash.h" +#endif /* HAL_FLASH_MODULE_ENABLED */ + +#ifdef HAL_SRAM_MODULE_ENABLED + #include "stm32f4xx_hal_sram.h" +#endif /* HAL_SRAM_MODULE_ENABLED */ + +#ifdef HAL_NOR_MODULE_ENABLED + #include "stm32f4xx_hal_nor.h" +#endif /* HAL_NOR_MODULE_ENABLED */ + +#ifdef HAL_NAND_MODULE_ENABLED + #include "stm32f4xx_hal_nand.h" +#endif /* HAL_NAND_MODULE_ENABLED */ + +#ifdef HAL_PCCARD_MODULE_ENABLED + #include "stm32f4xx_hal_pccard.h" +#endif /* HAL_PCCARD_MODULE_ENABLED */ + +#ifdef HAL_SDRAM_MODULE_ENABLED + #include "stm32f4xx_hal_sdram.h" +#endif /* HAL_SDRAM_MODULE_ENABLED */ + +#ifdef HAL_HASH_MODULE_ENABLED + #include "stm32f4xx_hal_hash.h" +#endif /* HAL_HASH_MODULE_ENABLED */ + +#ifdef HAL_I2C_MODULE_ENABLED + #include "stm32f4xx_hal_i2c.h" +#endif /* HAL_I2C_MODULE_ENABLED */ + +#ifdef HAL_I2S_MODULE_ENABLED + #include "stm32f4xx_hal_i2s.h" +#endif /* HAL_I2S_MODULE_ENABLED */ + +#ifdef HAL_IWDG_MODULE_ENABLED + #include "stm32f4xx_hal_iwdg.h" +#endif /* HAL_IWDG_MODULE_ENABLED */ + +#ifdef HAL_LTDC_MODULE_ENABLED + #include "stm32f4xx_hal_ltdc.h" +#endif /* HAL_LTDC_MODULE_ENABLED */ + +#ifdef HAL_PWR_MODULE_ENABLED + #include "stm32f4xx_hal_pwr.h" +#endif /* HAL_PWR_MODULE_ENABLED */ + +#ifdef HAL_RNG_MODULE_ENABLED + #include "stm32f4xx_hal_rng.h" +#endif /* HAL_RNG_MODULE_ENABLED */ + +#ifdef HAL_RTC_MODULE_ENABLED + #include "stm32f4xx_hal_rtc.h" +#endif /* HAL_RTC_MODULE_ENABLED */ + +#ifdef HAL_SAI_MODULE_ENABLED + #include "stm32f4xx_hal_sai.h" +#endif /* HAL_SAI_MODULE_ENABLED */ + +#ifdef HAL_SD_MODULE_ENABLED + #include "stm32f4xx_hal_sd.h" +#endif /* HAL_SD_MODULE_ENABLED */ + +#ifdef HAL_SPI_MODULE_ENABLED + #include "stm32f4xx_hal_spi.h" +#endif /* HAL_SPI_MODULE_ENABLED */ + +#ifdef HAL_TIM_MODULE_ENABLED + #include "stm32f4xx_hal_tim.h" +#endif /* HAL_TIM_MODULE_ENABLED */ + +#ifdef HAL_UART_MODULE_ENABLED + #include "stm32f4xx_hal_uart.h" +#endif /* HAL_UART_MODULE_ENABLED */ + +#ifdef HAL_USART_MODULE_ENABLED + #include "stm32f4xx_hal_usart.h" +#endif /* HAL_USART_MODULE_ENABLED */ + +#ifdef HAL_IRDA_MODULE_ENABLED + #include "stm32f4xx_hal_irda.h" +#endif /* HAL_IRDA_MODULE_ENABLED */ + +#ifdef HAL_SMARTCARD_MODULE_ENABLED + #include "stm32f4xx_hal_smartcard.h" +#endif /* HAL_SMARTCARD_MODULE_ENABLED */ + +#ifdef HAL_WWDG_MODULE_ENABLED + #include "stm32f4xx_hal_wwdg.h" +#endif /* HAL_WWDG_MODULE_ENABLED */ + +#ifdef HAL_PCD_MODULE_ENABLED + #include "stm32f4xx_hal_pcd.h" +#endif /* HAL_PCD_MODULE_ENABLED */ + +#ifdef HAL_HCD_MODULE_ENABLED + #include "stm32f4xx_hal_hcd.h" +#endif /* HAL_HCD_MODULE_ENABLED */ + +/* Exported macro ------------------------------------------------------------*/ +#ifdef USE_FULL_ASSERT +/** + * @brief The assert_param macro is used for function's parameters check. + * @param expr: If expr is false, it calls assert_failed function + * which reports the name of the source file and the source + * line number of the call that failed. + * If expr is true, it returns no value. + * @retval None + */ + #define assert_param(expr) ((expr) ? (void)0 : assert_failed((uint8_t *)__FILE__, __LINE__)) +/* Exported functions ------------------------------------------------------- */ + void assert_failed(uint8_t* file, uint32_t line); +#else + #define assert_param(expr) ((void)0) +#endif /* USE_FULL_ASSERT */ + + +#ifdef __cplusplus +} +#endif + +#endif /* __STM32F4xx_HAL_CONF_H */ + + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/stepper/steppermotor_F401RE/Core/Inc/stm32f4xx_it.h b/stepper/steppermotor_F401RE/Core/Inc/stm32f4xx_it.h new file mode 100644 index 0000000..10c0c1f --- /dev/null +++ b/stepper/steppermotor_F401RE/Core/Inc/stm32f4xx_it.h @@ -0,0 +1,73 @@ +/** + ****************************************************************************** + * @file Multi/Examples/MotionControl/IHM05A1_ExampleFor1Motor/Inc/stm32f4xx_it.h + * @author IPC Rennes + * @version V1.5.0 + * @date June 1st, 2018 + * @brief This file contains the headers of the interrupt handlers. + ****************************************************************************** + * @attention + * + *

© COPYRIGHT(c) 2016 STMicroelectronics

+ * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. Neither the name of STMicroelectronics nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + ****************************************************************************** + */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __STM32F4xx_IT_H +#define __STM32F4xx_IT_H + +#ifdef __cplusplus + extern "C" { +#endif + +/* Includes ------------------------------------------------------------------*/ +#include "main.h" + +/* Exported types ------------------------------------------------------------*/ +/* Exported constants --------------------------------------------------------*/ +/* Exported macro ------------------------------------------------------------*/ +/* Exported functions ------------------------------------------------------- */ + +void NMI_Handler(void); +void HardFault_Handler(void); +void MemManage_Handler(void); +void BusFault_Handler(void); +void UsageFault_Handler(void); +void SVC_Handler(void); +void DebugMon_Handler(void); +void PendSV_Handler(void); +void SysTick_Handler(void); + +void EXTI15_10_IRQHandler(void); +void TIM4_IRQHandler(void); + +#ifdef __cplusplus +} +#endif + +#endif /* __STM32F4xx_IT_H */ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/stepper/steppermotor_F401RE/Core/Inc/stm32f4xx_nucleo.h b/stepper/steppermotor_F401RE/Core/Inc/stm32f4xx_nucleo.h new file mode 100644 index 0000000..1fc66d0 --- /dev/null +++ b/stepper/steppermotor_F401RE/Core/Inc/stm32f4xx_nucleo.h @@ -0,0 +1,302 @@ +/** + ****************************************************************************** + * @file stm32f4xx_nucleo.h + * @author MCD Application Team + * @brief This file contains definitions for: + * - LEDs and push-button available on STM32F4XX-Nucleo Kit + * from STMicroelectronics + * - LCD, joystick and microSD available on Adafruit 1.8" TFT LCD + * shield (reference ID 802) + ****************************************************************************** + * @attention + * + *

© COPYRIGHT(c) 2017 STMicroelectronics

+ * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. Neither the name of STMicroelectronics nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + ****************************************************************************** + */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __STM32F4XX_NUCLEO_H +#define __STM32F4XX_NUCLEO_H + +#ifdef __cplusplus + extern "C" { +#endif + +/* Includes ------------------------------------------------------------------*/ +#include "stm32f4xx_hal.h" + +/* To be defined only if the board is provided with the related shield */ +/* https://www.adafruit.com/products/802 */ +#define ADAFRUIT_TFT_JOY_SD_ID802 + +/** @addtogroup BSP + * @{ + */ + +/** @addtogroup STM32F4XX_NUCLEO + * @{ + */ + +/** @addtogroup STM32F4XX_NUCLEO_LOW_LEVEL + * @{ + */ + +/** @defgroup STM32F4XX_NUCLEO_LOW_LEVEL_Exported_Types STM32F4XX NUCLEO LOW LEVEL Exported Types + * @{ + */ +typedef enum +{ + LED2 = 0 +}Led_TypeDef; + +typedef enum +{ + BUTTON_USER = 0, + /* Alias */ + BUTTON_KEY = BUTTON_USER +} Button_TypeDef; + +typedef enum +{ + BUTTON_MODE_GPIO = 0, + BUTTON_MODE_EXTI = 1 +}ButtonMode_TypeDef; + +typedef enum +{ + JOY_NONE = 0, + JOY_SEL = 1, + JOY_DOWN = 2, + JOY_LEFT = 3, + JOY_RIGHT = 4, + JOY_UP = 5 +}JOYState_TypeDef; + +/** + * @} + */ + +/** @defgroup STM32F4XX_NUCLEO_LOW_LEVEL_Exported_Constants STM32F4XX NUCLEO LOW LEVEL Exported Constants + * @{ + */ + +/** + * @brief Define for STM32F4XX_NUCLEO board + */ +#if !defined (USE_STM32F4XX_NUCLEO) + #define USE_STM32F4XX_NUCLEO +#endif + +/** @defgroup STM32F4XX_NUCLEO_LOW_LEVEL_LED STM32F4XX NUCLEO LOW LEVEL LED + * @{ + */ +#define LEDn 1 + +#define LED2_PIN GPIO_PIN_5 +#define LED2_GPIO_PORT GPIOA +#define LED2_GPIO_CLK_ENABLE() __HAL_RCC_GPIOA_CLK_ENABLE() +#define LED2_GPIO_CLK_DISABLE() __HAL_RCC_GPIOA_CLK_DISABLE() + +#define LEDx_GPIO_CLK_ENABLE(__INDEX__) LED2_GPIO_CLK_ENABLE() +#define LEDx_GPIO_CLK_DISABLE(__INDEX__) LED2_GPIO_CLK_DISABLE() +/** + * @} + */ + +/** @defgroup STM32F4XX_NUCLEO_LOW_LEVEL_BUTTON STM32F4XX NUCLEO LOW LEVEL BUTTON + * @{ + */ +#define BUTTONn 1 + +/** + * @brief Key push-button + */ +#define USER_BUTTON_PIN GPIO_PIN_13 +#define USER_BUTTON_GPIO_PORT GPIOC +#define USER_BUTTON_GPIO_CLK_ENABLE() __HAL_RCC_GPIOC_CLK_ENABLE() +#define USER_BUTTON_GPIO_CLK_DISABLE() __HAL_RCC_GPIOC_CLK_DISABLE() +#define USER_BUTTON_EXTI_LINE GPIO_PIN_13 +#define USER_BUTTON_EXTI_IRQn EXTI15_10_IRQn + +#define BUTTONx_GPIO_CLK_ENABLE(__INDEX__) USER_BUTTON_GPIO_CLK_ENABLE() +#define BUTTONx_GPIO_CLK_DISABLE(__INDEX__) USER_BUTTON_GPIO_CLK_DISABLE() + +/* Aliases */ +#define KEY_BUTTON_PIN USER_BUTTON_PIN +#define KEY_BUTTON_GPIO_PORT USER_BUTTON_GPIO_PORT +#define KEY_BUTTON_GPIO_CLK_ENABLE() USER_BUTTON_GPIO_CLK_ENABLE() +#define KEY_BUTTON_GPIO_CLK_DISABLE() USER_BUTTON_GPIO_CLK_DISABLE() +#define KEY_BUTTON_EXTI_LINE USER_BUTTON_EXTI_LINE +#define KEY_BUTTON_EXTI_IRQn USER_BUTTON_EXTI_IRQn + +/** + * @} + */ + +/** @defgroup STM32F4XX_NUCLEO_LOW_LEVEL_BUS STM32F4XX NUCLEO LOW LEVEL BUS + * @{ + */ +/*############################### SPI1 #######################################*/ +#ifdef HAL_SPI_MODULE_ENABLED + +#define NUCLEO_SPIx SPI1 +#define NUCLEO_SPIx_CLK_ENABLE() __HAL_RCC_SPI1_CLK_ENABLE() + +#define NUCLEO_SPIx_SCK_AF GPIO_AF5_SPI1 +#define NUCLEO_SPIx_SCK_GPIO_PORT GPIOA +#define NUCLEO_SPIx_SCK_PIN GPIO_PIN_5 +#define NUCLEO_SPIx_SCK_GPIO_CLK_ENABLE() __HAL_RCC_GPIOA_CLK_ENABLE() +#define NUCLEO_SPIx_SCK_GPIO_CLK_DISABLE() __HAL_RCC_GPIOA_CLK_DISABLE() + +#define NUCLEO_SPIx_MISO_MOSI_AF GPIO_AF5_SPI1 +#define NUCLEO_SPIx_MISO_MOSI_GPIO_PORT GPIOA +#define NUCLEO_SPIx_MISO_MOSI_GPIO_CLK_ENABLE() __HAL_RCC_GPIOA_CLK_ENABLE() +#define NUCLEO_SPIx_MISO_MOSI_GPIO_CLK_DISABLE() __HAL_RCC_GPIOA_CLK_DISABLE() +#define NUCLEO_SPIx_MISO_PIN GPIO_PIN_6 +#define NUCLEO_SPIx_MOSI_PIN GPIO_PIN_7 +/* Maximum Timeout values for flags waiting loops. These timeouts are not based + on accurate values, they just guarantee that the application will not remain + stuck if the SPI communication is corrupted. + You may modify these timeout values depending on CPU frequency and application + conditions (interrupts routines ...). */ +#define NUCLEO_SPIx_TIMEOUT_MAX 1000 + +/** + * @brief SD Control Lines management + */ +#define SD_CS_LOW() HAL_GPIO_WritePin(SD_CS_GPIO_PORT, SD_CS_PIN, GPIO_PIN_RESET) +#define SD_CS_HIGH() HAL_GPIO_WritePin(SD_CS_GPIO_PORT, SD_CS_PIN, GPIO_PIN_SET) + +/** + * @brief LCD Control Lines management + */ +#define LCD_CS_LOW() HAL_GPIO_WritePin(LCD_CS_GPIO_PORT, LCD_CS_PIN, GPIO_PIN_RESET) +#define LCD_CS_HIGH() HAL_GPIO_WritePin(LCD_CS_GPIO_PORT, LCD_CS_PIN, GPIO_PIN_SET) +#define LCD_DC_LOW() HAL_GPIO_WritePin(LCD_DC_GPIO_PORT, LCD_DC_PIN, GPIO_PIN_RESET) +#define LCD_DC_HIGH() HAL_GPIO_WritePin(LCD_DC_GPIO_PORT, LCD_DC_PIN, GPIO_PIN_SET) + +/** + * @brief SD Control Interface pins (shield D4) + */ +#define SD_CS_PIN GPIO_PIN_5 +#define SD_CS_GPIO_PORT GPIOB +#define SD_CS_GPIO_CLK_ENABLE() __HAL_RCC_GPIOB_CLK_ENABLE() +#define SD_CS_GPIO_CLK_DISABLE() __HAL_RCC_GPIOB_CLK_DISABLE() + +/** + * @brief LCD Control Interface pins (shield D10) + */ +#define LCD_CS_PIN GPIO_PIN_6 +#define LCD_CS_GPIO_PORT GPIOB +#define LCD_CS_GPIO_CLK_ENABLE() __HAL_RCC_GPIOB_CLK_ENABLE() +#define LCD_CS_GPIO_CLK_DISABLE() __HAL_RCC_GPIOB_CLK_DISABLE() + +/** + * @brief LCD Data/Command Interface pins (shield D8) + */ +#define LCD_DC_PIN GPIO_PIN_9 +#define LCD_DC_GPIO_PORT GPIOA +#define LCD_DC_GPIO_CLK_ENABLE() __HAL_RCC_GPIOA_CLK_ENABLE() +#define LCD_DC_GPIO_CLK_DISABLE() __HAL_RCC_GPIOA_CLK_DISABLE() + +#endif /* HAL_SPI_MODULE_ENABLED */ + +/*################################ ADC1 ######################################*/ +/** + * @brief ADC Interface pins + * used to detect motion of Joystick available on Adafruit 1.8" TFT shield + */ + +#ifdef HAL_ADC_MODULE_ENABLED + +#define NUCLEO_ADCx ADC1 +#define NUCLEO_ADCx_CLK_ENABLE() __HAL_RCC_ADC1_CLK_ENABLE() +#define NUCLEO_ADCx_CLK_DISABLE() __HAL_RCC_ADC1_CLK_DISABLE() + +#define NUCLEO_ADCx_CHANNEL ADC_CHANNEL_8 + +#define NUCLEO_ADCx_GPIO_PORT GPIOB +#define NUCLEO_ADCx_GPIO_PIN GPIO_PIN_0 +#define NUCLEO_ADCx_GPIO_CLK_ENABLE() __HAL_RCC_GPIOB_CLK_ENABLE() +#define NUCLEO_ADCx_GPIO_CLK_DISABLE() __HAL_RCC_GPIOB_CLK_DISABLE() +#endif /* HAL_ADC_MODULE_ENABLED */ +/** + * @} + */ + +/** + * @} + */ + +/** @defgroup STM32F4XX_NUCLEO_LOW_LEVEL_Exported_Macros STM32F4XX NUCLEO LOW LEVEL Exported Macros + * @{ + */ +/** + * @} + */ + +/** @defgroup STM32F4XX_NUCLEO_LOW_LEVEL_Exported_Functions STM32F4XX NUCLEO LOW LEVEL Exported Functions + * @{ + */ +uint32_t BSP_GetVersion(void); +void BSP_LED_Init(Led_TypeDef Led); +void BSP_LED_DeInit(Led_TypeDef Led); +void BSP_LED_On(Led_TypeDef Led); +void BSP_LED_Off(Led_TypeDef Led); +void BSP_LED_Toggle(Led_TypeDef Led); +void BSP_PB_Init(Button_TypeDef Button, ButtonMode_TypeDef ButtonMode); +void BSP_PB_DeInit(Button_TypeDef Button); +uint32_t BSP_PB_GetState(Button_TypeDef Button); +#ifdef HAL_ADC_MODULE_ENABLED +uint8_t BSP_JOY_Init(void); +JOYState_TypeDef BSP_JOY_GetState(void); +void BSP_JOY_DeInit(void); +#endif /* HAL_ADC_MODULE_ENABLED */ + + +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ + +#ifdef __cplusplus +} +#endif + +#endif /* __STM32F4XX_NUCLEO_H */ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/stepper/steppermotor_F401RE/Core/Inc/x_nucleo_ihm05a1_stm32f4xx.h b/stepper/steppermotor_F401RE/Core/Inc/x_nucleo_ihm05a1_stm32f4xx.h new file mode 100644 index 0000000..0c5a163 --- /dev/null +++ b/stepper/steppermotor_F401RE/Core/Inc/x_nucleo_ihm05a1_stm32f4xx.h @@ -0,0 +1,209 @@ +/** + ****************************************************************************** + * @file x_nucleo_ihm05a1_stm32f4xx.h + * @author IPC Rennes + * @version V1.5.0 + * @date June 1st, 2018 + * @brief Header for BSP driver for x-nucleo-ihm05a1 Nucleo extension board + * (based on L6208) + ****************************************************************************** + * @attention + * + *

© COPYRIGHT(c) 2018 STMicroelectronics

+ * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. Neither the name of STMicroelectronics nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + ****************************************************************************** + */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef X_NUCLEO_IHM05A1_STM32F4XX_H +#define X_NUCLEO_IHM05A1_STM32F4XX_H + +#ifdef __cplusplus + extern "C" { +#endif + +/* Includes ------------------------------------------------------------------*/ +#include "stm32f4xx_nucleo.h" + +/** @addtogroup BSP + * @{ + */ + +/** @addtogroup X_NUCLEO_IHM05A1_STM32F4XX + * @{ + */ + +/* Exported Constants --------------------------------------------------------*/ + +/** @defgroup IHM05A1_Exported_Constants IHM05A1 Exported Constants + * @{ + */ + +/******************************************************************************/ +/* USE_STM32F4XX_NUCLEO */ +/******************************************************************************/ + + /** @defgroup Constants_For_STM32F4XX_NUCLEO Constants For STM32F4XX NUCLEO +* @{ +*/ + +/// GPIO Pin used for the VREFA +#define BSP_MOTOR_CONTROL_BOARD_VREFA_PIN (GPIO_PIN_3) +/// GPIO port used for the VREFA +#define BSP_MOTOR_CONTROL_BOARD_VREFA_PORT (GPIOB) + +/// Interrupt line used for L6208 OCD and OVT +#define FLAG_EXTI_LINE_IRQn (EXTI15_10_IRQn) + +/// Timer used to generate the VREFA PWM +#define BSP_MOTOR_CONTROL_BOARD_TIMER_VREFA_PWM (TIM2) + +/// Timer used to generate the VREFB PWM +#define BSP_MOTOR_CONTROL_BOARD_TIMER_VREFB_PWM (TIM3) + +/// Channel Timer used for the VREFA PWM +#define BSP_MOTOR_CONTROL_BOARD_CHAN_TIMER_VREFA_PWM (TIM_CHANNEL_2) + +/// Channel Timer used for the VREFB PWM +#define BSP_MOTOR_CONTROL_BOARD_CHAN_TIMER_VREFB_PWM (TIM_CHANNEL_2) + +/// HAL Active Channel Timer used for the VREFA PWM +#define BSP_MOTOR_CONTROL_BOARD_HAL_ACT_CHAN_TIMER_VREFA_PWM (HAL_TIM_ACTIVE_CHANNEL_2) + +/// HAL Active Channel Timer used for the VREFB PWM +#define BSP_MOTOR_CONTROL_BOARD_HAL_ACT_CHAN_TIMER_VREFB_PWM (HAL_TIM_ACTIVE_CHANNEL_2) + +/// Timer Clock Enable for the VREFA PWM +#define __BSP_MOTOR_CONTROL_BOARD_TIMER_VREFA_PWM_CLCK_ENABLE() __TIM2_CLK_ENABLE() + +/// Timer Clock Disable for the VREFA PWM +#define __BSP_MOTOR_CONTROL_BOARD_TIMER_VREFA_PWM_CLCK_DISABLE() __TIM2_CLK_DISABLE() + +/// Timer Clock Enable for the VREFB PWMs +#define __BSP_MOTOR_CONTROL_BOARD_TIMER_VREFB_PWM_CLCK_ENABLE() __TIM3_CLK_ENABLE() + +/// Timer Clock Disable for the VREFB PWMs +#define __BSP_MOTOR_CONTROL_BOARD_TIMER_VREFB_PWM_CLCK_DISABLE() __TIM3_CLK_DISABLE() + +/// VREFA PWM GPIO alternate function +#define BSP_MOTOR_CONTROL_BOARD_AFx_TIMx_VREFA_PWM (GPIO_AF1_TIM2) + +/// VREFB PWM GPIO alternate function +#define BSP_MOTOR_CONTROL_BOARD_AFx_TIMx_VREFB_PWM (GPIO_AF2_TIM3) + +/// Timer used to generate the tick +#define BSP_MOTOR_CONTROL_BOARD_TIMER_TICK (TIM4) + +/// tick timer global interrupt +#define BSP_MOTOR_CONTROL_BOARD_TIMER_TICK_IRQn (TIM4_IRQn) + +/// Channel Timer used for the tick +#define BSP_MOTOR_CONTROL_BOARD_CHAN_TIMER_TICK (TIM_CHANNEL_1) + +/// Timer Clock Enable for the tick +#define __BSP_MOTOR_CONTROL_BOARD_TIMER_TICK_CLCK_ENABLE() __TIM4_CLK_ENABLE() + +/// Timer Clock Disable for the tick +#define __BSP_MOTOR_CONTROL_BOARD_TIMER_TICK_CLCK_DISABLE() __TIM4_CLK_DISABLE() + +/// HAL Active Channel Timer used for the tick +#define BSP_MOTOR_CONTROL_BOARD_HAL_ACT_CHAN_TIMER_TICK (HAL_TIM_ACTIVE_CHANNEL_1) + +/// Flag interrupt priority +#define BSP_MOTOR_CONTROL_BOARD_EN_AND_FLAG_PRIORITY (1) + +/// tick timer priority (lower than flag interrupt priority) +#define BSP_MOTOR_CONTROL_BOARD_TIMER_TICK_PRIORITY (BSP_MOTOR_CONTROL_BOARD_EN_AND_FLAG_PRIORITY + 1) + + /** +* @} +*/ + +/******************************************************************************/ +/* Independent plateform definitions */ +/******************************************************************************/ + + /** @defgroup Constants_For_All_Nucleo_Platforms Constants For All Nucleo Platforms +* @{ +*/ + +/// GPIO Pin used for the VREFB +#define BSP_MOTOR_CONTROL_BOARD_VREFB_PIN (GPIO_PIN_7) +/// GPIO Port used for the VREFB +#define BSP_MOTOR_CONTROL_BOARD_VREFB_PORT (GPIOC) + +/// GPIO Pin used for the L6208 clock pin (step clock input) +#define BSP_MOTOR_CONTROL_BOARD_CLOCK_PIN (GPIO_PIN_10) +/// GPIO port used for the L6208 clock pin (step clock input) +#define BSP_MOTOR_CONTROL_BOARD_CLOCK_PORT (GPIOB) + +/// GPIO Pin used for the L6208 CW/CCW pin (direction) +#define BSP_MOTOR_CONTROL_BOARD_DIR_PIN (GPIO_PIN_8) +/// GPIO port used for the L6208 CW/CCW pin (direction) +#define BSP_MOTOR_CONTROL_BOARD_DIR_PORT (GPIOA) + +/// GPIO Pin used for the L6208 HALF/FULL pin (step mode selector) +#define BSP_MOTOR_CONTROL_BOARD_HALF_FULL_PIN (GPIO_PIN_5) +/// GPIO port used for the L6208 HALF/FULL pin (step mode selector) +#define BSP_MOTOR_CONTROL_BOARD_HALF_FULL_PORT (GPIOB) + +/// GPIO Pin used for the L6208 control pin (decay mode selector) +#define BSP_MOTOR_CONTROL_BOARD_CONTROL_PIN (GPIO_PIN_4) +/// GPIO port used for the L6208 control pin (decay mode selector) +#define BSP_MOTOR_CONTROL_BOARD_CONTROL_PORT (GPIOB) + +/// GPIO Pin used for the L6208 reset pin +#define BSP_MOTOR_CONTROL_BOARD_RESET_PIN (GPIO_PIN_9) +/// GPIO port used for the L6208 reset pin +#define BSP_MOTOR_CONTROL_BOARD_RESET_PORT (GPIOA) + +/// GPIO Pin used for the L6208 EN pin (chip enable) and OCD and OVT alarms +#define BSP_MOTOR_CONTROL_BOARD_EN_AND_FLAG_PIN (GPIO_PIN_10) +/// GPIO port used for the L6208 EN pin (chip enable) OCD and OVT alarms +#define BSP_MOTOR_CONTROL_BOARD_EN_AND_FLAG_PORT (GPIOA) + +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ + +#ifdef __cplusplus +} +#endif + +#endif /* X_NUCLEO_IHM05A1_STM32F4XX_H */ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/stepper/steppermotor_F401RE/Core/Inc/x_nucleo_ihmxx.h b/stepper/steppermotor_F401RE/Core/Inc/x_nucleo_ihmxx.h new file mode 100644 index 0000000..cb1e0bc --- /dev/null +++ b/stepper/steppermotor_F401RE/Core/Inc/x_nucleo_ihmxx.h @@ -0,0 +1,241 @@ +/** + ****************************************************************************** + * @file x_nucleo_ihmxx.h + * @author IPC Rennes + * @version V1.7.0 + * @date March 16th, 2018 + * @brief This file provides common definitions for motor control + ****************************************************************************** + * @attention + * + *

© COPYRIGHT(c) 2018 STMicroelectronics

+ * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. Neither the name of STMicroelectronics nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + ****************************************************************************** + */ + + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef X_NUCLEO_IHMXX_H +#define X_NUCLEO_IHMXX_H + +#ifdef __cplusplus + extern "C" { +#endif + +/* Includes ------------------------------------------------------------------*/ +#include "motor.h" + +/** @addtogroup BSP + * @{ + */ + +/** @addtogroup MOTOR_CONTROL + * @{ + */ + +/** @defgroup MOTOR_CONTROL_Exported_Types MOTOR CONTROL Exported Types + * @{ + */ + + + +/** + * @} + */ + +/** @defgroup MOTOR_CONTROL_Exported_Constants MOTOR CONTROL Exported Constants + * @{ + */ +/// Motor control error tag (used when trying to call undefined functions via motorDrvHandle) +#define MOTOR_CONTROL_ERROR_TAG (0x0800) +///Motor control board id for L6474 +#define BSP_MOTOR_CONTROL_BOARD_ID_L6474 (6474) + ///Motor control board id for L6470 + #define BSP_MOTOR_CONTROL_BOARD_ID_L6470 (6470) + ///Motor control board id for L6472 + #define BSP_MOTOR_CONTROL_BOARD_ID_L6472 (6472) + ///Motor control board id for L6480 + #define BSP_MOTOR_CONTROL_BOARD_ID_L6480 (6480) + ///Motor control board id for L6482 + #define BSP_MOTOR_CONTROL_BOARD_ID_L6482 (6482) + ///Motor control board id for L6474 + #define BSP_MOTOR_CONTROL_BOARD_ID_L6474 (6474) +///Motor control board id for Powerstep01 +#define BSP_MOTOR_CONTROL_BOARD_ID_POWERSTEP01 (0001) +///Motor control board id for L6206 +#define BSP_MOTOR_CONTROL_BOARD_ID_L6206 (6206) +///Motor control board id for L6208 +#define BSP_MOTOR_CONTROL_BOARD_ID_L6208 (6208) +///Motor control board id for STSPIN220 +#define BSP_MOTOR_CONTROL_BOARD_ID_STSPIN220 (220) +///Motor control board id for STSPIN240 +#define BSP_MOTOR_CONTROL_BOARD_ID_STSPIN240 (240) +///Motor control board id for STSPIN250 +#define BSP_MOTOR_CONTROL_BOARD_ID_STSPIN250 (250) +/** + * @} + */ + + +/** @defgroup MOTOR_CONTROL_Exported_Macros MOTOR CONTROL Exported Macros + * @{ + */ +#if defined ( __GNUC__ ) + #ifndef __weak + #define __weak __attribute__((weak)) + #endif /* __weak */ +#endif /* __GNUC__ */ +/** + * @} + */ + +/** @defgroup MOTOR_CONTROL_Weak_Function_Prototypes MOTOR CONTROL Weak Function Prototypes + * @{ + */ +__weak motorDrv_t* L6474_GetMotorHandle(void); +__weak motorDrv_t* l647x_GetMotorHandle(void); +__weak motorDrv_t* l648x_GetMotorHandle(void); +__weak motorDrv_t* Powerstep01_GetMotorHandle(void); +__weak motorDrv_t* L6206_GetMotorHandle(void); +__weak motorDrv_t* L6208_GetMotorHandle(void); +__weak motorDrv_t* Stspin220_GetMotorHandle(void); +__weak motorDrv_t* Stspin240_250_GetMotorHandle(void); +/** + * @} + */ + +/** @defgroup MOTOR_CONTROL_Exported_Functions MOTOR CONTROL Exported Functions + * @{ + */ +void BSP_MotorControl_AttachErrorHandler(void (*callback)(uint16_t)); +void BSP_MotorControl_AttachFlagInterrupt(void (*callback)(void)); +void BSP_MotorControl_AttachBusyInterrupt(void (*callback)(void)); +void BSP_MotorControl_ErrorHandler(uint16_t error); +void BSP_MotorControl_Init(uint16_t id, void* initDeviceParameters); +void BSP_MotorControl_FlagInterruptHandler(void); +uint16_t BSP_MotorControl_GetAcceleration(uint8_t deviceId); +uint16_t BSP_MotorControl_GetBoardId(void); +uint16_t BSP_MotorControl_GetCurrentSpeed(uint8_t deviceId); +uint16_t BSP_MotorControl_GetDeceleration(uint8_t deviceId); +motorState_t BSP_MotorControl_GetDeviceState(uint8_t deviceId); +uint32_t BSP_MotorControl_GetFwVersion(void); +int32_t BSP_MotorControl_GetMark(uint8_t deviceId); +uint16_t BSP_MotorControl_GetMaxSpeed(uint8_t deviceId); +uint16_t BSP_MotorControl_GetMinSpeed(uint8_t deviceId); +int32_t BSP_MotorControl_GetPosition(uint8_t deviceId); +void BSP_MotorControl_GoHome(uint8_t deviceId); +void BSP_MotorControl_GoMark(uint8_t deviceId); +void BSP_MotorControl_GoTo(uint8_t deviceId, int32_t targetPosition); +void BSP_MotorControl_HardStop(uint8_t deviceId); +void BSP_MotorControl_Move(uint8_t deviceId, motorDir_t direction, uint32_t stepCount); +void BSP_MotorControl_ResetAllDevices(void); +void BSP_MotorControl_Run(uint8_t deviceId, motorDir_t direction); +bool BSP_MotorControl_SetAcceleration(uint8_t deviceId,uint16_t newAcc); +bool BSP_MotorControl_SetDeceleration(uint8_t deviceId, uint16_t newDec); +void BSP_MotorControl_SetHome(uint8_t deviceId, int32_t homePosition); +void BSP_MotorControl_SetMark(uint8_t deviceId, int32_t markPosition); +bool BSP_MotorControl_SetMaxSpeed(uint8_t deviceId, uint16_t newMaxSpeed); +bool BSP_MotorControl_SetMinSpeed(uint8_t deviceId, uint16_t newMinSpeed); +bool BSP_MotorControl_SoftStop(uint8_t deviceId); +void BSP_MotorControl_StepClockHandler(uint8_t deviceId); +void BSP_MotorControl_WaitWhileActive(uint8_t deviceId); +void BSP_MotorControl_CmdDisable(uint8_t deviceId); +void BSP_MotorControl_CmdEnable(uint8_t deviceId); +uint32_t BSP_MotorControl_CmdGetParam(uint8_t deviceId, uint32_t param); +uint16_t BSP_MotorControl_CmdGetStatus(uint8_t deviceId); +void BSP_MotorControl_CmdNop(uint8_t deviceId); +void BSP_MotorControl_CmdSetParam(uint8_t deviceId, uint32_t param, uint32_t value); +uint16_t BSP_MotorControl_ReadStatusRegister(uint8_t deviceId); +void BSP_MotorControl_ReleaseReset(uint8_t deviceId); +void BSP_MotorControl_Reset(uint8_t deviceId); +bool BSP_MotorControl_SelectStepMode(uint8_t deviceId, motorStepMode_t stepMode); +void BSP_MotorControl_SetDirection(uint8_t deviceId, motorDir_t dir); +void BSP_MotorControl_CmdGoToDir(uint8_t deviceId, motorDir_t dir, int32_t abs_pos); +uint8_t BSP_MotorControl_CheckBusyHw(void); +uint8_t BSP_MotorControl_CheckStatusHw(void); +void BSP_MotorControl_CmdGoUntil(uint8_t deviceId, motorAction_t action, motorDir_t dir, uint32_t speed); +void BSP_MotorControl_CmdHardHiZ(uint8_t deviceId); +void BSP_MotorControl_CmdReleaseSw(uint8_t deviceId, motorAction_t action, motorDir_t dir); +void BSP_MotorControl_CmdResetDevice(uint8_t deviceId); +void BSP_MotorControl_CmdResetPos(uint8_t deviceId); +void BSP_MotorControl_CmdRun(uint8_t deviceId, motorDir_t dir, uint32_t speed); +void BSP_MotorControl_CmdSoftHiZ(uint8_t deviceId); +void BSP_MotorControl_CmdStepClock(uint8_t deviceId, motorDir_t dir); +void BSP_MotorControl_FetchAndClearAllStatus(void); +uint16_t BSP_MotorControl_GetFetchedStatus(uint8_t deviceId); +uint8_t BSP_MotorControl_GetNbDevices(void); +bool BSP_MotorControl_IsDeviceBusy(uint8_t deviceId); +void BSP_MotorControl_SendQueuedCommands(void); +void BSP_MotorControl_QueueCommands(uint8_t deviceId, uint8_t command, int32_t value); +void BSP_MotorControl_WaitForAllDevicesNotBusy(void); +void BSP_MotorControl_BusyInterruptHandler(void); +void BSP_MotorControl_CmdSoftStop(uint8_t deviceId); +void BSP_MotorControl_StartStepClock(uint16_t newFreq); +void BSP_MotorControl_StopStepClock(void); +void BSP_MotorControl_SetDualFullBridgeConfig(uint8_t config); +uint32_t BSP_MotorControl_GetBridgeInputPwmFreq(uint8_t bridgeId); +void BSP_MotorControl_SetBridgeInputPwmFreq(uint8_t bridgeId, uint32_t newFreq); +void BSP_MotorControl_SetStopMode(uint8_t deviceId, motorStopMode_t stopMode); +motorStopMode_t BSP_MotorControl_GetStopMode(uint8_t deviceId); +void BSP_MotorControl_SetDecayMode(uint8_t deviceId, motorDecayMode_t decayMode); +motorDecayMode_t BSP_MotorControl_GetDecayMode(uint8_t deviceId); +motorStepMode_t BSP_MotorControl_GetStepMode(uint8_t deviceId); +motorDir_t BSP_MotorControl_GetDirection(uint8_t deviceId); +void BSP_MotorControl_ExitDeviceFromReset(uint8_t deviceId); +uint8_t BSP_MotorControl_GetTorque(uint8_t deviceId, motorTorqueMode_t torqueMode); +void BSP_MotorControl_SetTorque(uint8_t deviceId, motorTorqueMode_t torqueMode, uint8_t torqueValue); +void BSP_MotorControl_SetRefFreq(uint8_t refId, uint32_t newFreq); +uint32_t BSP_MotorControl_GetRefFreq(uint8_t refId); +void BSP_MotorControl_SetRefDc(uint8_t refId, uint8_t newDc); +uint8_t BSP_MotorControl_GetRefDc(uint8_t refId); +bool BSP_MotorControl_SetNbDevices(uint16_t id, uint8_t nbDevices); +bool BSP_MotorControl_SetAnalogValue(uint8_t deviceId, uint32_t param, float value); +float BSP_MotorControl_GetAnalogValue(uint8_t deviceId, uint32_t param); +void BSP_MotorControl_SetTorqueBoostEnable(uint8_t deviceId, bool enable); +bool BSP_MotorControl_GetTorqueBoostEnable(uint8_t deviceId); +void BSP_MotorControl_SetTorqueBoostThreshold(uint8_t deviceId, uint16_t speedThreshold); +uint16_t BSP_MotorControl_GetTorqueBoostThreshold(uint8_t deviceId); +uint8_t BSP_MotorControl_GetDualFullBridgeConfig(void); +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ + +#ifdef __cplusplus + } +#endif + +#endif /* X_NUCLEO_IHMXX_H */ + + + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/stepper/steppermotor_F401RE/Core/Src/clock_f4.c b/stepper/steppermotor_F401RE/Core/Src/clock_f4.c new file mode 100644 index 0000000..f733289 --- /dev/null +++ b/stepper/steppermotor_F401RE/Core/Src/clock_f4.c @@ -0,0 +1,111 @@ +/** + ****************************************************************************** + * @file Multi/Examples/MotionControl/IHM05A1_ExampleFor1Motor/Src/clock_f4.c + * @author IPC Rennes + * @version V1.5.0 + * @date June 1st, 2018 + * @brief Clock configuration of the IHM05A1 with a NucleoF4xx + ****************************************************************************** + * @attention + * + *

© COPYRIGHT(c) 2016 STMicroelectronics

+ * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. Neither the name of STMicroelectronics nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + ****************************************************************************** + */ + +/* Includes ------------------------------------------------------------------*/ +#include "main.h" + +/** @defgroup IHM05A1_System_clock_configuration + * @{ + */ + +/** + * @brief System Clock Configuration + * The system Clock is configured as follow : + * System Clock source = PLL (HSE) + * SYSCLK(Hz) = 84000000 + * HCLK(Hz) = 84000000 + * AHB Prescaler = 1 + * APB1 Prescaler = 2 + * APB2 Prescaler = 1 + * HSI Frequency(Hz) = 16000000 + * PLL_M = 16 + * PLL_N = 336 + * PLL_P = 4 + * PLL_Q = 7 + * VDD(V) = 3.3 + * Main regulator output voltage = Scale2 mode + * Flash Latency(WS) = 2 + * @param None + * @retval None + */ +void SystemClock_Config(void) +{ + RCC_ClkInitTypeDef RCC_ClkInitStruct; + RCC_OscInitTypeDef RCC_OscInitStruct; + + /* Enable Power Control clock */ + __PWR_CLK_ENABLE(); + + /* The voltage scaling allows optimizing the power consumption when the device is + clocked below the maximum system frequency, to update the voltage scaling value + regarding system frequency refer to product datasheet. */ + __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE2); + + /* Enable HSE Oscillator and activate PLL with HSI as source */ + RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI; + RCC_OscInitStruct.HSIState = RCC_HSI_ON; + RCC_OscInitStruct.HSICalibrationValue = 16; + RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON; + RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSI; + RCC_OscInitStruct.PLL.PLLM = 16; + RCC_OscInitStruct.PLL.PLLN = 336; + RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV4; + RCC_OscInitStruct.PLL.PLLQ = 7; + if(HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK) + { + MyErrorHandler(0); + } + + /* Select PLL as system clock source and configure the HCLK, PCLK1 and PCLK2 + clocks dividers */ + RCC_ClkInitStruct.ClockType = (RCC_CLOCKTYPE_SYSCLK | RCC_CLOCKTYPE_HCLK | RCC_CLOCKTYPE_PCLK1 | RCC_CLOCKTYPE_PCLK2); + RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK; + RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1; + RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV2; + RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1; + if(HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_2) != HAL_OK) + { + MyErrorHandler(1); + } +} + +/** + * @} + */ + + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/stepper/steppermotor_F401RE/Core/Src/l6208.c b/stepper/steppermotor_F401RE/Core/Src/l6208.c new file mode 100644 index 0000000..f41f524 --- /dev/null +++ b/stepper/steppermotor_F401RE/Core/Src/l6208.c @@ -0,0 +1,2183 @@ +/** + ****************************************************************************** + * @file l6208.c + * @author IPC Rennes + * @version V1.5.0 + * @date June 1st, 2018 + * @brief L6208 product related routines + * @note (C) COPYRIGHT 2016 STMicroelectronics + ****************************************************************************** + * @attention + * + *

© COPYRIGHT(c) 2016 STMicroelectronics

+ * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. Neither the name of STMicroelectronics nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + ****************************************************************************** + */ + +#include "l6208.h" +#include "string.h" + +/** @addtogroup BSP + * @{ + */ + +/** @addtogroup L6208 + * @{ + */ + +/* Private constants ---------------------------------------------------------*/ + +/** @addtogroup L6208_Private_Constants + * @{ + */ + +/// The maximum number of devices +#define MAX_NUMBER_OF_DEVICES (1) + +/// Bridge A +#define BRIDGE_A (0) +/// Bridge B +#define BRIDGE_B (1) + +/// Bitmaps for system flags +#define EN_A_set 0x00000001 ///< EN_A pin status +#define HiZstop 0x00000002 ///< motor has to be left in HiZ after stopping +#define busy 0x00000004 ///< stepper position command executing flag +#define running 0x00000008 ///< running motor flag +#define velocitymode 0x00000010 ///< velocity controlled stepper motor +#define positionmode 0x00000020 ///< position controlled stepper motor +#define fullstep 0x00000040 ///< full step mode controlled +#define halfstep 0x00000080 ///< half step mode controlled +#define microstep 0x00000100 ///< micro step mode controlled +#define forward 0x00000200 ///< forward running motor +#define dir2change 0x00000400 ///< direction has to be changed while the motor is running +#define fastdecaymode 0x00000800 ///< decay mode is fast +#define wavestep 0x00001000 ///< wave step mode controlled + +/** + * @} + */ + +/* Private variables ---------------------------------------------------------*/ + +/** @addtogroup L6208_Private_Variables + * @{ + */ + +/// Function pointer to flag interrupt call back +void (*flagInterruptCallback)(void); +/// Function pointer to error handler call back +void (*errorHandlerCallback)(uint16_t); +static volatile bool isrFlag = FALSE; +static uint16_t l6208DriverInstance = 0; + +/// L6208 Device Paramaters structure +deviceParams_t devicePrm; + +/// Exponent used to scale the sine function for the RefMicroTable +#define L6208_SINE_WAVEFORM_POWER_OF_TWO_MAX_VALUE (15) + +/// RefMicroTable values are 2^L6208_SINE_WAVEFORM_POWER_OF_TWO_MAX_VALUE*|sin(n/16*PI/2)| +/// where n is the index in the table +const uint16_t RefMicroTable[L6208_USTEPS_PER_QUARTER_PERIOD*3] = +{ + 0,3212,6393,9512,12540,15447,18205,20788,23170,25330,27246,28899,30274,31357,32138,32610, + 32768,32610,32138,31357,30274,28899,27246,25330,23170,20788,18205,15447,12540,9512,6393,3212, + 0,3212,6393,9512,12540,15447,18205,20788,23170,25330,27246,28899,30274,31357,32138,32610 +}; + +/// microstepping PWM period and torque scaled waveform samples array +uint16_t updatedMicroTable[L6208_USTEPS_PER_QUARTER_PERIOD+1]; +/// waveform microstepping PWM period sample arrays for VREFA wave +uint16_t microTable1[L6208_USTEPS_PER_QUARTER_PERIOD*3+1]; +/// waveform microstepping PWM period sample array for VREFB wave, 90 deg shifted +uint16_t *pMicroTable2 = &(microTable1[16]); + +/** + * @} + */ + +/* Private function prototypes -----------------------------------------------*/ + +/** @addtogroup L6208_Private_functions + * @{ + */ +void L6208_ClearSysFlag(uint32_t mask); +uint32_t L6208_ComputeNbAccOrDecSteps(uint16_t accOrDecRate); +uint16_t L6208_ConvertAcceDecelRateValue(uint16_t newAccOrDecRate); +void L6208_DoAccel(void); +void L6208_DoDecel(void); +void L6208_DoRun(void); +uint8_t L6208_GetMicrostepSample2Scale(void); +void L6208_Indexmodeinit(void); +bool L6208_IsSysFlag(uint32_t mask); +void L6208_ResetSteps(void); +uint32_t L6208_ScaleWaveformSample(uint8_t sampleIndex); +void L6208_ScaleWaveformTable(void); +void L6208_SetDeviceParamsToGivenValues(l6208_Init_t* pInitDevicePrm); +void L6208_SetDeviceParamsToPredefinedValues(void); +void L6208_SetMicrostepSample2Scale(uint8_t value); +void L6208_SetMicrostepSample2Update(uint8_t value); +void L6208_SetMotionState(motorState_t newMotionState); +bool L6208_SetSpeed(uint16_t newSpeed, uint32_t volatile *pSpeed); +void L6208_SetSysFlag(uint32_t mask); +bool L6208_StartMovement(void); +void L6208_UpdateScanWaveformTable(void); +void L6208_UstepWaveformHandling(void); +bool L6208_VectorCalc(uint8_t newTorque); +/** + * @} + */ + +/** @defgroup L6208_Exported_Variables L6208 Exported Variables + * @{ + */ + +/// L6208 motor driver functions pointer structure +motorDrv_t l6208Drv = +{ + L6208_Init, //void (*Init)(void*); + L6208_ReadId, //uint16_t (*ReadID)(void); + L6208_AttachErrorHandler, //void (*AttachErrorHandler)(void (*callback)(uint16_t)); + L6208_AttachFlagInterrupt, //void (*AttachFlagInterrupt)(void (*callback)(void)); + 0, //void (*AttachBusyInterrupt)(void (*callback)(void)); + L6208_FlagInterruptHandler, //void (*FlagInterruptHandler)(void); + L6208_GetAcceleration, //uint16_t (*GetAcceleration)(uint8_t); + L6208_GetCurrentSpeed, //uint16_t (*GetCurrentSpeed)(uint8_t); + L6208_GetDeceleration, //uint16_t (*GetDeceleration)(uint8_t); + L6208_GetMotionState, //motorState_t(*GetDeviceState)(uint8_t); + L6208_GetFwVersion, //uint32_t (*GetFwVersion)(void); + L6208_GetMark, //int32_t (*GetMark)(uint8_t); + L6208_GetMaxSpeed, //uint16_t (*GetMaxSpeed)(uint8_t); + L6208_GetMinSpeed, //uint16_t (*GetMinSpeed)(uint8_t); + L6208_GetPosition, //int32_t (*GetPosition)(uint8_t); + L6208_GoHome, //void (*GoHome)(uint8_t); + L6208_GoMark, //void (*GoMark)(uint8_t); + L6208_GoTo, //void (*GoTo)(uint8_t, int32_t); + L6208_HardStop, //void (*HardStop)(uint8_t); + L6208_Move, //void (*Move)(uint8_t, motorDir_t, uint32_t ); + 0, //void (*ResetAllDevices)(void); + L6208_Run, //void (*Run)(uint8_t, motorDir_t); + L6208_SetAcceleration, //bool(*SetAcceleration)(uint8_t ,uint16_t ); + L6208_SetDeceleration, //bool(*SetDeceleration)(uint8_t , uint16_t ); + L6208_SetHome, //void (*SetHome)(uint8_t, int32_t); + L6208_SetMark, //void (*SetMark)(uint8_t, int32_t); + L6208_SetMaxSpeed, //bool (*SetMaxSpeed)(uint8_t, uint16_t ); + L6208_SetMinSpeed, //bool (*SetMinSpeed)(uint8_t, uint16_t ); + L6208_SoftStop, //bool (*SoftStop)(uint8_t); + L6208_TickHandler, //void (*StepClockHandler)(uint8_t deviceId); + L6208_WaitWhileActive, //void (*WaitWhileActive)(uint8_t); + L6208_Disable, //void (*CmdDisable)(uint8_t); + L6208_Enable, //void (*CmdEnable)(uint8_t); + 0, //uint32_t (*CmdGetParam)(uint8_t, uint32_t); + 0, //uint16_t (*CmdGetStatus)(uint8_t); + 0, //void (*CmdNop)(uint8_t); + 0, //void (*CmdSetParam)(uint8_t, uint32_t, uint32_t); + 0, //uint16_t (*ReadStatusRegister)(uint8_t); + L6208_ReleaseReset, //void (*ReleaseReset)(uint8_t); + L6208_Reset, //void (*Reset)(uint8_t); + L6208_SetStepMode, //bool (*SelectStepMode)(uint8_t deviceId, motorStepMode_t); + L6208_SetDirection, //void (*SetDirection)(uint8_t, motorDir_t); + L6208_GoToDir, //void (*CmdGoToDir)(uint8_t, motorDir_t, int32_t); + 0, //uint8_t (*CheckBusyHw)(void); + L6208_CheckStatusHw, //uint8_t (*CheckStatusHw)(void); + 0, //void (*CmdGoUntil)(uint8_t, motorAction_t, motorDir_t, uint32_t); + 0, //void (*CmdHardHiZ)(uint8_t); + 0, //void (*CmdReleaseSw)(uint8_t, motorAction_t, motorDir_t); + 0, //void (*CmdResetDevice)(uint8_t); + 0, //void (*CmdResetPos)(uint8_t); + 0, //void (*CmdRun)(uint8_t, motorDir_t, uint32_t); + 0, //void (*CmdSoftHiZ)(uint8_t); + 0, //void (*CmdStepClock)(uint8_t, motorDir_t); + 0, //void (*FetchAndClearAllStatus)(void); + 0, //uint16_t (*GetFetchedStatus)(uint8_t); + 0, //uint8_t (*GetNbDevices)(void); + 0, //bool (*IsDeviceBusy)(uint8_t); + 0, //void (*SendQueuedCommands)(void); + 0, //void (*QueueCommands)(uint8_t, uint8_t, int32_t); + 0, //void (*WaitForAllDevicesNotBusy)(void); + L6208_ErrorHandler, //void (*ErrorHandler)(uint16_t); + 0, //void (*BusyInterruptHandler)(void); + 0, //void (*CmdSoftStop)(uint8_t); + 0, //void (*StartStepClock)(uint16_t); + 0, //void (*StopStepClock)(void); + 0, //void (*SetDualFullBridgeConfig)(uint8_t); + L6208_VrefPwmGetFreq, //uint32_t (*GetBridgeInputPwmFreq)(uint8_t); + L6208_VrefPwmSetFreq, //void (*SetBridgeInputPwmFreq)(uint8_t, uint32_t); + L6208_SetStopMode, //void (*SetStopMode)(uint8_t, motorStopMode_t); + L6208_GetStopMode, //motorStopMode_t (*GetStopMode)(uint8_t); + L6208_SetDecayMode, //void (*SetDecayMode)(uint8_t, motorDecayMode_t); + L6208_GetDecayMode, //motorDecayMode_t (*GetDecayMode)(uint8_t); + L6208_GetStepMode, //motorStepMode_t (*GetStepMode)(uint8_t); + L6208_GetDirection, //motorDir_t (*GetDirection)(uint8_t); + 0, //void (*ExitDeviceFromReset)(uint8_t); + L6208_SetTorque, //void (*SetTorque)(uint8_t, motorTorqueMode_t, uint8_t); + L6208_GetTorque, //uint8_t (*GetTorque)(uint8_t, motorTorqueMode_t); + 0, //void (*SetRefFreq)(uint8_t, uint32_t); + 0, //uint32_t (*GetRefFreq)(uint8_t); + 0, //void (*SetRefDc)(uint8_t, uint8_t); + 0, //uint8_t (*GetRefDc)(uint8_t); + L6208_SetNbDevices, //bool (*SetNbDevices)(uint8_t); + 0, //bool (*SetAnalogValue)(uint8_t, uint32_t, float); + 0 //float (*GetAnalogValue)(uint8_t, uint32_t); +}; + +/** + * @} + */ + +/** @defgroup L6208_library_Functions L6208 library Functions + * @{ + */ + +/******************************************************//** + * @brief Return motor handle (pointer to the L6208 motor driver structure) + * @retval Pointer to the motorDrv_t structure + **********************************************************/ +motorDrv_t* L6208_GetMotorHandle(void) +{ + return (&l6208Drv); +} + +/******************************************************//** + * @brief Start the L6208 library + * @param[in] pInit pointer to the initialization data + * @retval None + **********************************************************/ +void L6208_Init(void* pInit) +{ + + l6208DriverInstance++; + + /* Initialise the GPIOs */ + L6208_Board_GpioInit(); + + if (pInit == NULL) + { + /* Set context variables to the predefined values from l6208_target_config.h */ + /* Set GPIO according to these values */ + L6208_SetDeviceParamsToPredefinedValues(); + } + else + { + L6208_SetDeviceParamsToGivenValues((l6208_Init_t*) pInit); + } + + /* Initialise the PWMs */ + L6208_Board_VrefPwmInit(BRIDGE_A, devicePrm.vrefPwmFreq); + L6208_Board_VrefPwmInit(BRIDGE_B, devicePrm.vrefPwmFreq); + + /* Initialise the tick */ + L6208_Board_TickInit(); + + /* Reset L6208 */ + L6208_ResetDevice(); + + /* Align motor mechanical position to driver position */ + L6208_Board_VrefPwmStart(BRIDGE_A, devicePrm.vrefPwmFreq); + L6208_Board_VrefPwmStart(BRIDGE_B, devicePrm.vrefPwmFreq); + L6208_Enable(0); + } + +/******************************************************//** + * @brief Read id + * @retval Id of the l6208 Driver Instance + **********************************************************/ +uint16_t L6208_ReadId(void) + { + return(l6208DriverInstance); + } + +/******************************************************//** + * @brief Attaches a user callback to the error Handler. + * The call back will be then called each time the library + * detects an error + * @param[in] callback Name of the callback to attach + * to the error Hanlder + * @retval None + **********************************************************/ +void L6208_AttachErrorHandler(void (*callback)(uint16_t error)) + { + errorHandlerCallback = (void (*)(uint16_t error)) callback; +} + +/******************************************************//** + * @brief Attach a user callback to the flag Interrupt + * The call back will be then called each time the EN + * pin will be pulled down due to the occurrence of + * OCD or OVT + * @param[in] callback Name of the callback to attach + * to the Flag Interrupt + * @retval None + **********************************************************/ +void L6208_AttachFlagInterrupt(void (*callback)(void)) +{ + flagInterruptCallback = (void (*)())callback; +} + +/******************************************************//** + * @brief Check if L6208 has a fault by reading EN pin position. + * @retval One if L6208 has EN pin down, otherwise zero + **********************************************************/ +uint8_t L6208_CheckStatusHw(void) +{ + if(!L6208_Board_FLAG_PIN_GetState()) + { + return 0x01; + } + else + { + return 0x00; + } +} + +/******************************************************//** + * @brief Disable the power bridges (leave the output bridges HiZ) + * @param[in] deviceId dummy parameter for compatibility with motor.h + * @retval None + **********************************************************/ +void L6208_Disable(uint8_t deviceId) + { + L6208_Board_Disable(); + L6208_ClearSysFlag(EN_A_set); +} + +/******************************************************//** + * @brief Error handler which calls the user callback (if defined) + * @param[in] error Number of the error + * @retval None + **********************************************************/ +void L6208_ErrorHandler(uint16_t error) + { + if (errorHandlerCallback != 0) + { + errorHandlerCallback(error); + } + else + { + while(1) + { + /* Infinite loop */ + } + } + } + +/******************************************************//** + * @brief Enable the power bridges + * @param[in] deviceId dummy parameter for compatibility with motor.h + * @retval None + **********************************************************/ +void L6208_Enable(uint8_t deviceId) + { + L6208_Board_Enable(); + L6208_SetSysFlag(EN_A_set); + } + +/******************************************************//** + * @brief Handler of the flag interrupt which calls the user callback (if defined) + * @retval None + **********************************************************/ +void L6208_FlagInterruptHandler(void) + { + if (flagInterruptCallback != 0) + { + /* Set isr flag */ + isrFlag = TRUE; + + flagInterruptCallback(); + + /* Reset isr flag */ + isrFlag = FALSE; + } + } + +/******************************************************//** + * @brief Get the stepper acceleration rate + * in step/s^2 for full, half and wave modes + * in microsteps/s^2 for microstep modes + * @param[in] deviceId dummy parameter for compatibility with motor.h + * @retval the stepper acceleration rate in step/s^2 or microstep/s^2 + * @note + **********************************************************/ +uint16_t L6208_GetAcceleration(uint8_t deviceId) + { + return devicePrm.accelerationSps2; + } + +/******************************************************//** + * @brief Get the current speed + * in step/s for full, half and wave modes + * in microsteps/s for microstep modes + * @param[in] deviceId dummy parameter for compatibility with motor.h + * @retval return the current speed in step/s or microstep/s + * @note + **********************************************************/ +uint16_t L6208_GetCurrentSpeed(uint8_t deviceId) + { + uint64_t tmp64 = (uint64_t) devicePrm.speedSpt * L6208_Board_TickGetFreq(); + + devicePrm.speedSps = (uint16_t)(tmp64 >> 23); + if (devicePrm.speedSps & 0x1) + { + devicePrm.speedSps = (devicePrm.speedSps >> 1) + 1; + } + else + { + devicePrm.speedSps = devicePrm.speedSps >> 1; + } + return devicePrm.speedSps; + } + +/******************************************************//** + * @brief Get the motor decay mode + * @param[in] deviceId dummy parameter for compatibility with motor.h + * @retval decay mode + **********************************************************/ +motorDecayMode_t L6208_GetDecayMode(uint8_t deviceId) + { + if (L6208_IsSysFlag(fastdecaymode)) return (FAST_DECAY); + else return (SLOW_DECAY); + } + +/******************************************************//** + * @brief Get the stepper deceleration rate + * in step/s^2 for full, half and wave modes + * in microsteps/s^2 for microstep modes + * @param[in] deviceId dummy parameter for compatibility with motor.h + * @retval the stepper deceleration rate in step/s^2 or microstep/s^2 + * @note + **********************************************************/ +uint16_t L6208_GetDeceleration(uint8_t deviceId) + { + return devicePrm.decelerationSps2; + } + +/******************************************************//** + * @brief Get the motor current direction + * @param[in] deviceId dummy parameter for compatibility with motor.h + * @retval direction + **********************************************************/ +motorDir_t L6208_GetDirection(uint8_t deviceId) + { + if (L6208_IsSysFlag(forward)) + { + return FORWARD; + } + else + { + return BACKWARD; + } + } + +/******************************************************//** + * @brief Return the FW version. + * @retval FW version + **********************************************************/ +uint32_t L6208_GetFwVersion(void) + { + return L6208_FW_VERSION; + } + +/******************************************************//** + * @brief Get the mark position (32b signed) + * @param[in] deviceId dummy parameter for compatibility with motor.h + * @retval mark position + **********************************************************/ +int32_t L6208_GetMark(uint8_t deviceId) +{ + return devicePrm.markPos; + } + +/******************************************************//** + * @brief Get the max speed + * in step/s for full, half and wave modes + * in microsteps/s for microstep modes + * @param[in] deviceId dummy parameter for compatibility with motor.h + * @retval return the max speed in step/s or microstep/s + * @note + **********************************************************/ +uint16_t L6208_GetMaxSpeed(uint8_t deviceId) + { + return devicePrm.maxSpeedSps; + } + +/******************************************************//** + * @brief Get the min speed + * in step/s for full, half and wave modes + * in microsteps/s for microstep modes + * @param[in] deviceId dummy parameter for compatibility with motor.h + * @retval return the min speed in step/s or microstep/s + * @note + **********************************************************/ +uint16_t L6208_GetMinSpeed(uint8_t deviceId) +{ + return devicePrm.minSpeedSps; + } + +/******************************************************//** + * @brief Get the stepper state machine index + * @param[in] deviceId dummy parameter for compatibility with motor.h + * @retval one of the stepper state machine index in the motorState_t enum + **********************************************************/ +motorState_t L6208_GetMotionState(uint8_t deviceId) + { + // gets the new stepper state machine index + return devicePrm.motionState; +} + +/******************************************************//** + * @brief Get the current position (32b signed) + * @param[in] deviceId dummy parameter for compatibility with motor.h + * @retval current absoulte position + **********************************************************/ +int32_t L6208_GetPosition(uint8_t deviceId) + { + return devicePrm.absolutePos; + } + +/******************************************************//** + * @brief Get the motor step mode + * @param[in] deviceId dummy parameter for compatibility with motor.h + * @retval step mode + **********************************************************/ +motorStepMode_t L6208_GetStepMode(uint8_t deviceId) + { + return devicePrm.stepMode; + } + +/******************************************************//** + * @brief Get the selected stop mode + * @param[in] deviceId dummy parameter for compatibility with motor.h + * @retval the selected stop mode + **********************************************************/ +motorStopMode_t L6208_GetStopMode(uint8_t deviceId) + { + if (L6208_IsSysFlag(HiZstop) == FALSE) + { + return (HOLD_MODE); + } + else + { + return (HIZ_MODE); + } +} + +/******************************************************//** + * @brief Get the torque of the specified device + * @param[in] deviceId dummy parameter for compatibility with motor.h + * @param[in] torqueMode torque mode + * @retval the torqueValue in % (from 0 to 100) + * @note + **********************************************************/ +uint8_t L6208_GetTorque(uint8_t deviceId, motorTorqueMode_t torqueMode) +{ + uint8_t torqueValue = 0; + switch(torqueMode) + { + case ACC_TORQUE: + torqueValue = devicePrm.accelTorque; + break; + case DEC_TORQUE: + torqueValue = devicePrm.decelTorque; + break; + case RUN_TORQUE: + torqueValue = devicePrm.runTorque; + break; + case HOLD_TORQUE: + torqueValue = devicePrm.holdTorque; + break; + case CURRENT_TORQUE: + torqueValue = devicePrm.curTorqueScaler; + break; + default: + break; + } + return torqueValue; +} + +/******************************************************//** + * @brief Go to the home position + * @param[in] deviceId dummy parameter for compatibility with motor.h + * @retval None + **********************************************************/ +void L6208_GoHome(uint8_t deviceId) +{ + L6208_GoTo(deviceId, 0); +} + +/******************************************************//** + * @brief Go to the Mark position + * @param[in] deviceId dummy parameter for compatibility with motor.h + * @retval None + **********************************************************/ +void L6208_GoMark(uint8_t deviceId) +{ + L6208_GoTo(deviceId, devicePrm.markPos); +} + +/******************************************************//** + * @brief Move the motor to the absolute position using the shortest path + * @param[in] deviceId dummy parameter for compatibility with motor.h + * @param[in] abs_pos 32 bit signed value position + * @retval None + * @note The position is at the resolution corresponding to the + * selected step mode. + * STEP_MODE_FULL or STEP_MODE_WAVE : step + * STEP_MODE_HALF : 1/2 step + * STEP_MODE_1_4 : 1/4 step + * STEP_MODE_1_8 : 1/8 step + * STEP_MODE_1_16 : 1/16 step + **********************************************************/ +void L6208_GoTo(uint8_t deviceId, int32_t abs_pos) +{ + uint32_t steps = 0; + + if(L6208_IsSysFlag(running)) + { + L6208_HardStop(0); + } + + if (abs_pos > devicePrm.absolutePos) + { + steps = abs_pos - devicePrm.absolutePos; + if (steps < (L6208_POSITION_RANGE>>1)) + { + L6208_Move(0, FORWARD, steps); +} + else + { + L6208_Move(0, BACKWARD, (L6208_POSITION_RANGE - steps)); + } +} + else +{ + steps = devicePrm.absolutePos - abs_pos; + if (steps < (L6208_POSITION_RANGE>>1)) + { + L6208_Move(0, BACKWARD, steps); + } + else + { + L6208_Move(0, FORWARD, (L6208_POSITION_RANGE - steps)); + } +} +} + +/******************************************************//** + * @brief Move the motor to the absolute position + * @param[in] deviceId dummy parameter for compatibility with motor.h + * @param[in] direction FORWARD or BACKWARD + * @param[in] abs_pos 32 bit signed value position + * @retval None + * @note The position is at the resolution corresponding to the + * selected step mode. + * STEP_MODE_FULL or STEP_MODE_WAVE : step + * STEP_MODE_HALF : 1/2 step + * STEP_MODE_1_4 : 1/4 step + * STEP_MODE_1_8 : 1/8 step + * STEP_MODE_1_16 : 1/16 step + **********************************************************/ +void L6208_GoToDir(uint8_t deviceId, motorDir_t direction, int32_t abs_pos) +{ + uint32_t steps = 0; + + if(L6208_IsSysFlag(running)) + { + L6208_HardStop(0); + } + + if (direction != BACKWARD) + { + if (abs_pos > devicePrm.absolutePos) + { + steps = abs_pos - devicePrm.absolutePos; + } + else + { + steps = L6208_POSITION_RANGE + (abs_pos - devicePrm.absolutePos); + } +} + else +{ + if (abs_pos > devicePrm.absolutePos) + { + steps = L6208_POSITION_RANGE + (devicePrm.absolutePos - abs_pos); +} + else +{ + steps = devicePrm.absolutePos - abs_pos; + } + } + L6208_Move(0, direction, steps); +} + +/******************************************************//** + * @brief Immediately stop the motor and disables the power bridges + * @param[in] deviceId dummy parameter for compatibility with motor.h + * @retval None + **********************************************************/ +void L6208_HardHiZ(uint8_t deviceId) +{ + /* Disables power stage */ + L6208_Disable(0); + + /* Sets inactive state */ + L6208_SetMotionState(INACTIVE); + + /* Clears the running motor and the position */ + L6208_ClearSysFlag(running); + + /* Disables PWMs */ + L6208_Board_VrefPwmStop(BRIDGE_A); + L6208_Board_VrefPwmStop(BRIDGE_B); + + /* Disables tick timer */ + L6208_Board_TickStop(); +} + +/******************************************************//** + * @brief Immediately stop the motor and keeps holding torque + * @param[in] deviceId dummy parameter for compatibility with motor.h + * @retval None + **********************************************************/ +void L6208_HardStop(uint8_t deviceId) +{ + /* Sets inactive state */ + L6208_SetMotionState(INACTIVE); + + /* Clears the running motor and the position */ + L6208_ClearSysFlag(running); + L6208_VectorCalc(devicePrm.holdTorque); + + /* Disables tick timer */ + L6208_Board_TickStop(); +} + +/******************************************************//** + * @brief Move the motor by the specified number of steps + * in the specified direction + * @param[in] deviceId dummy parameter for compatibility with motor.h + * @param[in] direction FORWARD or BACKWARD + * @param[in] stepCount 32 bit unsigned step count + * @retval None + * @note The step count resolution is corresponding to the + * selected step mode. + * STEP_MODE_FULL or STEP_MODE_WAVE : step + * STEP_MODE_HALF : 1/2 step + * STEP_MODE_1_4 : 1/4 step + * STEP_MODE_1_8 : 1/8 step + * STEP_MODE_1_16 : 1/16 step + **********************************************************/ +void L6208_Move(uint8_t deviceId, motorDir_t direction, uint32_t stepCount) +{ + if(L6208_IsSysFlag(running)) + { + L6208_HardStop(0); + } + + /* clear the velocity driving mode flag */ + L6208_ClearSysFlag(velocitymode); + + /* Set the indexing driving mode flag */ + /* and the user command executing flag */ + L6208_SetSysFlag(positionmode); + + /* store relative number of steps to move */ + devicePrm.positionTarget = stepCount; + + L6208_SetDirection(0, direction); + + /* Motor activation */ + L6208_StartMovement(); +} + +/******************************************************//** + * @brief Release the L6208 reset (Reset pin set to high level) + * @param[in] deviceId dummy parameter for compatibility with motor.h + * @retval None + **********************************************************/ +void L6208_ReleaseReset(uint8_t deviceId) + { + L6208_Board_ReleaseReset(); +} + +/******************************************************//** + * @brief Reset the L6208 (Reset pin set to low level) + * @param[in] deviceId dummy parameter for compatibility with motor.h + * @retval None + **********************************************************/ +void L6208_Reset(uint8_t deviceId) + { + L6208_Board_Reset(); + } + +/******************************************************//** + * @brief Reset the device with current step mode, resets current speed, + * positions and microstep variables. + * @retval None + **********************************************************/ +void L6208_ResetDevice(void) + { + L6208_SetStepMode(0, L6208_GetStepMode(0)); +} + +/******************************************************//** + * @brief Run the motor in the specified direction + * according to the speed profile defined by the minimum speed, + * maximum speed, and acceleration parameters. + * The device accelerates from the minimum speed up to the maximum + * speed by using the device acceleration. + * @param[in] deviceId dummy parameter for compatibility with motor.h + * @param[in] direction FORWARD or BACKWARD + * @retval None + **********************************************************/ +void L6208_Run(uint8_t deviceId, motorDir_t direction) +{ + if(L6208_IsSysFlag(running)) + { + L6208_HardStop(0); + } + L6208_SetDirection(0, direction); + /* Clear the indexing driving mode flag */ + L6208_ClearSysFlag(positionmode); + /* Set the velocity driving mode flag */ + L6208_SetSysFlag(velocitymode); + /* Motor activation */ + L6208_StartMovement(); +} + +/******************************************************//** + * @brief Set the stepper acceleration rate + * in step/s^2 and step/tick^2 for full, half and wave modes + * in microsteps/s^2 and microsteps/tick^2 for microstep modes + * @param[in] deviceId dummy parameter for compatibility with motor.h + * @param[in] newAcc new acceleration rate in step/s^2 or microstep/s^2 + * @retval TRUE + * @note + **********************************************************/ +bool L6208_SetAcceleration(uint8_t deviceId, uint16_t newAcc) +{ + uint16_t newAccSpt2 = L6208_ConvertAcceDecelRateValue(newAcc); + if (newAccSpt2) + { + devicePrm.accelerationSps2 = newAcc; + devicePrm.accelerationSpt2 = newAccSpt2; + } + else + { + L6208_ErrorHandler(L6208_ERROR_SET_ACCELERATION); + } + return TRUE; +} + +/******************************************************//** + * @brief Select the motor decay mode + * @param[in] deviceId dummy parameter for compatibility with motor.h + * @param[in] decayMode (SLOW_DECAY or FAST_DECAY) + * @retval None + **********************************************************/ +void L6208_SetDecayMode(uint8_t deviceId, motorDecayMode_t decayMode) +{ + if ((decayMode & L6208_FAST_DECAY_MODE_MASK) == L6208_FAST_DECAY_MODE_MASK) + { + L6208_Board_CONTROL_PIN_Set(); + L6208_SetSysFlag(fastdecaymode); + } + else + { + L6208_Board_CONTROL_PIN_Reset(); + L6208_ClearSysFlag(fastdecaymode); + } +} + +/******************************************************//** + * @brief Set the stepper deceleration rate + * in step/s^2 and step/tick^2 for full, half and wave modes + * in microsteps/s^2 and microsteps/tick^2 for microstep modes + * @param[in] deviceId dummy parameter for compatibility with motor.h + * @param[in] newDec new deceleration rate in step/s^2 or microstep/s^2 + * @retval TRUE + * @note + **********************************************************/ +bool L6208_SetDeceleration(uint8_t deviceId, uint16_t newDec) +{ + uint16_t newDecSpt2 = L6208_ConvertAcceDecelRateValue(newDec); + if (newDecSpt2) + { + devicePrm.decelerationSps2 = newDec; + devicePrm.decelerationSpt2 = newDecSpt2; + } + else + { + L6208_ErrorHandler(L6208_ERROR_SET_DECELERATION); + } + return TRUE; +} + +/******************************************************//** + * @brief Specify the direction + * @param[in] deviceId dummy parameter for compatibility with motor.h + * @param[in] dir FORWARD or BACKWARD + * @note In velocity mode a direction change forces the device to stop and + * then run in the new direction. In position mode, if the device is + * running, a direction change will generate an error. + * @retval None + **********************************************************/ +void L6208_SetDirection(uint8_t deviceId, motorDir_t dir) +{ + L6208_ClearSysFlag(dir2change); + if (dir == FORWARD) + { + if (!L6208_IsSysFlag(forward)) + { + if (L6208_IsSysFlag(running)) + { + /* motor is running */ + if (L6208_IsSysFlag(positionmode)) + { + L6208_ErrorHandler(L6208_ERROR_SET_DIRECTION); + } + else + { + /* set the rotation direction to change flag */ + L6208_SetSysFlag(dir2change); + } + } + else /* the motor is stopped, cw direction selected */ + { + L6208_SetSysFlag(forward); + L6208_Board_DIR_PIN_Set(); + } + } + } + else + { + if (L6208_IsSysFlag(forward)) + { + if (L6208_IsSysFlag(running)) + { + /* motor is running */ + if (L6208_IsSysFlag(positionmode)) + { + L6208_ErrorHandler(L6208_ERROR_SET_DIRECTION); + } + else + { + /* set the rotation direction to change flag */ + L6208_SetSysFlag(dir2change); + } + } + else /* the motor is stopped, ccw direction selected */ + { + L6208_ClearSysFlag(forward); + L6208_Board_DIR_PIN_Reset(); + } + } + } + if(L6208_IsSysFlag(dir2change)) + { + L6208_VectorCalc(devicePrm.decelTorque); + L6208_SetMotionState(DECELERATINGTOSTOP); + } +} + +/******************************************************//** + * @brief Set home position + * @param[in] deviceId dummy parameter for compatibility with motor.h + * @param[in] homePos new home position + * @retval None + **********************************************************/ +void L6208_SetHome(uint8_t deviceId, int32_t homePos) +{ + if (!L6208_IsSysFlag(running)) + { + devicePrm.absolutePos -= homePos; + } + else + { + L6208_ErrorHandler(L6208_ERROR_SET_HOME); + } +} + +/******************************************************//** + * @brief Set mark position + * @param[in] deviceId dummy parameter for compatibility with motor.h + * @param[in] markPos new mark position + * @retval None + **********************************************************/ +void L6208_SetMark(uint8_t deviceId, int32_t markPos) +{ + devicePrm.markPos = markPos; +} + +/******************************************************//** + * @brief Set the user selected maximum speed + * in step/s and step/tick for full, half and wave modes + * in microsteps/s and microsteps/tick for microstep modes + * @param[in] deviceId dummy parameter for compatibility with motor.h + * @param[in] newSpeed speed value (step/s or microstep/s) + * @retval TRUE + * @note One microstep is 1/16 step + **********************************************************/ +bool L6208_SetMaxSpeed(uint8_t deviceId, uint16_t newSpeed) +{ + if (L6208_SetSpeed(newSpeed, &devicePrm.maxSpeedSpt)) + { + devicePrm.maxSpeedSps = newSpeed; + } + else + { + L6208_ErrorHandler(L6208_ERROR_SET_MAX_SPEED); + } + return TRUE; +} + +/******************************************************//** + * @brief Set the user selected minimum speed + * in step/s and step/tick for full, half and wave modes + * in microsteps/s and microsteps/tick for microstep modes + * @param[in] deviceId dummy parameter for compatibility with motor.h + * @param[in] newSpeed speed value (step/s or microstep/s) + * @retval TRUE + * @note One microstep is 1/16 step + **********************************************************/ +bool L6208_SetMinSpeed(uint8_t deviceId, uint16_t newSpeed) +{ + if (L6208_SetSpeed(newSpeed, &devicePrm.minSpeedSpt)) + { + devicePrm.minSpeedSps = newSpeed; + } + else + { + L6208_ErrorHandler(L6208_ERROR_SET_MIN_SPEED); + } + return TRUE; +} + +/******************************************************//** + * @brief Sets the number of devices to be used + * @param[in] nbDevices (from 1 to MAX_NUMBER_OF_DEVICES) + * @retval TRUE if successfull, FALSE if failure, attempt to set a number of + * devices greater than MAX_NUMBER_OF_DEVICES + **********************************************************/ +bool L6208_SetNbDevices(uint8_t nbDevices) +{ + if (nbDevices <= MAX_NUMBER_OF_DEVICES) + { + return TRUE; + } + else + { + return FALSE; + } +} + +/******************************************************//** + * @brief Set the step mode + * @param[in] deviceId dummy parameter for compatibility with motor.h + * @param[in] stepMode + * @retval true if the command is successfully executed, else false + * @note Every time the step mode is changed, the step state machine is reset + **********************************************************/ +bool L6208_SetStepMode(uint8_t deviceId, motorStepMode_t stepMode) +{ + devicePrm.stepMode = stepMode; + L6208_ClearSysFlag(fullstep | halfstep | microstep | wavestep); + switch (stepMode) + { + case STEP_MODE_HALF: + /* Set the Half/Full pin low and Reset and the set the Half/Full pin high*/ + L6208_Board_HALF_FULL_PIN_Reset(); + L6208_Board_Reset(); + L6208_Board_HALF_FULL_PIN_Set(); + /* Set system flag */ + L6208_SetSysFlag(halfstep); + break; + case STEP_MODE_FULL: + /* Set the Half/Full pin low and Reset */ + L6208_Board_HALF_FULL_PIN_Reset(); + L6208_Board_Reset(); + /* Set system flag */ + L6208_SetSysFlag(fullstep); + break; + case STEP_MODE_WAVE: + /* Set the Half/Full pin low and Reset and the set the Half/Full pin high*/ + L6208_Board_CLOCK_PIN_Reset(); + L6208_Board_HALF_FULL_PIN_Reset(); + L6208_Board_Reset(); + L6208_Board_CLOCK_PIN_Set(); + L6208_Board_HALF_FULL_PIN_Set(); + L6208_Board_Delay(2); + L6208_Board_CLOCK_PIN_Reset(); + L6208_Board_Delay(2); + L6208_Board_HALF_FULL_PIN_Reset(); + /* Set system flag */ + L6208_SetSysFlag(wavestep); + break; + case STEP_MODE_1_4: + /* Set the Half/Full pin low and Reset */ + L6208_Board_HALF_FULL_PIN_Reset(); + L6208_Board_Reset(); + /* Set system flag */ + L6208_SetSysFlag(microstep); + devicePrm.uStepInc = 4; + break; + case STEP_MODE_1_8: + /* Set the Half/Full pin low and Reset */ + L6208_Board_HALF_FULL_PIN_Reset(); + L6208_Board_Reset(); + /* Set system flag */ + L6208_SetSysFlag(microstep); + devicePrm.uStepInc = 2; + break; + case STEP_MODE_1_16: + /* Set the Half/Full pin low and Reset */ + L6208_Board_HALF_FULL_PIN_Reset(); + L6208_Board_Reset(); + /* Set system flag */ + L6208_SetSysFlag(microstep); + devicePrm.uStepInc = 1; + break; + default: + return FALSE; + } + L6208_Board_Delay(2); + L6208_Board_ReleaseReset(); + L6208_ResetSteps(); + return TRUE; +} + +/******************************************************//** + * @brief Select the mode to stop the motor. When the motor + * is stopped, if autoHiZ is TRUE, the power bridges are disabled + * if autoHiZ is FALSE, the power bridges are kept enabled. + * @param[in] deviceId dummy parameter for compatibility with motor.h + * @param[in] stopMode HOLD_MODE to let power bridge enabled + * @retval None + **********************************************************/ +void L6208_SetStopMode(uint8_t deviceId, motorStopMode_t stopMode) +{ + if (stopMode == HOLD_MODE) + { + L6208_ClearSysFlag(HiZstop); + } + else + { + L6208_SetSysFlag(HiZstop); + } +} + +/******************************************************//** + * @brief Set the torque of the specified device + * @param[in] deviceId Unused parameter + * @param[in] torqueMode Torque mode as specified in enum motorTorqueMode_t + * @param[in] torqueValue in % (from 0 to 100) + * @retval None + * @note + **********************************************************/ +void L6208_SetTorque(uint8_t deviceId, motorTorqueMode_t torqueMode, uint8_t torqueValue) +{ + if (torqueValue>100) torqueValue = 100; + switch(torqueMode) + { + case ACC_TORQUE: + devicePrm.accelTorque = torqueValue; + break; + case DEC_TORQUE: + devicePrm.decelTorque = torqueValue; + break; + case RUN_TORQUE: + devicePrm.runTorque = torqueValue; + break; + case HOLD_TORQUE: + devicePrm.holdTorque = torqueValue; + if (devicePrm.motionState != INACTIVE) + { + break; + } + L6208_VectorCalc(devicePrm.holdTorque); + break; + case CURRENT_TORQUE: + devicePrm.curTorqueScaler = torqueValue; + L6208_SetMicrostepSample2Scale(L6208_USTEPS_PER_QUARTER_PERIOD); + default: + break; //ignore error + } +} + +/******************************************************//** + * @brief Stop the motor by using the device deceleration and set deceleration torque + * @param[in] deviceId dummy parameter for compatibility with motor.h + * @retval true if the command is successfully executed, else false + * @note . + **********************************************************/ +bool L6208_SoftStop(uint8_t deviceId) +{ + L6208_VectorCalc(devicePrm.decelTorque); + L6208_SetMotionState(DECELERATINGTOSTOP); + return TRUE; +} + +/******************************************************//** + * @brief Handle the device state machine at each tick timer pulse end. + * @param[in] deviceId dummy parameter for compatibility with motor.h + * @retval None + **********************************************************/ +void L6208_TickHandler(uint8_t deviceId) +{ + uint32_t locMaxSpeedSpt = devicePrm.maxSpeedSpt; + uint32_t locMinSpeedSpt = devicePrm.minSpeedSpt; + + /* Update state, target speed, acceleration and deceleration rates */ + L6208_Board_CLOCK_PIN_Reset(); + + switch(L6208_GetMotionState(0)) + { + /* ============ Velocity control mode states ======================== */ + case ACCELERATING: + /* velocity mode: acceleration phase */ + /* Increase Speed and update position */ + L6208_DoAccel(); + if(locMaxSpeedSpt < devicePrm.speedSpt) + { + /*Target speed reached */ + devicePrm.speedSpt = locMaxSpeedSpt; + L6208_VectorCalc(devicePrm.runTorque); + L6208_SetMotionState(STEADY); + } + break; + case STEADY: + /* velocity mode: constant speed phase */ + /* Update position */ + L6208_DoRun(); + if(locMaxSpeedSpt != devicePrm.speedSpt) + { + /* targeted speed has changed */ + if(locMaxSpeedSpt< devicePrm.speedSpt) + { + /* Slow down the motor */ + L6208_VectorCalc(devicePrm.decelTorque); + L6208_SetMotionState(DECELERATING); + } + else + { + /* speed up the motor */ + L6208_VectorCalc(devicePrm.accelTorque); + L6208_SetMotionState(ACCELERATING); + } + } + break; + case DECELERATING: + /* velocity mode: running motor deceleration phase */ + /* Decrease Speed and update position */ + L6208_DoDecel(); + if(locMaxSpeedSpt > devicePrm.speedSpt) + { + /*Target speed reached but motor has still to be run*/ + devicePrm.speedSpt = locMaxSpeedSpt; + L6208_VectorCalc(devicePrm.runTorque); + L6208_SetMotionState(STEADY); + } + break; + case DECELERATINGTOSTOP: + /* velocity mode: decelerate to stopped phase */ + /* Decrease current speed */ + L6208_DoDecel(); + if(devicePrm.speedSpt == locMinSpeedSpt) + { + if (L6208_IsSysFlag(dir2change)) + { + L6208_ClearSysFlag(running); + /* Change direction */ + if (L6208_IsSysFlag(forward)) + { + /* switch to reverse rotation */ + L6208_SetDirection(0, BACKWARD); + } + else + { + /* switch to forward rotation */ + L6208_SetDirection(0, FORWARD); + } + L6208_SetSysFlag(running); + L6208_SetMotionState(ACCELERATING); + /* Set VRefA and VRefB to the selected acceleration torque */ + L6208_VectorCalc(devicePrm.accelTorque); + } + else + { + if (L6208_IsSysFlag(HiZstop)) + { + L6208_HardHiZ(0); + } + else + { + L6208_HardStop(0); + } + } + } + break; + + /* ============ Position (indexed) control mode states ======================== */ + + case INDEX_ACCEL: + /* position mode: acceleration state*/ + + /* Increase Speed and update position */ + L6208_DoAccel(); + + if(devicePrm.positionTarget1 <= devicePrm.step) + { + /* End of acceleration phase */ + L6208_VectorCalc(devicePrm.runTorque); + L6208_SetMotionState(INDEX_RUN); + } + break; + + case INDEX_RUN: + /* position mode: constant speed phase */ + + /* Update position */ + L6208_DoRun(); + + if(devicePrm.positionTarget2 <= devicePrm.step) + { + /* reach position targeted for constant speed */ + L6208_VectorCalc(devicePrm.decelTorque); + L6208_SetMotionState(INDEX_DECEL); + } + break; + + case INDEX_DECEL: + /* position mode: deceleration phase */ + + /* Decrease Speed and update position */ + L6208_DoDecel(); + + if(devicePrm.positionTarget3 <= devicePrm.step) + { + /* reach position targeted for deceleration phase */ + /* the motor terminated its run */ + /* the torque will be the deceleration one */ + devicePrm.step = devicePrm.positionTarget3; + L6208_SetMotionState(INDEX_DWELL); + } + break; + + case INDEX_DWELL: + /* position mode: dwelling state */ + if(devicePrm.dwellCounter > 0) + { + /* decrease the dwelling wait tick counter */ + devicePrm.dwellCounter--; + } + if(devicePrm.dwellCounter == 0) + { + /* dwelling wait time is elapsed */ + /* so stop the motor */ + if (L6208_IsSysFlag(HiZstop)) + { + L6208_HardHiZ(0); + } + else + { + L6208_HardStop(0); + } + } + break; + + /* ============ stopped state ======================== */ + case INACTIVE: + { + if(L6208_IsSysFlag(running)) + { + /* clear the user move command executing */ + /* and the motor running flags */ + L6208_ClearSysFlag(running); + } + break; + } + default: + break; + } /* switch(L6208_GetMotionState(0)) */ + if(L6208_GetMotionState(0) != INACTIVE) + { + if (L6208_IsSysFlag(microstep)) + { + /* Microstep handling */ + switch(devicePrm.uStepInc) + { + default: + case 1: + /* 1 microstep increment */ + devicePrm.lsbTicks = (uint8_t)(devicePrm.ticks>>16); + break; + + case 2: + /* 2 microsteps increment */ + devicePrm.lsbTicks = (uint8_t)(devicePrm.ticks>>17); + break; + + case 4: + /* 4 microsteps increment */ + devicePrm.lsbTicks = (uint8_t)(devicePrm.ticks>>18); + break; + } + devicePrm.lsbTicks &= 0x01; + if(devicePrm.lsbOldUSteppingTicks != devicePrm.lsbTicks) + { + /* waveform sample to update */ + devicePrm.lsbOldUSteppingTicks = devicePrm.lsbTicks; + devicePrm.step++; + if (L6208_IsSysFlag(forward)) + { + /* the motor is going forward */ + devicePrm.absolutePos++; + /* Reset the absolute motor position in step/microsteps */ + /* Get next microstep sample */ + devicePrm.uStepSample += devicePrm.uStepInc; + if(devicePrm.uStepSample > 31) + { + devicePrm.uStepSample = 0; + } + } + else + { + /* the motor is going backward */ + devicePrm.absolutePos--; + if(devicePrm.uStepSample >= devicePrm.uStepInc) + { + /* Get previous microstep sample */ + devicePrm.uStepSample -= devicePrm.uStepInc; + } + else + { + devicePrm.uStepSample = 32 - devicePrm.uStepInc; + } + } + /* set the PWM to update VRefs */ + L6208_Board_VrefPwmSetDutyCycle(BRIDGE_A, pMicroTable2[devicePrm.uStepSample], FALSE); + L6208_Board_VrefPwmSetDutyCycle(BRIDGE_B, microTable1[devicePrm.uStepSample], FALSE); + if(devicePrm.uStepsample2update > 0) + { + /* the waveform samples table has been recalculated + so update the waveform scanning table */ + L6208_UpdateScanWaveformTable(); + devicePrm.uStepsample2update = 0; + } + } + /* Microstep: use the bit4 toggling as step clock */ + /* this bit is used because there are 16 microstep samples per quarter period */ + devicePrm.lsbTicks = (uint8_t)((devicePrm.uStepSample>>4) & 0x01); + if(devicePrm.lsbOldTicks != devicePrm.lsbTicks) + { + /* the selected bit status changed ==> get the next motor step + save the current masked motor tick position for step setting scope ... */ + devicePrm.lsbOldTicks = devicePrm.lsbTicks; + L6208_Board_CLOCK_PIN_Set(); + } + } + else + { + /* Full and half step handling code */ + if(!L6208_IsSysFlag(halfstep)) + { + /* Full step: use the bit 16 toggling as step clock */ + devicePrm.lsbTicks = (uint8_t)((devicePrm.ticks>>16) & 0x00000001); + } + else + { + /* half step: use the bit 15 toggling as step clock */ + devicePrm.lsbTicks = (uint8_t)((devicePrm.ticks>>15) & 0x00000001); + } + if(devicePrm.lsbOldTicks != devicePrm.lsbTicks) + { + /* the selected bit status changed ==> get the next motor step */ + devicePrm.step++; + if(L6208_IsSysFlag(forward)) + { + /* the motor is going forward */ + devicePrm.absolutePos++; + } + else + { + /* the motor is going backward */ + devicePrm.absolutePos--; + } + /* save the current masked motor tick position for step setting scope ... */ + devicePrm.lsbOldTicks = devicePrm.lsbTicks; + L6208_Board_CLOCK_PIN_Set(); + } + } + } + L6208_UstepWaveformHandling(); +} + +/******************************************************//** + * @brief Get the frequency of VREFA and VREFB PWM + * @param[in] deviceId dummy parameter for compatibility with motor.h + * @retval the frequency of VREFA and VREFB PWM in Hz + * @note + **********************************************************/ +uint32_t L6208_VrefPwmGetFreq(uint8_t deviceId) + { + return devicePrm.vrefPwmFreq; +} + +/******************************************************//** + * @brief Set the frequency of the VREFA and VREFB PWM + * @param[in] deviceId dummy parameter for compatibility with motor.h + * @param[in] newFreq in Hz + * @retval None + * @note + **********************************************************/ +void L6208_VrefPwmSetFreq(uint8_t deviceId, uint32_t newFreq) +{ + if (!L6208_Board_VrefPwmFreqCheck(newFreq)) L6208_ErrorHandler(L6208_ERROR_SET_PWM); + devicePrm.vrefPwmFreq = newFreq; + /* Re-Initialise the PWMs -----------------------------------------------------*/ + L6208_Board_VrefPwmInit(BRIDGE_A, devicePrm.vrefPwmFreq); + L6208_Board_VrefPwmInit(BRIDGE_B, devicePrm.vrefPwmFreq); + /* Recompute the waveform samples according to the new PWM frequency */ + L6208_ScaleWaveformTable(); + /* Update the waveform scanning table */ + L6208_UpdateScanWaveformTable(); + if (L6208_IsSysFlag(running)) + { + L6208_Board_VrefPwmStart(BRIDGE_A, devicePrm.vrefPwmFreq); + L6208_Board_VrefPwmStart(BRIDGE_B, devicePrm.vrefPwmFreq); + } +} + +/******************************************************//** + * @brief Lock while motor is running + * @param[in] deviceId dummy parameter for compatibility with motor.h + * @retval None + **********************************************************/ +void L6208_WaitWhileActive(uint8_t deviceId) +{ + /* Wait while motor is running */ + while (L6208_IsSysFlag(running)); +} + +/** + * @} + */ + +/* ------------------------------------------------------------------------- */ +/* Private functions ------------------------------------------------------- */ +/* ------------------------------------------------------------------------- */ +/******************************************************//** + * @brief Clear the bit/s of flags according to the specified mask + * @param[in] mask flag bit mask + * @retval None + **********************************************************/ +inline void L6208_ClearSysFlag(uint32_t mask) + { + devicePrm.flags &= ~mask; +} + +/******************************************************//** + * @brief Compute the number of steps at the end of the accereration/deceleration phase + * P = position in steps at the end of the acceleration/deceleration phase + * T = acceleration/deceleration time in seconds + * A = acceleration/deceleration rate in steps per second per second (steps/sec^2) + * V = peak velocity during acceleration/deceleration phase + * V1 = average velocity during acceleration/deceleration phase + * T = V/A + * V1 = V/2 + * P = V1*T + * P = V^2/2A + * @param accOrDecRate acceleration/deceleration rate in steps per second per second (steps/sec^2) + * @retval end position or 0xFFFFFFFF on error + **********************************************************/ +uint32_t L6208_ComputeNbAccOrDecSteps(uint16_t accOrDecRate) + { + uint32_t nbAccOrDecSteps; + uint32_t locMaxSpeedSps = (uint32_t)devicePrm.maxSpeedSps; + + if (L6208_IsSysFlag(microstep)) + { + switch(devicePrm.uStepInc) + { + case 1: + locMaxSpeedSps = (uint32_t)devicePrm.maxSpeedSps; + break; + case 2: + locMaxSpeedSps = ((uint32_t)devicePrm.maxSpeedSps)>>1; + accOrDecRate >>= 1; + break; + case 4: + locMaxSpeedSps = ((uint32_t)devicePrm.maxSpeedSps)>>2; + accOrDecRate >>= 2; + break; + default: + break; + } + } + else if (L6208_IsSysFlag(halfstep)) + { + locMaxSpeedSps = ((uint32_t)devicePrm.maxSpeedSps)<<1; + accOrDecRate <<= 1; + } + + if(accOrDecRate == 0) + { + /* division by 0 error */ + return 0xFFFFFFFF; + } + nbAccOrDecSteps = locMaxSpeedSps * locMaxSpeedSps; + nbAccOrDecSteps /= (uint32_t)accOrDecRate; + nbAccOrDecSteps /= 2; + + return nbAccOrDecSteps; + } + +/******************************************************//** + * @brief Compute the acceleration/deceleration speed increment value + * @param[in] newAccOrDecRate acceleration or deceleration value (steps/s^2) greater or equal than 24 + * @retval the speed (step/tick) increment value + * LSB = 2^-24 step/tick^2 or 2^-20 microstep/tick^2 + * @note return 0 if the rate is too low or if the tick frequency is too small + * or if the device is running in position mode + **********************************************************/ +uint16_t L6208_ConvertAcceDecelRateValue(uint16_t newAccOrDecRate) +{ + uint64_t tmp64; + uint32_t tmp32; + + if (((L6208_IsSysFlag(running))&&(L6208_IsSysFlag(positionmode)))||\ + (newAccOrDecRate < L6208_MIN_ACC_DEC_RATE)) + { + return 0; + } + /* Compute (tick frequency)^2 */ + tmp32 = (uint32_t)L6208_Board_TickGetFreq(); + tmp32 *= tmp32; + /* Return 0 if the (tick frequency)^2 is too small */ + if ( tmp32 < (uint32_t)newAccOrDecRate ) + { + return 0; +} + /* Compute the decimal number of microstep or step per tick^2 */ + /* Decimal part is on 32 bits */ + tmp64 = (uint64_t)newAccOrDecRate << 32; + tmp64 /= ((uint64_t)tmp32); + + return (uint16_t)((tmp64 & 0x00000000FFFFFFFF)>>8); +} + +/******************************************************//** + * @brief Compute next position and speed according to the acceleration rate + * @retval None + **********************************************************/ +void L6208_DoAccel(void) +{ + /* Increase speed by acceleration rate */ + uint32_t locAccelerationSpt2 = (uint32_t)devicePrm.accelerationSpt2; + uint32_t locMinSpeedSpt = devicePrm.minSpeedSpt; + if ((devicePrm.speedSpt + locAccelerationSpt2) < locMinSpeedSpt) + { + devicePrm.speedSpt = locMinSpeedSpt; + } + else + { + devicePrm.speedSpt += locAccelerationSpt2; + } + /* Compute next position */ + L6208_DoRun(); +} + +/******************************************************//** + * @brief Compute next position and speed according to the deceleration rate + * @retval None + **********************************************************/ +void L6208_DoDecel(void) +{ + /* Decrease current speed by deceleration rate */ + uint32_t locDecelerationSpt2 = (uint32_t)devicePrm.decelerationSpt2; + uint32_t locMinSpeedSpt = devicePrm.minSpeedSpt; + if((devicePrm.speedSpt - locMinSpeedSpt) > (uint32_t)locDecelerationSpt2) + { + devicePrm.speedSpt -= (uint32_t)locDecelerationSpt2; + } + else + { + /* Set minimum speed */ + devicePrm.speedSpt = locMinSpeedSpt; + } + /* Compute next position */ + L6208_DoRun(); +} + +/******************************************************//** + * @brief Compute next position by adding current speed + * @retval None + **********************************************************/ +void L6208_DoRun(void) +{ + devicePrm.ticks += (devicePrm.speedSpt >> 8) & 0x0000FFFF; +} + +/******************************************************//** + * @brief Get number of samples to rescale + * @retval uStepsample2scale the number of micro stepping waveform samples to rescale + **********************************************************/ +uint8_t L6208_GetMicrostepSample2Scale(void) +{ + return devicePrm.uStepsample2scale; +} + +/******************************************************//** + * @brief Initialize the system for position mode motor moving command + * P = total move distance in steps + * P1 = steps required to accel from 0 to V + * P2 = steps required to decel from V to 0 + * V = peak velocity in steps per second (steps/sec) + * V1 = average velocity during accel or decel* + * A = required accel rate in steps per second per second (steps/sec2) + * D = required decel rate in steps per second per second (steps/sec2) + * T1 = acceleration time in seconds + * T2 = deceleration time in seconds* + * + * 1) T1 = V / A + * 2) V1 = V / 2 + * 3) P1 = V1 T1 + * Substituting 1 and 2 into 3 yields: + * 4) P1 = V2 / 2A + * In the same manner we have: + * 5) P2 = V2 / 2D + * + * P1 = PD/(D+A) + * + * \sa Application Note: AN2044 + * @retval None + **********************************************************/ +void L6208_Indexmodeinit(void) + { + uint32_t tmpVal0; + uint32_t tmpVal1; + uint32_t locAccelSteps; + uint32_t locDecSteps; + + /* calculate the number of steps to get the running speed */ + locAccelSteps = L6208_ComputeNbAccOrDecSteps(devicePrm.accelerationSps2); + /* calculate the number of steps to get the motor stopped */ + locDecSteps = L6208_ComputeNbAccOrDecSteps(devicePrm.decelerationSps2); + if(( locAccelSteps + locDecSteps ) > devicePrm.positionTarget) + { + /* Triangular move needed */ + /* accelsteps = P1 = PD/(D+A) */ + tmpVal0 = devicePrm.positionTarget * devicePrm.decelerationSps2; + tmpVal1 = (uint32_t)devicePrm.decelerationSps2; + tmpVal1 += (uint32_t)devicePrm.accelerationSps2; + locAccelSteps = tmpVal0 / tmpVal1; + devicePrm.positionTarget1 = locAccelSteps; + devicePrm.positionTarget2 = devicePrm.positionTarget1 + 1; + devicePrm.positionTarget3 = devicePrm.positionTarget; + if(devicePrm.positionTarget1 == 0) + { + devicePrm.positionTarget1 = 1; + } + } + else + { + /* trapezoidal move needed */ + /* P1 = V^2/2A */ + /* P2 = P - V^2/2D */ + devicePrm.positionTarget1 = locAccelSteps; + devicePrm.positionTarget2 = devicePrm.positionTarget - locDecSteps; + devicePrm.positionTarget3 = devicePrm.positionTarget; + } + L6208_SetMotionState(INDEX_ACCEL); +} + +/******************************************************//** + * @brief Check the bit/s of flags according to the specified mask + * @param[in] mask flag bit mask + * @retval TRUE if the bit of the mask are set + **********************************************************/ +inline bool L6208_IsSysFlag(uint32_t mask) + { + return (bool)((devicePrm.flags & mask) == mask); + } + +/******************************************************//** + * @brief Stepper driver device step state reset subroutine + * @retval None + **********************************************************/ +void L6208_ResetSteps(void) + { + devicePrm.speedSpt = 0; // reset the current speed value + devicePrm.ticks = 0; // reset the current ticks counter value + devicePrm.step = 0; // reset the current step counter value + devicePrm.lsbOldTicks = 0; // reset copy of the previous position (tick) + devicePrm.lsbOldUSteppingTicks = 0; // reset copy of the previous position (tick) ( micro stepping ) + devicePrm.lsbTicks = 0; // reset copy of the current position (tick) + devicePrm.absolutePos = 0; // reset the absolute motor position in step/microsteps + devicePrm.uStepSample = 0; // reset the microstepping waveform sample index +} + +/******************************************************//** + * @brief Compute the specified micro stepping waveform sample with the + * current selected torque and pwm period + * @param[in] sampleIndex sample Index + * @retval scaled sample value + **********************************************************/ +uint32_t L6208_ScaleWaveformSample(uint8_t sampleIndex) +{ + uint32_t sample; + + sample = (uint32_t)RefMicroTable[sampleIndex]; + sample *= L6208_Board_VrefPwmGetPeriod(); + sample >>= (uint32_t)L6208_SINE_WAVEFORM_POWER_OF_TWO_MAX_VALUE; + + sample *= (uint32_t)devicePrm.curTorqueScaler; // torque val (%) + sample /= (uint32_t)100; + + return sample; + } + +/******************************************************//** + * @brief Compute the micro stepping waveform sample table samples with the + * current selected torque and pwm period + * @retval None + **********************************************************/ +void L6208_ScaleWaveformTable(void) +{ + uint8_t index; + for(index=0; index<=L6208_USTEPS_PER_QUARTER_PERIOD; index++) + { + /* Calculate the scaled sample and save its value into the waveform to update table */ + updatedMicroTable[index] = (uint16_t)L6208_ScaleWaveformSample(index); + } +} + +/******************************************************//** + * @brief Set the parameters of the device to values of the structure pointed + * by pInitDevicePrm. Set GPIO according to these values. + * @param pInitDevicePrm pointer onto the structure containing values to + * initialize the device parameters. + * @retval None + **********************************************************/ +void L6208_SetDeviceParamsToGivenValues(l6208_Init_t* pInitDevicePrm) +{ + memset(&devicePrm, 0, sizeof(devicePrm)); + L6208_SetAcceleration(0, pInitDevicePrm->accelerationSps2); + L6208_SetDeceleration(0, pInitDevicePrm->decelerationSps2); + L6208_SetMaxSpeed(0, pInitDevicePrm->maxSpeedSps); + L6208_SetMinSpeed(0, L6208_MIN_SPEED); + devicePrm.accelTorque = pInitDevicePrm->accelTorque; + devicePrm.decelTorque = pInitDevicePrm->decelTorque; + devicePrm.runTorque = pInitDevicePrm->runTorque; + devicePrm.holdTorque = pInitDevicePrm->holdTorque; + /* Only once acceleration, deceleration, min speed and max speed have been */ + /* initialized, set the step mode */ + devicePrm.stepMode = pInitDevicePrm->stepMode; + L6208_SetDecayMode(0, pInitDevicePrm->decayMode); + devicePrm.moveDwellTime = pInitDevicePrm->moveDwellTime; + if (L6208_CONF_PARAM_AUTO_HIZ_STOP) L6208_SetSysFlag(pInitDevicePrm->autoHiZstop); + if (!L6208_Board_VrefPwmFreqCheck(pInitDevicePrm->vrefPwmFreq)) + L6208_ErrorHandler(L6208_ERROR_SET_PWM); + devicePrm.vrefPwmFreq = pInitDevicePrm->vrefPwmFreq; + /* Initialize current stepper state machine index */ + L6208_SetMotionState(INACTIVE); +} + +/******************************************************//** + * @brief Set the parameters of the device to predefined values + * Set GPIO according to these values + * from l6208_target_config.h + * @retval None + **********************************************************/ +void L6208_SetDeviceParamsToPredefinedValues(void) + { + memset(&devicePrm, 0, sizeof(devicePrm)); + L6208_SetAcceleration(0, L6208_CONF_PARAM_ACC_RATE); + L6208_SetDeceleration(0, L6208_CONF_PARAM_DEC_RATE); + L6208_SetMaxSpeed(0, L6208_CONF_PARAM_RUNNING_SPEED); + L6208_SetMinSpeed(0, L6208_MIN_SPEED); + devicePrm.accelTorque = L6208_CONF_PARAM_ACC_CURRENT; + devicePrm.decelTorque = L6208_CONF_PARAM_DEC_CURRENT; + devicePrm.runTorque = L6208_CONF_PARAM_RUNNING_CURRENT; + devicePrm.holdTorque = L6208_CONF_PARAM_HOLDING_CURRENT; + /* Only once acceleration, deceleration, min speed and max speed have been */ + /* initialized, set the step mode */ + devicePrm.stepMode = L6208_CONF_PARAM_STEP_MODE; + L6208_SetDecayMode(0, L6208_CONF_PARAM_DECAY_MODE); + devicePrm.moveDwellTime = L6208_CONF_PARAM_DWELL_TIME; + if (L6208_CONF_PARAM_AUTO_HIZ_STOP) L6208_SetSysFlag(HiZstop); + if (!L6208_Board_VrefPwmFreqCheck(L6208_CONF_VREF_PWM_FREQUENCY)) + L6208_ErrorHandler(L6208_ERROR_SET_PWM); + devicePrm.vrefPwmFreq = L6208_CONF_VREF_PWM_FREQUENCY; + /* Initialize current stepper state machine index */ + L6208_SetMotionState(INACTIVE); + } + +/******************************************************//** + * @brief Set the number of micro stepping waveform samples to rescale + * @param[in] value number of micro stepping waveform samples + * @retval None + **********************************************************/ +void L6208_SetMicrostepSample2Scale(uint8_t value) +{ + // clamp to maximum number of samples per period/4 + if(value > L6208_USTEPS_PER_QUARTER_PERIOD) + { + value = L6208_USTEPS_PER_QUARTER_PERIOD; + } + devicePrm.uStepsample2scale = value; +} + +/******************************************************//** + * @brief Set the number of micro stepping waveform samples to update into scanning + * @param[in] value number of micro stepping waveform samples + * @retval None + **********************************************************/ +void L6208_SetMicrostepSample2Update(uint8_t value) +{ + // clamp to maximum number of samples per period/4 + if(value > L6208_USTEPS_PER_QUARTER_PERIOD) + { + value = L6208_USTEPS_PER_QUARTER_PERIOD; + } + devicePrm.uStepsample2update = value; + } + +/******************************************************//** + * @brief Set the stepper state machine index + * @param[in] newMotionState + * @retval None + **********************************************************/ +void L6208_SetMotionState(motorState_t newMotionState) +{ + // sets the new stepper state machine index + devicePrm.motionState = newMotionState; +} + +/******************************************************//** + * @brief Set the user selected speed in step/tick + * @param[in] newSpeed speed value (step/s) + * @param[in] pSpeed pointer to the selected speed field + * @retval return FALSE if the speed is too low or too high + * or if the device is running in position mode, else TRUE + **********************************************************/ +bool L6208_SetSpeed(uint16_t newSpeed, uint32_t volatile *pSpeed) +{ + uint64_t tmp64; + uint32_t tmp32; + + if (((L6208_IsSysFlag(running))&&(L6208_IsSysFlag(positionmode)))||\ + (newSpeed < L6208_MIN_SPEED)) + { + return FALSE; + } + tmp32 = (uint32_t)L6208_Board_TickGetFreq(); + if (tmp32 < newSpeed) + { + return FALSE; + } + /* Compute the decimal number of microstep or step per tick */ + /* Decimal part is on 32 bits */ + tmp64 = (uint64_t)newSpeed << 32; + tmp64 /= ((uint64_t)tmp32); + /* set the running constant speed value (step/tick) */ + *pSpeed = (uint32_t)((tmp64 & 0x00000000FFFFFFFF)>>8); + + return TRUE; +} + +/******************************************************//** + * @brief Set the bit/s of flags according to the specified mask + * @param[in] mask flag bit mask + * @retval None + **********************************************************/ +inline void L6208_SetSysFlag(uint32_t mask) + { + devicePrm.flags |= mask; +} + +/******************************************************//** + * @brief Stepper motor start command + * @retval true on correct command execution + **********************************************************/ +bool L6208_StartMovement(void) +{ + uint32_t tmp; + if (L6208_IsSysFlag(running)) + { + /* Motor is already running ==> quit */ + return FALSE; + } + if (!L6208_IsSysFlag(positionmode)) + { + /* Set the VREFA and VREFB to the selected acc. torque */ + L6208_VectorCalc(devicePrm.accelTorque); + + /* If the speed control mode is selected */ + /* setup the motor acceleration for velocity mode driving */ + L6208_SetMotionState(ACCELERATING); + } + else + { + /* if position control mode is selected, reset the current step counter */ + devicePrm.step = 0; + if(devicePrm.uStepSample > 31) + { + /* check the micro stepping waveform sample index */ + devicePrm.uStepSample = 0; + } + /* Set the position dwelling wait time */ + /* compute number of ticks per millisecond */ + tmp = (uint32_t)L6208_Board_TickGetFreq() / 1000; + /* Compute the dwelling time in ticks => dwellCounter (ticks) */ + devicePrm.dwellCounter = tmp * (uint32_t)devicePrm.moveDwellTime; + if (devicePrm.positionTarget == 0) + { + /* if the position to go is 0 (no move) */ + /* Set the deceleration torque */ + L6208_VectorCalc(devicePrm.decelTorque); + /* Set the dwelling delay state index */ + L6208_SetMotionState(INDEX_DWELL); + } + else + { + /* Set the VREFA and VREFB to the selected acc. torque */ + L6208_VectorCalc(devicePrm.accelTorque); + /* go to the selected position */ + L6208_Indexmodeinit(); + L6208_SetMotionState(INDEX_ACCEL); + } + } + /* Sets the motor running flag */ + L6208_SetSysFlag(running); + /* Start the VREFA and VREFB PWMs */ + L6208_Board_VrefPwmStart(BRIDGE_A, devicePrm.vrefPwmFreq); + L6208_Board_VrefPwmStart(BRIDGE_B, devicePrm.vrefPwmFreq); + if (!(L6208_IsSysFlag(EN_A_set))) + { + /* Enable power bridges */ + L6208_Enable(0); + } + /* Start the tick */ + L6208_Board_TickStart(); + + return TRUE; +} + +/******************************************************//** + * @brief Update the micro stepping waveform samples table with the + * values previously scaled with current selected torque and tick period + * @retval None + **********************************************************/ +void L6208_UpdateScanWaveformTable(void) +{ + uint8_t index; + + for(index=0; index<=L6208_USTEPS_PER_QUARTER_PERIOD; index++) + { + microTable1[index] = updatedMicroTable[index]; + microTable1[L6208_USTEPS_PER_QUARTER_PERIOD*2 - index] = microTable1[index]; + microTable1[index + L6208_USTEPS_PER_QUARTER_PERIOD*2] = updatedMicroTable[index]; + } + /* clear the number of samples to update */ + L6208_SetMicrostepSample2Update(0); +} + +/******************************************************//** + * @brief Check if there are waveform samples to rescale and if so, perform the rescaling + * @retval None + **********************************************************/ +void L6208_UstepWaveformHandling(void) +{ + /* micro stepper waveform samples rescaling ... and updating */ + if(L6208_GetMicrostepSample2Scale() > 0) + { + /* Current torque value has been changed, so recalculate the waveform table */ + L6208_ScaleWaveformTable(); + + /* Set the number of samples to update */ + L6208_SetMicrostepSample2Update(L6208_USTEPS_PER_QUARTER_PERIOD); + + /* Reset the number of samples to rescaled afer rescaling */ + L6208_SetMicrostepSample2Scale(0); + } +} + +/******************************************************//** + * @brief Set the current torque value (Vref) + * @param[in] newTorque Selected torque value + * @retval always TRUE + **********************************************************/ +bool L6208_VectorCalc(uint8_t newTorque) +{ + /* save current selected torque value */ + devicePrm.curTorqueScaler = newTorque; + + if(!L6208_IsSysFlag(microstep)) + { + /* full/half step mode or the motor is not running */ + /* set the PWM duty cycle according to the current torque value (%). */ + /* The TON value will be calculated inside the TIMx_PWM_duty_setup f(). */ + L6208_Board_VrefPwmSetDutyCycle(BRIDGE_A, devicePrm.curTorqueScaler, TRUE); + L6208_Board_VrefPwmSetDutyCycle(BRIDGE_B, devicePrm.curTorqueScaler, TRUE); + } + else + { + /* microstep mode */ + if(L6208_IsSysFlag(running)) + { + /* set the number of waveform sample to rescale according current selected */ + /* torque value */ + L6208_SetMicrostepSample2Scale(L6208_USTEPS_PER_QUARTER_PERIOD); + } + else + { + /* micro stepping mode motor stopped */ + /* Recompute the waveform samples according to the new PWM frequency */ + L6208_ScaleWaveformTable(); + /* Update the waveform scanning table */ + L6208_UpdateScanWaveformTable(); + /* Set the VREF timer PWM TON to update VREFA and VREFB */ + L6208_Board_VrefPwmSetDutyCycle(BRIDGE_A, pMicroTable2[devicePrm.uStepSample], FALSE); + L6208_Board_VrefPwmSetDutyCycle(BRIDGE_B, microTable1[devicePrm.uStepSample], FALSE); + } + } + return TRUE; +} + +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ + +/******************* (C) COPYRIGHT 2016 STMicroelectronics *****END OF FILE****/ diff --git a/stepper/steppermotor_F401RE/Core/Src/main.c b/stepper/steppermotor_F401RE/Core/Src/main.c new file mode 100644 index 0000000..468e5a3 --- /dev/null +++ b/stepper/steppermotor_F401RE/Core/Src/main.c @@ -0,0 +1,539 @@ +/** + ****************************************************************************** + * @file Multi/Examples/MotionControl/IHM05A1_ExampleFor1Motor/Src/main.c + * @author IPC Rennes + * @version V1.5.0 + * @date June 1st, 2018 + * @brief This example shows how to use 1 IHM05A1 expansion board + ****************************************************************************** + * @attention + * + *

© COPYRIGHT(c) 2016 STMicroelectronics

+ * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. Neither the name of STMicroelectronics nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + ****************************************************************************** + */ + +/* Includes ------------------------------------------------------------------*/ +#include "main.h" + +/** @defgroup IHM05A1_Example_for_1_motor_device + * @{ + */ + +/* Private typedef -----------------------------------------------------------*/ +/* Private define ------------------------------------------------------------*/ +/* Private macro -------------------------------------------------------------*/ +/* Private variables ---------------------------------------------------------*/ +static volatile uint16_t gLastError; + +/* Initialization parameters. */ +l6208_Init_t initDeviceParameters = +{ + 1500, //Acceleration rate in step/s^2 or (1/16)th step/s^2 for microstep modes + 20, //Acceleration current torque in % (from 0 to 100) + 1500, //Deceleration rate in step/s^2 or (1/16)th step/s^2 for microstep modes + 20, //Deceleration current torque in % (from 0 to 100) + 1500, //Running speed in step/s or (1/16)th step/s for microstep modes + 10, //Running current torque in % (from 0 to 100) + 5, //Holding current torque in % (from 0 to 100) + STEP_MODE_1_16, //Step mode via enum motorStepMode_t + FAST_DECAY, //Decay mode via enum motorDecayMode_t + 0, //Dwelling time in ms + FALSE, //Automatic HIZ STOP + 100000 //VREFA and VREFB PWM frequency (Hz) +}; + +/* Private function prototypes -----------------------------------------------*/ +static void MyFlagInterruptHandler(void); +void ButtonHandler(void); + +/* Private functions ---------------------------------------------------------*/ + +/** + * @brief Main program + * @param None + * @retval None + */ +int main(void) +{ + int32_t pos; + uint16_t mySpeed; + uint32_t freqPwm; + + /* STM32xx HAL library initialization */ + HAL_Init(); + + /* Configure the system clock */ + SystemClock_Config(); + +//----- Init of the Motor control library + /* Set the L6208 library to use 1 device */ + BSP_MotorControl_SetNbDevices(BSP_MOTOR_CONTROL_BOARD_ID_L6208, 1); + /* When BSP_MotorControl_Init is called with NULL pointer, */ + /* the L6208 parameters are set with the predefined values from file */ + /* l6208_target_config.h, otherwise the parameters are set using the */ + /* initDeviceParameters structure values. */ + BSP_MotorControl_Init(BSP_MOTOR_CONTROL_BOARD_ID_L6208, NULL); + //BSP_MotorControl_Init(BSP_MOTOR_CONTROL_BOARD_ID_L6208, &initDeviceParameters); + + /* Attach the function MyFlagInterruptHandler (defined below) to the flag interrupt */ + BSP_MotorControl_AttachFlagInterrupt(MyFlagInterruptHandler); + + /* Attach the function MyErrorHandler (defined below) to the error Handler*/ + BSP_MotorControl_AttachErrorHandler(MyErrorHandler); + +//----- Configure Button for user interaction + + /* Set Systick Interrupt priority highest to ensure no lock by using HAL_Delay */ + HAL_NVIC_SetPriority(SysTick_IRQn, 0x0, 0x0); + + /* Configure KEY Button */ + BSP_PB_Init(BUTTON_KEY, BUTTON_MODE_EXTI); + +//----- Disable the power bridges after initialization of the L6208 device + + /* Disable the power bridges after initialization */ + BSP_MotorControl_CmdDisable(0); + + /* Wait for 2 seconds */ + HAL_Delay(2000); + +//----- Get the PWM frequency used for the VREFA and VREFB voltage generation + + freqPwm = BSP_MotorControl_GetBridgeInputPwmFreq(0); + +//----- Set the PWM frequency used for the VREFA and VREFB voltage generation + + BSP_MotorControl_SetBridgeInputPwmFreq(0, freqPwm>>1); + +//----- Move of 16000 microsteps in the FW direction + + /* Move device 16000 microsteps in the FORWARD direction */ + BSP_MotorControl_Move(0, FORWARD, 16000); + + /* Wait for the motor ends moving */ + BSP_MotorControl_WaitWhileActive(0); + + /* Wait for 2 seconds */ + HAL_Delay(2000); + +//----- Move of 16000 microsteps in the BW direction + + /* Move device 16000 microsteps in the BACKWARD direction*/ + BSP_MotorControl_Move(0, BACKWARD, 16000); + + /* Wait for the motor ends moving */ + BSP_MotorControl_WaitWhileActive(0); + + /* Get current position */ + pos = BSP_MotorControl_GetPosition(0); + + /* Set the current position to be the Home position */ + BSP_MotorControl_SetHome(0, pos); + + /* Wait for 2 seconds */ + HAL_Delay(2000); + +//----- Go to position -6400 + + /* Request to go to position -6400 */ + BSP_MotorControl_GoTo(0, -6400); + + /* Wait for the motor ends moving */ + BSP_MotorControl_WaitWhileActive(0); + + /* Get current position */ + pos = BSP_MotorControl_GetPosition(0); + + if (pos != -6400) + { + MyErrorHandler(L6208_ERROR_POSITION); + } + + /* Get current position */ + pos = BSP_MotorControl_GetPosition(0); + + /* Set the current position to be the Mark position */ + BSP_MotorControl_SetMark(0, pos); + + /* Wait for 2 seconds */ + HAL_Delay(2000); + +//----- Go Home + + /* Request to go to Home */ + BSP_MotorControl_GoHome(0); + BSP_MotorControl_WaitWhileActive(0); + + /* Get current position */ + pos = BSP_MotorControl_GetPosition(0); + + /* Wait for 2 seconds */ + HAL_Delay(2000); + +//----- Go to position 6400 + + /* Request to go to position 6400 */ + BSP_MotorControl_CmdGoToDir(0, FORWARD, 6400); + + /* Wait for the motor ends moving */ + BSP_MotorControl_WaitWhileActive(0); + + /* Get current position */ + pos = BSP_MotorControl_GetPosition(0); + + /* Wait for 2 seconds */ + HAL_Delay(2000); + +//----- Go Mark which was set previously after go to -6400 + + /* Request to go to Mark position */ + BSP_MotorControl_GoMark(0); + + /* Wait for the motor ends moving */ + BSP_MotorControl_WaitWhileActive(0); + + /* Get current position */ + pos = BSP_MotorControl_GetPosition(0); + + /* Wait for 2 seconds */ + HAL_Delay(2000); + +//----- Run the motor BACKWARD + + /* Request to run BACKWARD */ + BSP_MotorControl_Run(0, BACKWARD); + HAL_Delay(5000); + + /* Get current speed */ + mySpeed = BSP_MotorControl_GetCurrentSpeed(0); + +//----- Increase the speed while running + + /* Increase speed to 2400 microstep/s */ + BSP_MotorControl_SetMaxSpeed(0, 2400); + HAL_Delay(5000); + + /* Get current speed */ + mySpeed = BSP_MotorControl_GetCurrentSpeed(0); + +//----- Decrease the speed while running + + /* Decrease speed to 1200 microstep/s */ + BSP_MotorControl_SetMaxSpeed(0, 1200); + HAL_Delay(5000); + + /* Get current speed */ + mySpeed = BSP_MotorControl_GetCurrentSpeed(0); + +//----- Increase acceleration while running + + /* Increase acceleration to 2000 microstep/s^2 */ + BSP_MotorControl_SetAcceleration(0, 2000); + HAL_Delay(5000); + + /* Increase speed to 2400 microstep/s */ + BSP_MotorControl_SetMaxSpeed(0, 2400); + HAL_Delay(5000); + + /* Get current speed */ + mySpeed = BSP_MotorControl_GetCurrentSpeed(0); + + if (mySpeed != 2400) + { + MyErrorHandler(L6208_ERROR_SPEED); + } +//----- Increase deceleration while running + + /* Increase deceleration to 2000 microstep/s^2 */ + BSP_MotorControl_SetDeceleration(0, 2000); + HAL_Delay(5000); + + /* Decrease speed to 1200 microstep/s */ + BSP_MotorControl_SetMaxSpeed(0, 1200); + HAL_Delay(5000); + + /* Get current speed */ + mySpeed = BSP_MotorControl_GetCurrentSpeed(0); + +//----- Soft stopped required while running + + /* Request soft stop */ + BSP_MotorControl_SoftStop(0); + + /* Wait for the motor ends moving */ + BSP_MotorControl_WaitWhileActive(0); + + /* Wait for 2 seconds */ + HAL_Delay(2000); + +//----- Run stopped by hardstop + + /* Request to run in FORWARD direction */ + BSP_MotorControl_Run(0, FORWARD); + HAL_Delay(5000); + + /* Request to immediatly stop */ + BSP_MotorControl_HardStop(0); + BSP_MotorControl_WaitWhileActive(0); + + /* Wait for 2 seconds */ + HAL_Delay(2000); + +//----- GOTO stopped by softstop + + /* Request to go to position 20000 */ + BSP_MotorControl_GoTo(0, 20000); + HAL_Delay(5000); + + /* Request to perform a soft stop */ + BSP_MotorControl_SoftStop(0); + BSP_MotorControl_WaitWhileActive(0); + + /* Wait for 2 seconds */ + HAL_Delay(2000); + +//----- Change step mode to full step mode + + /* Select full step mode (normal mode) */ + BSP_MotorControl_SelectStepMode(0, STEP_MODE_FULL); + + /* Set speed, acceleration and deceleration to scale with normal mode */ + /* For normal mode and half step mode, these parameters are in steps/s or /s^2 */ + /* For microstep modes, these parameters are either in (1/16)step/s or /s^2 */ + BSP_MotorControl_SetMaxSpeed(0, BSP_MotorControl_GetMaxSpeed(0)>>4); + BSP_MotorControl_SetMinSpeed(0, L6208_MIN_SPEED); + BSP_MotorControl_SetAcceleration(0, BSP_MotorControl_GetAcceleration(0)>>4); + BSP_MotorControl_SetDeceleration(0, BSP_MotorControl_GetDeceleration(0)>>4); + + /* Request to go position 200 (full steps) */ + BSP_MotorControl_GoTo(0, 200); + + /* Wait for the motor ends moving */ + BSP_MotorControl_WaitWhileActive(0); + + /* Get current position */ + pos = BSP_MotorControl_GetPosition(0); + + if (pos != 200) + { + MyErrorHandler(L6208_ERROR_POSITION); + } + + /* Wait for 2 seconds */ + HAL_Delay(2000); + +//----- Change step mode to half step mode + /* Select half step mode */ + BSP_MotorControl_SelectStepMode(0, STEP_MODE_HALF); + + /* Request to go position -400 (half steps) */ + BSP_MotorControl_GoTo(0, -400); + + /* Wait for the motor ends moving */ + BSP_MotorControl_WaitWhileActive(0); + + /* Get current position */ + pos = BSP_MotorControl_GetPosition(0); + + if (pos != -400) + { + MyErrorHandler(L6208_ERROR_POSITION); + } + + /* Wait for 2 seconds */ + HAL_Delay(2000); + +//----- Change step mode 1/4 microstepping mode + /* Select 1/4 step mode */ + BSP_MotorControl_SelectStepMode(0, STEP_MODE_1_4); + + /* Set speed, acceleration and deceleration to scale with microstep mode */ + /* For normal mode and half step mode, these parameters are in steps/s or /s^2 */ + /* For microstep modes, these parameters are either in (1/16)step/s or /s^2 */ + BSP_MotorControl_SetMaxSpeed(0, BSP_MotorControl_GetMaxSpeed(0)<<4); + BSP_MotorControl_SetMinSpeed(0, L6208_MIN_SPEED); + BSP_MotorControl_SetAcceleration(0, BSP_MotorControl_GetAcceleration(0)<<4); + BSP_MotorControl_SetDeceleration(0, BSP_MotorControl_GetDeceleration(0)<<4); + + /* Request to go position 800 (quarter steps) */ + BSP_MotorControl_GoTo(0, 800); + + /* Wait for the motor ends moving */ + BSP_MotorControl_WaitWhileActive(0); + + /* Get current position */ + pos = BSP_MotorControl_GetPosition(0); + + if (pos != 800) + { + MyErrorHandler(L6208_ERROR_POSITION); + } + + /* Wait for 2 seconds */ + HAL_Delay(2000); + +//----- Change step mode 1/8 microstepping mode + /* Select 1/8 step mode */ + BSP_MotorControl_SelectStepMode(0, STEP_MODE_1_8); + + /* Request to go position -1600 (1/8th steps) */ + BSP_MotorControl_GoTo(0, -1600); + + /* Wait for the motor ends moving */ + BSP_MotorControl_WaitWhileActive(0); + + /* Get current position */ + pos = BSP_MotorControl_GetPosition(0); + + if (pos != -1600) + { + MyErrorHandler(L6208_ERROR_POSITION); + } + + /* Wait for 2 seconds */ + HAL_Delay(2000); + +//----- Restore 1/16 microstepping mode + + /* Reset device to 1/16 microstepping mode */ + BSP_MotorControl_SelectStepMode(0, STEP_MODE_1_16); + + /* Set speed and acceleration at lowest values */ + BSP_MotorControl_SetMaxSpeed(0, L6208_MIN_SPEED); + BSP_MotorControl_SetAcceleration(0, L6208_MIN_ACC_DEC_RATE); + BSP_MotorControl_SetDeceleration(0, L6208_MIN_ACC_DEC_RATE); + + /* Move device 49 microsteps (1/16th steps) in the FORWARD direction*/ + BSP_MotorControl_Move(0, FORWARD, 49); + + /* Wait for the motor ends moving */ + BSP_MotorControl_WaitWhileActive(0); + + /* Get current position */ + pos = BSP_MotorControl_GetPosition(0); + + if (pos != 49) + { + MyErrorHandler(L6208_ERROR_POSITION); + } + + /* Set speed and acceleration from powerspin6208_target_config.h */ + BSP_MotorControl_SetMaxSpeed(0, L6208_CONF_PARAM_RUNNING_SPEED); + BSP_MotorControl_SetAcceleration(0, L6208_CONF_PARAM_ACC_RATE); + BSP_MotorControl_SetDeceleration(0, L6208_CONF_PARAM_DEC_RATE); + + /* Turn off power bridges when motor is stopped */ + BSP_MotorControl_SetStopMode(0, HIZ_MODE); + + /* Infinite loop */ + while(1) + { + /* Request to run */ + BSP_MotorControl_Run(0, BSP_MotorControl_GetDirection(0)); + HAL_Delay(5000); + + /* Request soft stop */ + BSP_MotorControl_SoftStop(0); + HAL_Delay(2000); + } +} + +/** + * @brief This function is the User handler for the flag interrupt + * @param None + * @retval None + */ +void MyFlagInterruptHandler(void) +{ + //When EN pin is forced low by a failure, configure the GPIO as an ouput low + BSP_MotorControl_CmdDisable(0); +} + +/** + * @brief This function is executed in case of error occurrence. + * @param error number of the error + * @retval None + */ +void MyErrorHandler(uint16_t error) +{ + /* Backup error number */ + gLastError = error; + + /* Infinite loop */ + while(1) + { + } +} + +/** + * @brief This function is executed in case of button press and it changes the + * current direction of the motor + * @param None + * @retval None + */ +void ButtonHandler(void) +{ + if (BSP_MotorControl_GetDirection(0) != BACKWARD) + { + BSP_MotorControl_SetDirection(0, BACKWARD); + } + else + { + BSP_MotorControl_SetDirection(0, FORWARD); + } + /* Let 200 ms before clearing the IT for key debouncing */ + HAL_Delay(200); + __HAL_GPIO_EXTI_CLEAR_IT(KEY_BUTTON_PIN); + HAL_NVIC_ClearPendingIRQ(KEY_BUTTON_EXTI_IRQn); +} + +#ifdef USE_FULL_ASSERT + +/** + * @brief Reports the name of the source file and the source line number + * where the assert_param error has occurred. + * @param file: pointer to the source file name + * @param line: assert_param error line source number + * @retval None + */ +void assert_failed(uint8_t* file, uint32_t line) +{ + /* User can add his own implementation to report the file name and line number, + ex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */ + + /* Infinite loop */ + while (1) + { + } +} +#endif + +/** + * @} + */ + + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/stepper/steppermotor_F401RE/Core/Src/stm32f4xx_hal_msp.c b/stepper/steppermotor_F401RE/Core/Src/stm32f4xx_hal_msp.c new file mode 100644 index 0000000..288baa3 --- /dev/null +++ b/stepper/steppermotor_F401RE/Core/Src/stm32f4xx_hal_msp.c @@ -0,0 +1,177 @@ +/** + ****************************************************************************** + * @file Multi/Examples/MotionControl/IHM05A1_ExampleFor1Motor/Src/stm32f4xx_hal_msp.c + * @author IPC Rennes + * @version V1.5.0 + * @date June 1st, 2018 + * @brief HAL MSP module. + ****************************************************************************** + * @attention + * + *

© COPYRIGHT(c) 2016 STMicroelectronics

+ * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. Neither the name of STMicroelectronics nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + ****************************************************************************** + */ + +/* Includes ------------------------------------------------------------------*/ +#include "main.h" + +/** @defgroup MSP_module + * @brief HAL MSP module. + * @{ + */ + +/* Private typedef -----------------------------------------------------------*/ +/* Private define ------------------------------------------------------------*/ +/* Private macro -------------------------------------------------------------*/ +/* Private variables ---------------------------------------------------------*/ + +/* Private function prototypes -----------------------------------------------*/ +extern void BSP_MotorControl_StepClockHandler(uint8_t deviceId); +extern void BSP_MotorControl_FlagInterruptHandler(void); +///ButtonHandler defined in main.c +extern void ButtonHandler(void); +/* Private functions ---------------------------------------------------------*/ + +/** @defgroup HAL_MSP_Private_Functions + * @{ + */ + +/** + * @brief PWM MSP Initialization + * @param[in] htim_pwm PWM handle pointer + * @retval None + */ +void HAL_TIM_PWM_MspInit(TIM_HandleTypeDef* htim_pwm) +{ + GPIO_InitTypeDef GPIO_InitStruct; + if(htim_pwm->Instance == BSP_MOTOR_CONTROL_BOARD_TIMER_TICK) + { + /* Peripheral clock enable */ + __BSP_MOTOR_CONTROL_BOARD_TIMER_TICK_CLCK_ENABLE(); + + /* Set Interrupt Group Priority of Timer Interrupt*/ + HAL_NVIC_SetPriority(BSP_MOTOR_CONTROL_BOARD_TIMER_TICK_IRQn, BSP_MOTOR_CONTROL_BOARD_TIMER_TICK_PRIORITY, 0); + + /* Enable the timer global Interrupt */ + HAL_NVIC_EnableIRQ(BSP_MOTOR_CONTROL_BOARD_TIMER_TICK_IRQn); + } + if(htim_pwm->Instance == BSP_MOTOR_CONTROL_BOARD_TIMER_VREFA_PWM) + { + /* Peripheral clock enable */ + __BSP_MOTOR_CONTROL_BOARD_TIMER_VREFA_PWM_CLCK_ENABLE(); + + /* Configure L6208 - VREFA pin -------------------------------------*/ + GPIO_InitStruct.Pin = BSP_MOTOR_CONTROL_BOARD_VREFA_PIN; + GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; + GPIO_InitStruct.Pull = GPIO_NOPULL; + GPIO_InitStruct.Speed = GPIO_SPEED_MEDIUM; + GPIO_InitStruct.Alternate = BSP_MOTOR_CONTROL_BOARD_AFx_TIMx_VREFA_PWM; + HAL_GPIO_Init(BSP_MOTOR_CONTROL_BOARD_VREFA_PORT, &GPIO_InitStruct); + } + if(htim_pwm->Instance == BSP_MOTOR_CONTROL_BOARD_TIMER_VREFB_PWM) + { + /* Peripheral clock enable */ + __BSP_MOTOR_CONTROL_BOARD_TIMER_VREFB_PWM_CLCK_ENABLE(); + + /* Configure L6208 - VREFB pin -------------------------------------*/ + GPIO_InitStruct.Pin = BSP_MOTOR_CONTROL_BOARD_VREFB_PIN; + GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; + GPIO_InitStruct.Pull = GPIO_NOPULL; + GPIO_InitStruct.Speed = GPIO_SPEED_MEDIUM; + GPIO_InitStruct.Alternate = BSP_MOTOR_CONTROL_BOARD_AFx_TIMx_VREFB_PWM; + HAL_GPIO_Init(BSP_MOTOR_CONTROL_BOARD_VREFB_PORT, &GPIO_InitStruct); + } +} + +/** + * @brief PWM MSP De-Initialization + * @param[in] htim_pwm PWM handle pointer + * @retval None + */ +void HAL_TIM_PWM_MspDeInit(TIM_HandleTypeDef* htim_pwm) +{ + if(htim_pwm->Instance == BSP_MOTOR_CONTROL_BOARD_TIMER_TICK) + { + /* Peripheral clock disable */ + __BSP_MOTOR_CONTROL_BOARD_TIMER_TICK_CLCK_DISABLE(); + } + if(htim_pwm->Instance == BSP_MOTOR_CONTROL_BOARD_TIMER_VREFA_PWM) + { + /* Peripheral clock disable */ + __BSP_MOTOR_CONTROL_BOARD_TIMER_VREFA_PWM_CLCK_DISABLE(); + /* GPIO Deconfiguration */ + HAL_GPIO_DeInit(BSP_MOTOR_CONTROL_BOARD_VREFA_PORT, BSP_MOTOR_CONTROL_BOARD_VREFA_PIN); + } + if(htim_pwm->Instance == BSP_MOTOR_CONTROL_BOARD_TIMER_VREFB_PWM) + { + /* Peripheral clock enable */ + __BSP_MOTOR_CONTROL_BOARD_TIMER_VREFB_PWM_CLCK_DISABLE(); + /* GPIO Deconfiguration */ + HAL_GPIO_DeInit(BSP_MOTOR_CONTROL_BOARD_VREFB_PORT, BSP_MOTOR_CONTROL_BOARD_VREFB_PIN); + } +} + +/** + * @brief PWM Callback + * @param[in] htim PWM handle pointer + * @retval None + */ +void HAL_TIM_PWM_PulseFinishedCallback(TIM_HandleTypeDef *htim) +{ + if ((htim->Instance == BSP_MOTOR_CONTROL_BOARD_TIMER_TICK)&& (htim->Channel == BSP_MOTOR_CONTROL_BOARD_HAL_ACT_CHAN_TIMER_TICK)) + { + if (BSP_MotorControl_GetDeviceState(0) != INACTIVE) + { + BSP_MotorControl_StepClockHandler(0); + } + } +} + +/** + * @brief External Line Callback + * @param[in] GPIO_Pin pin number + * @retval None + */ +void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin) +{ + if (GPIO_Pin == BSP_MOTOR_CONTROL_BOARD_EN_AND_FLAG_PIN) + { + BSP_MotorControl_FlagInterruptHandler(); + } + if (GPIO_Pin == KEY_BUTTON_PIN) + { + ButtonHandler(); + } + } +/** + * @} + */ + +/** + * @} + */ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/stepper/steppermotor_F401RE/Core/Src/stm32f4xx_it.c b/stepper/steppermotor_F401RE/Core/Src/stm32f4xx_it.c new file mode 100644 index 0000000..c3bf1fc --- /dev/null +++ b/stepper/steppermotor_F401RE/Core/Src/stm32f4xx_it.c @@ -0,0 +1,200 @@ +/** + ****************************************************************************** + * @file Multi/Examples/MotionControl/IHM05A1_ExampleFor1Motor/Src/stm32f4xx_it.c + * @author IPC Rennes + * @version V1.5.0 + * @date June 1st, 2018 + * @brief Main Interrupt Service Routines. + * This file provides template for all exceptions handler and + * peripherals interrupt service routine. + ****************************************************************************** + * @attention + * + *

© COPYRIGHT(c) 2016 STMicroelectronics

+ * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. Neither the name of STMicroelectronics nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + ****************************************************************************** + */ + +/* Includes ------------------------------------------------------------------*/ +#include "stm32f4xx_it.h" + +/** @addtogroup Interrupt_Handlers + * @{ + */ + +/* Private typedef -----------------------------------------------------------*/ +/* Private define ------------------------------------------------------------*/ +/* Private macro -------------------------------------------------------------*/ +/* Private variables ---------------------------------------------------------*/ + +extern TIM_HandleTypeDef hTimTick; + +/* Private function prototypes -----------------------------------------------*/ +/* Private functions ---------------------------------------------------------*/ + + +/******************************************************************************/ +/* Cortex-M4 Processor Exceptions Handlers */ +/******************************************************************************/ + +/** + * @brief This function handles NMI exception. + * @param None + * @retval None + */ +void NMI_Handler(void) +{ +} + +/** + * @brief This function handles Hard Fault exception. + * @param None + * @retval None + */ +void HardFault_Handler(void) +{ + /* Go to infinite loop when Hard Fault exception occurs */ + while (1) + { + } +} + +/** + * @brief This function handles Memory Manage exception. + * @param None + * @retval None + */ +void MemManage_Handler(void) +{ + /* Go to infinite loop when Memory Manage exception occurs */ + while (1) + { + } +} + +/** + * @brief This function handles Bus Fault exception. + * @param None + * @retval None + */ +void BusFault_Handler(void) +{ + /* Go to infinite loop when Bus Fault exception occurs */ + while (1) + { + } +} + +/** + * @brief This function handles Usage Fault exception. + * @param None + * @retval None + */ +void UsageFault_Handler(void) +{ + /* Go to infinite loop when Usage Fault exception occurs */ + while (1) + { + } +} + +/** + * @brief This function handles SVCall exception. + * @param None + * @retval None + */ +void SVC_Handler(void) +{ +} + +/** + * @brief This function handles Debug Monitor exception. + * @param None + * @retval None + */ +void DebugMon_Handler(void) +{ +} + +/** + * @brief This function handles PendSVC exception. + * @param None + * @retval None + */ +void PendSV_Handler(void) +{ +} + +/** + * @brief This function handles SysTick Handler. + * @param None + * @retval None + */ +void SysTick_Handler(void) +{ + HAL_IncTick(); +} + +/******************************************************************************/ +/* STM32F4xx Peripherals Interrupt Handlers */ +/* Add here the Interrupt Handler for the used peripheral(s) (PPP), for the */ +/* available peripheral interrupt handler's name please refer to the startup */ +/* file (startup_stm32f4xx.s). */ +/******************************************************************************/ + +/** + * @brief This function handles interrupt for External lines 10 to 15 + * @param None + * @retval None + */ +void EXTI15_10_IRQHandler(void) +{ + HAL_GPIO_EXTI_IRQHandler(BSP_MOTOR_CONTROL_BOARD_EN_AND_FLAG_PIN); + HAL_GPIO_EXTI_IRQHandler(KEY_BUTTON_PIN); +} + +/** + * @brief This function handles TIM4 interrupt request. + * @param None + * @retval None + */ +void TIM4_IRQHandler(void) +{ + HAL_TIM_IRQHandler(&hTimTick); +} +/** + * @brief This function handles PPP interrupt request. + * @param None + * @retval None + */ +/*void PPP_IRQHandler(void) +{ +}*/ + +/** + * @} + */ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/stepper/steppermotor_F401RE/Core/Src/stm32f4xx_nucleo.c b/stepper/steppermotor_F401RE/Core/Src/stm32f4xx_nucleo.c new file mode 100644 index 0000000..2fda2ae --- /dev/null +++ b/stepper/steppermotor_F401RE/Core/Src/stm32f4xx_nucleo.c @@ -0,0 +1,863 @@ +/** + ****************************************************************************** + * @file stm32f4xx_nucleo.c + * @author MCD Application Team + * @brief This file provides set of firmware functions to manage: + * - LEDs and push-button available on STM32F4XX-Nucleo Kit + * from STMicroelectronics + * - LCD, joystick and microSD available on Adafruit 1.8" TFT LCD + * shield (reference ID 802) + ****************************************************************************** + * @attention + * + *

© COPYRIGHT(c) 2017 STMicroelectronics

+ * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. Neither the name of STMicroelectronics nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + ****************************************************************************** + */ + +/* Includes ------------------------------------------------------------------*/ +#include "stm32f4xx_nucleo.h" + +/** @defgroup BSP BSP + * @{ + */ + +/** @defgroup STM32F4XX_NUCLEO STM32F4XX NUCLEO + * @{ + */ + +/** @defgroup STM32F4XX_NUCLEO_LOW_LEVEL STM32F4XX NUCLEO LOW LEVEL + * @brief This file provides set of firmware functions to manage Leds and push-button + * available on STM32F4xx-Nucleo Kit from STMicroelectronics. + * @{ + */ + +/** @defgroup STM32F4XX_NUCLEO_LOW_LEVEL_Private_TypesDefinitions STM32F4XX NUCLEO LOW LEVEL Private TypesDefinitions + * @{ + */ +/** + * @} + */ + + +/** @defgroup STM32F4XX_NUCLEO_LOW_LEVEL_Private_Defines STM32F4XX NUCLEO LOW LEVEL Private Defines + * @{ + */ + +/** + * @brief STM32F4xx NUCLEO BSP Driver version number V1.2.7 + */ +#define __STM32F4xx_NUCLEO_BSP_VERSION_MAIN (0x01) /*!< [31:24] main version */ +#define __STM32F4xx_NUCLEO_BSP_VERSION_SUB1 (0x02) /*!< [23:16] sub1 version */ +#define __STM32F4xx_NUCLEO_BSP_VERSION_SUB2 (0x07) /*!< [15:8] sub2 version */ +#define __STM32F4xx_NUCLEO_BSP_VERSION_RC (0x00) /*!< [7:0] release candidate */ +#define __STM32F4xx_NUCLEO_BSP_VERSION ((__STM32F4xx_NUCLEO_BSP_VERSION_MAIN << 24)\ + |(__STM32F4xx_NUCLEO_BSP_VERSION_SUB1 << 16)\ + |(__STM32F4xx_NUCLEO_BSP_VERSION_SUB2 << 8 )\ + |(__STM32F4xx_NUCLEO_BSP_VERSION_RC)) + +/** + * @brief LINK SD Card + */ +#define SD_DUMMY_BYTE 0xFF +#define SD_NO_RESPONSE_EXPECTED 0x80 + +/** + * @} + */ + +/** @defgroup STM32F4XX_NUCLEO_LOW_LEVEL_Private_Macros STM32F4XX NUCLEO LOW LEVEL Private Macros + * @{ + */ +/** + * @} + */ + +/** @defgroup STM32F4XX_NUCLEO_LOW_LEVEL_Private_Variables STM32F4XX NUCLEO LOW LEVEL Private Variables + * @{ + */ +GPIO_TypeDef* GPIO_PORT[LEDn] = {LED2_GPIO_PORT}; + +const uint16_t GPIO_PIN[LEDn] = {LED2_PIN}; + +GPIO_TypeDef* BUTTON_PORT[BUTTONn] = {KEY_BUTTON_GPIO_PORT}; +const uint16_t BUTTON_PIN[BUTTONn] = {KEY_BUTTON_PIN}; +const uint8_t BUTTON_IRQn[BUTTONn] = {KEY_BUTTON_EXTI_IRQn}; + +/** + * @brief BUS variables + */ + +#ifdef ADAFRUIT_TFT_JOY_SD_ID802 +#ifdef HAL_SPI_MODULE_ENABLED +uint32_t SpixTimeout = NUCLEO_SPIx_TIMEOUT_MAX; /*SR) & SPI_FLAG_TXE) != SPI_FLAG_TXE) + { + } + /* Need to invert bytes for LCD*/ + *((__IO uint8_t*)&hnucleo_Spi.Instance->DR) = *(pData+1); + + while(((hnucleo_Spi.Instance->SR) & SPI_FLAG_TXE) != SPI_FLAG_TXE) + { + } + *((__IO uint8_t*)&hnucleo_Spi.Instance->DR) = *pData; + counter--; + pData += 2; + } + + /* Wait until the bus is ready before releasing Chip select */ + while(((hnucleo_Spi.Instance->SR) & SPI_FLAG_BSY) != RESET) + { + } + } + + /* Empty the Rx fifo */ + data = *(&hnucleo_Spi.Instance->DR); + UNUSED(data); + + /* Deselect : Chip Select high */ + LCD_CS_HIGH(); +} + +/** + * @brief Wait for loop in ms. + * @param Delay in ms. + */ +void LCD_Delay(uint32_t Delay) +{ + HAL_Delay(Delay); +} +#endif /* HAL_SPI_MODULE_ENABLED */ + +/******************************* ADC driver ********************************/ +#ifdef HAL_ADC_MODULE_ENABLED + +/** + * @brief Initializes ADC MSP. + */ +static void ADCx_MspInit(ADC_HandleTypeDef *hadc) +{ + GPIO_InitTypeDef GPIO_InitStruct; + + /*** Configure the GPIOs ***/ + /* Enable GPIO clock */ + NUCLEO_ADCx_GPIO_CLK_ENABLE(); + + /* Configure the selected ADC Channel as analog input */ + GPIO_InitStruct.Pin = NUCLEO_ADCx_GPIO_PIN ; + GPIO_InitStruct.Mode = GPIO_MODE_ANALOG; + GPIO_InitStruct.Pull = GPIO_NOPULL; + HAL_GPIO_Init(NUCLEO_ADCx_GPIO_PORT, &GPIO_InitStruct); + + /*** Configure the ADC peripheral ***/ + /* Enable ADC clock */ + NUCLEO_ADCx_CLK_ENABLE(); +} + +/** + * @brief DeInitializes ADC MSP. + * @note ADC DeInit does not disable the GPIO clock + */ +static void ADCx_MspDeInit(ADC_HandleTypeDef *hadc) +{ + GPIO_InitTypeDef GPIO_InitStruct; + + /*** DeInit the ADC peripheral ***/ + /* Disable ADC clock */ + NUCLEO_ADCx_CLK_DISABLE(); + + /* Configure the selected ADC Channel as analog input */ + GPIO_InitStruct.Pin = NUCLEO_ADCx_GPIO_PIN ; + HAL_GPIO_DeInit(NUCLEO_ADCx_GPIO_PORT, GPIO_InitStruct.Pin); + + /* Disable GPIO clock has to be done by the application*/ + /* NUCLEO_ADCx_GPIO_CLK_DISABLE(); */ +} + +/** + * @brief Initializes ADC HAL. + */ +static void ADCx_Init(void) +{ + if(HAL_ADC_GetState(&hnucleo_Adc) == HAL_ADC_STATE_RESET) + { + /* ADC Config */ + hnucleo_Adc.Instance = NUCLEO_ADCx; + hnucleo_Adc.Init.ClockPrescaler = ADC_CLOCKPRESCALER_PCLK_DIV4; /* (must not exceed 36MHz) */ + hnucleo_Adc.Init.Resolution = ADC_RESOLUTION12b; + hnucleo_Adc.Init.DataAlign = ADC_DATAALIGN_RIGHT; + hnucleo_Adc.Init.ContinuousConvMode = DISABLE; + hnucleo_Adc.Init.DiscontinuousConvMode = DISABLE; + hnucleo_Adc.Init.ExternalTrigConvEdge = ADC_EXTERNALTRIGCONVEDGE_NONE; + hnucleo_Adc.Init.EOCSelection = EOC_SINGLE_CONV; + hnucleo_Adc.Init.NbrOfConversion = 1; + hnucleo_Adc.Init.DMAContinuousRequests = DISABLE; + + ADCx_MspInit(&hnucleo_Adc); + HAL_ADC_Init(&hnucleo_Adc); + } +} + +/** + * @brief Initializes ADC HAL. + */ +static void ADCx_DeInit(void) +{ + hnucleo_Adc.Instance = NUCLEO_ADCx; + + HAL_ADC_DeInit(&hnucleo_Adc); + ADCx_MspDeInit(&hnucleo_Adc); +} + +/******************************* LINK JOYSTICK ********************************/ + +/** + * @brief Configures joystick available on adafruit 1.8" TFT shield + * managed through ADC to detect motion. + * @retval Joystickstatus (0=> success, 1=> fail) + */ +uint8_t BSP_JOY_Init(void) +{ + uint8_t status = HAL_ERROR; + + ADCx_Init(); + + /* Select the ADC Channel to be converted */ + sConfig.Channel = NUCLEO_ADCx_CHANNEL; + sConfig.SamplingTime = ADC_SAMPLETIME_3CYCLES; + sConfig.Rank = 1; + status = HAL_ADC_ConfigChannel(&hnucleo_Adc, &sConfig); + + /* Return Joystick initialization status */ + return status; +} + +/** + * @brief DeInit joystick GPIOs. + * @note JOY DeInit does not disable the Mfx, just set the Mfx pins in Off modee. + */ +void BSP_JOY_DeInit(void) +{ + ADCx_DeInit(); +} + +/** + * @brief Returns the Joystick key pressed. + * @note To know which Joystick key is pressed we need to detect the voltage + * level on each key output + * - None : 3.3 V / 4095 + * - SEL : 1.055 V / 1308 + * - DOWN : 0.71 V / 88 + * - LEFT : 3.0 V / 3720 + * - RIGHT : 0.595 V / 737 + * - UP : 1.65 V / 2046 + * @retval JOYState_TypeDef: Code of the Joystick key pressed. + */ +JOYState_TypeDef BSP_JOY_GetState(void) +{ + JOYState_TypeDef state; + uint16_t keyconvertedvalue = 0; + + /* Start the conversion process */ + HAL_ADC_Start(&hnucleo_Adc); + + /* Wait for the end of conversion */ + HAL_ADC_PollForConversion(&hnucleo_Adc, 10); + + /* Check if the continuous conversion of regular channel is finished */ + if(((HAL_ADC_GetState(&hnucleo_Adc) & HAL_ADC_STATE_EOC_REG) == HAL_ADC_STATE_EOC_REG)) + { + /* Get the converted value of regular channel */ + keyconvertedvalue = HAL_ADC_GetValue(&hnucleo_Adc); + } + + if((keyconvertedvalue > 2010) && (keyconvertedvalue < 2090)) + { + state = JOY_UP; + } + else if((keyconvertedvalue > 680) && (keyconvertedvalue < 780)) + { + state = JOY_RIGHT; + } + else if((keyconvertedvalue > 1270) && (keyconvertedvalue < 1350)) + { + state = JOY_SEL; + } + else if((keyconvertedvalue > 50) && (keyconvertedvalue < 130)) + { + state = JOY_DOWN; + } + else if((keyconvertedvalue > 3680) && (keyconvertedvalue < 3760)) + { + state = JOY_LEFT; + } + else + { + state = JOY_NONE; + } + + /* Loop while a key is pressed */ + if(state != JOY_NONE) + { + keyconvertedvalue = HAL_ADC_GetValue(&hnucleo_Adc); + } + /* Return the code of the Joystick key pressed */ + return state; +} +#endif /* HAL_ADC_MODULE_ENABLED */ + +#endif /* ADAFRUIT_TFT_JOY_SD_ID802 */ + + +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/stepper/steppermotor_F401RE/Core/Src/syscalls.c b/stepper/steppermotor_F401RE/Core/Src/syscalls.c new file mode 100644 index 0000000..4ec9584 --- /dev/null +++ b/stepper/steppermotor_F401RE/Core/Src/syscalls.c @@ -0,0 +1,159 @@ +/** + ****************************************************************************** + * @file syscalls.c + * @author Auto-generated by STM32CubeIDE + * @brief STM32CubeIDE Minimal System calls file + * + * For more information about which c-functions + * need which of these lowlevel functions + * please consult the Newlib libc-manual + ****************************************************************************** + * @attention + * + *

© Copyright (c) 2020 STMicroelectronics. + * All rights reserved.

+ * + * This software component is licensed by ST under BSD 3-Clause license, + * the "License"; You may not use this file except in compliance with the + * License. You may obtain a copy of the License at: + * opensource.org/licenses/BSD-3-Clause + * + ****************************************************************************** + */ + +/* Includes */ +#include +#include +#include +#include +#include +#include +#include +#include + + +/* Variables */ +//#undef errno +extern int errno; +extern int __io_putchar(int ch) __attribute__((weak)); +extern int __io_getchar(void) __attribute__((weak)); + +register char * stack_ptr asm("sp"); + +char *__env[1] = { 0 }; +char **environ = __env; + + +/* Functions */ +void initialise_monitor_handles() +{ +} + +int _getpid(void) +{ + return 1; +} + +int _kill(int pid, int sig) +{ + errno = EINVAL; + return -1; +} + +void _exit (int status) +{ + _kill(status, -1); + while (1) {} /* Make sure we hang here */ +} + +__attribute__((weak)) int _read(int file, char *ptr, int len) +{ + int DataIdx; + + for (DataIdx = 0; DataIdx < len; DataIdx++) + { + *ptr++ = __io_getchar(); + } + +return len; +} + +__attribute__((weak)) int _write(int file, char *ptr, int len) +{ + int DataIdx; + + for (DataIdx = 0; DataIdx < len; DataIdx++) + { + __io_putchar(*ptr++); + } + return len; +} + +int _close(int file) +{ + return -1; +} + + +int _fstat(int file, struct stat *st) +{ + st->st_mode = S_IFCHR; + return 0; +} + +int _isatty(int file) +{ + return 1; +} + +int _lseek(int file, int ptr, int dir) +{ + return 0; +} + +int _open(char *path, int flags, ...) +{ + /* Pretend like we always fail */ + return -1; +} + +int _wait(int *status) +{ + errno = ECHILD; + return -1; +} + +int _unlink(char *name) +{ + errno = ENOENT; + return -1; +} + +int _times(struct tms *buf) +{ + return -1; +} + +int _stat(char *file, struct stat *st) +{ + st->st_mode = S_IFCHR; + return 0; +} + +int _link(char *old, char *new) +{ + errno = EMLINK; + return -1; +} + +int _fork(void) +{ + errno = EAGAIN; + return -1; +} + +int _execve(char *name, char **argv, char **env) +{ + errno = ENOMEM; + return -1; +} diff --git a/stepper/steppermotor_F401RE/Core/Src/sysmem.c b/stepper/steppermotor_F401RE/Core/Src/sysmem.c new file mode 100644 index 0000000..d7cc52c --- /dev/null +++ b/stepper/steppermotor_F401RE/Core/Src/sysmem.c @@ -0,0 +1,80 @@ +/** + ****************************************************************************** + * @file sysmem.c + * @author Generated by STM32CubeIDE + * @brief STM32CubeIDE System Memory calls file + * + * For more information about which C functions + * need which of these lowlevel functions + * please consult the newlib libc manual + ****************************************************************************** + * @attention + * + *

© Copyright (c) 2020 STMicroelectronics. + * All rights reserved.

+ * + * This software component is licensed by ST under BSD 3-Clause license, + * the "License"; You may not use this file except in compliance with the + * License. You may obtain a copy of the License at: + * opensource.org/licenses/BSD-3-Clause + * + ****************************************************************************** + */ + +/* Includes */ +#include +#include + +/** + * Pointer to the current high watermark of the heap usage + */ +static uint8_t *__sbrk_heap_end = NULL; + +/** + * @brief _sbrk() allocates memory to the newlib heap and is used by malloc + * and others from the C library + * + * @verbatim + * ############################################################################ + * # .data # .bss # newlib heap # MSP stack # + * # # # # Reserved by _Min_Stack_Size # + * ############################################################################ + * ^-- RAM start ^-- _end _estack, RAM end --^ + * @endverbatim + * + * This implementation starts allocating at the '_end' linker symbol + * The '_Min_Stack_Size' linker symbol reserves a memory for the MSP stack + * The implementation considers '_estack' linker symbol to be RAM end + * NOTE: If the MSP stack, at any point during execution, grows larger than the + * reserved size, please increase the '_Min_Stack_Size'. + * + * @param incr Memory size + * @return Pointer to allocated memory + */ +void *_sbrk(ptrdiff_t incr) +{ + extern uint8_t _end; /* Symbol defined in the linker script */ + extern uint8_t _estack; /* Symbol defined in the linker script */ + extern uint32_t _Min_Stack_Size; /* Symbol defined in the linker script */ + const uint32_t stack_limit = (uint32_t)&_estack - (uint32_t)&_Min_Stack_Size; + const uint8_t *max_heap = (uint8_t *)stack_limit; + uint8_t *prev_heap_end; + + /* Initialize heap end at first call */ + if (NULL == __sbrk_heap_end) + { + __sbrk_heap_end = &_end; + } + + /* Protect heap from growing into the reserved MSP stack */ + if (__sbrk_heap_end + incr > max_heap) + { + errno = ENOMEM; + return (void *)-1; + } + + prev_heap_end = __sbrk_heap_end; + __sbrk_heap_end += incr; + + return (void *)prev_heap_end; +} diff --git a/stepper/steppermotor_F401RE/Core/Src/system_stm32f4xx.c b/stepper/steppermotor_F401RE/Core/Src/system_stm32f4xx.c new file mode 100644 index 0000000..409e50c --- /dev/null +++ b/stepper/steppermotor_F401RE/Core/Src/system_stm32f4xx.c @@ -0,0 +1,278 @@ +/** + ****************************************************************************** + * @file Multi/Examples/MotionControl/IHM05A1_ExampleFor1Motor/Src/system_stm32f4xx.c + * @author IPC Rennes + * @version V1.5.0 + * @date June 1st, 2018 + * @brief CMSIS Cortex-M4 Device Peripheral Access Layer System Source File. + * + * This file provides two functions and one global variable to be called from + * user application: + * - SystemInit(): This function is called at startup just after reset and + * before branch to main program. This call is made inside + * the "startup_stm32f4xx.s" file. + * + * - SystemCoreClock variable: Contains the core clock (HCLK), it can be used + * by the user application to setup the SysTick + * timer or configure other parameters. + * + * - SystemCoreClockUpdate(): Updates the variable SystemCoreClock and must + * be called whenever the core clock is changed + * during program execution. + * + * + ****************************************************************************** + * @attention + * + *

© COPYRIGHT 2017 STMicroelectronics

+ * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. Neither the name of STMicroelectronics nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + ****************************************************************************** + */ + +/** @addtogroup CMSIS + * @{ + */ + +/** @addtogroup stm32f4xx_system + * @{ + */ + +/** @addtogroup STM32F4xx_System_Private_Includes + * @{ + */ + +#include "stm32f4xx.h" + +#if !defined (HSE_VALUE) + #define HSE_VALUE ((uint32_t)8000000) /*!< Default value of the External oscillator in Hz */ +#endif /* HSE_VALUE */ + +#if !defined (HSI_VALUE) + #define HSI_VALUE ((uint32_t)16000000) /*!< Value of the Internal oscillator in Hz*/ +#endif /* HSI_VALUE */ + +/** + * @} + */ + +/** @addtogroup STM32F4xx_System_Private_TypesDefinitions + * @{ + */ + +/** + * @} + */ + +/** @addtogroup STM32F4xx_System_Private_Defines + * @{ + */ + +/************************* Miscellaneous Configuration ************************/ + +/*!< Uncomment the following line if you need to relocate your vector Table in + Internal SRAM. */ +/* #define VECT_TAB_SRAM */ +#define VECT_TAB_OFFSET 0x00 /*!< Vector Table base offset field. + This value must be a multiple of 0x200. */ +/******************************************************************************/ + +/** + * @} + */ + +/** @addtogroup STM32F4xx_System_Private_Macros + * @{ + */ + +/** + * @} + */ + +/** @addtogroup STM32F4xx_System_Private_Variables + * @{ + */ + /* This variable is updated in three ways: + 1) by calling CMSIS function SystemCoreClockUpdate() + 2) by calling HAL API function HAL_RCC_GetHCLKFreq() + 3) each time HAL_RCC_ClockConfig() is called to configure the system clock frequency + Note: If you use this function to configure the system clock; then there + is no need to call the 2 first functions listed above, since SystemCoreClock + variable is updated automatically. + */ +uint32_t SystemCoreClock = 16000000; +const uint8_t AHBPrescTable[16] = {0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 4, 6, 7, 8, 9}; +const uint8_t APBPrescTable[8] = {0, 0, 0, 0, 1, 2, 3, 4}; +/** + * @} + */ + +/** @addtogroup STM32F4xx_System_Private_FunctionPrototypes + * @{ + */ + +/** + * @} + */ + +/** @addtogroup STM32F4xx_System_Private_Functions + * @{ + */ + +/** + * @brief Setup the microcontroller system + * Initialize the FPU setting, vector table location and External memory + * configuration. + * @param None + * @retval None + */ +void SystemInit(void) +{ + /* FPU settings ------------------------------------------------------------*/ + #if (__FPU_PRESENT == 1) && (__FPU_USED == 1) + SCB->CPACR |= ((3UL << 10*2)|(3UL << 11*2)); /* set CP10 and CP11 Full Access */ + #endif + /* Reset the RCC clock configuration to the default reset state ------------*/ + /* Set HSION bit */ + RCC->CR |= (uint32_t)0x00000001; + + /* Reset CFGR register */ + RCC->CFGR = 0x00000000; + + /* Reset HSEON, CSSON and PLLON bits */ + RCC->CR &= (uint32_t)0xFEF6FFFF; + + /* Reset PLLCFGR register */ + RCC->PLLCFGR = 0x24003010; + + /* Reset HSEBYP bit */ + RCC->CR &= (uint32_t)0xFFFBFFFF; + + /* Disable all interrupts */ + RCC->CIR = 0x00000000; + + /* Configure the Vector Table location add offset address ------------------*/ +#ifdef VECT_TAB_SRAM + SCB->VTOR = SRAM_BASE | VECT_TAB_OFFSET; /* Vector Table Relocation in Internal SRAM */ +#else + SCB->VTOR = FLASH_BASE | VECT_TAB_OFFSET; /* Vector Table Relocation in Internal FLASH */ +#endif +} + +/** + * @brief Update SystemCoreClock variable according to Clock Register Values. + * The SystemCoreClock variable contains the core clock (HCLK), it can + * be used by the user application to setup the SysTick timer or configure + * other parameters. + * + * @note Each time the core clock (HCLK) changes, this function must be called + * to update SystemCoreClock variable value. Otherwise, any configuration + * based on this variable will be incorrect. + * + * @note - The system frequency computed by this function is not the real + * frequency in the chip. It is calculated based on the predefined + * constant and the selected clock source: + * + * - If SYSCLK source is HSI, SystemCoreClock will contain the HSI_VALUE(*) + * + * - If SYSCLK source is HSE, SystemCoreClock will contain the HSE_VALUE(**) + * + * - If SYSCLK source is PLL, SystemCoreClock will contain the HSE_VALUE(**) + * or HSI_VALUE(*) multiplied/divided by the PLL factors. + * + * (*) HSI_VALUE is a constant defined in stm32f4xx_hal_conf.h file (default value + * 16 MHz) but the real value may vary depending on the variations + * in voltage and temperature. + * + * (**) HSE_VALUE is a constant defined in stm32f4xx_hal_conf.h file (its value + * depends on the application requirements), user has to ensure that HSE_VALUE + * is same as the real frequency of the crystal used. Otherwise, this function + * may have wrong result. + * + * - The result of this function could be not correct when using fractional + * value for HSE crystal. + * + * @param None + * @retval None + */ +void SystemCoreClockUpdate(void) +{ + uint32_t tmp = 0, pllvco = 0, pllp = 2, pllsource = 0, pllm = 2; + + /* Get SYSCLK source -------------------------------------------------------*/ + tmp = RCC->CFGR & RCC_CFGR_SWS; + + switch (tmp) + { + case 0x00: /* HSI used as system clock source */ + SystemCoreClock = HSI_VALUE; + break; + case 0x04: /* HSE used as system clock source */ + SystemCoreClock = HSE_VALUE; + break; + case 0x08: /* PLL used as system clock source */ + + /* PLL_VCO = (HSE_VALUE or HSI_VALUE / PLL_M) * PLL_N + SYSCLK = PLL_VCO / PLL_P + */ + pllsource = (RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC) >> 22; + pllm = RCC->PLLCFGR & RCC_PLLCFGR_PLLM; + + if (pllsource != 0) + { + /* HSE used as PLL clock source */ + pllvco = (HSE_VALUE / pllm) * ((RCC->PLLCFGR & RCC_PLLCFGR_PLLN) >> 6); + } + else + { + /* HSI used as PLL clock source */ + pllvco = (HSI_VALUE / pllm) * ((RCC->PLLCFGR & RCC_PLLCFGR_PLLN) >> 6); + } + + pllp = (((RCC->PLLCFGR & RCC_PLLCFGR_PLLP) >>16) + 1 ) *2; + SystemCoreClock = pllvco/pllp; + break; + default: + SystemCoreClock = HSI_VALUE; + break; + } + /* Compute HCLK frequency --------------------------------------------------*/ + /* Get HCLK prescaler */ + tmp = AHBPrescTable[((RCC->CFGR & RCC_CFGR_HPRE) >> 4)]; + /* HCLK frequency */ + SystemCoreClock >>= tmp; +} + +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/stepper/steppermotor_F401RE/Core/Src/x_nucleo_ihm05a1_stm32f4xx.c b/stepper/steppermotor_F401RE/Core/Src/x_nucleo_ihm05a1_stm32f4xx.c new file mode 100644 index 0000000..178cade --- /dev/null +++ b/stepper/steppermotor_F401RE/Core/Src/x_nucleo_ihm05a1_stm32f4xx.c @@ -0,0 +1,631 @@ +/** + ****************************************************************************** + * @file x_nucleo_ihm05a1_stm32f4xx.c + * @author IPC Rennes + * @version V1.5.0 + * @date June 1st, 2018 + * @brief BSP driver for x-nucleo-ihm05a1 Nucleo extension board + * (based on L6208) + ****************************************************************************** +* @attention + * + *

© COPYRIGHT(c) 2018 STMicroelectronics

+ * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. Neither the name of STMicroelectronics nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + ****************************************************************************** + */ + +/* Includes ------------------------------------------------------------------*/ +#include "x_nucleo_ihm05a1_stm32f4xx.h" +#include "motor.h" + +/** @addtogroup BSP + * @{ + */ + +/** @defgroup X_NUCLEO_IHM05A1_STM32F4XX NUCLEO IHM05A1 STM32F4XX + * @{ + */ + +/* Private constants ---------------------------------------------------------*/ + +/** @defgroup IHM05A1_Private_Constants IHM05A1 Private Constants + * @{ + */ +/// Tick frequency (Hz) +#define TIMER_TICK_FREQUENCY (10000) + +/// Tick Timer Prescaler +#define TIMER_TICK_PRESCALER (64) + +/// MCU wait time after power bridges are enabled +#define BRIDGE_TURN_ON_DELAY (10) + +/** + * @} + */ + +/* Private variables ---------------------------------------------------------*/ + +/** @defgroup IHM05A1_Board_Private_Variables IHM05A1 Board Private Variables + * @{ + */ +/// L6208 timer handler for VREFA PWM +TIM_HandleTypeDef hTimVrefaPwm; + +/// L6208 timer handler for VREFB PWM +TIM_HandleTypeDef hTimVrefbPwm; + +/// L6208 timer handler for the tick +TIM_HandleTypeDef hTimTick; + +/** + * @} + */ + +/** @defgroup IHM05A1_Board_Private_Function_Prototypes IHM05A1 Board Private Function Prototypes + * @{ + */ +void L6208_Board_CLOCK_PIN_Reset(void); //Reset the clock pin +void L6208_Board_CLOCK_PIN_Set(void); //Set the clock pin +void L6208_Board_CONTROL_PIN_Reset(void); //Reset the control pin +void L6208_Board_CONTROL_PIN_Set(void); //Set the control pin +void L6208_Board_Delay(uint32_t delay); //Delay of the requested number of milliseconds +void L6208_Board_DIR_PIN_Reset(void); //Reset the dir pin +void L6208_Board_DIR_PIN_Set(void); //Set the dir pin +void L6208_Board_Disable(void); //Disable the power bridges (leave the output bridges HiZ) +void L6208_Board_DisableIrq(void); //Disable Irq +void L6208_Board_Enable(void); //Enable the power bridges (leave the output bridges HiZ) +void L6208_Board_EnableIrq(void); //Disable Irq +uint32_t L6208_Board_FLAG_PIN_GetState(void); //Returns the EN pin state +void L6208_Board_GpioInit(void); //Initialise GPIOs used for L6208 +void L6208_Board_HALF_FULL_PIN_Reset(void); //Reset the half full pin +void L6208_Board_HALF_FULL_PIN_Set(void); //Set the half full pin +bool L6208_Board_VrefPwmInit(uint8_t bridgeId, uint32_t pwmFreq); //Initialize the VREFA or VREFB PWM +void L6208_Board_ReleaseReset(void); //Release the reset pin +void L6208_Board_Reset(void); //Reset the reset pin +uint32_t L6208_Board_TickGetFreq(void); //Get the tick frequency in Hz +void L6208_Board_TickInit(void); //Initialize the tick +void L6208_Board_TickStart(void); //Start the timer for the tick by using the set tick frequency +void L6208_Board_TickStop(void); //Stop the timer for the tick +bool L6208_Board_VrefPwmFreqCheck(uint32_t newFreq); //Check that the new VREFA and VREFB PWM frequency is nor too low nor too high +uint32_t L6208_Board_VrefPwmGetPeriod(void); //Get current VREF PWM period duration +bool L6208_Board_VrefPwmSetDutyCycle(uint8_t bridgeId,\ + uint16_t value,\ + bool valueIsPwmDutyCycle); //Set duty cycle of VREFA or VREFB PWM +bool L6208_Board_VrefPwmStart(uint8_t bridgeId,\ + uint32_t pwmFreq); //Start the timer for the VREFA or VREFB PWM +bool L6208_Board_VrefPwmStop(uint8_t bridgeId); //Stop the timer for the VREFA or VREFB PWM + +/** + * @} + */ + +/** @defgroup IHM05A1_Board_Private_Functions IHM05A1 Board Private Functions + * @{ + */ + +/******************************************************//** + * @brief This function provides an accurate delay in milliseconds + * @param[in] delay time length in milliseconds + * @retval None + **********************************************************/ +void L6208_Board_Delay(uint32_t delay) +{ + HAL_Delay(delay); +} + +/******************************************************//** + * @brief This function disable the interruptions + * @retval None + **********************************************************/ +void L6208_Board_DisableIrq(void) +{ + //__disable_irq(); +} + +/******************************************************//** + * @brief This function enable the interruptions + * @retval None + **********************************************************/ +void L6208_Board_EnableIrq(void) +{ + //__enable_irq(); +} + +/******************************************************//** + * @brief Start the L6208 library + * @retval None + **********************************************************/ +void L6208_Board_GpioInit(void) +{ + GPIO_InitTypeDef GPIO_InitStruct; + + /* GPIO Ports Clock Enable */ + __GPIOC_CLK_ENABLE(); + __GPIOA_CLK_ENABLE(); + __GPIOB_CLK_ENABLE(); + + /* Configure L6208 - EN pin -------------------------------*/ + /* When this pin is set low, it is configured just before as */ + /* GPIO_MODE_OUTPUT_PP with GPIO_NOPULL */ + /* When this pin is set high, it is just after configured for OCD and OVT */ + /* as GPIO_MODE_IT_FALLING with GPIO_PULLUP */ + L6208_Board_Disable(); + + /* Set Priority of External Line Interrupt used for the OCD OVT interrupt*/ + HAL_NVIC_SetPriority(FLAG_EXTI_LINE_IRQn, BSP_MOTOR_CONTROL_BOARD_EN_AND_FLAG_PRIORITY, 0); + + /* Enable the External Line Interrupt used for the OCD OVT interrupt*/ + HAL_NVIC_EnableIRQ(FLAG_EXTI_LINE_IRQn); + + /* Configure L6208 - CW/CCW pin ----------------------------*/ + GPIO_InitStruct.Pin = BSP_MOTOR_CONTROL_BOARD_DIR_PIN; + GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; + GPIO_InitStruct.Pull = GPIO_NOPULL; + GPIO_InitStruct.Speed = GPIO_SPEED_MEDIUM; + HAL_GPIO_Init(BSP_MOTOR_CONTROL_BOARD_DIR_PORT, &GPIO_InitStruct); + HAL_GPIO_WritePin(BSP_MOTOR_CONTROL_BOARD_DIR_PORT, BSP_MOTOR_CONTROL_BOARD_DIR_PIN, GPIO_PIN_RESET); + + /* Configure L6208 - HALF/FULL pin -------------------------------------------*/ + GPIO_InitStruct.Pin = BSP_MOTOR_CONTROL_BOARD_HALF_FULL_PIN; + GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; + GPIO_InitStruct.Pull = GPIO_NOPULL; + GPIO_InitStruct.Speed = GPIO_SPEED_MEDIUM; + HAL_GPIO_Init(BSP_MOTOR_CONTROL_BOARD_HALF_FULL_PORT, &GPIO_InitStruct); + HAL_GPIO_WritePin(BSP_MOTOR_CONTROL_BOARD_HALF_FULL_PORT, BSP_MOTOR_CONTROL_BOARD_HALF_FULL_PIN, GPIO_PIN_RESET); + + /* Configure L6208 - CONTROL pin -------------------------------------------*/ + GPIO_InitStruct.Pin = BSP_MOTOR_CONTROL_BOARD_CONTROL_PIN; + GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; + GPIO_InitStruct.Pull = GPIO_NOPULL; + GPIO_InitStruct.Speed = GPIO_SPEED_MEDIUM; + HAL_GPIO_Init(BSP_MOTOR_CONTROL_BOARD_CONTROL_PORT, &GPIO_InitStruct); + HAL_GPIO_WritePin(BSP_MOTOR_CONTROL_BOARD_CONTROL_PORT, BSP_MOTOR_CONTROL_BOARD_CONTROL_PIN, GPIO_PIN_RESET); + + /* Configure L6208 - CLOCK pin -------------------------------------------*/ + GPIO_InitStruct.Pin = BSP_MOTOR_CONTROL_BOARD_CLOCK_PIN; + GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; + GPIO_InitStruct.Pull = GPIO_NOPULL; + GPIO_InitStruct.Speed = GPIO_SPEED_MEDIUM; + HAL_GPIO_Init(BSP_MOTOR_CONTROL_BOARD_CLOCK_PORT, &GPIO_InitStruct); + HAL_GPIO_WritePin(BSP_MOTOR_CONTROL_BOARD_CLOCK_PORT, BSP_MOTOR_CONTROL_BOARD_CLOCK_PIN, GPIO_PIN_RESET); + + /* Configure L6208 - STBY/RESET pin -------------------------------------*/ + GPIO_InitStruct.Pin = BSP_MOTOR_CONTROL_BOARD_RESET_PIN; + GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; + GPIO_InitStruct.Pull = GPIO_NOPULL; + GPIO_InitStruct.Speed = GPIO_SPEED_MEDIUM; + HAL_GPIO_Init(BSP_MOTOR_CONTROL_BOARD_RESET_PORT, &GPIO_InitStruct); + L6208_Board_ReleaseReset(); +} + +/******************************************************//** + * @brief Initialize the tick + * @retval None + **********************************************************/ +void L6208_Board_TickInit(void) +{ + static TIM_OC_InitTypeDef sConfigOC; + static TIM_MasterConfigTypeDef sMasterConfig; + static TIM_ClockConfigTypeDef sClockSourceConfig; + + hTimTick.Instance = BSP_MOTOR_CONTROL_BOARD_TIMER_TICK; + hTimTick.Init.Period = (HAL_RCC_GetSysClockFreq() / (TIMER_TICK_PRESCALER * TIMER_TICK_FREQUENCY)) - 1; + hTimTick.Init.Prescaler = TIMER_TICK_PRESCALER -1; + hTimTick.Init.ClockDivision = 0; + hTimTick.Init.CounterMode = TIM_COUNTERMODE_UP; + HAL_TIM_PWM_Init(&hTimTick); + + sClockSourceConfig.ClockSource = TIM_CLOCKSOURCE_INTERNAL; + HAL_TIM_ConfigClockSource(&hTimTick, &sClockSourceConfig); + + sConfigOC.OCMode = TIM_OCMODE_PWM1; + sConfigOC.Pulse = 0; + sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH; + sConfigOC.OCFastMode = TIM_OCFAST_DISABLE; + HAL_TIM_PWM_ConfigChannel(&hTimTick, &sConfigOC, BSP_MOTOR_CONTROL_BOARD_CHAN_TIMER_TICK); + + sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET; + sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE; + HAL_TIMEx_MasterConfigSynchronization(&hTimTick, &sMasterConfig); +} + +/******************************************************//** + * @brief Start the timer for the tick by using the set tick frequency + * @retval None + **********************************************************/ +void L6208_Board_TickStart(void) +{ + uint32_t period = (HAL_RCC_GetSysClockFreq() / (TIMER_TICK_PRESCALER * TIMER_TICK_FREQUENCY)) - 1; + + __HAL_TIM_SetAutoreload(&hTimTick, period); + __HAL_TIM_SetCompare(&hTimTick, BSP_MOTOR_CONTROL_BOARD_CHAN_TIMER_TICK, period >> 1); + HAL_TIM_PWM_Start_IT(&hTimTick, BSP_MOTOR_CONTROL_BOARD_CHAN_TIMER_TICK); +} + +/******************************************************//** + * @brief Stop the timer for the tick + * @retval None + **********************************************************/ +void L6208_Board_TickStop(void) +{ + HAL_TIM_PWM_Stop_IT(&hTimTick, BSP_MOTOR_CONTROL_BOARD_CHAN_TIMER_TICK); +} + +/******************************************************//** + * @brief Get the tick timer frequency in Hz + * @retval The tick timer frequency in Hz + **********************************************************/ +uint32_t L6208_Board_TickGetFreq(void) +{ + return TIMER_TICK_FREQUENCY; +} + +/******************************************************//** + * @brief Check that the frequency for the VREFA and VREFB PWM + * is high enough + * @param[in] newFreq frequency in Hz of the PWM used to generate + * the reference voltage for the bridge + * @retval FALSE if frequency is too low, else TRUE + **********************************************************/ +bool L6208_Board_VrefPwmFreqCheck(uint32_t newFreq) +{ + if (newFreq<=(HAL_RCC_GetSysClockFreq()>>16)) + { + return FALSE; + } + else + { + return TRUE; + } +} +/******************************************************//** + * @brief Initialize the VREFA or VREFB PWM + * @param[in] bridgeId + * 0 for BRIDGE_A + * 1 for BRIDGE_B + * @param[in] pwmFreq frequency in Hz of the PWM used to generate the reference + * voltage for the bridge + * @retval FALSE if wrong timer handle is used, else TRUE + * @note None + **********************************************************/ +bool L6208_Board_VrefPwmInit(uint8_t bridgeId, uint32_t pwmFreq) +{ + static TIM_OC_InitTypeDef sConfigOC; + static TIM_MasterConfigTypeDef sMasterConfig; + static TIM_ClockConfigTypeDef sClockSourceConfig; + TIM_HandleTypeDef *pHTim = NULL; + uint32_t channel; + + if (bridgeId == 0) + { + pHTim = &hTimVrefaPwm; + pHTim->Instance = BSP_MOTOR_CONTROL_BOARD_TIMER_VREFA_PWM; + pHTim->Init.Prescaler = 0; + pHTim->Init.Period = (HAL_RCC_GetSysClockFreq() / pwmFreq) - 1; + channel = BSP_MOTOR_CONTROL_BOARD_CHAN_TIMER_VREFA_PWM; + } + else if (bridgeId == 1) + { + pHTim = &hTimVrefbPwm; + pHTim->Instance = BSP_MOTOR_CONTROL_BOARD_TIMER_VREFB_PWM; + pHTim->Init.Prescaler = 0; + pHTim->Init.Period = (HAL_RCC_GetSysClockFreq() / pwmFreq) - 1; + channel = BSP_MOTOR_CONTROL_BOARD_CHAN_TIMER_VREFB_PWM; + } + else + { + return FALSE; + } + + pHTim->Init.CounterMode = TIM_COUNTERMODE_UP; + pHTim->Init.ClockDivision = TIM_CLOCKDIVISION_DIV1; + HAL_TIM_PWM_Init(pHTim); + + sClockSourceConfig.ClockSource = TIM_CLOCKSOURCE_INTERNAL; + HAL_TIM_ConfigClockSource(pHTim, &sClockSourceConfig); + + sConfigOC.OCMode = TIM_OCMODE_PWM1; + sConfigOC.Pulse = 0; + sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH; + sConfigOC.OCFastMode = TIM_OCFAST_DISABLE; + HAL_TIM_PWM_ConfigChannel(pHTim, &sConfigOC, channel); + + sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET; + sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE; + HAL_TIMEx_MasterConfigSynchronization(pHTim, &sMasterConfig); + + return TRUE; +} + +/******************************************************//** + * @brief Set duty cycle of VREFA or VREFB PWM + * @param[in] bridgeId + * 0 for BRIDGE_A + * 1 for BRIDGE_B + * @param[in] value pulse length or PWM duty cycle: 0 - 100 % + * @param[in] valueIsPwmDutyCycle must be TRUE if value is a PWM duty cycle + * @retval FALSE if wrong timer handle is used, else TRUE + **********************************************************/ +bool L6208_Board_VrefPwmSetDutyCycle(uint8_t bridgeId, uint16_t value, bool valueIsPwmDutyCycle) +{ + TIM_HandleTypeDef *pHTim = NULL; + uint32_t channel; + + if (bridgeId == 0) + { + pHTim = &hTimVrefaPwm; + channel = BSP_MOTOR_CONTROL_BOARD_CHAN_TIMER_VREFA_PWM; + } + else if (bridgeId == 1) + { + pHTim = &hTimVrefbPwm; + channel = BSP_MOTOR_CONTROL_BOARD_CHAN_TIMER_VREFB_PWM; + } + else + { + return 0; + } + // PWM or OC Channel pulse length + if(valueIsPwmDutyCycle) + { + if (value > 100) value = 100; + value = (uint16_t)(((uint32_t)pHTim->Init.Period * (uint32_t)value) / 100); + } + __HAL_TIM_SetCompare(pHTim, channel, value); + + return 1; +} + +/******************************************************//** + * @brief Start the timer for the VREFA or VREFB PWM + * @param[in] bridgeId + * 0 for BRIDGE_A + * 1 for BRIDGE_B + * @param[in] pwmFreq frequency in Hz of the PWM used to generate the reference + * voltage for the bridge + * @retval FALSE if wrong timer handle is used, else TRUE + **********************************************************/ +bool L6208_Board_VrefPwmStart(uint8_t bridgeId, uint32_t pwmFreq) +{ + TIM_HandleTypeDef *pHTim = NULL; + uint32_t period; + uint32_t channel; + + if (bridgeId == 0) + { + pHTim = &hTimVrefaPwm; + period = (HAL_RCC_GetSysClockFreq() / pwmFreq) - 1; + channel = BSP_MOTOR_CONTROL_BOARD_CHAN_TIMER_VREFA_PWM; + } + else if (bridgeId == 1) + { + pHTim = &hTimVrefbPwm; + period = (HAL_RCC_GetSysClockFreq() / pwmFreq) - 1; + channel = BSP_MOTOR_CONTROL_BOARD_CHAN_TIMER_VREFB_PWM; + } + else + { + return FALSE; + } + __HAL_TIM_SetAutoreload(pHTim, period); + HAL_TIM_PWM_Start(pHTim, channel); + + return TRUE; +} + +/******************************************************//** + * @brief Stop the VREFA or VREFB PWM + * @param[in] bridgeId + * 0 for BRIDGE_A + * 1 for BRIDGE_B + * @retval None + **********************************************************/ +bool L6208_Board_VrefPwmStop(uint8_t bridgeId) +{ + TIM_HandleTypeDef *pHTim = NULL; + uint32_t channel; + if (bridgeId == 0) + { + pHTim = &hTimVrefaPwm; + channel = BSP_MOTOR_CONTROL_BOARD_CHAN_TIMER_VREFA_PWM; + } + else if (bridgeId == 1) + { + pHTim = &hTimVrefbPwm; + channel = BSP_MOTOR_CONTROL_BOARD_CHAN_TIMER_VREFB_PWM; + } + else + { + return FALSE; + } + HAL_TIM_PWM_Stop(pHTim, channel); + + return TRUE; +} + +/******************************************************//** + * @brief Get current VREF PWM period duration + * @retval the current VREF PWM period duration + * @note hTimVrefbPwm.Init.Period is the same as hTimVrefaPwm.Init.Period + **********************************************************/ +uint32_t L6208_Board_VrefPwmGetPeriod(void) +{ + return ((uint32_t)hTimVrefaPwm.Init.Period); +} + +/******************************************************//** + * @brief Releases the L6208 reset (pin set to High) of all devices + * @retval None + **********************************************************/ +void L6208_Board_ReleaseReset(void) +{ + HAL_GPIO_WritePin(BSP_MOTOR_CONTROL_BOARD_RESET_PORT, BSP_MOTOR_CONTROL_BOARD_RESET_PIN, GPIO_PIN_SET); +} + +/******************************************************//** + * @brief Resets the L6208 (reset pin set to low) of all devices + * @retval None + **********************************************************/ +void L6208_Board_Reset(void) +{ + HAL_GPIO_WritePin(BSP_MOTOR_CONTROL_BOARD_RESET_PORT, BSP_MOTOR_CONTROL_BOARD_RESET_PIN, GPIO_PIN_RESET); +} + +/******************************************************//** + * @brief Set the L6208 CONTROL pin + * @retval None + **********************************************************/ +void L6208_Board_CONTROL_PIN_Set(void) +{ + HAL_GPIO_WritePin(BSP_MOTOR_CONTROL_BOARD_CONTROL_PORT, BSP_MOTOR_CONTROL_BOARD_CONTROL_PIN, GPIO_PIN_SET); +} + +/******************************************************//** + * @brief Reset the L6208 CONTROL pin + * @retval None + **********************************************************/ +void L6208_Board_CONTROL_PIN_Reset(void) +{ + HAL_GPIO_WritePin(BSP_MOTOR_CONTROL_BOARD_CONTROL_PORT, BSP_MOTOR_CONTROL_BOARD_CONTROL_PIN, GPIO_PIN_RESET); +} + +/******************************************************//** + * @brief Set the L6208 CLOCK pin + * @retval None + **********************************************************/ +void L6208_Board_CLOCK_PIN_Set(void) +{ + HAL_GPIO_WritePin(BSP_MOTOR_CONTROL_BOARD_CLOCK_PORT, BSP_MOTOR_CONTROL_BOARD_CLOCK_PIN, GPIO_PIN_SET); +} + +/******************************************************//** + * @brief Reset the L6208 CLOCK pin + * @retval None + **********************************************************/ +void L6208_Board_CLOCK_PIN_Reset(void) +{ + HAL_GPIO_WritePin(BSP_MOTOR_CONTROL_BOARD_CLOCK_PORT, BSP_MOTOR_CONTROL_BOARD_CLOCK_PIN, GPIO_PIN_RESET); +} + +/******************************************************//** + * @brief Set the L6208 HALF_FULL pin + * @retval None + **********************************************************/ +void L6208_Board_HALF_FULL_PIN_Set(void) +{ + HAL_GPIO_WritePin(BSP_MOTOR_CONTROL_BOARD_HALF_FULL_PORT, BSP_MOTOR_CONTROL_BOARD_HALF_FULL_PIN, GPIO_PIN_SET); +} + +/******************************************************//** + * @brief Reset the L6208 HALF_FULL pin + * @retval None + **********************************************************/ +void L6208_Board_HALF_FULL_PIN_Reset(void) +{ + HAL_GPIO_WritePin(BSP_MOTOR_CONTROL_BOARD_HALF_FULL_PORT, BSP_MOTOR_CONTROL_BOARD_HALF_FULL_PIN, GPIO_PIN_RESET); +} + +/******************************************************//** + * @brief Set the L6208 DIR pin + * @retval None + **********************************************************/ +void L6208_Board_DIR_PIN_Set(void) +{ + HAL_GPIO_WritePin(BSP_MOTOR_CONTROL_BOARD_DIR_PORT, BSP_MOTOR_CONTROL_BOARD_DIR_PIN, GPIO_PIN_SET); +} + +/******************************************************//** + * @brief Reset the L6208 DIR pin + * @retval None + **********************************************************/ +void L6208_Board_DIR_PIN_Reset(void) +{ + HAL_GPIO_WritePin(BSP_MOTOR_CONTROL_BOARD_DIR_PORT, BSP_MOTOR_CONTROL_BOARD_DIR_PIN, GPIO_PIN_RESET); +} + +/******************************************************//** + * @brief Returns the FLAG pin state. + * @retval The FLAG pin value. + **********************************************************/ +uint32_t L6208_Board_FLAG_PIN_GetState(void) +{ + return HAL_GPIO_ReadPin(BSP_MOTOR_CONTROL_BOARD_EN_AND_FLAG_PORT, BSP_MOTOR_CONTROL_BOARD_EN_AND_FLAG_PIN); +} + +/******************************************************//** + * @brief Disable the power bridges (leave the output bridges HiZ) + * @retval None + **********************************************************/ +void L6208_Board_Disable(void) +{ + GPIO_InitTypeDef GPIO_InitStruct; + + /* Configure the GPIO connected to EN pin as an output */ + GPIO_InitStruct.Pin = BSP_MOTOR_CONTROL_BOARD_EN_AND_FLAG_PIN; + GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; + GPIO_InitStruct.Pull = GPIO_NOPULL; + GPIO_InitStruct.Speed = GPIO_SPEED_MEDIUM; + HAL_GPIO_Init(BSP_MOTOR_CONTROL_BOARD_EN_AND_FLAG_PORT, &GPIO_InitStruct); + __disable_irq(); + HAL_GPIO_WritePin(BSP_MOTOR_CONTROL_BOARD_EN_AND_FLAG_PORT, BSP_MOTOR_CONTROL_BOARD_EN_AND_FLAG_PIN, GPIO_PIN_RESET); + __HAL_GPIO_EXTI_CLEAR_IT(BSP_MOTOR_CONTROL_BOARD_EN_AND_FLAG_PIN); + __enable_irq(); +} + +/******************************************************//** + * @brief Enable the power bridges (leave the output bridges HiZ) + * @retval None + **********************************************************/ +void L6208_Board_Enable(void) +{ + GPIO_InitTypeDef GPIO_InitStruct; + + HAL_GPIO_WritePin(BSP_MOTOR_CONTROL_BOARD_EN_AND_FLAG_PORT, BSP_MOTOR_CONTROL_BOARD_EN_AND_FLAG_PIN, GPIO_PIN_SET); + HAL_Delay(BRIDGE_TURN_ON_DELAY); + /* Configure the GPIO connected to EN pin to take interrupt */ + GPIO_InitStruct.Pin = BSP_MOTOR_CONTROL_BOARD_EN_AND_FLAG_PIN; + GPIO_InitStruct.Mode = GPIO_MODE_IT_FALLING; + GPIO_InitStruct.Pull = GPIO_PULLUP; + GPIO_InitStruct.Speed = GPIO_SPEED_MEDIUM; + HAL_GPIO_Init(BSP_MOTOR_CONTROL_BOARD_EN_AND_FLAG_PORT, &GPIO_InitStruct); + __HAL_GPIO_EXTI_CLEAR_IT(BSP_MOTOR_CONTROL_BOARD_EN_AND_FLAG_PIN); + HAL_NVIC_ClearPendingIRQ(FLAG_EXTI_LINE_IRQn); + HAL_NVIC_EnableIRQ(FLAG_EXTI_LINE_IRQn); +} + +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/stepper/steppermotor_F401RE/Core/Src/x_nucleo_ihmxx.c b/stepper/steppermotor_F401RE/Core/Src/x_nucleo_ihmxx.c new file mode 100644 index 0000000..e59439e --- /dev/null +++ b/stepper/steppermotor_F401RE/Core/Src/x_nucleo_ihmxx.c @@ -0,0 +1,1943 @@ + /** + ****************************************************************************** + * @file x_nucleo_ihmxx.c + * @author IPC Rennes + * @version V1.7.0 + * @date March 16th, 2018 + * @brief This file provides common functions for motor control + ****************************************************************************** + * @attention + * + *

© COPYRIGHT(c) 2018 STMicroelectronics

+ * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. Neither the name of STMicroelectronics nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + ****************************************************************************** + */ +/* Includes ------------------------------------------------------------------*/ +#include "x_nucleo_ihmxx.h" + +/** @addtogroup BSP + * @{ + */ + +/** @defgroup MOTOR_CONTROL MOTOR CONTROL + * @{ + */ + +/** @defgroup MOTOR_CONTROL_Private_Types_Definitions MOTOR CONTROL Private Types Definitions + * @{ + */ + +/** + * @} + */ + + +/** @defgroup MOTOR_CONTROL_Private_Defines MOTOR CONTROL Private Defines + * @{ + */ + +/** + * @} + */ + +/** @defgroup MOTOR_CONTROL_Private_Constants MOTOR CONTROL Private Constants + * @{ + */ + +/** + * @} + */ + +/** @defgroup MOTOR_CONTROL_Private_Macros MOTOR CONTROL Private Macros + * @{ + */ +/// Error when trying to call undefined functions via motorDrvHandle +#define MOTOR_CONTROL_ERROR_UNDEFINED_FUNCTION(errorNb) (BSP_MotorControl_ErrorHandler(MOTOR_CONTROL_ERROR_TAG|(errorNb))) + +/** + * @} + */ + +/** @defgroup MOTOR_CONTROL_Private_Variables MOTOR CONTROL Private Variables + * @{ + */ + +static motorDrv_t *motorDrvHandle = 0; +static uint16_t MotorControlBoardId; + +/** + * @} + */ + +/** @defgroup MOTOR_CONTROL_Weak_Private_Functions MOTOR CONTROL Weak Private Functions + * @{ + */ +/// Get motor handle for L6474 +__weak motorDrv_t* L6474_GetMotorHandle(void){return ((motorDrv_t* )0);} +/// Get motor handle for L647x +__weak motorDrv_t* l647x_GetMotorHandle(void){return ((motorDrv_t* )0);} +/// Get motor handle for L648x +__weak motorDrv_t* l648x_GetMotorHandle(void){return ((motorDrv_t* )0);} +/// Get motor handle for Powerstep +__weak motorDrv_t* Powerstep01_GetMotorHandle(void){return ((motorDrv_t* )0);} +/// Get motor handle for L6206 +__weak motorDrv_t* L6206_GetMotorHandle(void){return ((motorDrv_t* )0);} +/// Get motor handle for L6208 +__weak motorDrv_t* L6208_GetMotorHandle(void){return ((motorDrv_t* )0);} +/// Get motor handle for STSPIN220 +__weak motorDrv_t* Stspin220_GetMotorHandle(void){return ((motorDrv_t* )0);} +/// Get motor handle for STSPIN240 +__weak motorDrv_t* Stspin240_250_GetMotorHandle(void){return ((motorDrv_t* )0);} +/** + * @} + */ + +/** @defgroup MOTOR_CONTROL_Private_Functions MOTOR CONTROL Private Functions + * @{ + */ + +/******************************************************//** + * @brief Attaches a user callback to the error Handler. + * The call back will be then called each time the library + * detects an error + * @param[in] callback Name of the callback to attach + * to the error Hanlder + * @retval None + **********************************************************/ +void BSP_MotorControl_AttachErrorHandler(void (*callback)(uint16_t)) +{ + if ((motorDrvHandle != 0)&&(motorDrvHandle->AttachErrorHandler != 0)) + { + motorDrvHandle->AttachErrorHandler(callback); + } + else + { + MOTOR_CONTROL_ERROR_UNDEFINED_FUNCTION(2); + } +} + +/******************************************************//** + * @brief Attaches a user callback to the Flag interrupt Handler. + * The call back will be then called each time the library + * detects a FLAG signal falling edge. + * @param[in] callback Name of the callback to attach + * to the Flag interrupt Hanlder + * @retval None + **********************************************************/ +void BSP_MotorControl_AttachFlagInterrupt(void (*callback)(void)) +{ + if ((motorDrvHandle != 0)&&(motorDrvHandle->AttachFlagInterrupt != 0)) + { + motorDrvHandle->AttachFlagInterrupt(callback); + } + else + { + MOTOR_CONTROL_ERROR_UNDEFINED_FUNCTION(3); + } +} + +/******************************************************//** + * @brief Attaches a user callback to the Busy interrupt Handler. + * The call back will be then called each time the library + * detects a BUSY signal falling edge. + * @param[in] callback Name of the callback to attach + * to the Busy interrupt Hanlder + * @retval None + **********************************************************/ +void BSP_MotorControl_AttachBusyInterrupt(void (*callback)(void)) +{ + if ((motorDrvHandle != 0)&&(motorDrvHandle->AttachBusyInterrupt != 0)) + { + motorDrvHandle->AttachBusyInterrupt(callback); + } + else + { + MOTOR_CONTROL_ERROR_UNDEFINED_FUNCTION(4); + } +} + +/******************************************************//** + * @brief Motor control error handler + * @param[in] error number of the error + * @retval None + **********************************************************/ +void BSP_MotorControl_ErrorHandler(uint16_t error) +{ + if ((motorDrvHandle != 0)&&(motorDrvHandle->ErrorHandler != 0)) + { + motorDrvHandle->ErrorHandler(error); + } + else + { + while(1) + { + /* Infinite loop as Error handler must be defined*/ + } + } +} +/******************************************************//** + * @brief Initialises the motor driver. This function has to be called one time + * for each device. The number of devices is incremented in the driver up to + * the maximum allowed. Calling this function a number of times greater than the + * maximum number triggers an error in the driver. + * @param[in] id Component Id (L6474, Powerstep01,...) + * @param[in] initDeviceParameters Initialization structure for one device + * @retval None + **********************************************************/ +void BSP_MotorControl_Init(uint16_t id, void* initDeviceParameters) +{ + if ((motorDrvHandle != 0)&&(motorDrvHandle->Init != 0)) + { + motorDrvHandle->Init(initDeviceParameters); + } + else + { + MOTOR_CONTROL_ERROR_UNDEFINED_FUNCTION(0); + } +} + +/******************************************************//** + * @brief Handlers of the flag interrupt which calls the user callback (if defined) + * @retval None + **********************************************************/ +void BSP_MotorControl_FlagInterruptHandler(void) +{ + if ((motorDrvHandle != 0)&&(motorDrvHandle->FlagInterruptHandler != 0)) + { + motorDrvHandle->FlagInterruptHandler(); + } + else + { + MOTOR_CONTROL_ERROR_UNDEFINED_FUNCTION(5); + } +} +/******************************************************//** + * @brief Returns the acceleration of the specified device + * @param[in] deviceId (from 0 to MAX_NUMBER_OF_DEVICES - 1) + * For L6208: dummy parameter for compatibility with motor.h + * @retval Acceleration in pps^2 + **********************************************************/ +uint16_t BSP_MotorControl_GetAcceleration(uint8_t deviceId) +{ + uint16_t acceleration = 0; + + if ((motorDrvHandle != 0)&&(motorDrvHandle->GetAcceleration != 0)) + { + acceleration = motorDrvHandle->GetAcceleration(deviceId); + } + else + { + MOTOR_CONTROL_ERROR_UNDEFINED_FUNCTION(6); + } + return(acceleration); +} + +/******************************************************//** + * @brief Get board Id the motor driver + * @retval Motor control board Id + **********************************************************/ +uint16_t BSP_MotorControl_GetBoardId(void) +{ + return (MotorControlBoardId); +} +/******************************************************//** + * @brief Returns the current speed of the specified device + * @param[in] deviceId from 0 to (MAX_NUMBER_OF_DEVICES - 1) for stepper motor + * For L6208: dummy parameter for compatibility with motor.h + * motorId from 0 to MAX_NUMBER_OF_BRUSH_DC_MOTORS for Brush DC motor + * @retval Speed in pps for stepper motor + * in % for Brush DC motor (0-100) + **********************************************************/ +uint16_t BSP_MotorControl_GetCurrentSpeed(uint8_t deviceId) +{ + uint16_t currentSpeed = 0; + if ((motorDrvHandle != 0)&&(motorDrvHandle->GetCurrentSpeed != 0)) + { + currentSpeed = motorDrvHandle->GetCurrentSpeed(deviceId); + } + else + { + MOTOR_CONTROL_ERROR_UNDEFINED_FUNCTION(7); + } + return(currentSpeed); +} + +/******************************************************//** + * @brief Returns the deceleration of the specified device + * @param[in] deviceId (from 0 to MAX_NUMBER_OF_DEVICES - 1) + * For L6208: dummy parameter for compatibility with motor.h + * @retval Deceleration in pps^2 + **********************************************************/ +uint16_t BSP_MotorControl_GetDeceleration(uint8_t deviceId) +{ + uint16_t deceleration = 0; + + if ((motorDrvHandle != 0)&&(motorDrvHandle->GetDeceleration != 0)) + { + deceleration = motorDrvHandle->GetDeceleration(deviceId); + } + else + { + MOTOR_CONTROL_ERROR_UNDEFINED_FUNCTION(8); + } + return(deceleration); +} + +/******************************************************//** + * @brief Returns the device state + * @param[in] deviceId (from 0 to MAX_NUMBER_OF_DEVICES - 1) for stepper motor + * For L6208: dummy parameter for compatibility with motor.h + * motorId from 0 to MAX_NUMBER_OF_BRUSH_DC_MOTORS for Brush DC motor + * @retval State ACCELERATING, DECELERATING, STEADY or INACTIVE for stepper motor, + STEADY or INACTIVE for Brush DC motor + **********************************************************/ +motorState_t BSP_MotorControl_GetDeviceState(uint8_t deviceId) +{ + motorState_t state = INACTIVE; + + if ((motorDrvHandle != 0)&&(motorDrvHandle->GetDeviceState != 0)) + { + state = motorDrvHandle->GetDeviceState(deviceId); + } + else + { + MOTOR_CONTROL_ERROR_UNDEFINED_FUNCTION(9); + } + return(state); +} + +/******************************************************//** + * @brief Returns the FW version of the library + * @retval BSP_MotorControl_FW_VERSION + * @note the format is (MAJOR_VERSION<<16)|(MINOR_VERSION<<8)|(PATCH_VERSION) + * with major, minor and patch versions coded on 8 bits. + **********************************************************/ +uint32_t BSP_MotorControl_GetFwVersion(void) +{ + uint32_t version = 0; + + if ((motorDrvHandle != 0)&&(motorDrvHandle->GetFwVersion != 0)) + { + version = motorDrvHandle->GetFwVersion(); + } + else + { + MOTOR_CONTROL_ERROR_UNDEFINED_FUNCTION(10); + } + return(version); +} + +/******************************************************//** + * @brief Returns the mark position of the specified device + * @param[in] deviceId (from 0 to MAX_NUMBER_OF_DEVICES - 1) + * For L6208: dummy parameter for compatibility with motor.h + * @retval Mark register value converted in a 32b signed integer + **********************************************************/ +int32_t BSP_MotorControl_GetMark(uint8_t deviceId) +{ + int32_t mark = 0; + + if ((motorDrvHandle != 0)&&(motorDrvHandle->GetMark != 0)) + { + mark = motorDrvHandle->GetMark(deviceId); + } + else + { + MOTOR_CONTROL_ERROR_UNDEFINED_FUNCTION(11); + } + return(mark); +} + +/******************************************************//** + * @brief Returns the max speed of the specified device + * @param[in] deviceId (from 0 to MAX_NUMBER_OF_DEVICES - 1) for stepper motor + * For L6208: dummy parameter for compatibility with motor.h + * motorId from 0 to MAX_NUMBER_OF_BRUSH_DC_MOTORS for Brush DC motor + * @retval maxSpeed in pps for stepper motor + * in % for Brush DC motor (0-100) + **********************************************************/ +uint16_t BSP_MotorControl_GetMaxSpeed(uint8_t deviceId) +{ + uint16_t maxSpeed = 0; + if ((motorDrvHandle != 0)&&(motorDrvHandle->GetMaxSpeed != 0)) + { + maxSpeed = motorDrvHandle->GetMaxSpeed(deviceId); + } + else + { + MOTOR_CONTROL_ERROR_UNDEFINED_FUNCTION(12); + } + return(maxSpeed); +} + +/******************************************************//** + * @brief Returns the min speed of the specified device + * @param[in] deviceId (from 0 to MAX_NUMBER_OF_DEVICES - 1) + * For L6208: dummy parameter for compatibility with motor.h + * @retval minSpeed in pps + **********************************************************/ +uint16_t BSP_MotorControl_GetMinSpeed(uint8_t deviceId) +{ + uint16_t minSpeed = 0; + + if ((motorDrvHandle != 0)&&(motorDrvHandle->GetMinSpeed != 0)) + { + minSpeed = motorDrvHandle->GetMinSpeed(deviceId); + } + else + { + MOTOR_CONTROL_ERROR_UNDEFINED_FUNCTION(13); + } + return(minSpeed); +} + +/******************************************************//** + * @brief Returns the ABS_POSITION of the specified device + * @param[in] deviceId (from 0 to MAX_NUMBER_OF_DEVICES - 1) + * For L6208: dummy parameter for compatibility with motor.h + * @retval ABS_POSITION register value converted in a 32b signed integer + **********************************************************/ +int32_t BSP_MotorControl_GetPosition(uint8_t deviceId) +{ + int32_t pos = 0; + + if ((motorDrvHandle != 0)&&(motorDrvHandle->GetPosition != 0)) + { + pos = motorDrvHandle->GetPosition(deviceId); + } + else + { + MOTOR_CONTROL_ERROR_UNDEFINED_FUNCTION(14); + } + return(pos); +} + +/******************************************************//** + * @brief Requests the motor to move to the home position (ABS_POSITION = 0) + * @param[in] deviceId (from 0 to MAX_NUMBER_OF_DEVICES - 1) + * For L6208: dummy parameter for compatibility with motor.h + * @retval None + **********************************************************/ +void BSP_MotorControl_GoHome(uint8_t deviceId) +{ + if ((motorDrvHandle != 0)&&(motorDrvHandle->GoHome != 0)) + { + motorDrvHandle->GoHome(deviceId); + } + else + { + MOTOR_CONTROL_ERROR_UNDEFINED_FUNCTION(15); + } +} + +/******************************************************//** + * @brief Requests the motor to move to the mark position + * @param[in] deviceId (from 0 to MAX_NUMBER_OF_DEVICES - 1) + * For L6208: dummy parameter for compatibility with motor.h + * @retval None + **********************************************************/ +void BSP_MotorControl_GoMark(uint8_t deviceId) +{ + if ((motorDrvHandle != 0)&&(motorDrvHandle->GoMark != 0)) + { + motorDrvHandle->GoMark(deviceId); + } + else + { + MOTOR_CONTROL_ERROR_UNDEFINED_FUNCTION(16); + } +} + +/******************************************************//** + * @brief Requests the motor to move to the specified position + * @param[in] deviceId (from 0 to MAX_NUMBER_OF_DEVICES - 1) + * For L6208: dummy parameter for compatibility with motor.h + * @param[in] targetPosition absolute position in steps + * @retval None + **********************************************************/ +void BSP_MotorControl_GoTo(uint8_t deviceId, int32_t targetPosition) +{ + if ((motorDrvHandle != 0)&&(motorDrvHandle->GoTo != 0)) + { + motorDrvHandle->GoTo(deviceId, targetPosition); + } + else + { + MOTOR_CONTROL_ERROR_UNDEFINED_FUNCTION(17); + } +} + +/******************************************************//** + * @brief Immediatly stops the motor. + * @param[in] deviceId (from 0 to MAX_NUMBER_OF_DEVICES - 1) for stepper motor + * For L6208: dummy parameter for compatibility with motor.h + * motorId from 0 to MAX_NUMBER_OF_BRUSH_DC_MOTORS for Brush DC motor + * @retval None + **********************************************************/ +void BSP_MotorControl_HardStop(uint8_t deviceId) +{ + if ((motorDrvHandle != 0)&&(motorDrvHandle->HardStop != 0)) + { + motorDrvHandle->HardStop(deviceId); + } + else + { + MOTOR_CONTROL_ERROR_UNDEFINED_FUNCTION(18); + } +} + +/******************************************************//** + * @brief Moves the motor of the specified number of steps + * @param[in] deviceId (from 0 to MAX_NUMBER_OF_DEVICES - 1) + * For L6208: dummy parameter for compatibility with motor.h + * @param[in] direction FORWARD or BACKWARD + * @param[in] stepCount Number of steps to perform + * @retval None + **********************************************************/ +void BSP_MotorControl_Move(uint8_t deviceId, motorDir_t direction, uint32_t stepCount) +{ + if ((motorDrvHandle != 0)&&(motorDrvHandle->Move != 0)) + { + motorDrvHandle->Move(deviceId, direction, stepCount); + } + else + { + MOTOR_CONTROL_ERROR_UNDEFINED_FUNCTION(19); + } +} + +/******************************************************//** + * @brief Resets all motor driver devices + * @retval None + **********************************************************/ +void BSP_MotorControl_ResetAllDevices(void) +{ + if ((motorDrvHandle != 0)&&(motorDrvHandle->ResetAllDevices != 0)) + { + motorDrvHandle->ResetAllDevices(); + } + else + { + MOTOR_CONTROL_ERROR_UNDEFINED_FUNCTION(20); + } +} + +/******************************************************//** + * @brief Runs the motor. It will accelerate from the min + * speed up to the max speed by using the device acceleration. + * @param[in] deviceId (from 0 to MAX_NUMBER_OF_DEVICES - 1) for stepper motor + * For L6208: dummy parameter for compatibility with motor.h + * motorId from 0 to MAX_NUMBER_OF_BRUSH_DC_MOTORS for Brush DC motor + * @param[in] direction FORWARD or BACKWARD + * @retval None + * @note For unidirectionnal brush DC motor, direction parameter + * has no effect + **********************************************************/ +void BSP_MotorControl_Run(uint8_t deviceId, motorDir_t direction) +{ + if ((motorDrvHandle != 0)&&(motorDrvHandle->Run != 0)) + { + motorDrvHandle->Run(deviceId, direction); + } + else + { + MOTOR_CONTROL_ERROR_UNDEFINED_FUNCTION(21); + } +} +/******************************************************//** + * @brief Changes the acceleration of the specified device + * @param[in] deviceId (from 0 to MAX_NUMBER_OF_DEVICES - 1) + * For L6208: dummy parameter for compatibility with motor.h + * @param[in] newAcc New acceleration to apply in pps^2 + * @retval true if the command is successfully executed, else false + * @note The command is not performed is the device is executing + * a MOVE or GOTO command (but it can be used during a RUN command) + **********************************************************/ +bool BSP_MotorControl_SetAcceleration(uint8_t deviceId,uint16_t newAcc) +{ + bool status = FALSE; + if ((motorDrvHandle != 0)&&(motorDrvHandle->SetAcceleration != 0)) + { + status = motorDrvHandle->SetAcceleration(deviceId, newAcc); + } + else + { + MOTOR_CONTROL_ERROR_UNDEFINED_FUNCTION(22); + } + return (status); +} + +/******************************************************//** + * @brief Changes the deceleration of the specified device + * @param[in] deviceId (from 0 to MAX_NUMBER_OF_DEVICES - 1) + * For L6208: dummy parameter for compatibility with motor.h + * @param[in] newDec New deceleration to apply in pps^2 + * @retval true if the command is successfully executed, else false + * @note The command is not performed is the device is executing + * a MOVE or GOTO command (but it can be used during a RUN command) + **********************************************************/ +bool BSP_MotorControl_SetDeceleration(uint8_t deviceId, uint16_t newDec) +{ + bool status = FALSE; + if ((motorDrvHandle != 0)&&(motorDrvHandle->SetDeceleration != 0)) + { + status = motorDrvHandle->SetDeceleration(deviceId, newDec); + } + else + { + MOTOR_CONTROL_ERROR_UNDEFINED_FUNCTION(23); + } + return (status); +} + +/******************************************************//** + * @brief Set current position to be the Home position (ABS pos set to 0) + * @param[in] deviceId (from 0 to MAX_NUMBER_OF_DEVICES - 1) + * @param[in] homePosition new absolute home position + * For L6208: dummy parameter for compatibility with motor.h + * @retval None + **********************************************************/ +void BSP_MotorControl_SetHome(uint8_t deviceId, int32_t homePosition) +{ + if ((motorDrvHandle != 0)&&(motorDrvHandle->SetHome != 0)) + { + motorDrvHandle->SetHome(deviceId, homePosition); + } + else + { + MOTOR_CONTROL_ERROR_UNDEFINED_FUNCTION(24); + } +} + +/******************************************************//** + * @brief Sets current position to be the Mark position + * @param[in] deviceId (from 0 to MAX_NUMBER_OF_DEVICES - 1) + * @param[in] markPosition new absolute mark position + * For L6208: dummy parameter for compatibility with motor.h + * @retval None + **********************************************************/ +void BSP_MotorControl_SetMark(uint8_t deviceId, int32_t markPosition) +{ + if ((motorDrvHandle != 0)&&(motorDrvHandle->SetMark != 0)) + { + motorDrvHandle->SetMark(deviceId, markPosition); + } + else + { + MOTOR_CONTROL_ERROR_UNDEFINED_FUNCTION(25); + } +} + +/******************************************************//** + * @brief Changes the max speed of the specified device + * @param[in] deviceId (from 0 to MAX_NUMBER_OF_DEVICES - 1) for stepper motor + * For L6208: dummy parameter for compatibility with motor.h + * motorId from 0 to MAX_NUMBER_OF_BRUSH_DC_MOTORS for Brush DC motor + * @param[in] newMaxSpeed New max speed to apply in pps for stepper motor, + in % for Brush DC motor (0-100) + * @retval true if the command is successfully executed, else false + * @note For a stepper motor, the command is not performed if the device + * is executing a MOVE or GOTO command (but it can be used during a RUN command). + **********************************************************/ +bool BSP_MotorControl_SetMaxSpeed(uint8_t deviceId, uint16_t newMaxSpeed) +{ + bool status = FALSE; + if ((motorDrvHandle != 0)&&(motorDrvHandle->SetMaxSpeed != 0)) + { + status = motorDrvHandle->SetMaxSpeed(deviceId, newMaxSpeed); + } + else + { + MOTOR_CONTROL_ERROR_UNDEFINED_FUNCTION(26); + } + return (status); +} + +/******************************************************//** + * @brief Changes the min speed of the specified device + * @param[in] deviceId (from 0 to MAX_NUMBER_OF_DEVICES - 1) + * For L6208: dummy parameter for compatibility with motor.h + * @param[in] newMinSpeed New min speed to apply in pps + * @retval true if the command is successfully executed, else false + * @note The command is not performed is the device is executing + * a MOVE or GOTO command (but it can be used during a RUN command). + **********************************************************/ +bool BSP_MotorControl_SetMinSpeed(uint8_t deviceId, uint16_t newMinSpeed) +{ + bool status = FALSE; + if ((motorDrvHandle != 0)&&(motorDrvHandle->SetMinSpeed != 0)) + { + status = motorDrvHandle->SetMinSpeed(deviceId, newMinSpeed); + } + else + { + MOTOR_CONTROL_ERROR_UNDEFINED_FUNCTION(27); + } + + return (status); +} + +/******************************************************//** + * @brief Stops the motor by using the device deceleration + * @param[in] deviceId (from 0 to MAX_NUMBER_OF_DEVICES - 1) for stepper motor + * For L6208: dummy parameter for compatibility with motor.h + * motorId from 0 to MAX_NUMBER_OF_BRUSH_DC_MOTORS for Brush DC motor + * @retval true if the command is successfully executed, else false + * @note The command is not performed is the device is in INACTIVE state. + **********************************************************/ +bool BSP_MotorControl_SoftStop(uint8_t deviceId) +{ + bool status = FALSE; + if ((motorDrvHandle != 0)&&(motorDrvHandle->SoftStop != 0)) + { + status = motorDrvHandle->SoftStop(deviceId); + } + else + { + MOTOR_CONTROL_ERROR_UNDEFINED_FUNCTION(28); + } + return (status); +} + +/******************************************************//** + * @brief Handles the device state machine at each step + * or at each tick + * @param[in] deviceId (from 0 to MAX_NUMBER_OF_DEVICES - 1) + * For L6208: dummy parameter for compatibility with motor.h + * @retval None + * @note Must only be called by the timer ISR + **********************************************************/ +void BSP_MotorControl_StepClockHandler(uint8_t deviceId) +{ + if ((motorDrvHandle != 0)&&(motorDrvHandle->StepClockHandler != 0)) + { + motorDrvHandle->StepClockHandler(deviceId); + } + else + { + MOTOR_CONTROL_ERROR_UNDEFINED_FUNCTION(29); + } +} +/******************************************************//** + * @brief Locks until the device state becomes Inactive + * @param[in] deviceId (from 0 to MAX_NUMBER_OF_DEVICES - 1) + * For L6208: dummy parameter for compatibility with motor.h + * @retval None + **********************************************************/ +void BSP_MotorControl_WaitWhileActive(uint8_t deviceId) +{ + if ((motorDrvHandle != 0)&&(motorDrvHandle->WaitWhileActive != 0)) + { + motorDrvHandle->WaitWhileActive(deviceId); + } + else + { + MOTOR_CONTROL_ERROR_UNDEFINED_FUNCTION(30); + } +} + +/** + * @} + */ + +/** @defgroup BSP_MotorControl_Control_Functions BSP MotorControl Control Functions + * @{ + */ + +/******************************************************//** + * @brief Issue the Disable command to the motor driver of the specified device + * @param[in] deviceId (from 0 to MAX_NUMBER_OF_DEVICES - 1) for stepper motor + * For L6208: dummy parameter for compatibility with motor.h + * motorId from 0 to MAX_NUMBER_OF_BRUSH_DC_MOTORS for Brush DC motor + * @retval None + * @note For brush DC motor, when input of different brigdes are parallelized + * together, the disabling of one bridge leads to the disabling + * of the second one + **********************************************************/ +void BSP_MotorControl_CmdDisable(uint8_t deviceId) +{ + if ((motorDrvHandle != 0)&&(motorDrvHandle->CmdDisable != 0)) + { + motorDrvHandle->CmdDisable(deviceId); + } + else + { + MOTOR_CONTROL_ERROR_UNDEFINED_FUNCTION(31); + } +} + +/******************************************************//** + * @brief Issues the Enable command to the motor driver of the specified device + * @param[in] deviceId (from 0 to MAX_NUMBER_OF_DEVICES - 1) for stepper motor + * For L6208: dummy parameter for compatibility with motor.h + * motorId from 0 to MAX_NUMBER_OF_BRUSH_DC_MOTORS for Brush DC motor + * @retval None + * @note For brush DC motor, when input of different brigdes are parallelized + * together, the enabling of one bridge leads to the enabling + * of the second one + **********************************************************/ +void BSP_MotorControl_CmdEnable(uint8_t deviceId) +{ + if ((motorDrvHandle != 0)&&(motorDrvHandle->CmdEnable != 0)) + { + motorDrvHandle->CmdEnable(deviceId); + } + else + { + MOTOR_CONTROL_ERROR_UNDEFINED_FUNCTION(32); + } +} + +/******************************************************//** + * @brief Issues the GetParam command to the motor driver of the specified device + * @param[in] deviceId (from 0 to MAX_NUMBER_OF_DEVICES - 1) + * @param[in] param Register adress (BSP_MotorControl_ABS_POS, BSP_MotorControl_MARK,...) + * @retval Register value + **********************************************************/ +uint32_t BSP_MotorControl_CmdGetParam(uint8_t deviceId, + uint32_t param) +{ + uint32_t value = 0; + if ((motorDrvHandle != 0)&&(motorDrvHandle->CmdGetParam != 0)) + { + value = motorDrvHandle->CmdGetParam(deviceId, param); + } + else + { + MOTOR_CONTROL_ERROR_UNDEFINED_FUNCTION(33); + } + return (value); +} + +/******************************************************//** + * @brief Issues the GetStatus command to the motor driver of the specified + * device for stepper motor, + * Get bridge status for Brush DC motor + * @param[in] deviceId from 0 to MAX_NUMBER_OF_DEVICES - 1 for stepper motor, + bridgeId from 0 for bridge A, 1 for bridge B for brush DC motor + * @retval Status Register value for stepper motor, + * Bridge state for brush DC motor + * @note For stepper motor, once the GetStatus command is performed, + * the flags of the status register are reset. + * This is not the case when the status register is read with the + * GetParam command (via the functions ReadStatusRegister or CmdGetParam). + **********************************************************/ +uint16_t BSP_MotorControl_CmdGetStatus(uint8_t deviceId) +{ + uint16_t status = 0; + if ((motorDrvHandle != 0)&&(motorDrvHandle->CmdGetStatus != 0)) + { + status = motorDrvHandle->CmdGetStatus(deviceId); + } + else + { + MOTOR_CONTROL_ERROR_UNDEFINED_FUNCTION(34); + } + return (status); +} + +/******************************************************//** + * @brief Issues the Nop command to the motor driver of the specified device + * @param[in] deviceId (from 0 to MAX_NUMBER_OF_DEVICES - 1) + * @retval None + **********************************************************/ +void BSP_MotorControl_CmdNop(uint8_t deviceId) +{ + if ((motorDrvHandle != 0)&&(motorDrvHandle->CmdNop != 0)) + { + motorDrvHandle->CmdNop(deviceId); + } + else + { + MOTOR_CONTROL_ERROR_UNDEFINED_FUNCTION(35); + } +} + +/******************************************************//** + * @brief Issues the SetParam command to the motor driver of the specified device + * @param[in] deviceId (from 0 to MAX_NUMBER_OF_DEVICES - 1) + * @param[in] param Register adress (BSP_MotorControl_ABS_POS, BSP_MotorControl_MARK,...) + * @param[in] value Value to set in the register + * @retval None + **********************************************************/ +void BSP_MotorControl_CmdSetParam(uint8_t deviceId, + uint32_t param, + uint32_t value) +{ + if ((motorDrvHandle != 0)&&(motorDrvHandle->CmdSetParam != 0)) + { + motorDrvHandle->CmdSetParam(deviceId, param, value); + } + else + { + MOTOR_CONTROL_ERROR_UNDEFINED_FUNCTION(36); + } +} + +/******************************************************//** + * @brief Reads the Status Register value + * @param[in] deviceId (from 0 to MAX_NUMBER_OF_DEVICES - 1) + * @retval Status register valued + * @note The status register flags are not cleared + * at the difference with CmdGetStatus() + **********************************************************/ +uint16_t BSP_MotorControl_ReadStatusRegister(uint8_t deviceId) +{ + uint16_t status = 0; + if ((motorDrvHandle != 0)&&(motorDrvHandle->ReadStatusRegister != 0)) + { + status = motorDrvHandle->ReadStatusRegister(deviceId); + } + else + { + MOTOR_CONTROL_ERROR_UNDEFINED_FUNCTION(37); + } + return (status); +} + +/******************************************************//** + * @brief Releases the motor driver (pin set to High) of all devices + * @param[in] deviceId (from 0 to MAX_NUMBER_OF_DEVICES - 1) + * @retval None + **********************************************************/ +void BSP_MotorControl_ReleaseReset(uint8_t deviceId) +{ + if ((motorDrvHandle != 0)&&(motorDrvHandle->ReleaseReset != 0)) + { + motorDrvHandle->ReleaseReset(deviceId); + } + else + { + MOTOR_CONTROL_ERROR_UNDEFINED_FUNCTION(38); + } +} + +/******************************************************//** + * @brief Resets the motor driver (reset pin set to low) of all devices + * @retval None + **********************************************************/ +void BSP_MotorControl_Reset(uint8_t deviceId) +{ + if ((motorDrvHandle != 0)&&(motorDrvHandle->Reset != 0)) + { + motorDrvHandle->Reset(deviceId); + } + else + { + MOTOR_CONTROL_ERROR_UNDEFINED_FUNCTION(39); + } +} + +/******************************************************//** + * @brief Set the stepping mode + * @param[in] deviceId (from 0 to MAX_NUMBER_OF_DEVICES - 1) + * For L6208: dummy parameter for compatibility with motor.h + * @param[in] stepMode from full step to 1/16 microstep as specified in + * enum BSP_MotorControl_STEP_SEL_t + * @retval true if the command is successfully executed, else false + **********************************************************/ +bool BSP_MotorControl_SelectStepMode(uint8_t deviceId, motorStepMode_t stepMode) +{ + bool value = 0; + if ((motorDrvHandle != 0)&&(motorDrvHandle->SelectStepMode != 0)) + { + value = motorDrvHandle->SelectStepMode(deviceId, stepMode); + } + else + { + MOTOR_CONTROL_ERROR_UNDEFINED_FUNCTION(40); + } + return (value); +} + +/******************************************************//** + * @brief Specifies the direction + * @param[in] deviceId (from 0 to MAX_NUMBER_OF_DEVICES - 1) + * For L6208: dummy parameter for compatibility with motor.h + * @param[in] dir FORWARD or BACKWARD + * @note The direction change is only applied if the device + * is in INACTIVE state + * For L6208: In velocity mode a direction change forces the device to stop and + * then run in the new direction. In position mode, if the device is + * running, a direction change will generate an error. + * @retval None + **********************************************************/ +void BSP_MotorControl_SetDirection(uint8_t deviceId, motorDir_t dir) +{ + if ((motorDrvHandle != 0)&&(motorDrvHandle->SetDirection != 0)) + { + motorDrvHandle->SetDirection(deviceId, dir); + } + else + { + MOTOR_CONTROL_ERROR_UNDEFINED_FUNCTION(41); + } +} + +/******************************************************//** + * @brief Issues Go To Dir command + * @param[in] deviceId (from 0 to MAX_NUMBER_OF_DEVICES-1 ) + * For L6208: dummy parameter for compatibility with motor.h + * @param[in] dir movement direction + * @param[in] abs_pos absolute position where requested to move + * @retval None + **********************************************************/ +void BSP_MotorControl_CmdGoToDir(uint8_t deviceId, motorDir_t dir, int32_t abs_pos) +{ + if ((motorDrvHandle != 0)&&(motorDrvHandle->CmdGoToDir != 0)) + { + motorDrvHandle->CmdGoToDir(deviceId, dir, abs_pos); + } + else + { + MOTOR_CONTROL_ERROR_UNDEFINED_FUNCTION(42); + } +} + +/******************************************************//** + * @brief Checks if at least one device is busy by checking + * busy pin position. + * The busy pin is shared between all devices. + * @retval One if at least one device is busy, otherwise zero + **********************************************************/ +uint8_t BSP_MotorControl_CheckBusyHw(void) +{ + uint8_t value = 0; + if ((motorDrvHandle != 0)&&(motorDrvHandle->CheckBusyHw != 0)) + { + value = motorDrvHandle->CheckBusyHw(); + } + else + { + MOTOR_CONTROL_ERROR_UNDEFINED_FUNCTION(43); + } + return (value); +} + +/******************************************************//** + * @brief Checks if at least one device has an alarm flag set + * by reading flag pin position. + * The flag pin is shared between all devices. + * @retval One if at least one device has an alarm flag set , + * otherwise zero + **********************************************************/ +uint8_t BSP_MotorControl_CheckStatusHw(void) +{ + uint8_t value = 0; + if ((motorDrvHandle != 0)&&(motorDrvHandle->CheckStatusHw != 0)) + { + value = motorDrvHandle->CheckStatusHw(); + } + else + { + MOTOR_CONTROL_ERROR_UNDEFINED_FUNCTION(44); + } + return (value); +} + +/******************************************************//** + * @brief Issues Go Until command + * @param[in] deviceId (from 0 to MAX_NUMBER_OF_DEVICES-1 ) + * @param[in] action ACTION_RESET or ACTION_COPY + * @param[in] dir movement direction + * @param[in] speed in 2^-28 step/tick + * @retval None + **********************************************************/ +void BSP_MotorControl_CmdGoUntil(uint8_t deviceId, motorAction_t action, motorDir_t dir, uint32_t speed) +{ + if ((motorDrvHandle != 0)&&(motorDrvHandle->CmdGoUntil != 0)) + { + motorDrvHandle->CmdGoUntil(deviceId, action, dir, speed); + } + else + { + MOTOR_CONTROL_ERROR_UNDEFINED_FUNCTION(45); + } +} + +/******************************************************//** + * @brief Immediately stops the motor and disable the power bridge. + * @param[in] deviceId from 0 to MAX_NUMBER_OF_DEVICES-1 for stepper motor + * motorId from 0 to MAX_NUMBER_OF_BRUSH_DC_MOTORS for Brush DC motor + * @retval None + * @note if two Brush DC motors use the same power bridge, the + * power bridge will be disable only if the two motors are + * stopped + **********************************************************/ +void BSP_MotorControl_CmdHardHiZ(uint8_t deviceId) +{ + if ((motorDrvHandle != 0)&&(motorDrvHandle->CmdHardHiZ != 0)) + { + motorDrvHandle->CmdHardHiZ(deviceId); + } + else + { + MOTOR_CONTROL_ERROR_UNDEFINED_FUNCTION(46); + } +} + +/******************************************************//** + * @brief Issues Release SW command + * @param[in] deviceId (from 0 to MAX_NUMBER_OF_DEVICES-1 ) + * @param[in] action + * @param[in] dir movement direction + * @retval None + **********************************************************/ +void BSP_MotorControl_CmdReleaseSw(uint8_t deviceId, motorAction_t action, motorDir_t dir) +{ + if ((motorDrvHandle != 0)&&(motorDrvHandle->CmdReleaseSw != 0)) + { + motorDrvHandle->CmdReleaseSw(deviceId, action, dir); + } + else + { + MOTOR_CONTROL_ERROR_UNDEFINED_FUNCTION(47); + } +} + +/******************************************************//** + * @brief Issues Reset Device command + * @param[in] deviceId (from 0 to MAX_NUMBER_OF_DEVICES-1 ) + * @retval None + **********************************************************/ +void BSP_MotorControl_CmdResetDevice(uint8_t deviceId) +{ + if ((motorDrvHandle != 0)&&(motorDrvHandle->CmdResetDevice != 0)) + { + motorDrvHandle->CmdResetDevice(deviceId); + } + else + { + MOTOR_CONTROL_ERROR_UNDEFINED_FUNCTION(48); + } +} + +/******************************************************//** + * @brief Issues Reset Pos command + * @param[in] deviceId (from 0 to MAX_NUMBER_OF_DEVICES-1 ) + * @retval None + **********************************************************/ +void BSP_MotorControl_CmdResetPos(uint8_t deviceId) +{ + if ((motorDrvHandle != 0)&&(motorDrvHandle->CmdResetPos != 0)) + { + motorDrvHandle->CmdResetPos(deviceId); + } + else + { + MOTOR_CONTROL_ERROR_UNDEFINED_FUNCTION(49); + } +} + +/******************************************************//** + * @brief Issues Run command + * @param[in] deviceId (from 0 to MAX_NUMBER_OF_DEVICES-1 ) + * @param[in] dir Movement direction (FORWARD, BACKWARD) + * @param[in] speed in 2^-28 step/tick + * @retval None + **********************************************************/ +void BSP_MotorControl_CmdRun(uint8_t deviceId, motorDir_t dir, uint32_t speed) +{ + if ((motorDrvHandle != 0)&&(motorDrvHandle->CmdRun != 0)) + { + motorDrvHandle->CmdRun(deviceId, dir, speed); + } + else + { + MOTOR_CONTROL_ERROR_UNDEFINED_FUNCTION(50); + } +} + +/******************************************************//** + * @brief Issues Soft HiZ command + * @param[in] deviceId (from 0 to MAX_NUMBER_OF_DEVICES-1 ) + * @retval None + **********************************************************/ +void BSP_MotorControl_CmdSoftHiZ(uint8_t deviceId) +{ + if ((motorDrvHandle != 0)&&(motorDrvHandle->CmdSoftHiZ != 0)) + { + motorDrvHandle->CmdSoftHiZ(deviceId); + } + else + { + MOTOR_CONTROL_ERROR_UNDEFINED_FUNCTION(51); + } +} + +/******************************************************//** + * @brief Issues Step Clock command + * @param[in] deviceId (from 0 to MAX_NUMBER_OF_DEVICES-1 ) + * @param[in] dir Movement direction (FORWARD, BACKWARD) + * @retval None + **********************************************************/ +void BSP_MotorControl_CmdStepClock(uint8_t deviceId, motorDir_t dir) +{ + if ((motorDrvHandle != 0)&&(motorDrvHandle->CmdStepClock != 0)) + { + motorDrvHandle->CmdStepClock(deviceId, dir); + } + else + { + MOTOR_CONTROL_ERROR_UNDEFINED_FUNCTION(52); + } +} + +/******************************************************//** + * @brief Fetch and clear status flags of all devices + * by issuing a GET_STATUS command simultaneously + * to all devices. + * Then, the fetched status of each device can be retrieved + * by using the BSP_MotorControl_GetFetchedStatus function + * provided there is no other calls to functions which + * use the SPI in between. + * @retval None + **********************************************************/ +void BSP_MotorControl_FetchAndClearAllStatus(void) +{ + if ((motorDrvHandle != 0)&&(motorDrvHandle->FetchAndClearAllStatus != 0)) + { + motorDrvHandle->FetchAndClearAllStatus(); + } + else + { + MOTOR_CONTROL_ERROR_UNDEFINED_FUNCTION(53); + } +} + +/******************************************************//** + * @brief Get the value of the STATUS register which was + * fetched by using BSP_MotorControl_FetchAndClearAllStatus. + * The fetched values are available as long as there is + * no other calls to functions which use the SPI. + * @param[in] deviceId (from 0 to MAX_NUMBER_OF_DEVICES-1 ) + * @retval Last fetched value of the STATUS register + **********************************************************/ +uint16_t BSP_MotorControl_GetFetchedStatus(uint8_t deviceId) +{ + uint16_t value = 0; + if ((motorDrvHandle != 0)&&(motorDrvHandle->GetFetchedStatus != 0)) + { + value = motorDrvHandle->GetFetchedStatus(deviceId); + } + else + { + MOTOR_CONTROL_ERROR_UNDEFINED_FUNCTION(54); + } + return (value); +} + +/******************************************************//** + * @brief Return the number of devices in the daisy chain + * @retval number of devices from 1 to MAX_NUMBER_OF_DEVICES + **********************************************************/ +uint8_t BSP_MotorControl_GetNbDevices(void) +{ + uint8_t value = 0; + if ((motorDrvHandle != 0)&&(motorDrvHandle->GetNbDevices != 0)) + { + value = motorDrvHandle->GetNbDevices(); + } + else + { + MOTOR_CONTROL_ERROR_UNDEFINED_FUNCTION(55); + } + return (value); +} + +/******************************************************//** + * @brief Checks if the specified device is busy + * by reading the Busy bit of its status Register + * @param[in] deviceId (from 0 to MAX_NUMBER_OF_DEVICES-1 ) + * @retval true if device is busy, else false + **********************************************************/ +bool BSP_MotorControl_IsDeviceBusy(uint8_t deviceId) +{ + bool value = 0; + if ((motorDrvHandle != 0)&&(motorDrvHandle->IsDeviceBusy != 0)) + { + value = motorDrvHandle->IsDeviceBusy(deviceId); + } + else + { + MOTOR_CONTROL_ERROR_UNDEFINED_FUNCTION(56); + } + return (value); +} + +/******************************************************//** + * @brief Sends commands stored in the queue by previously + * BSP_MotorControl_QueueCommands + * @retval None + *********************************************************/ +void BSP_MotorControl_SendQueuedCommands(void) +{ + if ((motorDrvHandle != 0)&&(motorDrvHandle->SendQueuedCommands != 0)) + { + motorDrvHandle->SendQueuedCommands(); + } + else + { + MOTOR_CONTROL_ERROR_UNDEFINED_FUNCTION(57); + } +} + +/******************************************************//** + * @brief Put commands in queue before synchronous sending + * done by calling BSP_MotorControl_SendQueuedCommands. + * Any call to functions that use the SPI between the calls of + * BSP_MotorControl_QueueCommands and BSP_MotorControl_SendQueuedCommands + * will corrupt the queue. + * A command for each device of the daisy chain must be + * specified before calling BSP_MotorControl_SendQueuedCommands. + * @param[in] deviceId deviceId (from 0 to MAX_NUMBER_OF_DEVICES-1 ) + * @param[in] command Command to queue (all BSP_MotorControl commmands + * except SET_PARAM, GET_PARAM, GET_STATUS) + * @param[in] value argument of the command to queue + * @retval None + *********************************************************/ +void BSP_MotorControl_QueueCommands(uint8_t deviceId, uint8_t command, int32_t value) +{ + if ((motorDrvHandle != 0)&&(motorDrvHandle->QueueCommands != 0)) + { + motorDrvHandle->QueueCommands(deviceId, command, value); + } + else + { + MOTOR_CONTROL_ERROR_UNDEFINED_FUNCTION(58); + } +} + +/******************************************************//** + * @brief Locks until all devices become not busy + * @retval None + **********************************************************/ +void BSP_MotorControl_WaitForAllDevicesNotBusy(void) +{ + if ((motorDrvHandle != 0)&&(motorDrvHandle->WaitForAllDevicesNotBusy != 0)) + { + motorDrvHandle->WaitForAllDevicesNotBusy(); + } + else + { + MOTOR_CONTROL_ERROR_UNDEFINED_FUNCTION(59); + } +} + +/******************************************************//** + * @brief Handler of the busy interrupt which calls the user callback (if defined) + * @retval None + **********************************************************/ +void BSP_MotorControl_BusyInterruptHandler(void) +{ + if ((motorDrvHandle != 0)&&(motorDrvHandle->BusyInterruptHandler != 0)) + { + motorDrvHandle->BusyInterruptHandler(); + } + else + { + MOTOR_CONTROL_ERROR_UNDEFINED_FUNCTION(61); + } +} + +/******************************************************//** + * @brief Issues Soft Stop command + * @param[in] deviceId (from 0 to MAX_NUMBER_OF_DEVICES-1 ) + * @retval None + **********************************************************/ +void BSP_MotorControl_CmdSoftStop(uint8_t deviceId) +{ + if ((motorDrvHandle != 0)&&(motorDrvHandle->CmdSoftStop != 0)) + { + motorDrvHandle->CmdSoftStop(deviceId); + } + else + { + MOTOR_CONTROL_ERROR_UNDEFINED_FUNCTION(62); + } +} + +/******************************************************//** + * @brief Start the step clock by using the given frequency + * @param[in] newFreq in Hz of the step clock + * @retval None + * @note The frequency is directly the current speed of the device + **********************************************************/ +void BSP_MotorControl_StartStepClock(uint16_t newFreq) +{ + if ((motorDrvHandle != 0)&&(motorDrvHandle->StartStepClock != 0)) + { + motorDrvHandle->StartStepClock(newFreq); + } + else + { + MOTOR_CONTROL_ERROR_UNDEFINED_FUNCTION(63); + } +} + +/******************************************************//** + * @brief Stops the PWM uses for the step clock + * @retval None + **********************************************************/ +void BSP_MotorControl_StopStepClock(void) +{ + if ((motorDrvHandle != 0)&&(motorDrvHandle->StopStepClock != 0)) + { + motorDrvHandle->StopStepClock(); + } + else + { + MOTOR_CONTROL_ERROR_UNDEFINED_FUNCTION(64); + } +} + +/******************************************************//** + * @brief Set the dual full bridge configuration + * @param[in] config bridge configuration to apply + * for L6206, see dualFullBridgeConfig_t enum + * for Stspin240, 0 for a mono brush DC configuration, 1 for a dual brush DC configuration + * for Stspin250, 0 only as no dual brush DC configuration is supported + * @retval None + **********************************************************/ +void BSP_MotorControl_SetDualFullBridgeConfig(uint8_t config) +{ + if ((motorDrvHandle != 0)&&(motorDrvHandle->SetDualFullBridgeConfig != 0)) + { + motorDrvHandle->SetDualFullBridgeConfig(config); + } + else + { + MOTOR_CONTROL_ERROR_UNDEFINED_FUNCTION(65); + } +} + +/******************************************************//** + * @brief Get the PWM frequency of the bridge input + * @param[in] bridgeId from 0 for bridge A to 1 for bridge B for brush DC motor + * bridgeId must be 0 for L6208 (both bridges are set with the same frequency) + * @retval Freq in Hz + **********************************************************/ +uint32_t BSP_MotorControl_GetBridgeInputPwmFreq(uint8_t bridgeId) +{ + uint32_t pwmFreq = 0; + + if ((motorDrvHandle != 0)&&(motorDrvHandle->GetBridgeInputPwmFreq != 0)) + { + pwmFreq = motorDrvHandle->GetBridgeInputPwmFreq(bridgeId); + } + else + { + MOTOR_CONTROL_ERROR_UNDEFINED_FUNCTION(66); + } + return (pwmFreq); +} + +/******************************************************//** + * @brief Changes the PWM frequency of the bridge input + * @param[in] bridgeId from 0 for bridge A to 1 for bridge B for brush DC motor + * bridgeId must be 0 for L6208 (both bridges are set with the same frequency) + * @param[in] newFreq in Hz up to 100000Hz + * @retval None + **********************************************************/ +void BSP_MotorControl_SetBridgeInputPwmFreq(uint8_t bridgeId, uint32_t newFreq) +{ + if ((motorDrvHandle != 0)&&(motorDrvHandle->SetBridgeInputPwmFreq != 0)) + { + motorDrvHandle->SetBridgeInputPwmFreq(bridgeId, newFreq); + } + else + { + MOTOR_CONTROL_ERROR_UNDEFINED_FUNCTION(67); + } +} + +/******************************************************//** + * @brief Select the mode to stop the motor. When the motor + * is stopped, if autoHiZ is TRUE, the power bridges are disabled + * if autoHiZ is FALSE, the power bridges are kept enabled. + * @param[in] deviceId (from 0 to MAX_NUMBER_OF_DEVICES - 1) + * deviceId dummy parameter for compatibility with motor.h + * @param[in] stopMode selected stop mode + * @retval None + **********************************************************/ +void BSP_MotorControl_SetStopMode(uint8_t deviceId, motorStopMode_t stopMode) +{ + if ((motorDrvHandle != 0)&&(motorDrvHandle->SetStopMode != 0)) + { + motorDrvHandle->SetStopMode(deviceId, stopMode); + } + else + { + MOTOR_CONTROL_ERROR_UNDEFINED_FUNCTION(68); + } +} + +/******************************************************//** + * @brief Get the selected stop mode + * @param[in] deviceId (from 0 to MAX_NUMBER_OF_DEVICES - 1) + * For L6208: dummy parameter for compatibility with motor.h + * @retval the selected stop mode + **********************************************************/ +motorStopMode_t BSP_MotorControl_GetStopMode(uint8_t deviceId) +{ + motorStopMode_t stopMode = UNKNOW_STOP_MODE; + + if ((motorDrvHandle != 0)&&(motorDrvHandle->GetStopMode != 0)) + { + stopMode = motorDrvHandle->GetStopMode(deviceId); + } + else + { + MOTOR_CONTROL_ERROR_UNDEFINED_FUNCTION(69); + } + return (stopMode); +} + +/******************************************************//** + * @brief Select the motor decay mode + * @param[in] deviceId (from 0 to MAX_NUMBER_OF_DEVICES - 1) + * For L6208: dummy parameter for compatibility with motor.h + * @param[in] decayMode (SLOW_DECAY or FAST_DECAY) + * @retval None + **********************************************************/ +void BSP_MotorControl_SetDecayMode(uint8_t deviceId, motorDecayMode_t decayMode) +{ + if ((motorDrvHandle != 0)&&(motorDrvHandle->SetDecayMode != 0)) + { + motorDrvHandle->SetDecayMode(deviceId, decayMode); + } + else + { + MOTOR_CONTROL_ERROR_UNDEFINED_FUNCTION(70); + } +} + +/******************************************************//** + * @brief Get the motor decay mode + * @param[in] deviceId (from 0 to MAX_NUMBER_OF_DEVICES - 1) + * For L6208: dummy parameter for compatibility with motor.h + * @retval decay mode + **********************************************************/ +motorDecayMode_t BSP_MotorControl_GetDecayMode(uint8_t deviceId) +{ + motorDecayMode_t decayMode = UNKNOW_DECAY; + + if ((motorDrvHandle != 0)&&(motorDrvHandle->GetDecayMode != 0)) + { + decayMode = motorDrvHandle->GetDecayMode(deviceId); + } + else + { + MOTOR_CONTROL_ERROR_UNDEFINED_FUNCTION(71); + } + return (decayMode); +} + +/******************************************************//** + * @brief Get the motor step mode + * @param[in] deviceId (from 0 to MAX_NUMBER_OF_DEVICES - 1) + * For L6208: dummy parameter for compatibility with motor.h + * @retval step mode + **********************************************************/ +motorStepMode_t BSP_MotorControl_GetStepMode(uint8_t deviceId) +{ + motorStepMode_t stepMode = STEP_MODE_UNKNOW; + + if ((motorDrvHandle != 0)&&(motorDrvHandle->GetStepMode != 0)) + { + stepMode = motorDrvHandle->GetStepMode(deviceId); + } + else + { + MOTOR_CONTROL_ERROR_UNDEFINED_FUNCTION(72); + } + return (stepMode); +} + +/******************************************************//** + * @brief Get the motor direction + * @param[in] deviceId (from 0 to MAX_NUMBER_OF_DEVICES - 1) + * For L6208: dummy parameter for compatibility with motor.h + * @retval direction + **********************************************************/ +motorDir_t BSP_MotorControl_GetDirection(uint8_t deviceId) +{ + motorDir_t dir = UNKNOW_DIR; + + if ((motorDrvHandle != 0)&&(motorDrvHandle->GetDirection != 0)) + { + dir = motorDrvHandle->GetDirection(deviceId); + } + else + { + MOTOR_CONTROL_ERROR_UNDEFINED_FUNCTION(73); + } + return (dir); +} + +/******************************************************//** + * @brief Exit specified device from reset + * @param[in] deviceId (from 0 to MAX_NUMBER_OF_DEVICES-1 ) + * @retval None + **********************************************************/ +void BSP_MotorControl_ExitDeviceFromReset(uint8_t deviceId) +{ + if ((motorDrvHandle != 0)&&(motorDrvHandle->ExitDeviceFromReset != 0)) + { + motorDrvHandle->ExitDeviceFromReset(deviceId); + } + else + { + MOTOR_CONTROL_ERROR_UNDEFINED_FUNCTION(74); + } +} + +/******************************************************//** + * @brief Get the motor torque + * @param[in] deviceId (from 0 to MAX_NUMBER_OF_DEVICES - 1) + * @param[in] torqueMode Torque mode as specified in enum motorTorqueMode_t + * @retval torque value in % (from 0 to 100) + **********************************************************/ +uint8_t BSP_MotorControl_GetTorque(uint8_t deviceId, motorTorqueMode_t torqueMode) +{ + uint8_t torqueValue = 0; + + if ((motorDrvHandle != 0)&&(motorDrvHandle->GetTorque != 0)) + { + torqueValue = motorDrvHandle->GetTorque(deviceId, torqueMode); + } + else + { + MOTOR_CONTROL_ERROR_UNDEFINED_FUNCTION(76); + } + return (torqueValue); +} + +/******************************************************//** + * @brief Set the motor torque + * @param[in] deviceId (from 0 to MAX_NUMBER_OF_DEVICES - 1) + * @param[in] torqueMode Torque mode as specified in enum motorTorqueMode_t + * @param[in] torqueValue in % (from 0 to 100) + * @retval None + **********************************************************/ +void BSP_MotorControl_SetTorque(uint8_t deviceId, motorTorqueMode_t torqueMode, uint8_t torqueValue) +{ + if ((motorDrvHandle != 0)&&(motorDrvHandle->SetTorque != 0)) + { + motorDrvHandle->SetTorque(deviceId, torqueMode, torqueValue); + } + else + { + MOTOR_CONTROL_ERROR_UNDEFINED_FUNCTION(75); + } +} + +/******************************************************//** + * @brief Set the PWM frequency of Ref + * @param[in] refId Id of the targeted Ref + * @param[in] newFreq frequency in Hz + * @retval None + **********************************************************/ +void BSP_MotorControl_SetRefFreq(uint8_t refId, uint32_t newFreq) +{ + if ((motorDrvHandle != 0)&&(motorDrvHandle->SetRefFreq != 0)) + { + motorDrvHandle->SetRefFreq(refId, newFreq); + } + else + { + MOTOR_CONTROL_ERROR_UNDEFINED_FUNCTION(77); + } +} + +/******************************************************//** + * @brief Return the PWM frequency of Ref + * @param[in] refId Id of the targeted Ref + * @retval frequency in Hz + **********************************************************/ +uint32_t BSP_MotorControl_GetRefFreq(uint8_t refId) +{ + uint32_t value = 0; + if ((motorDrvHandle != 0)&&(motorDrvHandle->GetRefFreq != 0)) + { + value = motorDrvHandle->GetRefFreq(refId); + } + else + { + MOTOR_CONTROL_ERROR_UNDEFINED_FUNCTION(78); + } + return (value); +} + +/******************************************************//** + * @brief Set the PWM duty cycle of Ref + * @param[in] refId Id of the targeted Ref + * @param[in] newDc duty cycle in % (from 0 to 100) + * @retval None + **********************************************************/ +void BSP_MotorControl_SetRefDc(uint8_t refId, uint8_t newDc) +{ + if ((motorDrvHandle != 0)&&(motorDrvHandle->SetRefDc != 0)) + { + motorDrvHandle->SetRefDc(refId, newDc); + } + else + { + MOTOR_CONTROL_ERROR_UNDEFINED_FUNCTION(79); + } +} + +/******************************************************//** + * @brief Return the PWM duty cycle of Ref + * @param[in] refId Id of the targeted Ref + * @retval duty cycle in % (from 0 to 100) + **********************************************************/ +uint8_t BSP_MotorControl_GetRefDc(uint8_t refId) +{ + uint8_t value = 0; + if ((motorDrvHandle != 0)&&(motorDrvHandle->GetRefDc != 0)) + { + value = motorDrvHandle->GetRefDc(refId); + } + else + { + MOTOR_CONTROL_ERROR_UNDEFINED_FUNCTION(80); + } + return (value); +} + +/******************************************************//** + * @brief Set the number of devices in the daisy chain + * @param[in] id Component Id (L6474, Powerstep01,...) + * @param[in] nbDevices the number of devices to be used + * from 1 to MAX_NUMBER_OF_DEVICES + * @retval TRUE if successfull, FALSE if failure, attempt + * to set a number of devices greater than MAX_NUMBER_OF_DEVICES + **********************************************************/ +bool BSP_MotorControl_SetNbDevices(uint16_t id, uint8_t nbDevices) +{ + MotorControlBoardId = id; + bool status = FALSE; + if (id == BSP_MOTOR_CONTROL_BOARD_ID_L6474) + { + motorDrvHandle = L6474_GetMotorHandle(); + } + else if (id == BSP_MOTOR_CONTROL_BOARD_ID_POWERSTEP01) + { + motorDrvHandle = Powerstep01_GetMotorHandle(); + } + else if (id == BSP_MOTOR_CONTROL_BOARD_ID_L6206) + { + motorDrvHandle = L6206_GetMotorHandle(); + } + else if (id == BSP_MOTOR_CONTROL_BOARD_ID_L6208) + { + motorDrvHandle = L6208_GetMotorHandle(); + } + else if (id == BSP_MOTOR_CONTROL_BOARD_ID_STSPIN220) + { + motorDrvHandle = Stspin220_GetMotorHandle(); + } + else if ( (id == BSP_MOTOR_CONTROL_BOARD_ID_L6470) || + (id == BSP_MOTOR_CONTROL_BOARD_ID_L6472) ) + { + motorDrvHandle = l647x_GetMotorHandle(); + } + else if ( (id == BSP_MOTOR_CONTROL_BOARD_ID_L6480) || + (id == BSP_MOTOR_CONTROL_BOARD_ID_L6482) ) + { + motorDrvHandle = l648x_GetMotorHandle(); + } + else if ((id == BSP_MOTOR_CONTROL_BOARD_ID_STSPIN240)|| + (id == BSP_MOTOR_CONTROL_BOARD_ID_STSPIN250)) + { + motorDrvHandle = Stspin240_250_GetMotorHandle(); + } + else + { + motorDrvHandle = 0; + } + if ((motorDrvHandle != 0)&& + (motorDrvHandle->SetNbDevices != 0)&& + (nbDevices !=0)) + { + status = motorDrvHandle->SetNbDevices(nbDevices); + } + return (status); +} + +/******************************************************//** + * @brief Set the parameter param in the motor driver of the specified device + * @param[in] deviceId (from 0 to MAX_NUMBER_OF_DEVICES - 1) + * @param[in] param Register adress (BSP_MotorControl_ABS_POS, BSP_MotorControl_MARK,...) + * @param[in] value Floating point value to convert and set into the register + * @retval None + **********************************************************/ +bool BSP_MotorControl_SetAnalogValue(uint8_t deviceId, uint32_t param, float value) +{ + bool status = FALSE; + if ((motorDrvHandle != 0)&&(motorDrvHandle->CmdSetParam != 0)) + { + status = motorDrvHandle->SetAnalogValue(deviceId, param, value); + } + else + { + MOTOR_CONTROL_ERROR_UNDEFINED_FUNCTION(82); + } + return (status); +} + +/******************************************************//** + * @brief Get the parameter param in the motor driver of the specified device + * @param[in] deviceId (from 0 to MAX_NUMBER_OF_DEVICES - 1) + * @param[in] param Register adress (BSP_MotorControl_ABS_POS, BSP_MotorControl_MARK,...) + * @retval Floating point value corresponding to the register value + **********************************************************/ +float BSP_MotorControl_GetAnalogValue(uint8_t deviceId, uint32_t param) +{ + float value = 0; + if ((motorDrvHandle != 0)&&(motorDrvHandle->GetAnalogValue != 0)) + { + value = motorDrvHandle->GetAnalogValue(deviceId, param); + } + else + { + MOTOR_CONTROL_ERROR_UNDEFINED_FUNCTION(83); + } + return (value); +} + +/******************************************************//** + * @brief Enable or disable the torque boost + * @param[in] deviceId (from 0 to MAX_NUMBER_OF_DEVICES - 1) + * @param[in] enable true to enable torque boost, false to disable + * @retval None + **********************************************************/ +void BSP_MotorControl_SetTorqueBoostEnable(uint8_t deviceId, bool enable) +{ + if ((motorDrvHandle != 0)&&(motorDrvHandle->SetTorqueBoostEnable != 0)) + { + motorDrvHandle->SetTorqueBoostEnable(deviceId, enable); + } + else + { + MOTOR_CONTROL_ERROR_UNDEFINED_FUNCTION(84); + } +} + +/******************************************************//** + * @brief Get the torque boost feature status + * @param[in] deviceId (from 0 to MAX_NUMBER_OF_DEVICES - 1) + * @retval TRUE if enabled, FALSE if disabled + **********************************************************/ +bool BSP_MotorControl_GetTorqueBoostEnable(uint8_t deviceId) +{ + bool status = FALSE; + if ((motorDrvHandle != 0)&&(motorDrvHandle->GetTorqueBoostEnable != 0)) + { + status = motorDrvHandle->GetTorqueBoostEnable(deviceId); + } + else + { + MOTOR_CONTROL_ERROR_UNDEFINED_FUNCTION(85); + } + return status; +} + +/******************************************************//** + * @brief Set the torque boost threshold + * @param[in] deviceId (from 0 to MAX_NUMBER_OF_DEVICES - 1) + * @param[in] speedThreshold speed threshold above which the step mode is + * changed to full step + * @retval None + **********************************************************/ +void BSP_MotorControl_SetTorqueBoostThreshold(uint8_t deviceId, uint16_t speedThreshold) +{ + if ((motorDrvHandle != 0)&&(motorDrvHandle->SetTorqueBoostThreshold != 0)) + { + motorDrvHandle->SetTorqueBoostThreshold(deviceId, speedThreshold); + } + else + { + MOTOR_CONTROL_ERROR_UNDEFINED_FUNCTION(86); + } +} + +/******************************************************//** + * @brief Get the torque boost threshold + * @param[in] deviceId (from 0 to MAX_NUMBER_OF_DEVICES - 1) + * @retval the torque boost threshold above which the step mode is + * changed to full step + **********************************************************/ +uint16_t BSP_MotorControl_GetTorqueBoostThreshold(uint8_t deviceId) +{ + uint16_t value = 0; + if ((motorDrvHandle != 0)&&(motorDrvHandle->GetTorqueBoostThreshold != 0)) + { + value = motorDrvHandle->GetTorqueBoostThreshold(deviceId); + } + else + { + MOTOR_CONTROL_ERROR_UNDEFINED_FUNCTION(87); + } + return value; +} + +/******************************************************//** + * @brief Get the dual full bridge configuration + * return config bridge configuration to apply + * for L6206, see dualFullBridgeConfig_t enum + * for Stspin240, 0 for a mono brush DC configuration, 1 for a dual brush DC configuration + * for Stspin250, 0 only as no dual brush DC configuration is supported + **********************************************************/ +uint8_t BSP_MotorControl_GetDualFullBridgeConfig(void) +{ + uint8_t value = 0; + + if ((motorDrvHandle != 0)&&(motorDrvHandle->GetDualFullBridgeConfig != 0)) + { + value = motorDrvHandle->GetDualFullBridgeConfig(); + } + else + { + MOTOR_CONTROL_ERROR_UNDEFINED_FUNCTION(88); + } + + return value; +} + +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/stepper/steppermotor_F401RE/Core/Startup/startup_stm32f401retx.s b/stepper/steppermotor_F401RE/Core/Startup/startup_stm32f401retx.s new file mode 100644 index 0000000..cc9a847 --- /dev/null +++ b/stepper/steppermotor_F401RE/Core/Startup/startup_stm32f401retx.s @@ -0,0 +1,432 @@ +/** + ****************************************************************************** + * @file startup_stm32f401xe.s + * @author MCD Application Team + * @brief STM32F401xExx Devices vector table for GCC based toolchains. + * This module performs: + * - Set the initial SP + * - Set the initial PC == Reset_Handler, + * - Set the vector table entries with the exceptions ISR address + * - Branches to main in the C library (which eventually + * calls main()). + * After Reset the Cortex-M4 processor is in Thread mode, + * priority is Privileged, and the Stack is set to Main. + ****************************************************************************** + * @attention + * + *

© Copyright (c) 2017 STMicroelectronics. + * All rights reserved.

+ * + * This software component is licensed by ST under BSD 3-Clause license, + * the "License"; You may not use this file except in compliance with the + * License. You may obtain a copy of the License at: + * opensource.org/licenses/BSD-3-Clause + * + ****************************************************************************** + */ + + .syntax unified + .cpu cortex-m4 + .fpu softvfp + .thumb + +.global g_pfnVectors +.global Default_Handler + +/* start address for the initialization values of the .data section. +defined in linker script */ +.word _sidata +/* start address for the .data section. defined in linker script */ +.word _sdata +/* end address for the .data section. defined in linker script */ +.word _edata +/* start address for the .bss section. defined in linker script */ +.word _sbss +/* end address for the .bss section. defined in linker script */ +.word _ebss +/* stack used for SystemInit_ExtMemCtl; always internal RAM used */ + +/** + * @brief This is the code that gets called when the processor first + * starts execution following a reset event. Only the absolutely + * necessary set is performed, after which the application + * supplied main() routine is called. + * @param None + * @retval : None +*/ + + .section .text.Reset_Handler + .weak Reset_Handler + .type Reset_Handler, %function +Reset_Handler: + ldr sp, =_estack /* set stack pointer */ + +/* Copy the data segment initializers from flash to SRAM */ + movs r1, #0 + b LoopCopyDataInit + +CopyDataInit: + ldr r3, =_sidata + ldr r3, [r3, r1] + str r3, [r0, r1] + adds r1, r1, #4 + +LoopCopyDataInit: + ldr r0, =_sdata + ldr r3, =_edata + adds r2, r0, r1 + cmp r2, r3 + bcc CopyDataInit + ldr r2, =_sbss + b LoopFillZerobss +/* Zero fill the bss segment. */ +FillZerobss: + movs r3, #0 + str r3, [r2], #4 + +LoopFillZerobss: + ldr r3, = _ebss + cmp r2, r3 + bcc FillZerobss + +/* Call the clock system intitialization function.*/ + bl SystemInit +/* Call static constructors */ + bl __libc_init_array +/* Call the application's entry point.*/ + bl main + bx lr +.size Reset_Handler, .-Reset_Handler + +/** + * @brief This is the code that gets called when the processor receives an + * unexpected interrupt. This simply enters an infinite loop, preserving + * the system state for examination by a debugger. + * @param None + * @retval None +*/ + .section .text.Default_Handler,"ax",%progbits +Default_Handler: +Infinite_Loop: + b Infinite_Loop + .size Default_Handler, .-Default_Handler +/****************************************************************************** +* +* The minimal vector table for a Cortex M3. Note that the proper constructs +* must be placed on this to ensure that it ends up at physical address +* 0x0000.0000. +* +*******************************************************************************/ + .section .isr_vector,"a",%progbits + .type g_pfnVectors, %object + .size g_pfnVectors, .-g_pfnVectors + +g_pfnVectors: + .word _estack + .word Reset_Handler + .word NMI_Handler + .word HardFault_Handler + .word MemManage_Handler + .word BusFault_Handler + .word UsageFault_Handler + .word 0 + .word 0 + .word 0 + .word 0 + .word SVC_Handler + .word DebugMon_Handler + .word 0 + .word PendSV_Handler + .word SysTick_Handler + + /* External Interrupts */ + .word WWDG_IRQHandler /* Window WatchDog */ + .word PVD_IRQHandler /* PVD through EXTI Line detection */ + .word TAMP_STAMP_IRQHandler /* Tamper and TimeStamps through the EXTI line */ + .word RTC_WKUP_IRQHandler /* RTC Wakeup through the EXTI line */ + .word FLASH_IRQHandler /* FLASH */ + .word RCC_IRQHandler /* RCC */ + .word EXTI0_IRQHandler /* EXTI Line0 */ + .word EXTI1_IRQHandler /* EXTI Line1 */ + .word EXTI2_IRQHandler /* EXTI Line2 */ + .word EXTI3_IRQHandler /* EXTI Line3 */ + .word EXTI4_IRQHandler /* EXTI Line4 */ + .word DMA1_Stream0_IRQHandler /* DMA1 Stream 0 */ + .word DMA1_Stream1_IRQHandler /* DMA1 Stream 1 */ + .word DMA1_Stream2_IRQHandler /* DMA1 Stream 2 */ + .word DMA1_Stream3_IRQHandler /* DMA1 Stream 3 */ + .word DMA1_Stream4_IRQHandler /* DMA1 Stream 4 */ + .word DMA1_Stream5_IRQHandler /* DMA1 Stream 5 */ + .word DMA1_Stream6_IRQHandler /* DMA1 Stream 6 */ + .word ADC_IRQHandler /* ADC1, ADC2 and ADC3s */ + .word 0 /* Reserved */ + .word 0 /* Reserved */ + .word 0 /* Reserved */ + .word 0 /* Reserved */ + .word EXTI9_5_IRQHandler /* External Line[9:5]s */ + .word TIM1_BRK_TIM9_IRQHandler /* TIM1 Break and TIM9 */ + .word TIM1_UP_TIM10_IRQHandler /* TIM1 Update and TIM10 */ + .word TIM1_TRG_COM_TIM11_IRQHandler /* TIM1 Trigger and Commutation and TIM11 */ + .word TIM1_CC_IRQHandler /* TIM1 Capture Compare */ + .word TIM2_IRQHandler /* TIM2 */ + .word TIM3_IRQHandler /* TIM3 */ + .word TIM4_IRQHandler /* TIM4 */ + .word I2C1_EV_IRQHandler /* I2C1 Event */ + .word I2C1_ER_IRQHandler /* I2C1 Error */ + .word I2C2_EV_IRQHandler /* I2C2 Event */ + .word I2C2_ER_IRQHandler /* I2C2 Error */ + .word SPI1_IRQHandler /* SPI1 */ + .word SPI2_IRQHandler /* SPI2 */ + .word USART1_IRQHandler /* USART1 */ + .word USART2_IRQHandler /* USART2 */ + .word 0 /* Reserved */ + .word EXTI15_10_IRQHandler /* External Line[15:10]s */ + .word RTC_Alarm_IRQHandler /* RTC Alarm (A and B) through EXTI Line */ + .word OTG_FS_WKUP_IRQHandler /* USB OTG FS Wakeup through EXTI line */ + .word 0 /* Reserved */ + .word 0 /* Reserved */ + .word 0 /* Reserved */ + .word 0 /* Reserved */ + .word DMA1_Stream7_IRQHandler /* DMA1 Stream7 */ + .word 0 /* Reserved */ + .word SDIO_IRQHandler /* SDIO */ + .word TIM5_IRQHandler /* TIM5 */ + .word SPI3_IRQHandler /* SPI3 */ + .word 0 /* Reserved */ + .word 0 /* Reserved */ + .word 0 /* Reserved */ + .word 0 /* Reserved */ + .word DMA2_Stream0_IRQHandler /* DMA2 Stream 0 */ + .word DMA2_Stream1_IRQHandler /* DMA2 Stream 1 */ + .word DMA2_Stream2_IRQHandler /* DMA2 Stream 2 */ + .word DMA2_Stream3_IRQHandler /* DMA2 Stream 3 */ + .word DMA2_Stream4_IRQHandler /* DMA2 Stream 4 */ + .word 0 /* Reserved */ + .word 0 /* Reserved */ + .word 0 /* Reserved */ + .word 0 /* Reserved */ + .word 0 /* Reserved */ + .word 0 /* Reserved */ + .word OTG_FS_IRQHandler /* USB OTG FS */ + .word DMA2_Stream5_IRQHandler /* DMA2 Stream 5 */ + .word DMA2_Stream6_IRQHandler /* DMA2 Stream 6 */ + .word DMA2_Stream7_IRQHandler /* DMA2 Stream 7 */ + .word USART6_IRQHandler /* USART6 */ + .word I2C3_EV_IRQHandler /* I2C3 event */ + .word I2C3_ER_IRQHandler /* I2C3 error */ + .word 0 /* Reserved */ + .word 0 /* Reserved */ + .word 0 /* Reserved */ + .word 0 /* Reserved */ + .word 0 /* Reserved */ + .word 0 /* Reserved */ + .word 0 /* Reserved */ + .word FPU_IRQHandler /* FPU */ + .word 0 /* Reserved */ + .word 0 /* Reserved */ + .word SPI4_IRQHandler /* SPI4 */ + +/******************************************************************************* +* +* Provide weak aliases for each Exception handler to the Default_Handler. +* As they are weak aliases, any function with the same name will override +* this definition. +* +*******************************************************************************/ + .weak NMI_Handler + .thumb_set NMI_Handler,Default_Handler + + .weak HardFault_Handler + .thumb_set HardFault_Handler,Default_Handler + + .weak MemManage_Handler + .thumb_set MemManage_Handler,Default_Handler + + .weak BusFault_Handler + .thumb_set BusFault_Handler,Default_Handler + + .weak UsageFault_Handler + .thumb_set UsageFault_Handler,Default_Handler + + .weak SVC_Handler + .thumb_set SVC_Handler,Default_Handler + + .weak DebugMon_Handler + .thumb_set DebugMon_Handler,Default_Handler + + .weak PendSV_Handler + .thumb_set PendSV_Handler,Default_Handler + + .weak SysTick_Handler + .thumb_set SysTick_Handler,Default_Handler + + .weak WWDG_IRQHandler + .thumb_set WWDG_IRQHandler,Default_Handler + + .weak PVD_IRQHandler + .thumb_set PVD_IRQHandler,Default_Handler + + .weak TAMP_STAMP_IRQHandler + .thumb_set TAMP_STAMP_IRQHandler,Default_Handler + + .weak RTC_WKUP_IRQHandler + .thumb_set RTC_WKUP_IRQHandler,Default_Handler + + .weak FLASH_IRQHandler + .thumb_set FLASH_IRQHandler,Default_Handler + + .weak RCC_IRQHandler + .thumb_set RCC_IRQHandler,Default_Handler + + .weak EXTI0_IRQHandler + .thumb_set EXTI0_IRQHandler,Default_Handler + + .weak EXTI1_IRQHandler + .thumb_set EXTI1_IRQHandler,Default_Handler + + .weak EXTI2_IRQHandler + .thumb_set EXTI2_IRQHandler,Default_Handler + + .weak EXTI3_IRQHandler + .thumb_set EXTI3_IRQHandler,Default_Handler + + .weak EXTI4_IRQHandler + .thumb_set EXTI4_IRQHandler,Default_Handler + + .weak DMA1_Stream0_IRQHandler + .thumb_set DMA1_Stream0_IRQHandler,Default_Handler + + .weak DMA1_Stream1_IRQHandler + .thumb_set DMA1_Stream1_IRQHandler,Default_Handler + + .weak DMA1_Stream2_IRQHandler + .thumb_set DMA1_Stream2_IRQHandler,Default_Handler + + .weak DMA1_Stream3_IRQHandler + .thumb_set DMA1_Stream3_IRQHandler,Default_Handler + + .weak DMA1_Stream4_IRQHandler + .thumb_set DMA1_Stream4_IRQHandler,Default_Handler + + .weak DMA1_Stream5_IRQHandler + .thumb_set DMA1_Stream5_IRQHandler,Default_Handler + + .weak DMA1_Stream6_IRQHandler + .thumb_set DMA1_Stream6_IRQHandler,Default_Handler + + .weak ADC_IRQHandler + .thumb_set ADC_IRQHandler,Default_Handler + + .weak EXTI9_5_IRQHandler + .thumb_set EXTI9_5_IRQHandler,Default_Handler + + .weak TIM1_BRK_TIM9_IRQHandler + .thumb_set TIM1_BRK_TIM9_IRQHandler,Default_Handler + + .weak TIM1_UP_TIM10_IRQHandler + .thumb_set TIM1_UP_TIM10_IRQHandler,Default_Handler + + .weak TIM1_TRG_COM_TIM11_IRQHandler + .thumb_set TIM1_TRG_COM_TIM11_IRQHandler,Default_Handler + + .weak TIM1_CC_IRQHandler + .thumb_set TIM1_CC_IRQHandler,Default_Handler + + .weak TIM2_IRQHandler + .thumb_set TIM2_IRQHandler,Default_Handler + + .weak TIM3_IRQHandler + .thumb_set TIM3_IRQHandler,Default_Handler + + .weak TIM4_IRQHandler + .thumb_set TIM4_IRQHandler,Default_Handler + + .weak I2C1_EV_IRQHandler + .thumb_set I2C1_EV_IRQHandler,Default_Handler + + .weak I2C1_ER_IRQHandler + .thumb_set I2C1_ER_IRQHandler,Default_Handler + + .weak I2C2_EV_IRQHandler + .thumb_set I2C2_EV_IRQHandler,Default_Handler + + .weak I2C2_ER_IRQHandler + .thumb_set I2C2_ER_IRQHandler,Default_Handler + + .weak SPI1_IRQHandler + .thumb_set SPI1_IRQHandler,Default_Handler + + .weak SPI2_IRQHandler + .thumb_set SPI2_IRQHandler,Default_Handler + + .weak USART1_IRQHandler + .thumb_set USART1_IRQHandler,Default_Handler + + .weak USART2_IRQHandler + .thumb_set USART2_IRQHandler,Default_Handler + + .weak EXTI15_10_IRQHandler + .thumb_set EXTI15_10_IRQHandler,Default_Handler + + .weak RTC_Alarm_IRQHandler + .thumb_set RTC_Alarm_IRQHandler,Default_Handler + + .weak OTG_FS_WKUP_IRQHandler + .thumb_set OTG_FS_WKUP_IRQHandler,Default_Handler + + .weak DMA1_Stream7_IRQHandler + .thumb_set DMA1_Stream7_IRQHandler,Default_Handler + + .weak SDIO_IRQHandler + .thumb_set SDIO_IRQHandler,Default_Handler + + .weak TIM5_IRQHandler + .thumb_set TIM5_IRQHandler,Default_Handler + + .weak SPI3_IRQHandler + .thumb_set SPI3_IRQHandler,Default_Handler + + .weak DMA2_Stream0_IRQHandler + .thumb_set DMA2_Stream0_IRQHandler,Default_Handler + + .weak DMA2_Stream1_IRQHandler + .thumb_set DMA2_Stream1_IRQHandler,Default_Handler + + .weak DMA2_Stream2_IRQHandler + .thumb_set DMA2_Stream2_IRQHandler,Default_Handler + + .weak DMA2_Stream3_IRQHandler + .thumb_set DMA2_Stream3_IRQHandler,Default_Handler + + .weak DMA2_Stream4_IRQHandler + .thumb_set DMA2_Stream4_IRQHandler,Default_Handler + + .weak OTG_FS_IRQHandler + .thumb_set OTG_FS_IRQHandler,Default_Handler + + .weak DMA2_Stream5_IRQHandler + .thumb_set DMA2_Stream5_IRQHandler,Default_Handler + + .weak DMA2_Stream6_IRQHandler + .thumb_set DMA2_Stream6_IRQHandler,Default_Handler + + .weak DMA2_Stream7_IRQHandler + .thumb_set DMA2_Stream7_IRQHandler,Default_Handler + + .weak USART6_IRQHandler + .thumb_set USART6_IRQHandler,Default_Handler + + .weak I2C3_EV_IRQHandler + .thumb_set I2C3_EV_IRQHandler,Default_Handler + + .weak I2C3_ER_IRQHandler + .thumb_set I2C3_ER_IRQHandler,Default_Handler + + .weak FPU_IRQHandler + .thumb_set FPU_IRQHandler,Default_Handler + + .weak SPI4_IRQHandler + .thumb_set SPI4_IRQHandler,Default_Handler + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ + diff --git a/stepper/steppermotor_F401RE/Debug/Core/Src/clock_f4.d b/stepper/steppermotor_F401RE/Debug/Core/Src/clock_f4.d new file mode 100644 index 0000000..8ceb393 --- /dev/null +++ b/stepper/steppermotor_F401RE/Debug/Core/Src/clock_f4.d @@ -0,0 +1,105 @@ +Core/Src/clock_f4.o: ../Core/Src/clock_f4.c ../Core/Inc/main.h \ + ../Core/Inc/x_nucleo_ihmxx.h ../Core/Inc/motor.h ../Core/Inc/l6208.h \ + ../Core/Inc/l6208_target_config.h \ + ../Core/Inc/x_nucleo_ihm05a1_stm32f4xx.h ../Core/Inc/stm32f4xx_nucleo.h \ + ../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal.h \ + ../Core/Inc/stm32f4xx_hal_conf.h \ + ../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_rcc.h \ + ../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_def.h \ + ../Drivers/CMSIS/Device/ST/STM32F4xx/Include/stm32f4xx.h \ + ../Drivers/CMSIS/Device/ST/STM32F4xx/Include/stm32f401xe.h \ + ../Drivers/CMSIS/Include/core_cm4.h \ + ../Drivers/CMSIS/Include/cmsis_version.h \ + ../Drivers/CMSIS/Include/cmsis_compiler.h \ + ../Drivers/CMSIS/Include/cmsis_gcc.h \ + ../Drivers/CMSIS/Include/mpu_armv7.h \ + ../Drivers/CMSIS/Device/ST/STM32F4xx/Include/system_stm32f4xx.h \ + ../Drivers/STM32F4xx_HAL_Driver/Inc/Legacy/stm32_hal_legacy.h \ + ../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_rcc_ex.h \ + ../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_gpio.h \ + ../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_gpio_ex.h \ + ../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_dma.h \ + ../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_dma_ex.h \ + ../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_cortex.h \ + ../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_adc.h \ + ../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_adc_ex.h \ + ../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_flash.h \ + ../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_flash_ex.h \ + ../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_flash_ramfunc.h \ + ../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_pwr.h \ + ../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_pwr_ex.h \ + ../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_spi.h \ + ../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_tim.h \ + ../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_tim_ex.h + +../Core/Inc/main.h: + +../Core/Inc/x_nucleo_ihmxx.h: + +../Core/Inc/motor.h: + +../Core/Inc/l6208.h: + +../Core/Inc/l6208_target_config.h: + +../Core/Inc/x_nucleo_ihm05a1_stm32f4xx.h: + +../Core/Inc/stm32f4xx_nucleo.h: + +../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal.h: + +../Core/Inc/stm32f4xx_hal_conf.h: + +../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_rcc.h: + +../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_def.h: + +../Drivers/CMSIS/Device/ST/STM32F4xx/Include/stm32f4xx.h: + +../Drivers/CMSIS/Device/ST/STM32F4xx/Include/stm32f401xe.h: + +../Drivers/CMSIS/Include/core_cm4.h: + +../Drivers/CMSIS/Include/cmsis_version.h: + +../Drivers/CMSIS/Include/cmsis_compiler.h: + +../Drivers/CMSIS/Include/cmsis_gcc.h: + +../Drivers/CMSIS/Include/mpu_armv7.h: + +../Drivers/CMSIS/Device/ST/STM32F4xx/Include/system_stm32f4xx.h: + +../Drivers/STM32F4xx_HAL_Driver/Inc/Legacy/stm32_hal_legacy.h: + +../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_rcc_ex.h: + +../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_gpio.h: + +../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_gpio_ex.h: + +../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_dma.h: + +../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_dma_ex.h: + +../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_cortex.h: + +../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_adc.h: + +../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_adc_ex.h: + +../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_flash.h: + +../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_flash_ex.h: + +../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_flash_ramfunc.h: + +../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_pwr.h: + +../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_pwr_ex.h: + +../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_spi.h: + +../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_tim.h: + +../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_tim_ex.h: diff --git a/stepper/steppermotor_F401RE/Debug/Core/Src/clock_f4.o b/stepper/steppermotor_F401RE/Debug/Core/Src/clock_f4.o new file mode 100644 index 0000000000000000000000000000000000000000..34de2bd2ec643eb9c3f48010ba8457234ee374af GIT binary patch literal 759872 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
iZax?whXt=7ia0!&X~N@(U|<3Y92i^MVHw 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

SMShA{(zGcQ1{Yx76>A84rFN*> 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

5=$5m@yH=KIyM)=S2yk^n3WA>FMgG_Ft}?^< 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 z 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 )k@X|{ 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 NVEHabiUK2b{{zC_&vyU- literal 0 HcmV?d00001 diff --git a/stepper/steppermotor_F401RE/Debug/Core/Src/clock_f4.su b/stepper/steppermotor_F401RE/Debug/Core/Src/clock_f4.su new file mode 100644 index 0000000..24bfce1 --- /dev/null +++ b/stepper/steppermotor_F401RE/Debug/Core/Src/clock_f4.su @@ -0,0 +1 @@ +clock_f4.c:65:6:SystemClock_Config 88 static diff --git a/stepper/steppermotor_F401RE/Debug/Core/Src/l6208.d b/stepper/steppermotor_F401RE/Debug/Core/Src/l6208.d new file mode 100644 index 0000000..47af1e6 --- /dev/null +++ b/stepper/steppermotor_F401RE/Debug/Core/Src/l6208.d @@ -0,0 +1,8 @@ +Core/Src/l6208.o: ../Core/Src/l6208.c ../Core/Inc/l6208.h \ + ../Core/Inc/l6208_target_config.h ../Core/Inc/motor.h + +../Core/Inc/l6208.h: + +../Core/Inc/l6208_target_config.h: + +../Core/Inc/motor.h: diff --git a/stepper/steppermotor_F401RE/Debug/Core/Src/l6208.o b/stepper/steppermotor_F401RE/Debug/Core/Src/l6208.o new file mode 100644 index 0000000000000000000000000000000000000000..e9f80ba4ee51d98541344981f078d7e1f0ea1c61 GIT binary patch literal 107948 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 z%0A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 literal 0 HcmV?d00001 diff --git a/stepper/steppermotor_F401RE/Debug/Core/Src/l6208.su b/stepper/steppermotor_F401RE/Debug/Core/Src/l6208.su new file mode 100644 index 0000000..9b79400 --- /dev/null +++ b/stepper/steppermotor_F401RE/Debug/Core/Src/l6208.su @@ -0,0 +1,75 @@ +l6208.c:259:13:L6208_GetMotorHandle 4 static +l6208.c:269:6:L6208_Init 16 static +l6208.c:308:10:L6208_ReadId 4 static +l6208.c:321:6:L6208_AttachErrorHandler 16 static +l6208.c:335:6:L6208_AttachFlagInterrupt 16 static +l6208.c:344:9:L6208_CheckStatusHw 8 static +l6208.c:361:6:L6208_Disable 16 static +l6208.c:372:6:L6208_ErrorHandler 16 static +l6208.c:392:6:L6208_Enable 16 static +l6208.c:402:6:L6208_FlagInterruptHandler 8 static +l6208.c:424:10:L6208_GetAcceleration 16 static +l6208.c:437:10:L6208_GetCurrentSpeed 40 static +l6208.c:458:18:L6208_GetDecayMode 16 static +l6208.c:472:10:L6208_GetDeceleration 16 static +l6208.c:482:12:L6208_GetDirection 16 static +l6208.c:498:10:L6208_GetFwVersion 4 static +l6208.c:508:9:L6208_GetMark 16 static +l6208.c:521:10:L6208_GetMaxSpeed 16 static +l6208.c:534:10:L6208_GetMinSpeed 16 static +l6208.c:544:14:L6208_GetMotionState 16 static +l6208.c:555:9:L6208_GetPosition 16 static +l6208.c:565:17:L6208_GetStepMode 16 static +l6208.c:575:17:L6208_GetStopMode 16 static +l6208.c:594:9:L6208_GetTorque 24 static +l6208.c:625:6:L6208_GoHome 16 static +l6208.c:635:6:L6208_GoMark 16 static +l6208.c:653:6:L6208_GoTo 24 static +l6208.c:702:6:L6208_GoToDir 24 static +l6208.c:741:6:L6208_HardHiZ 16 static +l6208.c:765:6:L6208_HardStop 16 static +l6208.c:793:6:L6208_Move 16 static +l6208.c:821:6:L6208_ReleaseReset 16 static +l6208.c:831:6:L6208_Reset 16 static +l6208.c:841:6:L6208_ResetDevice 8 static +l6208.c:856:6:L6208_Run 16 static +l6208.c:880:6:L6208_SetAcceleration 24 static +l6208.c:901:6:L6208_SetDecayMode 16 static +l6208.c:924:6:L6208_SetDeceleration 24 static +l6208.c:948:6:L6208_SetDirection 16 static +l6208.c:1012:6:L6208_SetHome 16 static +l6208.c:1030:6:L6208_SetMark 16 static +l6208.c:1044:6:L6208_SetMaxSpeed 16 static +l6208.c:1066:6:L6208_SetMinSpeed 16 static +l6208.c:1085:6:L6208_SetNbDevices 16 static +l6208.c:1104:6:L6208_SetStepMode 16 static +l6208.c:1180:6:L6208_SetStopMode 16 static +l6208.c:1200:6:L6208_SetTorque 16 static +l6208.c:1236:6:L6208_SoftStop 16 static +l6208.c:1248:6:L6208_TickHandler 24 static +l6208.c:1544:10:L6208_VrefPwmGetFreq 16 static +l6208.c:1556:6:L6208_VrefPwmSetFreq 16 static +l6208.c:1579:6:L6208_WaitWhileActive 16 static +l6208.c:1597:13:L6208_ClearSysFlag 16 static +l6208.c:1616:10:L6208_ComputeNbAccOrDecSteps 24 static +l6208.c:1666:10:L6208_ConvertAcceDecelRateValue 40 static +l6208.c:1696:6:L6208_DoAccel 16 static +l6208.c:1717:6:L6208_DoDecel 16 static +l6208.c:1739:6:L6208_DoRun 4 static +l6208.c:1748:9:L6208_GetMicrostepSample2Scale 4 static +l6208.c:1778:6:L6208_Indexmodeinit 24 static +l6208.c:1822:13:L6208_IsSysFlag 16 static +l6208.c:1831:6:L6208_ResetSteps 4 static +l6208.c:1849:10:L6208_ScaleWaveformSample 24 static +l6208.c:1868:6:L6208_ScaleWaveformTable 16 static +l6208.c:1885:6:L6208_SetDeviceParamsToGivenValues 16 static +l6208.c:1915:6:L6208_SetDeviceParamsToPredefinedValues 8 static +l6208.c:1944:6:L6208_SetMicrostepSample2Scale 16 static +l6208.c:1959:6:L6208_SetMicrostepSample2Update 16 static +l6208.c:1974:6:L6208_SetMotionState 16 static +l6208.c:1987:6:L6208_SetSpeed 40 static +l6208.c:2017:13:L6208_SetSysFlag 16 static +l6208.c:2026:6:L6208_StartMovement 16 static +l6208.c:2095:6:L6208_UpdateScanWaveformTable 16 static +l6208.c:2113:6:L6208_UstepWaveformHandling 8 static +l6208.c:2134:6:L6208_VectorCalc 16 static diff --git a/stepper/steppermotor_F401RE/Debug/Core/Src/main.d b/stepper/steppermotor_F401RE/Debug/Core/Src/main.d new file mode 100644 index 0000000..d3a927e --- /dev/null +++ b/stepper/steppermotor_F401RE/Debug/Core/Src/main.d @@ -0,0 +1,105 @@ +Core/Src/main.o: ../Core/Src/main.c ../Core/Inc/main.h \ + ../Core/Inc/x_nucleo_ihmxx.h ../Core/Inc/motor.h ../Core/Inc/l6208.h \ + ../Core/Inc/l6208_target_config.h \ + ../Core/Inc/x_nucleo_ihm05a1_stm32f4xx.h ../Core/Inc/stm32f4xx_nucleo.h \ + ../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal.h \ + ../Core/Inc/stm32f4xx_hal_conf.h \ + ../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_rcc.h \ + ../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_def.h \ + ../Drivers/CMSIS/Device/ST/STM32F4xx/Include/stm32f4xx.h \ + ../Drivers/CMSIS/Device/ST/STM32F4xx/Include/stm32f401xe.h \ + ../Drivers/CMSIS/Include/core_cm4.h \ + ../Drivers/CMSIS/Include/cmsis_version.h \ + ../Drivers/CMSIS/Include/cmsis_compiler.h \ + ../Drivers/CMSIS/Include/cmsis_gcc.h \ + ../Drivers/CMSIS/Include/mpu_armv7.h \ + ../Drivers/CMSIS/Device/ST/STM32F4xx/Include/system_stm32f4xx.h \ + ../Drivers/STM32F4xx_HAL_Driver/Inc/Legacy/stm32_hal_legacy.h \ + ../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_rcc_ex.h \ + ../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_gpio.h \ + ../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_gpio_ex.h \ + ../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_dma.h \ + ../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_dma_ex.h \ + ../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_cortex.h \ + ../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_adc.h \ + ../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_adc_ex.h \ + ../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_flash.h \ + ../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_flash_ex.h \ + ../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_flash_ramfunc.h \ + ../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_pwr.h \ + ../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_pwr_ex.h \ + ../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_spi.h \ + ../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_tim.h \ + ../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_tim_ex.h + +../Core/Inc/main.h: + +../Core/Inc/x_nucleo_ihmxx.h: + +../Core/Inc/motor.h: + +../Core/Inc/l6208.h: + +../Core/Inc/l6208_target_config.h: + +../Core/Inc/x_nucleo_ihm05a1_stm32f4xx.h: + +../Core/Inc/stm32f4xx_nucleo.h: + +../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal.h: + +../Core/Inc/stm32f4xx_hal_conf.h: + +../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_rcc.h: + +../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_def.h: + +../Drivers/CMSIS/Device/ST/STM32F4xx/Include/stm32f4xx.h: + +../Drivers/CMSIS/Device/ST/STM32F4xx/Include/stm32f401xe.h: + +../Drivers/CMSIS/Include/core_cm4.h: + +../Drivers/CMSIS/Include/cmsis_version.h: + +../Drivers/CMSIS/Include/cmsis_compiler.h: + +../Drivers/CMSIS/Include/cmsis_gcc.h: + +../Drivers/CMSIS/Include/mpu_armv7.h: + +../Drivers/CMSIS/Device/ST/STM32F4xx/Include/system_stm32f4xx.h: + +../Drivers/STM32F4xx_HAL_Driver/Inc/Legacy/stm32_hal_legacy.h: + +../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_rcc_ex.h: + +../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_gpio.h: + +../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_gpio_ex.h: + +../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_dma.h: + +../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_dma_ex.h: + +../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_cortex.h: + +../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_adc.h: + +../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_adc_ex.h: + +../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_flash.h: + +../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_flash_ex.h: + +../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_flash_ramfunc.h: + +../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_pwr.h: + +../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_pwr_ex.h: + +../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_spi.h: + +../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_tim.h: + +../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_tim_ex.h: diff --git a/stepper/steppermotor_F401RE/Debug/Core/Src/main.o b/stepper/steppermotor_F401RE/Debug/Core/Src/main.o new file mode 100644 index 0000000000000000000000000000000000000000..4a22da0ad09fcba2e0b59643c1abcdaf746d0535 GIT binary patch literal 766996 zcma%j2Ur!?*7nRfXZoCeu=f&6>?N`HUZX~1PmGBzv1?+DRHcX@f`Fi6!-ir51ySq; zREh<$03ujHML`h+{&ykXn|$B>?(_RR%-XB3y=P|cwb!2Gs=h<|u`J7c`NuMinSWyp zlNF#4i)&Xd(3m;M94P1a1KuBhBs&0q11s8t00&pJhX4+(Xb%G%UeW#za70CWB;cru z_V<9JE81fKf2e4W1sqq=9uGL7qCF9CQbl_*;ExsUp8%&+w0{PiTG9Rm@Yjm=G{ET< z?HPbGE84RFf2(N!4mi7_JqK`ZMSC9L{EGGhz=aj()J zpUmm#p~1h9)huHl;e3b*FZ)nhMt^MG;rZvjqZae8R`vkGv&yebJ<#8jwfZc})G3!N zzYfnY`sv?T;ZMagCWux0eU=!WzicF1_diJ!hxrHRv($;7qGo*2{cQK*z`yH%kvciU zT5#n@ZQ{VU0`qV0|6BV%>3)fLc>b0D5#1N-UnKsU_Lt~;zI81hmCv%;e#Q2~^D9mH zjQuCx#{a@A`X9XiW~tcqXhEg9Gy-Dz2q5PFrTu^V`g_m5^!Cf0`e)RiCBMk@d0*#$ zc==D3n7V(bYWr1}f{uK7CQSc@_gU+o@>l*L|5@V1PbX(w`TE~?|4VdVdeHIzer8tv zZ!OI~Jit5qU!wgR?_bgWjW#@g!2G}W{onB(Eg0}0d}}Lw8~*Qz=NkX@l*<`R?B_Qa z*QaG=^YHSX`B+x=rT@ALYhT8=N(KG}wyyVOg#I2Qjb`hAjOMb6KHx3=U#)*y(DwUs zU;p{ke2M7gQ~L-eyuw?o{V9gAKjwsahu#y-pki06ed*KBefqbYwjcAgE|IB-U7PX6 z*mcd?8*wN%FlZM6RyuP+S^%ilU6 zFj@^}XwBE1LDsOM&$k*zqv1Ly^NjXz3D0Oc(weBz2=&fGbiJRB(F~=POQYkm(m|=6 zqGdG0X?@Y?gvE(a7P&kp5kPpofoF6&Zswdt#Ir1C8ST~CFk7V+q&b?xwcR^w7;OVu zx%vHso1bxvw%G*2PZEA~zn0Oqq7{&jCp-j;q;3qU3If|1K=&h$sa%YTN2kSKn`s$V z6u;$|vVZYC#}L16Cjr-EF~}Cg2~Su=cL!Ik*zSVB=)~;X0>g=Fp1|;87yE|9!^alONVOnn$CwEif8yDXKrl z$6FfvgO1U8OXtpO7|vTtyw5Vcw{-R^EhBhK%}gvKdP~zM@r>jx8JlyA>@6Kn;TXkR z(zX{F)tiy4aLFfOUD0FYx!W}Ij1q8K%Wx?)v>IjM03E}n5?!a5r(tmJ6P;IbamTrb zL>HAKb>Tdn=&}+Y1l>o}R+Oged4_vTqpm6|k=Jn9G)#KsZEe_mO1cImZY{@f&+nsc zQeJDJ`!XJF8>2na1B@K%zre9gK;wIVk1g{R_vq*iCz%q-~Fnf{tL!B~2 z%Pd!qeqfjt>XBlB`AhxnBhRc7>lM;SM}}eS#6$CGr0YJxlO{e!lBN^qZiY+owX2Bx z?Y4=<{a)3J?)S1ZjJwE=Hw^RuNlea!gfm${-C>O&n3gGu6fFtjN?5UGVhO6put|m|Efh zJZH5##yWcXKiV1zOErS@xT>y#ChbPWH7+M+T$Ud!-#)K(RrOB#lM zOKp?+JBYudCZ3@af4mYYVdG8)3XdF zf~s9OM(Uu4jA8wsA|qWVdxnfSfst-dM-4@bA&@{uD&Bs1$WpSH{{Zu7Z5;_Au6!Q09;qxcY&&`hKND#pR@|csIy%dJ#Sn#WUk(Hv+f7j*Ly|1$Vq>V)Q1FVCH_#c`$|}ki zwxa)+)eaC+%Z2oqIof@ua|5m2t9Gf1dr?7v>CXfs%MP@X2dwr3tu3K!hAr`Pgk;O| zZw(EG()w?-dsQOXS}@(KmUoG3RMpH{_#Ra@_JSw77VQ6|`}e9!o+@D)rXfI3WT0}3 z3iKc9RsN-}G^#q#`ZvQ>5kWRn#IIGZ$!`s5jn#3D@2y6orCuu;I5|BP3$?1@__{C95RF`= zS-)bnuVE^;q5Jz)t2ci}wFd3q>70J|Ee-Qe(PkXi*!epQUQ5g0MYYYXTodI5=&fX~ z>7?;GM%!BAD&O-3rIxK+Qv05@<0^gfLC`fTag{&iL8eya&#VnB|GBZ26}UQ^zZa2M zRQa2I?RK^*SMBg5yy&f}eWrg7OS{Kd{WH$Fm}0UyMyK^;MXuFCEDC=QT>FBRbUJPA z8lQ!=b!z_2x=vfS)<4i97K=5F^c}X&KNzKK-Omhrt{zwE*Q|eyj@D6A|FfiawWh&m znKinG|4k6G0nr5Fxp6Q!^ zCh0hT?Ve0zEPvOiU?I)Gd(A|3!CKD*HOAu19MfWbXL7Yz&6&GCEUu>4B-6Do(Zkvk zWk)()T^kU6h#k>eT*vIs?3;>(mvKZc$}v4PB$HK%uKs<<+K-n==ITzmYKY}`lC{NuP~;0IP`fOaEJUm%$;@sh(N-mj!~q&xK~(XT9_>*;i|uzMBx4Y)#Aua{&e?`xuW zjil?eIYgi2LY6(Jkk;DqbY1RFBf$F-yFT8Tu7V+!h$*3BNoZGD?!Ytex$^j=Ed zAG{}-EggxH@t(ArWKesu9mP2f*(AqwL3)bVrV!W2Qakk}X>CUe%`unf66H|>`7NG8 zy1Ad|+8H@AUZR5}Ibs|6E$u~;Pi9iP!C><4G>_Un%kS4S8(CO>m9CA>kYrE+ao=^O z7}mTXJ8Q5d;F$ZZ>AItQBdze`9}}P+NhmmXXfwJe)N=d zrN<<*d>&nsR}x*bo#dy!qIOhyoS!_&@|M+Pv(X^3Z*U~}3BlB!S4`X!0mS{ro#?rk zpg1P{1lb8YM|PU^CGNQLd-3acH2!^3h(4zhwJ)9~trR0&Ke0qteS_NyVUpFxgV?3J@z1@#w`3W{G98-B9#d&-hS@?Mv(Jv#> znnf!??M31BRJyAjAn515G{ThiU-s_V@57~Mv*VWmJ9c26I~k|Ci?g$q&sRhU5AyCWzR@zb50b)?D9L}Rhg`9w37Ut zK6EXdL0(#(r1sPqB%hK-@~tpEVXnY-lw+opzpd>bk#2JfQ9fa!#M|14B9Xo)tp(oH zc1$7q=*M);51|-ZHK2A8_G%pS?E#WGvX-vvz9%~~+7q{W9pZK_zefd?$(oxTQHFIR z3jrcg=FcSgvE?Iw?FhBIXvt1Y4T}H5F^ai+Uy`hIoU~3fBZ}`TvOno1$y;mDSnZFe z>q8{79MhvA(JO_L%$Z!eE`LLQuVFWYXZs3Wk4z-_%?+siq5=6DVk9s2U5S3TEm>Gl zLhTRb_cSAi+Saxt)3`0kk1l_sha!o@^W2tV`=)%J+&!HnL(1pFeZ7dgR3)u+Y~|6f zCe*vT(x6ej_eZ{#3lLL0)39RYIKmiH=1b*Q(daV^mAh z+KLRGW4vYJ_MA^1$Cc09i^|{YN!v)bxD(O4d`*(u>yz$*n$#{jN?M)1CvLanMCn{g z^8V#L8f&3=jM!FkOy4O)|8R!nhb^M3dk}H=B9+H|xkZtTilxywyPxRC%kNbFI_l&2 z^0#~6H`FffK)%kqk>plvUh(u!Ao-5h$<7)haoe1uNJ5&D$0bMsIi}`iiXr7PwHI}! zc2NjjFZ3h%u1D#bjO80M*fr8UU;b2#ZBOkFAiqvQ z)IRVBdEaFs3q?=KS__HjJBz8k)t5Y;Eui+T-|6~Wdy-EpkEFxzWT)p7il@gjx(-FI ziRa-fy7D*aYG03Mc&6$!l5_~fc9!X0{>(&U|A=u*rK|QL%215YUlfB6iW!J}Jo#<^ zJH@~3Bwd?#Aq&psPgL9n>SIy4-;tzv8kqqN z=sL7~J++lTAwQxpgL26Vl6+%Nk@Tg?5;Fls2+SMhnZR9atjjY?o%>@*@QVu}A^2^A zCo#1@DAISe`Ogw{S3Ur>@vDP~(TTl950W!$I0MX;HT?)tH`W1bF7M8sH^Ybr>wN`% z+QNExLv1VDHyI=Nf$cID;gqm1+e5)c^Xmctca6hC06)z)w6F$hwjw%it0pEBVTNl| zn$u!6)e9gJr>TUDqdZ>Yq$40yGya0{tXqP*D%Y~lY?$uK_Xd5`-Vg9Ld(36D*Rp+S zfI`_&>=n5f_T&>_H&`Pw20owN?1VA^rPgwr6;Lr9Z;dWAot_5f*PG9w1I@l0iCfTo z=0a@UT2KX*Z|R1@1m9}83(U2Chg-(AxriMN*S4?@DD9?f#~;M)j|Ol+3%ZKT^K#%_f(EI;!O?2jEme8LWVhLE1JL9`@3V>eF*?>*a~2)qxhPcg7Uwi4at z)tZEw5Lu(CBf_++re!{e8#N7R0`k`^PlTfYP0%dF5~_LF1z@*kWe&g|P03AwNKFTt zh>vT&sfRwC&~$PJc1hEq7{)GZE{4ELf@Ue^4K779k`kbYnw}-lOVd21R4`N1e>bov znv1s~@=_Ca57>LnQxvH=du>PB2e@dfyvDe!)uv2^2T!dXrN#kTr^o1Dpf>jjtnAd@ z7z~A7+FB2Q9oDYYK;($F&F>+AV-~8A92-L0)$wE7pgr+O0NRrswm|Zy#zmjG5e?{1N$TJwC<}7K+W!SBBfdL|_V;m#X#Y^W z3X3&a|Msvtdnfi(;uSaP;Nc3VCz)GJa9zOeZF+pOm+b~!hwuLrBBPI~{`w^5l z{Lq}zxADOPz?~Ewihlew=jNB_dX0ds_A^&N=bL`(F%DfGw}5o_(5ayJOT0ueF0KN~ zkks86z!5iTb{iR!itE_R4v_g}!CT18DDZ=)`QMC1yh|1hg1kMulrk`9_QV$OJ=u&7 z5cX$R)BzU2)}%dRAR9Ff(QIOSQkEaY%I}~Z%r4S`xQ}fnBbxo}MjD7Pws|aw2iOL7 zuyT;Co(*0&>q+m(5qA9^U`N>ydPk43Ig23~!B!gx5Y285gF+13jrKLC*?IGUongPF zZk=V{UxVI7)?pinm)Q2JK)k|c(CU1ZHKc+V$6gzZIOEwly%E_pwleL$uCw0`grgg5 zcUmPA*n!hvC6PT$y-i}%DLuH!UhW0GTkI=(E%ylZ*_pkJ@&yX7`xB9(FWup zd%6UDNMqmnz->CalQOPHZ1Q_ZX0m~F%#g)un}L|kW-=hYVrN{dSV|h@+2E`FNSq9C zbL&wQ^Dfh7bN*fhlm$JhV6xB-?_T+HSl^Yl4Xy6ev(S3{aLBb8IT#XcHTc|uYu5*x z&vLmsn?ewJ{W>S$tU)?$8X9i2Rjf6=df$bO-b4H2+9!A*y!4;l4ECmfJ&XUWUClv* zSR44Sh5aTA20)@&Bb-@qEvGkzT$?RaENI`$4Kf`@)6MIg_#BemuF_=CbD0(K^vNa4 zkVQw){+_2qe4?`*`%!kv0n#w;M3*t4Q>OFvW!XX@RaSjqseOxbXr{(OJA;FAjPZ}8N#i>N#30T23m|UR_)(6yMWZbMF+@{uA&hO)T-^y{J2bIf zLENcHc>`jE#-$7(QZv^RR+2QSKR_>8BjT)wyQS$v55;Yb)f-rf#<~dDUCn+7cW-Lc~$m1bGYRqPyb)$vo-uCZ1io>|2lw)rmjB`yO2+ zO=f#_2XU^+?bm(N7{oALW!knK)P3Csv4rdH(U$G7ZdeGgBf19rVda?4k@_B?dqL^( z3Ej9kcF~CmhEFU2fqYHL{vD3P1!RTMCu9h=+XLYx7ft}NJmE6>S^gwqx6nYPJ@sxh2>zcfWu?$_pui!n_^_2j! zbRTIG_(W&zj3A!sPEeBcT=%>XreEk{#-p3Lx@9zvywZj20`HCP431a1Jlzr6UcJ-Z zsRs|(ja>!yUiZ5P9DUGjp?CVD?mW&wxgyX#?gBoK z<9s-WBq(g)lBPj&BiEju9)GTN93%s|xj2E~HgN@%Z3c6{R{^$}+cyddTRHb_@E*ch zsKmORJKF{$v4eYp(`9ZK*PJTbq1^fqNbcnpQk7^Qw~mUaVcd~97`g*ob$WKgxmr}= zJOna=Kg!)458g4ZrYDGz+%J?pALmw4P8Y?k`WYUgIXlX|Vz|nqz&pj&{}#kpP6&j^ z8E!y5fD~@PeZ+Z}>rY#)`(NBVDlEg6Q5^rxA~YbfE2!R8F+X3F0?7X#}_<>mHYh9F0k^D zKVX6PG~Sa|@(g|wK84^O@qx6aKIZ$=t|p7$(gq?=_!UclJ>?JVg2;2;muAx!yq+@j z9R3HYqvrB^==kIfzcUO9dHnt=aGTG&pNFvmKBWnGh5Yejz&`R;+BbgU`=>y%gzvi^ z>Sg>NFF>>x&OU~Sqp*nuj!Gx zDKrTO@wSk43dB3Y{E>+BuJFhQ#8kntI>u+G%M{FAb-Uji9KcVg? zrqPtQQH*6^<(ycw7n0}2Z}LIBB(9(=;j(z+H6-K2G^*spiw(a4@47gTR{I;`(m$b> zC@!SheUi9hI7DuW(rplLi4*C_Aw~3{6QR3eU)l-X6SI%P*nN>%3SOGH{znkg#oj02 zC{w&lZ_Z<}Ryahm#qkS3d?Ko=A^A)!qoI2)ZlHwVrT7!obaTY<6!j~yKUF+mi|sxD z%M%wJfWlj`bPN>o#llYLbb)9*2x6i57cE&I#f$igfh!ini{R*!xR1(qJ(;By1`Y51(dnNZg_}eFaq6s2QQU}4x0cn*Eoeq~K(iy@b z33Xh|(2~9b6pl%=o!~Z7>JkfZT$))K9_~m#(*m6;dDMl-Jt^=#tUQofTm$&i^LGDV&QoeE$3JBarx%dtHJJRFg|0w8i!zE1ZxLhgGGyh!=p zV(?DL#=`(nau2#=C*?nA2Nfd+pq|B@mM7bT7b_=Fk>{*D@g!n7C)cB-?SkAa1qv7C zmGQtX%TrSzaz&o!1P^g?>Of%e@(Lp;uPMaWewDC=rYb)r(O?g>Q=-rn0(Fop= zpACnmF9UX7@um~GOUl+W0GE}v%g~jp z%8eS(i&M_f$;CCrO3BxC<=s$#1Z4*uf+Q;Shr&a$a>D@Zrt*UsdbgFql>OdO()vR3 zuCg*5SgNv@c=wftG}As%TxoGjQ!e0x4=!D~hsrkhNNM&6Ly)NqJ_eAbG^`29Y(=0A z_fw^4A=IBK{ppo?q1;HvAiq@j<=~YlKK3BGsI9*T@KMXCOtV3)oCYhts_A$1!B5@z z8?cS)aGD(b)oQn)9-vw%_YPEZXlV^n@6pQ@tX`$$a`OPW|9^yPA*z-Y&JfKRkr0TjF75uiA(n(|zg-%E+#%pL_wXtA$iOxuJHWQgDJg ze>AW}_3{r;Pf`y{z>?J?J26-{)r5&Kc1!(8^|;&Wq+PIiN3A&#-c!`R^T5kcO$VXy zNHv@QF-t8y1Mo~urW2FrDkDMfh3YyAA}>|rdSE$fqqnea&rn6NPDvjS>W!xv zt$rmA?FKVnB9?~1V?g=p(F4ddIy@JY#$D;rZZiKZ+D#W#Li_8z*THROq^>uAPcLDM zT|uC?jH4ZEtGR~|P3wO2?6>JZ6f$jtsY=;y!UoXW?`#G7H(fe|@@?@ra65cB2i=Z7 z2cX;O@J+~cZiSK#*X7DYbfD{>w0G}rbA)`4VN|Z}X-~^%ujo?f_O3|>8GTA9AsW1& zY>vH6y3?=J#&yYz2+$qbTDt%|*%~-xK|Rlvo{6pO;5x9olTE<~soY-noGWY|WN&V) zsHJ?;&GLg-iEdaibW3$-PeH6qXQ&A!dv0|bSaRV0_yw3FmmLIMCoatl1!wLRWu0rd zZ3ECvSI+J=fCp!6htSq?ZK&?;$naicgN` zKLWVV9iZ~|1FpISrXO;x!XTN()%qF6(zyn-#%FNXjNm=uj#D}QG54zrOlNUB=(I7L zOIU>fbGdo@!F$DBqc!j~x1b6{-f&;h1~!k|Msw&}ZX7;L=H78mw1Lg%dQO5~0k@Er z<@d<8;O_%>nv$ME?%6{~e&mi$23Ev5)BIYDwHw$cu5kvi60Xa5D3o%osXAT8)u5AY zd;ZdMh&b@kbV%UDA1VdWnK!DCbm510hriYQ3M%BS;b%_;(UtGs3c!u`vqHh0pZOLF z9{eE6xYzQ_>E3$s@Jt)gzBIXb@h7Ox@6A{54oB9KLG^rLD?9{Kz=mk-<$Yu_`Doj)?88u=A(@OoB6L+!_gLgP%3P0 zJ|JnwHtNe$TP>AD~ z&^diPf1y5%UE>2@L*Y8#_zJw=;5Un~lEA;Rhe9IXcRUo5_~6wLN#-}w*MqnDU+JU0 zJABhW(c2V0i`Id={Cqu#sk}QqJ@o{upGWo4T$9O1ytdB#V_jzW3PE9BY1E4Kifevk58j{`YpejrrCFV z-~@=|^Sz$}E8t(O0Pj6Nw>F3$_+f1T3i+MR2=F5x?FU{F-<+y+#r&53Ab#RU&VH;g<2UlJAm~;CI0{L0O6nwZqmY~hukjFZ5jImfX|+&iA%<>^ zaJnIQu7bt^9rF<4>9A+5u>T>5p2Fl_aJx~XJI{85|Sn#G- zZL?790);KYc`8_K6;dg44iWnHgTgi;rU<<4!i6_b*dc7Ej~{mm3G`LiE@2YAB%#7B z+Jx^GUfqSiJ;L>=(Az60EJk9V!2SfVUpU+jdSQar7p4yg{b+4P6@-?|aA7uy91?05 z!pdRc4b@AI2;N=*M}<6kc8>|&zXLBq`2Hh6q_CKdK#vPA;-P**=%IiZCHzjMifG}R zrBFB}bhjbE(?TYdg<^%!o8X-hrc)oz3Z~fz@SL#854`h2v+lqy2!tEuY zniU={3mIX+t_ZWEFa%eH9>oB0LcWRe zP@Af{NrL%2^pb@ttwFpgpoMu}h)RauZQ&0(B)KCvtb?%>p$bjucZJzUKui^sDFF9` zUbIubFRV(1u?NC@N@E@h)}^qLCR|H}Ub>J#uV{v#MndF~@TVOVGKJR*5Yl5|dUJp* z!Q(K9*}_e#wLcNk|AORG;nzGEdnQCbg|X+tIQoR^g%I-z*h?YW4Th* zyb`{qTIOrPMn&&8!lPwS$P)^w#PL>0zY388;o%J^ycY(!qqiS~b98o5DC{}_V;_a- z#~@iGOt*qqEac2UNS}n^dMK0#GduuFg$eBuQkl?l4~*H1ZnP0~5P#c%s2#-|8YL(3 z+XN7u#ZY?tUBtPEV0yK9HW0iuV$^p~cNLRrLfuU~Of#mtIKCcY@es4>fwxu+S`DJ7 zxO@vl)`<}Wyu?*5u;MK)*b0&LV%KUA@e$il1$~3~Y(CU|#Zh*^{KT&ofwxi2^aAED z)}UoRK%7m9W}x_x25Xa;z74z}(L(ivV6g)o0&f;Qw!`!m@jD`J6$@IzZHO31$86ig zF7&={7jx)Sn;l}yRZ!n4PG5?_+9fvEKs{6}c7fa7;wLu{_lT`NKxD5dvKWbd;&!U} z>=#GV`yM7{wu6TQ;<51n2gU5sAcl*L?EnsmjTeD;{ooarSbEoD=P-hIU?DeFi~X5JP%G+uLFs)$i|! zd%fTxMQlg`-WBgs-9J?{(Z2GY*q*YB`{JnHPn#0F6<8PPCe2H$r7<0Vt&xW8f-zU=Q8pa8 zNxxY@beBHX1Lh%Zpwwus#8OGqQ_7nN$#qgVhdy{oFE%1hZ)pMTE7wa-l(YLtr)aCR zL7Gh;RQpOrbOzxk<F-zhK_C{>vc;wC8tUk`CX(vpMV1xu4@ zrrj)M)55+*DtHfUtJHBGL_(xWv(S}oQWYwjY?tgQAKW2*O`DjV(wjCQ?viE%Kp|8b z`2!?(OT(y)zej37rvQ7ULfUDBNo%*m^Z_YRh5A9M61feRvTp($lIByL<*@VR6!DV^@vIjQ*r7&|X@rh>->Y4a}VU6h)q z16-2U&~$iNszje~UXf0JfTOF@ginYpPU=8s5b@H^vjEp5*9)+DUD`nhJvStO{P2fM zklJpBWTI5_JD5(AGBV*kSwaqlcT8Gb3*eSC;}=NYmM&((${p$6EhwZ&vs@v0R|;$b zW2sUQ6_f8t7pQc1Ut%~A)1+tNz|y6k|ALhaDY82B9!Z#w@K#B`&<5wR zAzONx36UpKo2JlvDtXfy_e=`yhK@a#7Smh&LRvNsLA;a}Q*kLr8j=7kS9+Wbg;$bk z6~JpLJqUVlq^4A4$dlqr5!qYmY9<`LlO7ERF<rNsGjE_cRdf_ zC|AD;(=KxUL4ehAolUT^Ms9il3hwgtPry9n=9OV=t^BMpfR}u%DXe(Qa~A?zFSnwT z1z$Ox3cr5x+~*)}l;_%DEKn|<2@jj(9WP-eNZ#)W5G?;rOV4Jx6@4qRMc(%alH26I z0{m^4(=GwqAs>4HV>{(tG+FJEo79J1sQhvhu-)=X`cP+&JmMg*y>hi4;O&#=e+BjZ zvODD{VRC2|tQ?T54F`5m4xz1cxNM_SfJ3q)%^HX0RrEd_k-woWcZB?sJ_I-+7si1Y zCAXRi5G@}X0^Uj42R|4?<<{#vbn}#4>lSRDmV;Yi2x8^%D8zC`j-~+5$|W?Zo|B)R zfU)!P?M$d&kk4tsyC`>}Pwy|u14E&3SspJzlq4fR`Y(4#SDJT0NCC>Q765_DV_J_kDF%P22PxKO5D8WWw}QfE#X{e*Y*B_3!rxY9A*~1@ z%HyBG+om+14&HXfsVcw@r4@bAwNuHaLcuPj4jndzD&LwRxm$^^jUe_Y7k`4tUS(zs zhHjrS?+HZqD=|-jg(+L2AaX$I;0N`CO4oGo!j&ELWF1nXyCcBE%1bJpA5r|Xz&omV zlHM`p{a*+vLYe&-SftWpC4xV$OpO3Ip^U2oUX&6`=~lE7M|*^m%3v#aF^We$V5gK3 zl;NIM*8U7)tYS}xIcJn+bf?cMztd6DIc0TqM0Q?j*aE~0iakvb7nNGHgj`alQYqrH zvMvYUisD8${Hjv)2SnnOh18>X#f~Doq5Rn%#02HLJ@AmIoSzQtrZSm!pSP6hD}dcr zE`EUI9pycJ+?k^Eu8)zps}$3Zxl)yqG2q=(e*7H@_mvnbFg#E$tVe(kl~xKA(v%D; zGo>qYcOaGwrT-8(dZbLJ@yt{j90%{Q;?)dTmJ&-#YqruX5|Yo9$A3cdxnds(D=(Cn zb|Ah~rrv^Njxt0=WVuQ{eQftixlH|gt)w~td!yVu3@lFxrY!HR(#{Pby;Is}fS9iY zYXAxq{&%RqSAKLyA3i8~ROc&H{3zcoR$AAB$S0-6F1RgGTxlLGRoc;RuuQSG2WGGS z+yp!a)$jTSbq6gkK57IdH5=6DR2=hF z+tZhIe(F!O7H?F~)&u6RzN!f;0qSvD8w1rQ#TbcAYW`R_3R3&gQCYBBorl6^_43!S zxkXK)2YRb&@`YZA>P(fBZ7M@&7u(gs(EvNtaZAv#o$A#;(Xn0X(p;#Asvoz(*lu;w zIjHYZJM@IeUbSyBc>7e(8!)zCtsBew7wr! zyMF`hi0VMA%u#ii6(YyfI}@QEp&qFYN0F+Y4m6_F->ASBtzHd*zmuwWKPbeghX+96 zl-lYi7(1<+_5+Jmuib{^8Flt-M159mMLX|vYSwLl^J>5pn7*KHrVnZ^s?9e-;gUM^ zC2U?+`}P31q8jL2Niy0c%%wHLOoNhngU~w)%rSk z$Wq6=12J3uVLC*fs5j_=eyZN12j!XCVH6~vtJmpEj2G&}AHjR6Mh^ooM}0sEWUl&c zA_9D+rgn$=Yc=C{NWM{b8euw5ZA&)as&g_ye5d|GhvE6^sXTxW>MyGiXQ8^4jz~YM zZ|OUbBGq~tSg~3|3+$76=Ne3xsEL%Um#P-pDwL@%dJygP=Rd);gWhl&JV$-JGh%Vl zucG5VXZ?Iiz92_u#;f&J=mc_&-s?Arxa!k-0l4YiyrJi=Z$#^#hkjNMfVKL5KjAid z>V0UDTBrY!(q%7w`VuI3>l>(WyI!9}PmhoO*<8fALBEl9!oK?6y&&nQuS6&L8}*ep z1NiGpuRxm#~c1lXhhB>@V1^$(lF z%0B%)IzQX5&!LZ(!t@<~g8Bjdh>uV|sGm6xym0+Q%CipXo!>+Kus&=%up|1P=zt_b zfAugFBK7T0BF^LbBzkO4=uHC=S(JVuJ?zo?Ui3})Nxc&to5kq+^00YIA4D~e)B2iJ zyNJ~+M>@!v%d9?WZs5=TJg-Nq?;;6fWzJdjq?o zkDUg8SM`p=fW_%+OoQ8a{XE*dUehO0#q7F%_%aZ0=0qmQHFQHp+i2Vi&gJ42z6svkv9|9q&Aqtl2qz1$HYrR$5T!)AuQ*)*s>(#!OnXQuwcHV_}{TW>^2S^92G z;UQbUjjA|L^xJa4d#W#^bJJ(~Hgu%*Tt9XSjJ?n|%7FSy{mvo~bM!y21u<8DoHl8% z^rO!~{k6V5%~@~sJE-vTPXB?1AYb3T7s4&j52BGT)W7Np;z#{OM-YqjO=y}a(dUhZ zUMZd|@XGX6y8*Zw_R~w^W|;FU^xO?>ATSR@!fAlDhUY^e;%Ue)Kd>+abcYo$!}=8P zybX=$POmo{J_n+Yp(>qQY%qL$2;ghjLAw_}gZm|58x1+MoA)NThORgdv57HPSFX z2O`G}zfwKxgyDS|Oh*~AY5j{f^rphnNyB@STU^5vBZ#*R zj!i(kW9UT%sT9MR3}AN+4ZFZms-e+Hh}<(wqMglsgWY_@^1zT90n-l+)q`rT zmvqC2L(t1G)b0npM}}|dsmnAhp?&dVLpyIsW*MfFUbexDj(naNj2FRsYN$-}#4|%6 zX>{8D+R&ADFK-M-DL>0IJkEgRTf>&c(0gZCz#y`G zLoLe43JmR50=zdow}<2hLl*%a3JqR#a`4embp#ZO3~On3U2NEv4(yZReKaB~G3=z1 z&{D(epTR3LEDeSSdt)5U3=YO~voMg3Mn5|HbTT%iy0Ejc_xBKSF^;BLakY`7!u%TJ zYbsf~8lRgW>1NEKyW(!VKL?nHaRSxr)*5e%Q1CRCQsHHtvD0v1UPfmDBHqRmwcu#I zF^gU`S*ez&MNEl|Wq*sW>E$oYHU~xu-mwfP6PKC6+bBKH4dc`;y&ZLb^!a0wL%d~m~pWdyaUFuG?g4Q zhSP)_ZhS!X$Rox@bZ?Iu-!?X(nf;D&3!Ry!7@d~_yKC%C z2h6F)b@WW!GivET?Y?mh6~iAGBmaQNL*v2+Af_3;>Fb7cqlqf(8O9s*InN{GwmJ~W zG=@|C^RY4MI*3`uoFCyf+t{oNuqVdIA>chVPIwF}&y3sXdyVJDsll-F!sxmmZeJQ# z(!-u(yg~D4uCYo-V6TjW*TeK{V~d-x^2VsAlaV}Q8O^kBjaR9l@y_T=UpwU+M^%AH zfzj83ad~fK(?I-SY)0RQ6dGqN2KLc7jcUzB#;EoH#m4pYtMO095}Kt-jNY`zD>W{D z0);Z8K$)Yx=>UD|<6s*42sRx}Z7G{^GX3%pdd?N02@slEhzpbZ!drVQ_5^O3N#t$#CDVEwG0nICJU8$gH6l45ZPu^bW>nk zOodb7Z>wo9&H5oGXDX3yGZj4ral5I<2pHR8I+O#j({%C|@OGJ2eh-_WrVq50-EG=R z1%^GQ!Q%k-nl>zeewg((tG3nO=Ts3u?54||kG|E)tO+638^fglyefeKxltE8VhUr%t$Va9X@1c-s z>Pg=hJT~o(g+i8TCv6XzFf7--}GudqSbu`U=K; z%qKm7Z7?q{uTPl6sr2Y)cB7enqj{emBL3!&^o>M-xj)_aK=W7y*e0_Zl%o_?Tv6Xv^gJEF|>>Aj6MXFr6< zN%O``5M#{Y-@x=K^X};&o;LT&fL^S*740U@n5zv%SI(N7mcZXRv&RsiB<2ym`iaEY2cvsE+ZBU3a-=l6JA3h&74RjsC2V?7Z5Ydwpobf zk$F)t9A%mh(MKbX&3OZ1EX!yYrcI9ZeN+B>p&d|-k5h$dY)$v zp{e<;xpx@U-OFpzSlXFxw9NEEAN(!7!TvffOFTVU+bk({VP(4|F$W?$EVe$tc3S4s zs=dpyVlxy%ExYIq-)osq#{&B-l_`7LZ@D7EbeQEr26zW7F0&E!LCa;DO~Wlin*kiM ztoa?iJ#5j_Ci{rx0DWG0)Z)JglE*ATT`(XKmWVyTA}#e_!pd=r3#F(hEOwiLMOjL& z07P4w?1iI~78g3>i?Mu412|=Q8V%lQ%QV`S#af1Sg@-eib-ST{*3yd-x^tFzn!V3k zJ`9571xvdkc)w^7@*#4`(wn|7xNONj2=zEiP7TBvZ{f>VAWH}OUiP}>uM&V87Ku8R zV2PduV@Z~)zraeeCHw|#-n3{Ff!(s~IRf?Dmi$JLyklAF3CR>orA`2MEgK%eQL4qE z5=8DgYmM3!#Jq{lnM@*MvaG55$4*%*?U7E2N0 zd~DfM2!$+5S#4O!wkR^NCzdyZ;Nhtyh7$Q_mdUh|Jh#-?1icrQ+*#0jX|ZpEaC0o9 z@&R%!-QGd+mBmc+?rV$dbXa*~nMo^2o@IAsh`hCoqSC-S%QSkx@-10Z=PR(dC{TEB z@u`LYKUm^uA5dtiMt8H=GPnuUKUt23BbE}&J^E&^)Kc09l4X|Ik+5lRySJ}) z0^496N+msCYaKdO@UvE31F+G`)B(@mdVT{W1FXN$T?w@2QP#Z4dWrfMWPMD(XbHCF z(J${eTSYp2-eMh2709jD2DBv&vF@U3#WrguRnNCuf2f3x?XZsi4IXw{f1tCMUDkn= z@`qaOjNt9I-lGr1_gFo(!1h{S$N>AS3tB^DzjZhjVZ*HV>jNCH=B7_*4YOE4qK=8K}bieJ?M1&s5PF}&0|(a`o9VytWlHTHq!bRoeCYdHlnXjPgr}= z=tf!l((Q=0HeLWLC#`4b-o{wlq(SnOweAyu)7IyX801)Mi$*YZ##+E5z_ZqF%OH8q zTKy74&Re6dLH&Yt8Vlk@>+3jxOV%JN)LpjrqYo;tSTA;k`c-Sd3Irc#eL&}i@z!xP z;a;;IqD|;^Yf4QJZ&(EZ>Iv4-Hbj$-1d4B$KTV_5<9s&f}nP%j(q+9&TGT z^iJQg?xatcQ>+6ih`ZK1^wgzV>n(xgJ!>6GrSDsR_zIE_tm|z653LDw+L>kzr=456 zHH=R9GpyfGh4ry@WK$5ctf>V6+13g4PCv1>pbg_w>%MpppILpVy8PT)8jg@&Sc_hP z_tKj6Gfd}L4;R2~uGP&AyjRw%j2u@ zms&gb(WcsqeIphTU{TBoU(m81|p|zKkNrF*5*!?p)O zNpjw1qvhp-tuqbXMcZmx_%7LwQw{L4ZKNNFS8P`gLhq_Ao#yK}n+v6P@wQSEhUc1X z=^GHQ+cNiqc*Ev=43Y`9ag>QC+Q!mGEXnqUlG0>bk9RP3)AlMIBDZWmbU}c(Z4YSb zx?}r|GR_oRpXI>r+N#e1mTFr_-!t5^^@;?zZ<|bc&jVXp4e%b?TGBo|&8BY%g>+l{ zPQWs3J?In4N48)Z&rDl~x4<6TvQiOemhBV$9OtR6t{bptwvyWj;<;@=RhWKZJ1v9v z(w0bba*pkcFKp)88qt?ruWW9IJ=EXYH1uuSJ6jD;*vz-3 zoPtP!Eq5Z+-`iF;gvdu*Ds5MbY)$8ax3uplvBgpavedSY?pT>^E@fo) zc7|`-FD$01;4fO(8XE$LLB)#lx;ZXOsv-1O3Z&xcA3O;t98bf4* zUG!^UzIJDaLekG}0VPTs?YuUC=x?`~GJycQ=d_Xp+RdV~$p6RDb;nh8G;PyAO?zX! zz4zWPn#4q75{;?0R85S=SYk;umc(cxh#(+>NR=iw!>cx!`%lev5c1&fs12o&Vz?|#)U9gImxgegOvnE z6O}I#8PCnf)t+MHQ06&_@fGDNPc!xu0+-Bqemb}_42Ru-r!d^USODL zX1NUhhY;p5G-WWI&sZ}GTmfS}1t1q04%F6gi7~wcV}*~qEBiy5~mi(10S zdltq@84D&bR>2Vc404$fGZ&^S8L^brtYWO9?#yaNDJ>8+j6{m(uP{s$DAh8S7sE;& z!;2Dw^^A1dUK$vqtDxD)IFSp@CPo8o!dDrG4B)OY{u;wrGvkY;0JJbRe*>BVR+K3eU~Ai$L$`Y=n*u#8UIIry!k$3S_iJZhoPauZ7;*43V=RF3!Rqw8JSMF z69bGK$`U_d#Hs;!$k0-{c95}f7OV_0cGD8{h;fuoXTyv=tr&aEI7tW15ytiwz(*OJ zsUTyFu|`;#WGts%_a_Wz%3nWa`1}Uq$V{~X;KY1y5GwnbVWjEIJP`oR1I*HmfV(h- z6p6bsXZ!-dL8i_J-rbnFrSRv@Ts#Y!9?Xn|z#U?~P7MN{%wKjwc$m2|9~1Oq#ux$j zX7*o&$`NMAR$QMCa~)OHk23#S0)Q`bBYkx3$COe%)t}i%!DRqb`X#IcGUsmwJcxOK zBEVzJy;V>NX7V?I3tGERVT> zGFbV{FKCx3V202U@gg(k0Bl}jveKYg$Sk0Rvxs?b5lj~|chI9>!u0qXq?Fk~IpZ>B z-G_jeGcQ-eLj}|I4FE1PwN%WgW-53P)-Z<*Fm{DGEC5%_l$QWd$DB#I=6dFIiZvRT z1%JbPBlF1TP-$Ym(geU&=6VV_t}$m#LZz8`ha&M7W~CKeD>JPJ+;wIICADub?O)<* z+n8@tj`JpSoIaFkXC_5J*uh*&Da%_-K^dmh$=pU2u`cE!+L>=NyJ*F{!(4qCxVy~7 z&hU4S$)>Q& z+=-*CNDAnDS)O#3@nfm!4;1*btV;n1VEJ!_W*}=V1-e13l({f{jJ1?rgkaW@1mHqg zqbI+gU>v9{7y7tNYOZ@>wbH{Hk> z*2|Rlj%5W0V7hUv0LtRTvtFmH=1JD#c&H?>T0GZ;%^ZKwXv)2tK< z_L5nCbSON-nn9VwG}dDZF4I{qR6{w-dX}Q643_IN#h{FJ9;^I!2=iH}HQ}vd?Noug$U0?)=^|E)3%Fud zGRTrZBCRRks%2>sX~!1FL5}qAYO(>shK1HL{k{TinD7B7av|%c#ly8ta${ zW6iAGKmb};ZZ?os)^8(Fxz0Mng!db)$ggmjZ7lb{L2k0D_mo*U z%ofsD?_TUI%IkZx*PR3I2s{0AjQOzjD`4y>+kqk$Uv^^~toX4t6v+Ftoe$tr0@(Zh z1R#*@NpV3C`%e$xjj1#@__IJ`+N*fo@?In8c3gRx}x)KQF`VV|SiVG8>l+89#VYXuOdvA=r` zR?^vNRBt@X&Z4L}gZ(2N)ic>|jRKy(#x9itaFhMA7Ao!RjTCEiu&s1xy2Wm%WNIgS z6aA=N><(&VxXsR`Rq75~Pj{l5-Fy?q?z6wCg_Rz5-#uJdFZs(KNM)SOqmP6p*lu*MC)s~QLgfiNGzQ#L_UDw%cI5260e};yk3OE-&)G_!FFA7x zsfXYI=P~^_E}UO}0O!g{Hv)c;qjZ5kH%=$T$?hDv7jPb&caLD~5a)X_h$m;i9e~4} zYzlw8I5vt{yg8xYVlGEGjMLzJIBS;yca#&<41g~uik1>T&JeX!`EwTk3bz5A?^*#5 zORuaV+O9?bC6b{OS~U_l z>7T%RA}4$R{!Vdv|HN1lCymnIr#Vfhp_0t`U;ywl96!oPq;N**S4rixW>^D&UO22`d*l$C4qu#L-b}Vj+i1rNtu7JJgk1%(2pWtb}um7OPT@ z$0Z2MI3<*pEa#{$fK+h)p{u>jS-lpTl1R=N`p9jhrm%&}icPM0vieoRudayvFIEEKW0L8tt$xoWyL5 zwQ{UYn9Fs}8Cn2ua8`)HwQ;^Mg1gD7rx&4}!+i!^2j@o$N^fz_I6$S7^OQ~nU7Wxl zVdXX_m?}+oI9+sjy~{cOC%Ai@`n}+~IV)BHexK7s%Wn^-Ef-dLIsg6&m443iqu>TO zmDINJfTN;jnunaPsUKyK)7Ol9HpEd=#o-aBn*zvTjsq2r9&=KujbeloM;VY&jyVTp zjFYz-{>C}$zJbaF=im3CGRY~S$L$GcBc)89a!&2RbRD_=AHuW~H>3rC{ahAh+MKxy z&I53OyPW3f!mT+7;>z7H4dfuVARhoXZuL%Z?%WD$;qu__`Un?xhq_fV0Jn1& z#sayY(O=XE;+~oVW5>8(#ldticNhH}A>80I&Oy+P0Q39kPXn2zDDqi>92x&EKR^hxeYI;$mcYkD9|03x0>bm$2WEJ`z-@BCtaG`?Yaq;#~KTTIF6%Ul*kWR=`zO08CL=TS38HTUZ`G5H#<8->|*Tmxk!>bY?g zsp5yxRb#@{2L|_%NwG*6vz9R%0cnGeQJn?+sl6h0(!JXmFr9dKucWoI|Qh8ITUX{jM`x3Zx-tEu8UEsYb!(4KC`zXZ8 z<3;}hE}ysVV^}HR#eWQyi@c`=uyToKqW0!O-hR52BA#_GNHI_5gRv4`Y63_p?-9L} zWxTBn7%S&(pgKYYubsLZF7tl<09+-{qX}FUPk9%{s(Im*C#vE7dI^rM@Lr)syq5Rr zE|5B28Lf)-yx>@H4LqJNY&P=5!?4oC+cY2EukuP5xVzVQ2Poa%%-g&JV=cUY&w*>@ zdC_8ZotNYa+zs9;KNxG{A*+fvho_>8Zs#p|h)HztR*iwX#WT=a-pTuZGpuy+UZZvC zHt(lzK<@FDQh~Xf7f2z%eO|$j!1eHUP#UI}_e(7ReZ1#r8SUpyxPlwteH9GyfQO?m zUJ~BdYrzfirt?4^@jev5*f8&_D!?D}K3ff&BfK7ZvPOAUIx&p#zWD`YoEJgKl?mQ8 zsvJ!6_zMAe!uy#P)u+7vjUbNvij5FD@t^C1%>#VRFVJ-1Z)ybYAb&$Yh#UX6xiIF= zUr%it9{k3S0XW1zL^%jg{`KF$9p{Q2EV00Q`J7ai%V{1Qqmh4Wvk2ktn(kXD-r{u~OrBl%y``8JB*-3=1W51|A934ZKWTth6sHV~7D zHMGQ z411Q(pp`F+Z!d!|n;-o%yr1Kz(`%8#-%$nbJU>Sb?gF2C4_q!k?g_X&e$S`4qI~{J z2}~F8$9BNKrZo_6yg-}lO?cO#Mdo_N-=*LH7Awun<)`e%KwhKBFgyUzd*|Q ztLb5{;3q_ZyUbr&2U5uoq{zRD-|_%}YW@_u_8R`nCAeo-_??u-uI2M)LZyzsYz5|0 z&!2JySJc4wY=p5!{`VG)HSym%3*lA%hH_ZB#?PeWdo$nR9Jm&~kdFVY{O@VOz0QB9 z0^AM$%qf^>8$aW}JRko{I;XbtU#SDGlYb^0-n(!k!QJMU{2xr;;U6ULclkOi#_sX+ zJ^-MbuUY{Q_xUpdG1kLhN7>L`{)^OP+sF4(LbIRWLtkkP@blk+l?VL#4ImHsC0-B? z@>?mnGQ__@Ik`vtT1tlv^S_{w_%UBa55ovwL?Qnue_abEKgRE%lj1o4g8*<(_zSng z-&6iN`u@mK;O_#Vlfb_K@cn`bN@O_;UY3Cz5M*aU=pwj86(d){MJnpL3--~=sbk((@bPx2ga~f@2$fL5D-;2S z3Fdtac!Z!b6@W;ALe?xScYnvMQw3t$$Ic7Bpl9%cU^X3=a|Nad+?PDT z4(fx*7wotL%>uz$S8x{v#dP+)B)CC4LZP6Jo|huQv%}zu1%FYMyF~EaT);~OTXevc z2^8^|V7Y+z2Cnw9pzURNs1yvW#aNXf_aQE&TEL_dMU9}w3BoIa{rv#c3zpKh+aM6| z0B97XsbI575M2nsRlzH>p?OVkRSlcXf`zjIZxPH$fcI8G#@8U%1zm}-azl_sdup4Y zg=T$Ipr@F&U2xY2q(k6NIjdWOsgw@u6og)ZuuBk=0?pfkBk2&{5geoDkGq01Q=oZI z&_iX2Zo!xpGrKQX_z#3V0^g6o^$K2p6@WfLI{jk(g8jMR9txJngFF)aM9clKpi2hs zu^{9bkP*T86kOP-pe+&Hm>^&&xN*U1O4CmW&U?Y_q~IAT{5=skPXqTA{=}dDz3tlbVfKRyh6t$H(?ir+3v!ZS@7T~ z+(v~eKjH2=jQI;crN68YAUsMTc%X1|2!uhxj|qNExR$<-4H5ot0Z6ED`M-dN3F8&e z3>SV72hHQc0tyQwgvWM3B~tj=hq#m|VX7W8J0aXiL2!(4`nv$c3axbfh!g(q3_!dv zxeDZ@a3AfI3Boq2FeVC%XdOHy%*_XvB%DiO_G#gZKY*MOcDxBdiZHqbfK(xm;KDrxfPgbv3c%n>f@fz9(m+YDH_ zAdI2qB3Jm#cQBSG9H&JfUud#Hvp^U`X~`mCN&^5T!qrA-mI~jYwzo2&xgDD2!p-+! zr9$|pBgQTZ6>ZS07QTHG@EYL^dJ(P&XVPagwZfqW0P2KG{)J|}P}~j82H|-}7;6;n z-vh2msHIo!n(&+5m~OLh{kO2vB78voZmmKg8;-6EXHkFM4Pg>BB(w=lK_EAUSA5{1 zUHJHU;5vjwwC>&#s^5gMPT`wWw7xBT`4hOkBYc-~C3l71lvBMYTuW_5-9l$OO!o){ z*FbuOu2~>`!a+J8^$Qmm03Q(kxdk>K2)i0Emxsc;^jZuFU#HyYBVp(!I2sn#rGtAc z45ZxQi13YQaHGQNzo9uMEExm*sqhA^w2q=->UDP#Rk&kpzi8z?5NFY=OpLjR^mMhZ zqF$nXZKd7{IjK6>iBL=jt|c|@e8)zn867X)%t6g?dP zf6=KZXaivCyxK!RxTJj^Un z)I{ZrQzC!LttE*}J1~|kx<+x&8Ie~iR8mAr9Z0HZIwfq1@#tQP4amYIy-O%Mn%4U(~oDdY%hFuBf>Pv(6KR=Kzo|I=38S1)^^kL0BmI zs{`JPL?Wr%czsMkB)5n@rPo7a~8Y)gRukRzJD<0BHlv>cULiwLaKw} z(JW}Xi52gIa~EqV*X$wAD}?4Du@CLAp5pJQT6S2R?E_6O@mC*%^A^9W#YGzm86cjdus2Zr78Un`#QAwpIVOIF*3V$EHyvI>#6D#Z zhKd7ekqZ;cXzd9Xe?nW`adG!!z$3)|w5&ynH%LLE#4&2Xqs3Dx?Q=rhMkTEn@rR3n zixn?=2Y@)Sk!F2TtkQx@5P$y(#uCN<&{_1f_)GeYlErJc19wLJH`Ogt#HsH?m@0Ol z?zc2?)CIuP#lgEFJS&bM4;kY1bXd+5zeRgomiU1XBwH+?4fCA%bSJnRasGcRyZAZ- z6TBd12Et0NSW62;p7?DOxP0+n*D#j?u`2~U7sc-fz~3eDr6O>J;#)VNStNdZ15+v% zciUmQL_9!|K&g1cRNyMaf6{h+S-dU)DwX0PTC-}!2X}(26Q2qPS1-Om=bQ%d;o}fC ziW}9yHHl9z!33|0i%(U+-fOlQYQ)BFgIGWCCZQ}K5 z;BJcJo`bP=@nibXqC?F55ZoEthr8kni!pXj zT;>AJZt)FDYuy*OQ1YQi{0A*hz2aE<8T-U9q`_amIBOQH42aWaVM-6g3*W-zABsg9 zXby`1r-YRu@z**CABlI=KxIVyZ!^fK*fRxVV`5D?W;QM^q~z^{xR{P6lVUsVsZYc& zz60S?aVzBj9VH7XRpum7Z-n>#l7ssJcb06Q4Zs0OJna@PlD!{b%vF+j7Q%xPbrV$F zB=7tLEAA35#b6#1)L-$gNMcPe<|&y%Nrb}^!7^}Ol5f9)6>rJf8Sr;RqPz&WkEELN zSw|(gcHn#^%}pSFlAZvJ`Ae=-Y9K)JVjWBeO3wcZV?mO6|6&p$l8(1P!X?dA{yi?) zDu8B$L_^2UNXafrGet>)*1~PHq(KI^CnSPakQm8I0>nx@Yhf%-@+TDu;w3v*VeF)2 zupc%PByZG#BuZ9v;KEKx)={{eB=MSsnVpstQcGO2CF;5MSv}m&gTGcmApf%{&mTUWdPie?3f4ACdswH!%d051((?_ zIYOz&4oU4akXw@6d^qZqeDeq3U6MP);BHHr>6?l>66PS_-I9W{5Z;$C--neR$rrDH z^hz>q0Q5ZtTI71|%WhL-;@vv<||Dl5ffGAwa< z6@bT*pPF$+Ba%%e;6^2v+%PsK*}E5HTrzk7#wH}vLzw5JB(@B5c_PW6;@(rqAAiHN zqcoHXw@%WO4N%!HZKt}0vve&TEe}X{wZn>w)RWd^S7}rpga@T-P2k+5?Y(g8E}b$H zLJ#R1-@?jasb4ZUFKHuXiM^$N(Z+B@+AW4@AL*w;j2)E@PlEVL7t!PGCoS-RroS|X zlBogGEfn?!N?qIm2$Bl+fjcJMe;U^iEL}7X%@ApV9Alx;>EH1n zC#9@kKoX=T>Rd^bj;;dWl=Kf;tdgV&RH#akHXMfcRO$FLaGNGwM>V1>X(APhv!$P2 z134$%LA!R2G?t3_=cS)eXTSyN5<2(iN&{4|k|)ie>Q%n9h*rJ=X&+UOFG|m)LFJP4 z+PhFGl#ag%4@J`OV^ArU-rE63CDPTaz?Dju(HW>rI-CtaxpZ&^gcZ`Ki$N|+Kc^~G zr8GnYn^n?{6uMVSUlwAlMwiH^>!laZL9;)L_4EuDH9fIHH_P;hsp&rnEpPg?vh{B=t!C^vIo`oRIf zd!+YiNAHymeg>{j+WarLe(ACaOnyMhtcJ}8(qkliC=E8k%AoWo%18`Ji#I^!k@Sl$ zOmJB0{}kl0G>yJA8bpCgDFMH z#%S}7mR)%trccP882~Ouw&w^)tn5eH_~K;Wsh|=s+e9rgCuJ2>eN2$`j=@Tz?9&+_ zr(|XUG?Qef$>wR(I&?>0Z$Y$_?yCR#l4#HYly%MBOmO~Bj^|IeSf$0X>Hfm#PlKnz`L04rZ-SBWt zW(xvomRafa(jr^;6ccQf@u`3CrtIPd;M!%?wEK3*3aO>zzKr<~tn|n#Y0v4E`O^>3 zC(FHyv3}VCTHOX@3n{vPAiF;cV-IDXlOTh#4U~Kzl0A+9_ejR1^7gQ7I;|m(Wx4=N zVnp`rTM&-QUZS{sOxD4Ha9sAwM*vL7riMc}Df{zn2%pG2SAcseYo_CzqdfCla8B|) z$KYYVeC;@9?JU<)1^j^gK7B3cBG2!FimUwe5|D%PhGiIYljn;;+~xd}n6-!ey)R+x zki4)O08hCi?Tv@!@=O@>l0Q!gXm9z~FM&HE|J5J2z(@WJ<*bg%T`3gvm6xbtB|z>= z=bS)!W--Qsr1eFY9)jr^7vZ-gv#%)1RzZQlmd`&`FeKX?Xu~z6$vvMy zm@fZ*2*%FJ(@$b7Lmu`vY-Y;6s9c#PKk)!6+46ulVC9_r@?8jXl7>a{s&6r+V)=WH7%P$g6$I0z@;2HO z%j83}GL*}AC&OliJZdAzW%-Jya8xOuPvLTv{HGV-y;}YrEzLFZfh8EbB7bccxLWx( zIs?_o3n}!gmvuZ$Xq$jdT?m&*N$~n!zU6cQ|2L77mu~RVCBKM_}TdTZl z4}{m{K8fIN$iHlc+cxlcte$E?QyS$A`-yQPEMBr}8y=V{bl)ri(V_otH+K6t; zXIFr`BbUvG%3b+odVTN7f1`v(w>*Ik;P>UXZh`d3zoqYpdgTu)FxDsELk++Ea)$|6 z8ITv<1^j{h-46JBC~u^PXi(lqUy={WN7R5nl5chgU|9YRl@=e%4?9D1L|(BPWK`a= z9e^=;M>M!``P>a~G$H3u9d=SamDY(T@{^QLeky;74=av}7|P-}DV+Ei+pnk=f^$~r z=p&i~ig5*OZ*aOa2!TAgvO4ihq;jfr^A6$SU!v+2V6+5W2KS;5gp1Na-XXr>1tYFAs zEJU$&69A!#N$NWcQ#d|^FkG>pvZ%)uW;%~WD5l+phe$;kwc|!9zNPecwBny~csQZh z<_47*#kdhxVin_CU^-6mZVXi76))1pcTypu{XIePDb*hm6=x`fJEho0xx6HWh7#VV z6=OF6NLFlm7Q!=%?Nr)NQG`=!CsonD93IjXXFWjD6+R&tJFDQ(Q7A((*bKLsiaXPx znWb2B8(g+x6MZ&wPQj-;e?c++4FI`{*DgRMPcd&Z#_|=#l(;TXEMvjuMa8!tLs+Ev zk^XK)vEs`Iuu`JvrZ3RT6_Ijq6$*D+=PxVL=sZ@b5T@d0RVfDlf|Y7T-bHY=ip><= z*C|9t0H{~Qz6d~r!h>oyjf!nTkS4{fKVkE#;+z*8T~mC~1!1!ybU6Smis0`t)~Yy^ z0V~%PxAtMyHx%nAU~N;(q38OhV%=zEhFUgugCD;V00% ztyoKIHoF|6EG6nzerdx}LLVys(npIS5SD_E4M>rsqRtk|n?y#>uaMK@*n`xTxP zzYHk$)3)?L;Xm$? z_T+#YQ{>D7U|eCL5MV+vi^7UY#ic6vd!h)XqtH`@`&4j_%CnS6c2eH{3Ap{rye@Fg zO4S|Q-2=)YCZ^<~{FmYoSLO4b5FS(t=-qTv?%fX4?#i%5FzumCoC5BUGLX715!_4ZLnR+?<=cUPA5nfe0-=v`_C9b&l}(QU_f-z82Ir^b=K|-i+(~t=Am#R# zK#nQ*P`DMW%%RvVM7etyDxt~+g#d&p-MumEaAj%@Y#vtzQi?&>I)4tZ0O0oHA$?#^RObzd`e)@*{d|5|mPEK~Ge+rbF|T zays3YB;`sCxYNoJTD_B%l|O(xqujIrfE4Ak|LsT0SS{S9DbG?iEnT^r7NoOEQzJAp zl-DR7mZ_XUy%kx?H|_wJtrYY_cupx$f#fJ(`xFyAudJjL%?0J#JP31@J00OKPx<@L zm{PuS`bSVHP}Y<~<)ZS+ERajeQED_TRL-Ihph&rwqS0dI)1CNLN|dYVbt+XBEdf`i zoVFbBawU%rBNfWpUqCJ^7ykq+mCF2Muu`RbpK|ck$`?B!tWgfi0KcMqdj^EH%7Ib{ z>y$4ng_U~ca0j>s<@a>LY*e=JAZ$|hQI71Y@+>utTvK*aMBS_`UICRBWosXVH%ny@)0X2hyOhK9quy0IQ$xZ%Q#O=6@UR{!3mHDO6Lh^K2#3(feb3`^fnGDx2?iuK2m-_IkI8p_g0X{$~hFK zjVP707K|#N^MSuHW#$5K<4RErxCvzx^KBs!>QB~~}81q&6({bES<;{lB zU&VhPT!2d604`9qYzC$qq}oZ5M~KQ!Rkl#o#!-xgsru>I60SO%gt6l)hY6UDP~9(w zN~B6e8+(+>{~RVCt@`vj#!jgC9+*;$YTiqjORQ?cItb%bC3HxOSIw9WV<%O$bm&b` z?WCkyqG~_2iJVeBPu`PMPCG$PtBTzLPgXrkvp%C5I|5;fY8Sm#sVc8WaGRzQ`~Z@! zT12VNv#PHSLM1~LG6~b!s{8-FE2=l?jmuG`Jiu74D$WaBo@xcH`uVDqV89Dh@w6#k zR4FsTT~h5Yz;p{$zZF8INcA8WGb>i@n2WIz)yxebrK;#skTO*XMNj3bN4H_RLba22 z-^;3hpMa}Wt)fIvl`55bIjU7R=VPo!HS;F8E2$meGu>8Qq1w_N)dYo2cU4orfxmmII7$q5t2V@d z+*fU(_ozqZbq}~+)$nV$^L?s)*WtEb#i!?GK!vmv-XoPerR^T7tVb~UK~)4T+e51H ze?T6oCaLl>tlCdO)MM42br6oIGO6Y^s+w^fj>c4jUqU#pI-Uhb6RPs*5KgLcj)Oc= zMYaI`RF$+8V~*;N+u_|wEv2x2zj|x{oQpdATa3A>zy1Z9?&|H-U+$saeE=$l)Z&#; z@l<~{jIqP&MYL*osb~BQ;;oj&!ov~uYzs7f)H8Zv#ZSGR;unAQy#!oefcm@-xIpy} zlxz%AGd*DJn7V{+NU)myH%N$jayg8Js;8}o+c0(O9vF*IKTG>&q`Eg7DpBfzW5C6z zmvmwhvFgjTvB#;I^qeKAU;Pap64ebKLwHJkm|pv2b@!_vXVe>*5T>Z@hhQvSJ@;1t z&Z2vB&_OG>ctedwyQs&By5K|g(8+)>RU&_-BvFs zgvuTDJZjpytG-GB$bI!v3aNV3iBvV|Rd4tV!U6SNKTPR?dM@p157o0ML-0s_E(q5? ztlp9gn~&8qe+3y+FLMWcTz#|>HYe1EAE5bEJxIHnqlQnJQYXzv=`eOc6G2hzVNLij zI4{ksly~#iY@>(ah~`;JCHZJ_C`aa}ng1m&(_b@72-5+YOezutYRvS;1!+#F!tF85 zca8uAYt~Ts6Qapwz-_2z{x8rB)7;X6glksQGk;uDau|R}O$G%nQJT?y;G#9VC~ba1 z6Gwe{F`BDXnT*r)wnH;s^FuH+Pii*Fz$IvoQ=d+v=0#_yoYLeif-qV0;!z0CXgsdM zN{Z%Y5^SbxcGd!SRx_6}3mKY!sU(u6`K=YWY)vLb3FkBqjhJVS#(ySm&v}j30FtY5 zr)VZm<4ip@`I;y6S!{u3h%$Q@HRU6)a!Iq5a^i)W&r(2&H1khk62+RY%-~8i>nIss zs!>rUs!SuJ=Hqfr-WcXmq46YRmo=Ih7^~F05d~qDW<53eRcmr6!&9U2rBnG8%?Gr7 z)@m|C0B_Lzd>L*VH68C@tVwgzh_PnP7^OE_G`1QDTQ%#xgRwSE=@g9J)I{cBtX)%> z1Jj)vN7}BtG-irvZ)>>TP`Rf$y91`XH4(3Z+}DIn1)xt8)C*(%nx_p=8PH_hhTB2S zrzL<=Moj0UQH{(2Dr1_B{|DTpW-Eo+Pc-^naQjrVn%)&h?L4ZS zJ8Ad+0hRsQ`aY;QYtKD|$^q>vGdLG*<1VPUYAv)1AJne?4RdkRR{jMK9@=?SaX6$s zyd1_nwF7G~c38{#7@U_jB?&Y0*1mHP#*SzkKE&8jZQ36ozSv6dHdMm2L)2##q22rj#v-+o z{qPs1?V{6ejP}wjsKjbx-vNo!uI+`fc&&vl^Q89WP>=*|(lYo<)cR5p@|3o92Q-tk zou9zNX{`sf>m+M${}0?5Z3TtBDcYyBLZ@njkAO?lCQOCDbZy;vaA&pisIM|ZEBX^Q zGqpSEDbLc*oeL}3+HuOpoYO9#)ig)@LKJZ4wa-zN=7M&D>Rh>6DJ66Av_DWPK3^MM z3bzH?>(m){QJc6N+$HU1YJe!zenLxSk@gDZ!HTt)pM!@IZ9lzSrCKiuxH9boouJFL z2ZJE2(593DcUjv;(P*W1?GtcS+HO^>;eT{zNhuTZj@;9hG z-~r7c?FL8Ke58GaQi#Laak@*7wcG;`j%ZZ|sEle?euP^vrrnSNE92S~R4kp)KG+7$ zN$uaU5I)gPxd8H1`z@`ej=FmK2Ea+D-UiM6IxQ_v&bm`WAP02b%P>zD-T#%sw5#rZ zA{-smO>=BA|dq9H8((bNcRl^JawKwz}R73?`F)?OV@3L2XCEi0_2D; z-3tI8-Et?W9MyIALd93d;$h5Bm$3(&zwX6em=4l?$;P!G)BQ~ESgUL00JWN+bnagn9L2BDSuG{Ab?-9D9XlO?2KBtb>C><{o!f4&rkD+-&=QaUcj4qv$ z2(h|P+3**q%c6KUUN>I~(2590m#seyJAY2I@Y`3vUL85m|3=N z!QYtKIbHG;kR07EDmb0jO`&u61>MOWc*xaVSPj#8x`Mv|&)5C*8iWNpUwSt$>ekYu zaY?79NW4(DdLu}Yu8$tKV%@7rFjk@)eha2cb$*m0Ez`|f3V6A06>Sq0x?VbgUDi$A z1Flln`YcqcbQ`XNtJW=k2V*t5@_*s|ims6!uv*<3djINltDl3-dfm)9@YkRVnueJ* z>e$rT(WDEc<@c&C;|aKHx{Y@DYu1HQvsa7ml{}2K>TI+ZU)P0bfxDqQ(G7jIsmtH|4`bsQ`bi+;5)jU8*p@2x6l*9d%8)AbOvFQx@NcV06ru#^@ zjUu^WT^vQRk98BLK}K}zDSjE%@#vu))5Y!r8P^TbL2OcY%KN@w(x(SOWxxKlDIf>*XXyOyqW`M}oU48f#q0<5t#81Xo8FJg>F)X%${Km-Kiv%O zkbXu1Ond5O)Chf8KSn(nUiv~>^1Sto!{CnSzwLsikA9eL-BJDY51{F*@26C!pZ;?S zYW($+*Wf5Xzl@gqK>c<)A_nRGDR4QaFF1?21nV7F0T-h0qkgGSeFfF=!t@8NPzl#h z=y55>^`&i4iO_F<9b=JtPkK8}=$mNAi_wSB10AbxPsLcA{_S({5U+n_FW@KjiMuhD zp#LZyRuc6KR)Cz+KPQK=B>mUlVVLElWzZm#|rS_Ja+ z8cH(f>*sgDLxH~21vW40%^rYX(yQh{rBI)>9l|2L%ZpGc)}OC}l@h&WJH|@&|56&X zOy4~p-pln$U#L{*>q5X?)^DT3U8R2g047+a?^p#~wSEdkEH!#LdSqU>qIaDMVXgiG zJy~`7VcKl!^}PxR8}uGTN~eAwRT1y#k5k3yuKw5CP`Rgn#Q-ZkdTs-}_v*vw`RvpG6$4`f`rm0& ze4w8~O@$Bj^Ax}h>bJfCl_C8p`ubv6e=`hYkM(~wfQ;xDL_s*Fucy=CxPDhHtW4;; zskv-Y-w+7$L_eI1Yj-qkpvBn9(ANUteuKdR+yTQNEvhaCcMj(1YB)^6`ay%spBQs9 z98bWQhryFRfjng3G-J%uFpVldhYfSSfg>-2^f)HyZ78Ea;;7*s51g;zRS7)!88*=3 z=x+$$ipvZzbWk5zpkX>4dV>rn9sqvK5J}-(u))g{j-m`JX!DLX+@-_v3Bxfe+{PH* zqOw)2VKWtE;tgwQTRLf2834@$gOeF5Nro!wOE_)Fz5tSJ*iL!xGloFgFjEYg*We-5 z@ahSSr5WbEg-N6v7~3#*)-bggV;P3oBQTa}i2NBIvJ7+SsBqqJ!v&MLVECSrqPd1B zD{e@hp=3G$`G(%B;0g>3dUlHqM`=qgF?dsrw$uK=n@Fa%NZw%PFIdQ7RsFwzHHtKm61<6SpY(GPdS zaD_JgHp5Rp;~F{)zve)A%b+;}VW**UFK}Ikh3CNCHsq-Rzhh{ns_b2Zb{>TH3{kW{ zbQ`8p1aaSRas}M>7*d)*dJSJtLinKpWpq4shKhyoFl11k$1QkduuXsr8yNKHKQ?5R zfJ_)l+A*_9LrffuJu$pZ^|+^ouLeLIjd^cE=wv+a2!F1|amqm)G>#mF2RCD7DEzq_ zyO(0j!&sRJa>%HE0k|VZ7n-$?@t=2K`lvDdIS74?f5buPXWUIWTz}*EG{A$5-%zk{ z%;@$GOa~jE<3lCHxZrn?P@|RV4`Ie%DU};;e4Wba$Bo1ES1clow|D?V8ue>%eNo0A zD#1k?{pj!$Z=8_{(wDGsAL!ew*Z%EEDHoVZ(I?Eu?xn@NswG4cQZWX8J|>xH7Vr>@+1?IKK97=NUbX_e87PLb8dnN$<5G0vbHa>cls zc8gl$%hW?qXT0_{g!RTdw}5Lfww(s9(fD)_!X{%=20UCfYK~&;nsE-5&~6wbDZ$WY zjH3RDo5n3vaB4TYEQCsjaV!JETgDN(A$N^0-hrcgMlY&XcN;%cf!sG zuhDb^{vH}DPlFpYe$fXjL&mw3=X+!;$3``sohFPKG^I)7$&UeeVq8vh zd1`EX238zRuC$OjnQl?r+W}LBKZuK|>t_gEO)F?OJZL(-37ng0Q3$Tj-DGrtKOfVR zU~orGpSHoYuj%(C(DXB{qU?dcN#zA$fJsilWuR$VFZ>0WvJ+wYm?JyAk<+BE46o5?0wJ#40$lBo+n&GbIy zZPHErM=*BQw5t|?3{wCFrJ1HUiYl{A@vlHL+vN5ZaOX^0q|iKXI)bsn}* znIoQHF_~o|gz+!NBOg)s1xoi6CRam)a zYND|4zA21S|2?Mji{P)<^nDYI^_#BHv3kJtsuZ{frq|zv%0tr$0mcSRo&TNOOkT9d zJu<~pO7^j7?$6*xOqoA`8#N8hg65d%SOn%dZrWpll}S?^)ykik^1Q)4HBI{fnvUj~ zUt=y#=ET+D_L~Q*aSL3`W~%qQn%f9)(7c%Lyqo!rFM)G63ub}yFuz7Bhs^URPWCj{ z9s&HYIi1qcUgnu|;N9Dt`U%JpvqLM0k6HOQCV15RM>DMWnyXpR^fQlq1f0KlYz~YC znDe(nCD6Q%J|GG*&!tEInE5)b-ofS~s@{3~T&Q_N*_m`pdb${;*z zeu5~>osr%=4WVOxoBQa>F-NsRTwl2%>n7)ip-yf!C$etn2J0l<|9-kEj2Hi zj+vF2eV@Qlxp~?Gs8pCU=+E?BHp>MtU1@fqt+mR$oQ@II=I7poW{vq%3SY07H=cx* zTC+$Dn|0=3TC?iSOX(4AFiU?1*Jw6f1+K~LMEA4VoIpkS7PAi(JkKCYg-@Jf+u^zMO1W2!W+Kae`J~LMd@BL=42ml7m&eSdP zz?@4v`jEN)A57_y`N3L{VRLf}$YXQ*A{ZMnFD{14nAvS1aO388voSVdmRc~SN%JD= z4|!sq^9DRTHTNhmT_?+f5#aV)rlx{(wse09a=_B-1h|W3(ge=c@@FUDZkE}!Cc9e# zG9dJ@BvId*r{x;GM~5xjXeIKpB>RAPTlP{C{fH%op2(vXPuk;rEtwS{eij~8P5dpz z^lArK&L(3nftHWxym`!0@;|5qTRtOrh~+~{i-cMd9^t-(Sx!#HSh&SS4}TGsmzMw@ zX-T9gHp+7I38ousG0~e7XUU`pBHpr60dmrk@;Yz{mRY~S<|&JF7i=b3=5GW!ZAn+d zSh6MKMU0)X1W?mYilt&FgsGN)DK(dFDWH_)S<6M*q%tg@(ax1=QT2gjSwj6`<(y?f z73Pv-k4z5tV`w+KH5yuqUT9DpXv0V9N0E#hyXa?MiE09=dZIe*;2R?8AQ;MXm8 zC@8&QnfwU%tj#jB6S#KE-%TJLmbCep*)7Y5Kf-3G#eo`Mx-334rQ4Pf3SaM9rd$BI zXW{h=oG|@~CAEtv%zGlaC;ruxzM-aMH4Z-hd~T(qG}>sbwa`M2=RUn-Dr# zuhR44Y~8sRvp!(myAapzVpZLRimP?&VvvK@=MTZAyY(RDVm+*@H^B5E>yj0ii>Gxx z7u;d%+$cEmvi>+7oVT@b1#m~Lf6@ZzYi+5=n4i`A1#te>zp3OCU`=}!HUq82lxq&M z2L6PxW7e%-z-F-Z7YfBftQE2F7iuk)LKtQ}G6gE(R^5ld9k-tB2Z^vMHe)Q(%ApV- z%DQU@gwa+G{n96_Z2{n7tlgpDVy!pm)2%q`?f*d-Z|!x4hm+QoHoz0CAL%jOMC($@ zs+_W#86Zj4YziGtTm7g+k!Dtf`dnPPOuBc}lak)5$H}I{OV6J8NyD zigbqcg~PyQTHm4^OO{ncC7*2T`Y%AvSx+2-ha4-z6>iU4KPrRpg0=d0n9j9+)eU0> zR;>`+MQi^tj9s!mrnjTm%J2f9#QL*0NU3$zOAuCAchYNd*}6uAn^kF@|2h2CSigT8 z-mh4nr{Ykp^%csyHCQt!5^uB)eGknhYv@Z5Hd}S?1KwhN$po&|dXW~@HtW~azPRulur-6~B#*5t2B0!xHHu+# z)Vfyz593zzT966rRa)RDtziuyPpt6^A$)4B{s6?$=2#1yldY0cQ2T8Y$xv~&rPCq% zfbFk$;mE~i_yd}*wr2%!bkMeb9md>jrzuC~Zu|Nb`17!JxkB@h?RX}Hp0=L1K)h{d zNb`tIMY1DaoZjvtVG#1P(eG|_TD{MIbrLewy-!`0bN79 z?ILx6owOaNj|~!R?^7B((bhm;Y$n+<{>xU_)YUMZY}-e7@QiKsCKyYxN$D+4wYkXv zPqRIsGO)< z8(#&R)i(cwz}48+`~z~umO+JpTHDt#a8zg8^CbZFwi$0>x(zld^-DF{rci*~WLu^M zxoUfTHdLj$d7Ca< z+;y0~ZTr3x+#TCD)H-z6wq+aO_iRC5f$OocD6ijZ(@|-v&o<*9Oupat*Cvb&*tYxw z%?Gw%Z;*#JMl8sn?YR&*8nP{>OwA+P77lR3wzVk`KDOy8&>gWwQoe4~HiaIBF`JRn zBICAm)D1IXo1l~Tr0vl>kSDe#N{c+T&7il@(f-3t7<00R>EUR?T2Dgle2Q(t>?*qR;r1@-);exiF91Bk{@rn?MA}CpFzYD$Q#$HJ+owMZ za>BlU6ePy}BjsXa?ca1jCC(o7Cp^U4y}kqPq&;j393|LWp9M*@yVhVXr|k9=0Fvx{ zKe#<@@Bae7Sh9VN696gp=V((*wYyQYoo3H!f`@c_djbGw?ST~YW!g7W%`MCR9Q8+L z+b_`0b>6;vI^Y-Va+-XuJ)bhAdG_f+5a!#RSkNr6m(K&aXnzn450~s5CQKLFH&WWX z$bPpSxMKSv50Daj-7(lKwa=z!u*|-X!n<;N1C{l{ro1(^SXUuDrSAd{y$1Kw%K_HV6($M^&OB~_Eoz; zI_-6oVePUzQRH~r-mnzL?%0>p+i}-^?^Vq6o_$jctaRH)8X>%I=QIP*V^5%K=(E3Y z7+k;oGN}yM7k>=lh<%F>Opn^jS7bI^<=6I62JKgE%`JqqygQLu4EPE)GlRxa#TS zO@YI5svZ|Q{K5yW$f1GGT*VIdNNAQgJYNk*r4Ai*I4^T(x&%PE!w^~df0C{{Ad2&8 zdmO?6cNebT!5KBtSQ2C9dOg1AQbei>D1u-` znhm6=ARv6tz=sjw-TSpa%7Q2RMklS|ZTnO*jDRnTp zYv)6YntOJ(yKyP^?GC&TXAkVcY3a~vXMY>c9@_o30>U=CJRyYbc5GU#ci1hY%}=M@ zr}Qj!+5IpCXOHYI{RP*L?K0)a`iUKbI@wR{&Yp$IGrJ}lkh<-Xmw@ZBn{R~4bGzOM zkY2kcTJrbV>7D@4Z@0AqxeVBCdjP--yT+@C_tGwT2BHtzr9Xyl*zPL_07mSlQ;~Vp zuDBk;H+HU6nj5qGg3dOL+dW7EIihf+rMsg-u^Kuj#RwOc&WZ>ExG2mf!o*c^fxa2> zRm`Ivn4e(2VIn6!Zlb%D_S=rr5Hsg6DG$L9+x1DRm>OT`r;HX zsQ3`CSbQ3|1Vzvvh?l6yT?Ue*__zaiB3Thh4|Iy6n#!)JitqElr78NU=6GDO(iPkZ z#o`IjWh&l|M=n{4nPY%wD@N8qm!tR}7nZq-=d?%9Q&g@;W~US%y2CPG(L4ytbBbAi zLwH_MsDrRT!LH0fVcY@pR| ztzwj#W_5}EAspx zyrbAx19Dff(E}0gDP~fY@xH>6#`%W|-&@eNDVDwqUAy85t+P55S~^?NsYqOjB)Sx8 z1$2)Tp(|neSTW5UDLqj#R~f>-R-_j~IILKg1CtR&$Xnn>6%l8U z#2ZBnZN0`6tOF1_D(fEu=cG)SgFE4@jG$M>MQMD7c&^HGwBT`5&Y(Jy z<RS-rh8>}Eas$Bmsgi*?4^ngVxFYQO5 z7-ho{yc|)BgL9BlhSFmNEKe$XXpfMooJYf2mhw718oA2vvtg2_4B`QBN|{2-^V7<`RDU_6 z{EIeJXO%wvaD7hMb_3jb<#s>l3Y4C7AgE9|GYs$xO6@jq7nS!ffD|d`8DUbaoFxL_ zlG0}yOv;ol!O&e+e*XrfT#5Y#o_S>iRpBa?9XBDYQg%`yvRb+EFOVAL;2$7Yl#gg5 zc2()S2|lkW(?@`-RaVnFxlS2LC*10lI(nI}D+lR>)D7k43BWZd<37R_-Bcbr1@%g9 zMxt(IQYI{WlwaS6m*>h&bO(EtJ7|Z}r#w6l!hR+H4FChmx9-8&3#Hcsn7mYeGX~r% zW!cv-8C2fVgBwx?(9HZ=8AIiUVWk&6U?a**GjOBIGgMiBqdflzfH7ss4(P^}Z0a~1 zQO)y5W{#>+sy#WW+#36xD@b6)pVLukE#af)PI!f{1cc&s|KFKXN*c52HY{#8fwzT zs{U|-E>86cjc4(y{B)Qks1(om6e7T|uTw_$_>9sV-78DqGbx5r7=ksuXz1Rb^7)B~SHnI&h~{ zg6oKouZk7J4@56hNvYL-S@k~E-O5!qbS9%hwT}*XRH{PWfv!rm zav!`@tMXoet5L0`uNtnX;yPe?RaHnO#A~WrdN*rTwN%QjQw>nltX|a=3|)ijOA32a zb?7NlYE(VwhptJb-2^YURD~>X&8h$fa4o7S#Q@w^T@*rhNA(LA@$RZJ_5pWKwVB4< z`>IXJ5I#^XKM0dnRU}n=+f={ofJwV5pI+Dw)!h+rohnbN5_hSDx8VAbYA@{#AFJlk z2H=UxUkPVVRZaARKU1aAZS7WlPF;*%RnIGMeX21!Nz$+CYz5$@Dsw90y;7}~LN}<= z9|Rdv*-|z1wW^htD#I#Ino~zqw`W5*sv2wpd82wsi>NWxdo_TMt88Z>!V&dHHXx4b z!A~G`Qa_+JptE{TAJTPEyU+sJRW1JpoSRx>4@-CTTXzx9L(TaWmY(W24G?;%t?5p9 ztDTGB#YY{p143W5$#o>*r{4Jjmj3ETYY{y_{Q=cV0@W93iyx%+pxth;`nm~lA?nY( z;U!ePfYz8{YDX#|hO4)#z(uHceFWW6^=Gsok5aG9M1*Md45}~1sBLI*a!lR&2EthN z@>ax)Q#V(`GG6_l6}kkqJI#iP>OnhrNm6g8-Al4Mgqmh4YW6R{rKU7#aoKR<0!z5k(ybDQWsMigFJE=aL20*6T;xR0<)SsUNm#xmC(Je=P@Mj2f)#>j6 zo~O2;8U2*HV;6M!>easjep>B4A0}tiPN(7XtlE7WOwOrS`9XJH-9jhv3e@dh&=sn4 zsVs6qy}<`pbW#0)N-afdPdbNGtX>*{ODRz&ctKdIP7i_bl6ry)T$#F@#`4SRopQJ? zSLfb`u0pN33$9Y#e+{}S^_+2JU9BFaA-zU@fL7F3)W3#6cUAqzWpLNjkqzK#)ycF@ zu2T<;Kv=JSLcN~r>KGO>yP=Le3wVP%j(+KzY5|pm8r8bZNWMwUnh5wUwcr*^n$^{G z@~B0<;u6Sh^%w^xchuj|`*2sCk_w;q)I+7Pys!Rr2FL?-Cw+w9s=m4#J|C*j*ubPs zo!W@o+OD3o5nPAb@k@B=RIjBOwoAP{1>}jkE)9UE>M%V_o~dK^B0{%%h~B>*brhW) zd9HS(>Q=A%oo1Nysi$3mNx%9X8ubU%Gv?uHU#Qn*fV@=C{}Q@a>YH*{4yxCOgBwz> zq=P80)dy%PHmuI0J;I3k(O(dbsspJ>_eP!bHS!!&-&G*&xcV#?VGb0CK6EyG8r6g)x?*X2qxt0fEvZmz$xD?G}caT(#JC!=qG@B*B9oP6x z#but*{8j;H>6-V(K{7NqK7{b3X7Lg@%hXsW!7@uzNNxCR4ToxZIT{N)2y-p>)6pm`b!K%wThFTh>UT%wulqUL8B zBa1ZK55cljvxc6tOPX2rAZ4203P36}PwNn`QZs1-a8;TQX>nPtNu#&8M)OBHxGNfu zHY9jeQ%cQ@Ynnz{htz6{n84L(KB3dD^_pk%pu4VdqK4W{%>_?5Yt-1&+~1_x{|w}o zrgtMQrCH-Z(^8A(5!G1kY6|GM@jcDKH6ZsjmQ+=FsOfzPu1(WVE9!R59a@xjX*{UR z^hm?p1@5tCBNf=6Xk4bk%Tvt`32@IeGxvb&*6gICN|a=D_)AuT_BfYTu*IkDoTBv}+cGbIZ7OeH6woaIK z%WhbPYrmuYLxgt976>D?KD5L+s`dI5Bue{=9=8~6+imEMX}_YjYOGd4b<;TQUmFlF zUi&5%@C0qw+t4LyzoeC8l6DrY&yuyQ4**ZmTG1h+R4wBGOwzPLwDLHvT|=Yr3GF*m z0Z-S;scdjkyMtz~Os&=yBum>?3qZDZLnoZ&Xip1ZnX7$|)~$Kk<1ui3O8d`ic*)l? zsp4{4>+KHijP~pAp*yQBoC@4I?P_`k&uhPDL06znrA_ulZDBB67im*z<5#SGNyjfP zY0I`kSEkLOKFMY6Q`#z&Yrnh>c!k!o9w}97{isS@qg_Pjwy$WXP}~2ic8Dr_*R)Tm zmRGBtxCgn^X;Z1}TCe?{1KoA)f}_yg&_-$?Y|uv2<9$(2Z;NoPWh_~@ok?a)`(`YxjT>Gq#Sg8n*tKR64}g*AW# z>MH4e2I;oU0vD`nks*l?9iI+Igz6ZyKn~N*NuzT9@B-=;iOpI*IN-iPAASqO7Xf6<{_m7-K7L@iMs#M<~&(< zjOvjox_eYsPSsV>PAW}zfr?zmb<@e&37x+h(bILusM(gGOS+HfnYy%#5N7Gtj=>~b z=Sq9Z99>%>yyWU0vLMXUd7T7zO1Fj{)6=>=v}--16VfPrR(J9XkaIeFs&1XvMN|3h zg08azCKq-6bD=BJU8J>lv2I%zxDp*>Hhh-q=5Bz=C0!mZ56W}`7F=J}O`tVVxvu6d z=qhyIP=%*b_bDBYsM38wr=Y5Jd+1ZK8r=s}GrpqprCr@s-3=P7uIct}LY}p{eILL} zo$eG>8S8bCWq@DT?WAKqH*_a{1ZmJM^@r}JZYmX>8g=t}L7H>}4n{LH7aMrFX%Yd*$ zm-87+9_i+!&&~ofdhf6Hh_b-MTW`5clXts4w$eH;aluy}C{+ z!uIKw&}iDPn=gmufUb!aN-uSfr^4AQ9d;&oS9B}?f^bMzOS9o?oe!Ng8rE&3D$a;* zcQm+B-S-QT(wHumZt}S9(NzGB=w0ZG6-WKuL0CHJn+||D>%ChbbkV!%k*BNPn$CN> z>36&V&Rze>PcZS&_Z7jJr{1v`UcB_X-v#m3J3NAkkG|$9Onmhzw9fL=d(bWS*Xvf` z?gr?+HQ)mE%V=F5q<2~cK(M|w0q_ug$Se2^)t^g-E=<3Y_A8P4tsfxzQGLS#m_+G0 z^szyVKEfGZj_K#pAP}p6<_D8F{UCLr;`OYj;1cu`CIgN!5Eu07%o%q!;hFzLwUC>H6-U!DZ;ro`#o``VF+5%haFy24S=G*C^{8eKg&= zT)huHn0flOKLU43exHvR`k!f%D$~Co3gKnFs|gkg`xMNVnD0Di6+H1eZh~ozIMI8Be)K|Lo~AP)W7pL0(I&0>GRe{ z`qf{9d#s;+7(SoqJAa4eQ~i9}nLg7GZ35S=cbW^*t8bufZlC_!G^E?F|Faw>1A5sc za4+-Yq6ZkB zQ7NI z@N9!12bMX81qWf0YY3-<(0PU*_JW);g!jWF->{f=*QX85k>Ji4hSY$cHB{6i>^Xzi z3Ro5zZqp|1f}zhFUM?EOsF71-sHM71v0*m#ElLdU(WFsocu6aWONLw2FD^5D?FlcJ z4T&wttlaSHY*dx(%?hyW|hH?itp71UH~H081#kka>byg^Mh9n^JqA{W_U>J zx>`e2IdFA`4IALP-r!EF!|R6PSa`W%=%u&6!Ql4@CN~Xx*)VA|{7TbVlOdCy>stm} z>X|kh*7YD>i@}TPS+@;eQy=e+;hQ{=2ZphKAZ#^kpjGoj!=E~EZHCR3(6t*TT>-qq zu$3Asord#Nlj}0fa>Ug>G9H01q*`Q1u|xSipm2nDO{(;KGgm zItU|-%O^t^X>6MVa@4rP9KtB$)d1k4jlcg1XEDZ)w?KHzD5DKPtZ~8&+@&~UKGl%o zjW$mmF;ez9>o z^#)6fC(l4vYV1CTlr9;Meh*!l(M*XXE*n#6UMV+z{sy`VW8r_>52No(=&FprQoF0# z7_%OL8e`>un-Sw``Wo=6@q=Mp<~8GPTI|&tXHp%k&d5FnT)iLINt1(Fjz(eCz0Z6;?muy&e7!%e)*J-r<6A`+Mu2gP#WZby~xTnUJ5OB|o zooaC1##dh=P>=CJHC#V8&cm=jvDbLK2&B(A z-fLqZosS$gy8TyzGX7x-+^BJUHOL#|O6tdr8C#h!88`kG2kwZyJ+&H~>{p!uakjsF z8eUxNd$`Ej)&4sngl_iF-vhwIzI+s%r@b9L1zz^ID{(2__FNi*eC)@wVB%{(NCiwk z`|r-cB*1*wwD#vddWj|vs0MYi7M9{_9+bo3cnEfIufMwWc?gq)UZ`}$n+4c=9!JV>?nS(&( z_HoN#dCmTPK6E$iRgV#&$-X-s*KpgubQe;(XP-;I`$PLR^!j$%-p?c+j8N|Yw>j@bb*WCaReX&1SV07UG2doEEawSa(r>C0`amJcj!UREI#9cKo=J$ zZh-Fc;=VZ$URliXhqJoHUz`Wmw77aYxI2qmYCzl^j)fy7UxzF12o&Pr=m-+$aE|u& zi4M!D0(rt=S`d8ZI&go*eL3fFVm?TTLrEecR5`R#<@t)kbsExdI9%HVuGt}UC9dI) z!+IMyYjqf7gX?ry{tuFW?6B@f#OrpDcYyRd+;oStmkv9qnl|jvKpzdfarnRumPeMj z|BM8kmwb92oZAusb$&dT%*=r^uO)eAaP7V1MJ#kaOCAP*3tZCK3_#G5t?m$pEV0c3 zAaqFt71hF)@aUL9_>wVNPDU(gI0`OuNdxU=jxNa=28mwsC*8A{CCk>sOYD;6^lQc~ znY$KOl(0m56$vITS%pA2u#B;S@#9ATH8A#OAy^}07ySsg7#SafYhgU!1nWDD&D3VP z$1tUy_yfih>J~m^CR{vQxe-$muU_u6wHnQ?^*V>748U^9Qv6@C}| zdJ%sve2)S7A_bjVvvcx-YegXyrj=8uaizNPHn8fk4Z(9ku8FLLyQZv`DFE7~5dg!njML+-*h+-PsPt!P{`t$@qn)`!2?Zfe8PI;j|9iV@AZ+&^=)c z{tmxS8A5k>dB&I^0WS2tnlXriRK&dFqm2NP$LKzhPl zOzw}u($yq~wx(_-+ED1+O|H|k=wZU8V=bO0JEq*)%w$V&k<1N^FgePcLnB!f^Vm2@G}Ai`mlDHV@jWs-#?1c+@nV^+%i%hX zsrd&ap1GA4MG4HeAHpP&SwRc>B<6Z*86`74=;=&h9{LF+l^MDd!Zc>bNyIzO6idLJ zU}`48XFBueL3qhv9u|W;$@Hi3B9nQB9-1uX1}Y6@GnFj>xIH zFm-+(fg(-+v;dcA8bq&Sl4&O$8^|!#Q7QPO>3RmPJ==8UDO_fb>4j8yxn}wUb!2Ky z4OA1VGo4IN&kfV$R&WibwXXrcX*z{|jz&{HdFeD=I~%$l(@%dvO3zIv(oVY9G-WwV z`b^9I2hwj^djok6n6B>t;DzaW3wU{H`qwt-UYVAeLpNl4el@t)rn_lxIcz$Yp1Kj! z$;as0O$AYO?WP?|03S0o`y45aoAUn$-FdV97625O5!Tt}oeSZ13)r`|@cd7KkSp84CWAj~&6pAPP{d2lAUv*z+lL^y9gq=&G;eD6;9 zEHuAI-NYL6{CWsm&7-J{`q2E;DFE8cH&G>|-TcFg2-{))hJNBs^VKxub(#Me1i&Nn zg82|WHcz9a_%rimv;yfiH(dfRJ?4hBi16IJj&{<0=5@s|={N67g0lhhz*3mJFrP`C zznA8fROlNs|N8;prb#i0{(AwRJHR}*?&aAF8FmYkU&}-<%YJLHoJL{zpLJ!u( z1PDD@f@TmemYxpx`mk1XA-XT?(q+W+V;N}+=Fj?pcG-cfw^IQRVx9a3Cc&&1NdSbh zCet=KjAd>O63#mJE`;f+=&SUw7*l*wwm11^iz(+Z#2tZlSi%3%fAgXFO){o(Tz z>+(!+r&(v{#P%81;k~ddW=)<4Qo?#R6Fy5>yHj9!iPg0d_oa+wpgPlK7K55+<*bFY z7OPW^U3&$?{~-3!*YpM!hJvZX2V6>HvFL?2|a{u}F95#`A2HS0SX8HQPhs7f-z znnuxb^DL4;{w?6^#wD6+>y_W?u4mxj(>Uj|QSbS83Jbf*kLP7j2 zRP=xaSZo{s3AC`Mw%Vvu$KF&4K|;PaS8lsT?1*21?5>Bd>~Qtc|tGH2jUSa{q3Nw-KSgwI+F>j|)| zvyjpNam!-W1^8^X7^36fEfykjcH6==1Ms^Re-;6E&w~FRgbyr|{(xnx#d_KxJ+x?X zK@x2i>uKidu-J4Ox=xF|A0tASMGSS79$CcGF`6e9GU}Q=v-nmDUAM(1TAdDAd^HiS zUt8>=z50kn{BJNBwO9~~AI`<{<}VQXT7LQ+I6uqVbV%3VGKmKG0Lv>hs|8w)Qf)5C z@+&6@gDqpJ2p?kEKnsab%ft*s2(!E&56d{qwR8*OEemN6oM3sB&YmP%ZfS=w$+F82 zT(af2)W%4$WC$TlwUloIIc~{L1pI`h2_0cbw{$au&kV~&G`*a(EYTrQrsW2@+APa@ zXSmL`jERJo982x*xRhMWsQoa>vkWKzF5l9Wc3Y<{7l|P}WBDl+JgoBc zv%GKux_ZmMXxzPSIa-H2Z(Ax7pu1zaqXD|Rmetd6efKP<(AwsK<@w|A(rWoDH4YzI z?x*E)pw*&G03xkYC&J{YRRG=VD69H^;WOH51|6%8v9h93|Cm(_EqD^F&aHxFqE%%! za7k9b)32FqB?t#ewVE{o*J)OP?ch#Wr9T89-AZ2xpIKJ6^n7Mp#n6wFW7Wn7$+a4% zTIVUNh(m~%Z>60FpQo)xD?!d!wM>D@Ijh4TgFA0k{}(I^tjrxCEVTNT4x?VQ`o0Y} zq{u4q1CU~?;rqy}#L9`93^i8sgCV?Pm7s>}t5(*Q5MHzLeugA!t!9tGS)J9)SJ2g4 zDI*Z!y4CFe0dT{r!Wvwo)$FMN+_H)p2B6uB$-;#_vg&FE?y*%F9r}7=9EdYGkS7_z$$6osn zF2$eCqK0Y!`@~z|0@>DdXfKG}bqGlWvoBD+Hj$k`gJTlAms;7$>?kVDrm#<+1DDFS znn}MOJD66#$Jv@sfjhyz&;?vNd!83?8SLdJ5%wfoNqf3X_6n+|X0dtBMLW=He_eulk}PUoIw{}GM^&#~|Qw~%KqQ6f+wyHEwo z3+zZ2m|SG<_z=#D*eWVom9V#qkXb3)ybLCn*t_?^SsD9xTJ~OMH_{TWoc)|0jSBXL zTX0>;-aHS0Dz^Rq0H|hf`~(rMu(#3P=_Wg)0=h=_s;>cPVyDsga-SVUyPhug4myAF zh#ijw=)}kD*BV$pVITB?m1dwmcH{>j!)$pr za88_i@$llzv7;H*g<~6ybX_@{>5N4L$FvDtBxfe=ua9zOgux_%qoyY-kuzBZlO)c= z5=2PmSk6O)6i!ArgsGe^49XMJI6bt|InL==ip)-M3|+Y8>74D2AQ_yx&jC2eN!bN1zcRB#S2LV}eXLp|VCoXcAPujZuE4zq@{ zj7kkxITIIvyTl=o9E3a>_r4u8mVcGhRFA-0u)}aJX8;>*RbvLrE8B2d(QKaeU4~_n5<`=kp22 z^-t)Ya@N+svYWGg940-uyKw!SV;TmomvhA*q>ruLaw za9ut-IeQA2un9^(;}qn&dsL>#e*xMLv)_pYKq{+^`b3X zF!vCxBSW~h@4;CpcmGz9FmApCCb8VP9|91^ZE}ERJU6Wp!UXQ#4G<=BKNW*Z;=0nF zB$>M@4kU%Ubs92D<+lHYB+|GY7vbzU_rpDiaDuy={?W~J?l-hv%HZxg0O3h)?*&+9 za<9m74cXlG$q?pnpV2Iu%iU1`lE?LZ7rIm2s|M)ux!8kZMB%QbS?vs$O=n=wa%=X( z%Q*W*_te}{WN9TDzw_pirIzQt@U%NxYSvX-Gs2&I_*<%E!Mp+aG8&+f1#b*W9u_-fjqTdL#54U*6%q(*KK{$ z2|jzQJ1&6hwf>BYBu1=1yaCHmYh^5)x$%anX64S?NC)gZc+dP{62$w3R!_k^zjz2k zcmtn;gz}ahhAxcvE*&K>Y_l-ER4YZOmFk76`$A+;@IcwIbElouah@w}LQn7}(}C}Fo?8!0GI$@~K!lUL%_E4H$(!B?*I7K-6acb$ zcXPny@WPtGsvqZ_C^BH{wLFP!#t-rfb>3*MdY z0C>r}9RcAhUfXqWgS;yGH}!^iIZKe>Yo0&|-7wET1@IBxtWI#FycAj*z2ObNhUFM9 zfQks?yhUfg9pM)b0_Vt|Pkme`etsH=Gk=x`hztJ!-AGq{m^r+-@qK zRgvI4`O~TTa|_>Clt=G*?>Gx#0>9J_B$40!UzwLLpb}Ive?4tm zQuum1aH;&M6}W~pelSh?$N5XWD*AE0A_r}z!cu*~OMoy8TM<_kt(a)uvIt;w_eUMg9h z6`v(3rYJT42vuGXJ z$p4b&l_viG=#jd`e@69*X1)tO^DX?>%JcbC8P2AtjFAKZv|_xTTL zXZnCYpSsAcd;v}65BXE8AZ+6|Pld3ZzlYjo9sKnc5O(q_+rf457f`YB5kKn{TtDW! z9tZb?zoG^{pYkoH!OJuLI#UR{`BP~s=;6N%NAl14Ya{^l^1V!PnSK1@zaTFsb45NLye^Avbf)?R{We-Lj0KMwJH1O=bMnXka&ECTrnwk`$n7rbkMYX}hJ zEe01T_?zC;AVC_fdx8aKG<}8$Ivv1;3O3U6JWOy$0}?KX{s({v!DOl$MG9&Kh;URe zxeo9sK`M=y(E=`Q_+tcfet?%_f{k}^Ct?LZEkL|DK^)az;sw*fflCmizl#Wof?ZP} zOcKndqFS<`n-=mZg7)!%d4kC_Y@ZUeEC(Q8Flh+fX@Ob{az;?b z068m=T|j2%1k0$9d|uF#4_txZ7VYB-1!`J~T@duqQu?C6o&Ig7BEg+TBv>p+4g;=4 zP&)>bQo#<|09+E3xdT@wh^AiFWxR0s zH3H^1oLv#v&}?{BFpoaCza~iI0$wZF)sLH8CzzcNpY?+Fe?hJbChOtshM@L2a%m7u zq{YciK|9q=8wJz$!lX%HECF{*@Ny2kGz(Ne!Apx^>oEv#3l>qY?v5aks^E78t7!bZ zClF9q_r9R+ZwMa!!r==>MaI|PH9VbUoG^8o1*xabh! zkzg$?SRV^gssVT{c(4e%VZnC|$a6$6V;2IA3VL0T;2Qx;43jZ|1NFeh1v9t6^%3ET zcK~-3J~aa1B>bFa8E0WQRlZz=;=e&$g-iZ~rJL~A`>=Eu2Jb^y58-APc<~e_Is@P( zJlF~1Ej;rFh>vj376kGYhJ1yve!_k9OZyAErO*Wk1AG7v6z-)jWrBn&euC>@VGQ-C zLxdYvAl*>mA9SP*ez*&TlO9jP9VHg+iqry(=fkg?wpp{Ov@M9W&V}vf& zz#S7lpbcEC@H7p8aY8X20*M#)Zw5&a7B7XfMB!puktGSgxr8f97EY%rBt;lS>&R50 zYY#}8@K;xu92ZJx9y=kdrFwa~@cTdjGK7a|50vxGml1CTA;OP`nI z2qUOYn=8z4L%cj;^<9ut!uu29C13dWdRU$oK8%C#j4;0tS)Uc|q-Od#;l~N!&I?^w zNTNVk90x$5Z~~pox*$C8Hn@wzM%p_S3E$8Ot70L46v7f=-P;hB3Kj3d%Ozn&3gBhJ z_=g~uh1*S_D;ExZiOed589gwm6mrB!zDl^>946JmGHSlp2p>@8@`~`I-Ee(XxO*1J zHDTIZkXqqa)FY}Besd5e^}(x=_;Jv5Z)(kg=pA{jcM&Y+K5;Y0e z(N6J}@LvUR&BD@m0B8|TDFwML+_D+EJHq76(A^d8rBU&oaJ?VMePOr)$scWc&@`6QL{h-=7M# z*~t2t@YHTN>lQY?2d+oh_#FVxg~hZA>J@%N|I<>Ra9b>J{lZCXa09}R_~2d$zg!M4 zFNGtt*M22r?E`L5xak7C3<=fLk9#c?9D#6H_)j6oh%j~(x>4aCIx6x;SZ)e3CY*m9 z@Nr?tIRK7`0_nJbqiAI}A~=b1{y+q0(S>T@TtuxjLc5Bl(vr$e^xbdJxr-Q7rtlD% zvq3yXntyOZyhLB<;LKa}!y`EJ5vi#{?khTd4L1|UQflLK9-XyhE}2m8Y3^UqHXjH#)($Y4kcbxK|@!9NL36jQ8bIn^hu(>pF)@{%A@fm zMYLiY0I4FuZxE)5jwC^NTvT%t+zC+;&A#cP2r9f}h)j5ha8kskbx5YDI2tBdBGEy> zvqh8X)MSoGqr;uZ6>XUfFL@#_dah52ENKOpFB={^#jnulB-i=IY7_(T-=5xhJV1>XkuOfy( z^#vIgVF8a9K@>;r-#4O3(cs2J;|p+^EiLqcKeU1I@+Z;-GEt z86jRlt@cRq{MRr!Dqc;^#3-@F*D#3|3qA%HBUZ12vtwfYMF3*O$)>nHapF~UU*g46 ziUCg$H;jWMiup92C5aPhxs@yyP;D(mY}pDgsbc5L@R=s=&V$Ku@fzA_o)EvLwoba( z*9pQ5@miXTPl~@e2+K@y5#63FaS;_1v&EKFC(04W(7nzTGwG;Oo_Gx{Cr^o^qoB*j zvJ7EQi)RP`I3tep#?_t`JO2-s=ft+umpLz9*#tm=xPlMMLh;%=aCSjFPzBvZ@##-+ z3yQ=-S|k>Wf1wU)iCEJNu2eimg|kcIFPDKU6aP*_>}B!WdI-zK8dC@>#7kX3D#f`i zh+ZY;S|dWWc!1u<8u5V;=&pzhsVs6;e9#0JeNC+Q1-w?A@;02+iC56!k9u)lKFD=( zbPoVG#3yO^Z4jr@Omb6voW4A26z9qTZxZJzz}*rrngm_5SU@ei7V*7gaJR)HG#lO# z4^c(%uDFM~5%9Y#Rf#23yX-F7j<9+n;APp5%& ziZMpx#S>37NAi!vr>H>mSp2>{;7`OW|9kPo1{%7aiA{fnu3J216r@M|8+BBkivwua z(<^SIT1lU{MFG+;X458SKpbKN%NOE#&ynX#@f@m&zY@EhgK$t>YJzw}Vm6h(UyHx! zhL>S+9-Vg^5ud~vyNRRXhzvM;Bfh*8!ZGphUjsfap8gWTBa)S0fjCNjp&8vt@~i?T z&XT|P!;6a~Dh)bU$u=67+$5V@p>vmfv==FPNK!t-g?UN>?!(ecQWk?;yd?wlVERbT z9tP(t`6V3yKZyy|bzY@;hWCUIH?VXTC;4qoCUrnHWXmy~WpW(ks5`WX`? zwe%t+Nq$&{c*&A?sWhG<@xBBuRWd>){Ns|JX=Fbkc|n`4bcqcOzZsIRXbw0jncD(D zrlepxZe*5(^Adn;$>_HrIg+byV3I4bD+C}vLY2Kj$&P*Sc~LU!TO?5=VcUT#mfWSIUnP>+w4yGR zB&Gs)N#b!3!ZJxPy)u_2V)}ZjT+&S4qzZ}TzxJ;r`X~TZl6{{edbMQ03O;Kj`^{i- zMKWtTyj+#cbp`yIWZC<$td&Tn!=z4Pp9^8V#D&&;*Ched;rfPTDs^cZBsuh$-jrO~ z4tS&FJzCEF%#TV$&&R5^h{FBhe@~Of)wx`NiS8bpG#U@AncVapyEoO^pRUP`Q~s`*N?=p48~$*gZch9rKpOMWde(8rd;66<#%9FeqA6=zh^ zPFwspk{GH_j7hxP;cQ%zMY$Z2meOL+QEJ}^6DR45Sr9r)i?4ulkuIRO!&R!2Lg*&_ zjJ7TA(xEC44{4hVOgyFKLrBm|dTtr+lDBj@eGcIx6+8pLR~j7-*M8E^FCeVHbns7b z0n#t1Kolt5w-JCK>H6J(2TKnH0T3ePj)M!8E?W#hnDmf4oP|qcX;&U0{ooYfk87GW^_lBIFB(4|OE^1-D_(+`15lNK@%{kYVj8^ROP?P1{3r4y*In;~68v*Af; z5k1M7(m&sZ&n)TJtC3l@H0Dp3Kzpt#X+{lvR!f~%!P#r+ z%RUH)rJvA3epLEnF?^0meW{5&E|qSF7(~B>VdSGINm)9RYEZeIW+U zU3UKzEInoFi@*e*auvo?8AQ% zHduD)A%r2a^cMhx%Dy}YK)5V-3A{we{!K#kNZHUjSRR#0TtT8_>!YEImbK7R7bE*~ z6LL8wE2ASav9dijfXB%ey$rpY{vNaDC`%VY#PA+w_GRk|!H8I~Ech7!PYWp_3qLcZ+B$8ddG)+7KqBYRd1 zle4mM1Du_cbyY!lUX~IIX9coF9RL){KK$=Tl_k;v+#;EjmYT(~)^EX;$lmcppi-IH zXTV*OrN<(Ane4?6@OfFbYbC;#%NmSuT_LMG3}=}wkNuFLj>!19JH-W|FIStCt0H)R2| z_-d31O@M2XEu4-dZpmDJg6n44%%2gcMfM4OTX9>)%?JFB%!(RScV!3ug5`bLCVGS) z$ljg<%U0RU*)Vx1`)mzJo6LG60=3JssNB#YtDq8Tr|jpa2-GE;zY4fVvWileJeE0A zk>rVNjLum-m3=}3=QG&=8@g_pk-p{Vk?oL!JeR#gy|X^qd^X_yvevE0b3itUhv+Y4 zpV9;NQuf9PUIu0R>8#jm*|;;fVOjUz2sfy=?rlzYz|!)!{F&_&o}2SONWV?$?Sj@ry$2w{{Bdls%Q+D1XgL}F}q(H`%Zjn#ig&~1FF zSe0w@CB3PqY|?&$>wKG53R`Nki#8mWZA{$ZtkNccx)?P!9>?M3noZVG;BMF)+6-NT z&7YCb-LwhTLfB}N_!uTlHg8!Y`YoF&o-k>)DWHmOi_PIxAh&J01pwT!>Cl3^Yom7r z?w-whD(T&~8K^|`2R6A3?0}<2DVtahtZuh;YO9_TL%MUAGN+3*?4vQa#`ewr*6{xM`a{2PTcS z&+maW*=F5@@RqG-87y0Er{0F}q3wd%5VqM4TmtE~UH<|X-DBHN_xic*B-$AD+CFuH zu;12_wgWG0JGSH6U)sjA5$K4#Y6zB&@;EwcEl z7K00vzo1n@ko>1yTtl$@IW+=8PZVQuiua z?n~zfW8|&WwLB&-m;;}&@}KD-Uz|L0KLGLanl12>DF40*K9l5D^a3TzWf@2}Meach z)>OIGAarT+bt~cexctXe(4CN{<$+|#>*`^0Qoc10J~QP#v<=LXtA7U|TYh9WggNr1 z&ET-P>V_^)-t#9&zI+P}&8Ovk66ns#OQ|w@PX0Z$yGrCiR1+_iFa8&#Om0yMa#?0MnD-3W|@*}jfsh02G4KFqF z@>DkfuFEIU+VqB;M-`U_`3`3Q8s&x#ko)ow8YdpeP3Wy^mDkbl@KAo?AR@HMd#A!# zyL|jQNQZpw6zIC-Q@+9#J(6?iA9;B!|GXZ;KKT$8x%%bDs7yF4x1u9)Bl7Q-A&F7> z7U~1Nk&l_<+Q;O+35Yi?AL~WBMHV$E##WPqf5Ed}r^nnyI?yiT=3yc#~ z(YVOqxWh{kW63g*V#d4s;ktxzj1Jh9GUn1_aEY;v-n=r#IK88n88c~HSI&4?4N}2~ z_X4hx(ey8psA6oPX|0-Zi-yJPjL-$l31&SEzY_@LZ4zsM(8nZ%3cS81?R0R|&*Ym4 zl(k7J9Tg2QSu+f0fhK>@YADEL_bK=cHYqd(2{GBd8(u<9dh37-Gl{qX%WxCMCOC^Q z>8AB^q=`2Q-)1Q$0rzpyw@tpC4id=xC8O%{dOP((YmZ8wwf_rE{ShxTB?1N?bNMccX) zj2t1r`HW?kP5$4fco}WbkC<}kL2@+xdM|KJrtwt3bv0c|yWt?yFe6B?>2~UJIGZ1% ziQmP1o*wZN&AS%@o@BmmCAehs$5AjzG0)K=R=Ic=3+Y}JixVMi5YLDQ?zUKX8 z77x)lIV{%S1m`BPOoVGM$>-F*36s2-i6p`$CbZi~l-T_Q;R(qh0lef$X5U2gvyvCz zfD}opsG3+VIlBR_DR7-9ep+l=<3leOSSe}QoTas%;nk9J! z@X{h#aSwnyl7v`rcO{+;AonEgUm=P6lH_~9J&;VLb@VfdE*@k+lD{8-Vab+-;GCpM zQ^7e)FP#E$k=9eYFFqy`#oL!{r)CxoF=DfQjLq)VT`@|bki9mI>3 z)=>c>PHJ)jx_IePI{%X>4OHOvBuQsPAyBfkhbG$;sRcE)v!r`ziIWLvXK+$x)den7cJnk`XUUSsVVNUK z{1zlvc8&_-c`}U&OmgSkq!UzSbJ%OZU7q842dXTpUr+OCPp)iHL1PT-E&t&+hc$?p0=csXI$pnF}2?SVm zcXd~{jl1dwS1^-=;<}2HnMpE|$qX}-P%I-tfGAA@ie0e+g1sV$px6Z22IXd(<8}e?T=Vz;LAmqHi9GprzS)N&;|1o$T>-q%Y~2Ll zMdq;AQ0`*$fL+ktOU$R1A$6%4T8+HR%vvtB%gqR_(pQ*Sa``#tmr10qG$U7`z+7|7 zG63h9chXUHm3iKQNX<8odmFV}Z$5G+P;M}HegVziW;X7LE-f{Gw*YnCZhrC&@?eMP zj=UA-D-036&)jb?imx=!WR%eT=H*8MbCtRO6~J6;KKeTH9yKqadH69iHv|P9H@6JO zt2|*YcnEpx%)fnw0_)8gG<9w;-)6bj&C%3Q-Y_@PoVn4=J%Xy=HapHo-h1YseaL&? z+~IiSePI6KC)D|&`IlYr_{co*HvoQY?!cw-iFxZj7}ibZx)sQq=G(m<4Ndp8@6FNm zjXDs(OMSm&@qY7s7k!2nuJv6o0p)J-1%hxBfKbJ?MMh1m;7&eGfzG5#O$iCS2|N?G1RW z@hzl|zSj5l8>sV9-#uK{kNM8+0PqFhoSo6n4ZbcrpfB(E9^^9p*!RE@czofzF^1yb z`941x1y1q*{dr)X?Z2K*p6ULlPe9%b|B&ZVZl?c1s>kQ}@B9-;rAG<3bcPd7a7@NdVMh2{Rn2atNue>-Cc9`#=z1@I~V zzk8wcFZxHEh&o^QFF6LOcl{f#LuH%%`7TI(>Yq=wbF;rI8OCS+bqtR9+`s-WNPXd7 z-HKYi^rxt+edSMmj=r1{c#9n7)W8{cqoHYmV=n;8X@Nac$U8l7;A%Y12<%3i|Cxd9 z^Qi2sz_r_Ge%nHiW#`TCr|BFb&E0(;zsT4o1&y$zIe1L;f9!g+y< zUPQB(2ZVoL5r|#`%sGKsF`!%-nD_zm<_3n=pz3*nk+d&e6?kku#`9`?rUS(n1llOi zEew2j6ELp{{O3WmcWvOtEK-XCBWL1qU0@-DewGA;o8K1r>(3~@H1Iqf%(n+#JQv09 z2y8bK;VDNY}ba&v1Brxv{2yb5&_${T&<$kN?T_1RZy6BUEX z1?CiNLS2LSVh!2CDS(2EcN0DLLnAB`@(9N482b-ogq z7{cS#!1fD(@O3_#_CVxK3!c~p;Az24^sk&Ae49kzjNsYh zkUBH?9fgRqg129Y)b!vr<#@~pzD?uN%;06zvd#%E>JOAz!9{&AAhUxDM<8`>aOAB( zxiXliePV7fekjV#3y$aeT@@V3D4O}fzb-}I)xm$$V!a@kdJ?IH!Kp)0=e5ByMz}2s z-ZBF(eO>TRhXQzg@LCeU8-nX-Qn)cVoyNGEf{X44=FP!drvv5T;Ld&UcqDk?KY_A7 z`0lAlZ48dt6)n6O-192D*e}8R??69qEZ_enRJOXjg=Wb$<&_z<{zmyBB-C$}4>%Z@ zo62|H4S8ReUw18lKbGGZLY+UA-$~n0#^c@EJ%Dm&#afDlcUMe)5w+Y?am)x{F00s=M&{)ed4}<>s5t5< zJnpNQ!&iB-B1E&@(-l`zV0*4&@kgla#ftl=+`L>dVrD>pP1A$yPfww9%pyku^)glx(!{40_Sv_`A?)S=yo{8pNqP6qh;Z;ZZCX+)D_*v z)}w=SyS+-2$^34YZx6*D{{?o6pMlz2_haDc;2r4v95R3=p`m-Xqx7&7C!j+IZR9*1 zoTNg2$k%be58bjae&^@@8@~@b=Oo|^zdwe*hY#iGk2run-;uwi%+mHVwcSy_I}U%x zY+=0UF@54_WoiZ0vSWvl036pg8}%Q5B7+i7+;SNHo_qqS#VN)`U!u}ejj1Fkry1sD zsN{6xt-bI#!>BnQz}d#5pW|_^G3-H9be=JXs`>fGsa%&=7y}*$aE|fPn<#Ll@dyL| zmKZ_$p6@X(JODjiW%TNXF0D0oxeo=NGLFJvs9`zdK)^rtefV2+;1k~w^eu1l&EkIi z)K`-SaI-d}^grK#%5L)aU4hDO^RK)K1@7{{ z%z&Nc{=sJ_V0U%wK*+M=mqpnWfQo zG8<5CnKAcBRK48DU4X|5W58Mf?=w!K8Fr;{!YN4IZ|rtGimo!IFTqGWU_4C!++)Ul zC!oON#wScYVZ3x79_x%VsI;s%vhz{yNn^+Rf%24b4qxSI^Pu`OK_16_}r!S6+|JfY1 z0gqX}Z}&iDb9{SJJXzp7iji_R_y+BP)|dKj`2{GeeLFsk)GNNoXjJy8?^^D}Y5q6I zq4V?nQ*T6pCH}^L0p$Vz%Ck`5DgTr|A@2?U<~pRl@*nml@_zI`2Wls~^yxsqTao{2 zU^_;Fyb;*`5LEGIV2^Ww_6|PJfxf;Uxb0XDJ`GJj z1Ukq;P6=M!0~2&caQU(_RsBvEuR#Zg)zb=l@J(Y;@X$~HgTIG8NpGyuSb_ z7aI#2k(z5P`~}7484LU=5nTY3RyrSbm7D1N`Og64`<#xu0hJYXD4KlX#hc0Ew;A!GR< zq#ib!sU$sObh`uvU{J+4z@XZ#9KBv^9Qpu?KWbb)90eXTe%BQR9ye}%29GC) zXPhDd9mW|H2c9(Uy$J=LGB*5z;!hiAu0hq$7=wAb<5>gY5?JrX>5WLeX6&&mP&OEA z_CUGUjo0YQeZ!cs29J%#hFwtgn?|qekoTc+&>Kj7WQ5tJkByyjDE^7@{1-@VGG1#& zflrO&KLg5U-?F}}&7p|!@NWC0%;cOQk~ z9~+~&S~nT%_C@hejh{KM-xv)v4t{Iga5Y;0&N#dRDBl}vh9Wi1eB*PJJI%c7a$ufr zK6e@(XPBd@xu0q7PUZJ3v(E=WIonL$g1qVG&iCOl!#tWn88gi@sXL!z?ywpioMj%h z3|*RS9(XeH&NZ6?z&y{~{ym_aZ~lf}iObCsmLTs6^EkRq=9r7=XSvesLgVf=<`)zh zt~LKg4zkFM(%^WV*?$#Mx0#D*q+M!$bTSIuZZ4tNb%%M{X{h>6vj>l1-({XW0;#*r z8S_x!9&<`B6u;Me^CCQ!nN4+QVY&HXBl1?5G1_?VGY{smzLjRM4Z!=&Cyxf^D)Zg( z$a}yXI~!ucE^~3T<3xLthsp?U_NJFP0Qx<=I%ap=>_w{|Df|PnoHLs z^^!TT1La;e8%YvgF?a8Za<7^%-hy(knPa19VS{-rJ^inn8MgO^*_J?ojb_EIKzY*~ z`%k3aGRIOlecO!8MMLkH*Dyr*J@f4Z8hYRKeTZ_K&6jpW>NE5BG|GK$CMN>;h562Z z(B7BkLwBHsugvwA0r<5!YClxA#k{sBQa_s~o&c0z%qO^`PVx1a1mM}eoQVR{eVZ;t zW#{`=o{78*d_8Fcz0mgzZM7HqX2#H$i+%SDLf$35-M#?uQr}Kwcvtx@?TOTU-}ezb zuJ--#8fsbK+h+}$z0o&`;?hmNBPpWX>}#e>bBpgLj>KZ${YL}kR^O*{@wnS}<07~a^%U2XVz(tLsO!AI!-LSy?l@~$y@?u=TlHIBLx_KN?h)g}M*v)H{Bbiz4&?q{MiA;1U{VZVr@- zv=x|Mfz$(mOXs3n4+UjS$!gU3^WO+TXei-GZsw|XVuqt)rPz~c|1 zz=psNj2L}A@WL^u<&D6Jv~_%84?+jV45mw}{X#CNBgS8h-$#z044lc&?}yweC%=Op9Q_uh z%wv|{0m#&Sc0t#UU2q<7j(_M$lsYl?0e+upOshtvXBiKD3aoRDTPQN0XPo{7dU?L_ z+8k7Hff1`f>O$k3R-nu=x@S<}O5->RLvxKk?u@qQ86T3};uV;kN+ZYaD+K zQ0_Obrj_>*7b`Vl4R>d8>^pDdev=o?*bilg8BbNWEl?qkG|HV+w_kH;th)koT6c`FIp~+c-0d ze!gS;5JH`w8$)Q7`@#sFj`q$n@3<0=Tg=^uqQGMFK88HqYCgadT}#Zi8F<`gKKEBV zmYVx)K)Kt^lTJqqcbNOr{I||bw4#MK%`Z7#Yka3sEnDjwLL0%Oz7cx?{9(vj?>lw{s$S+FO$Wwuf3FMBmlgiMeTD+}`QPh@zO3|*9e~IE z{=vHfbCv(3MaX-=A72j42mR(_$eR;5<}B2CW#BioOV17T-3?XG3nV^5-c^C8*W)oi zaBvGyt`5985RV0cKb!>M!a&D`c-$XIM^J86;Is;K@RHy@jKaDlcI+-3VAN4GXKT$q^As+9Pe+UP9;JflMAE5JRb{P!VmYj>eJZQ||ak;fd8O50O#@|<<_;W_SKMK5J zT=Nzl8;vBbu$|i(~XB1WB8r%Je^X|zh3~_PsUp}0PkmGGaUk_nrH8e4o)*G??jzvm@n^* zo}FptC{0f{Ki&%{Gt8q_BJW~z>NwPSi8(Ke29}z;L;$?s4E)v7`^*Er2jms=8yZ1g zH9MxEir36Py@}KYb9ex)yl&2&f+{{Rr*T<)Xl_TJ&?n}fZ$!CG=KIsp*k|V36H)GS zbMFHI{K357cWCTK)1Z0g9N#+n?auR^bUPjw`9637k4t>dw;=CQ-_sDFm8{>VJKk@R zvEPfR?>eLWUug1rV-4lj8;oyhi@MS1G84VJ$rwvX{AObyRh>JGHP<2UPUCT^%=Z~* zQ6yPuJn%94c)#)3>%d%N45WK!t?@^4wWo~5hXCbi<85xSmyLtS<6kj;%Z|TgTy!_` z-Zm!0(E2;Zl8gAJ#uO5bO-47`RzEdv*$uU9HXbI${>+&56jGlXTPUS}VSJlG@h^?_ zVWfUA-updLKN^>Pgvw4g2Oa?68Ro3Z@t9>E@G$abn`iHjS}rjc(uH%W`7iR~%gp{X zZp}CI)YPvwAES9`f%%^*w7$^Hk{(@SZlnTwt=X~|k45Hg+W~m5xdY9UkC?;Pq0ZIj zpUwdA8T0S80KR3uLQU#Jb1)UV&&+EXne~&o`!Jx)@a;YrRbS#;!oJM)tzazjXTCSi z!s8p?jmv@gv+vn=@i^6g55qc7_a8YG&7SRFG!dy8{wv=?)wBFB?TuQ_^DiJjxzPXp zYS!uh_F`aO;jjD>kA?o9>QT!g|5H?dZ}7i-0Z?xCAG1o+m7V6CkL3UVqf*w z0N&~gGKOG@Z#2cN+kE54BDK^vglDL4_hr8T@DAUORNn6NJu?ZZyL{C=V05={8D+P7 ze3RE8b+2zfuKWjl$MgougT6jxDDaSP3~i_n`?l+b)FZwJ&OmCl?=$L*YkWz%pw{~S zh|^htr+jaogT6fNTgYh9XME=@MlG-Sx`y$1)i;H);&1zE>EnFIH=EZEyz8q!8hP*e zR%cM)Q{NHKqZ6Bb2lDvAXTFtlkoURo`@N9*!nYH7(D%N7<^cS`H|!XU;E%preg^P# z|9!9FafbixH_`eme~Mb-Z2ulV0rOJ-jg+G<^UooPpYQ+Vd|+Pf_dSYNxxxSa4oKbT zznwuiOZ~U<{M_ySZ)lER?(aDYP`MpRK-8_??m6|X8&G` z(cN$S@ApF9xBh8=L4i{On|=oH)WGQTQ0KHj2jhZf1pYA(c{2lV%tmGB1V(Wa%nJO8 zp4r)fhdWT<+`zY_Cg%nAor-rqKhQv`c6s2BEO15ON$M*L0>eiEb75egBT(*|z@X81 zTpRcc%^{0$9TM`c3oJhswOk)Kgj-@sU@m#qZGi@cATAB8`yK^u51509JI9N2L*`uRxU z<74qy9q9KoFxLeBN*efN;M_w1d@67+rP!wf%l?GNGl6?K$j=6LW(3D`fxZm@J|CFP zP4YsZqc6(67)XDCyq5wWlp(b-@WLnP%bS6x7US_&;HeLQ`F5b+7*zdEV8xTb`~;sp zLzgxM7MzUAJ`G$=JJ#laK@Itvz)@ke_ibR$COl3FE{~wVsllVDQcnx^rIFyY;O+xZ zd}i>Zx6$4?!Ab`4T@-v_7Emq@K1q?_%HZXv0A+5lbr)1UFSv09Qdb3c7fVI3=24Wp zJ~;7Ew6`SqVKW}L1+U)@zmV7onCPgC}y?{1ohc4=VdP zcm%t9W_cg(oU_XJy9_92m!H7OrkB6A4k$Cq7yk&93(9-`8?{_mo}dxrqVg+g^0~PD z+u!0<=9cH*1@TT&esYu>j zegdOCZz*3j0xoi0B}k9ly^BDtalv`EqBMEw-e0>$_e6ainE{%uEFa8Fdc)0wUHl!XY zU-2^vtScY)DpKpqfAWL_KMwjRJMcz4G=Ix1Q z=XUw!6Ew8A%jk;%T-jy&ozUL;F56v>_uJ5=;dnIrNtYAK0X(Ja!sCE)QP;y6JaKK; zV;TQ*SJ(IH7rMXeyt7gDny$+pLS;{O{d5OBUg$cLCvRTwddQE?Sv3-B!Jy~%v?M@pjcAko=Kd*S1OXJLLz991Ebjwzw zvKzWh_$vzB)h#pvd2710-iF6Z-Hvz*b-vu~4^_xTORdr z?(3fI58&GF<^Kle`tBc)Yd_n4B~7)@cW?X$QZIFHy8(|4-AB=P|3>#)xS-$a{_j;N z{%-djQo#JE`>aLi?xyaoRBJ!${wmEyUv^)3Bl5O%zaxj@zjXg*JCvK&W7v0S@9ZAW z*B~{sN83)oyr9RBUobp#dK@|yz^i-QeHu`%>yc%Y@6A2B(CM?d$0rR)-PYsQzXS8( z9#xxB=jtB*EqJW$@psam$9gP_poXEqt1iYoP&A}jxEIRLq=YP-28`h z^&V#Kh&qSAHVVHF?{g1wN8H0*IC5PRYHPc0fBYV`Xexe>{`=RcVa&r6`P-L{1m+Q+ zlV2YB30ck9)oakJaYt@O?)bMx;qQcVe!w72-1Q2;k4nDzX0=?9nVCmsUKa1 z++)}8fzYsS;pfO0%sea z{T9`oXY{4CdA@PaW$4~T#+TdSaj^ky7}BfJFcZZuHO_nsz{`vs>57N#^BSbCH7=&` zyT~|y6H?b37fwYVZZJMvjmmB`Cay*Cn~aYqpoN=_qsF4y#l}f~VBTtM;u+K>#$5LE zHskHRQOi=}(xZ^N-B|Y$%H3$z8DsW_vHt{=``CD$PTWt7DhjKcjNDlOZZ>W`48YHg1shPy7eCxBM~47^>=5dd6E32=bkaJCU{iMG=9oJFMD*hL_YMa9q)#uz zE1YV)b2LDw8$ZyJcb4(v9GU$c(s-}Sjc0lSILCNrJ3QtYn_oe(`Nm#!;V(31()50< zG5rAa7_+z(j~k8qk3!xp#&L90-fC<&62PU#Sa#_SV>XxK-NprfN9tZ9457bl2WYTn zStU&5rt!mXdXyRX2QdCOdiUNtI$=`V-q}eb%0~SA;Eu`oZ(L3Fh$)A+wU2DehkMud zuJV8mo;Y^O==Sj)2alLAu6M^|{HM`-1HbpU5mS1%O`Y5}Y5ef9lP63V+tGXU_$j^Q zSFceMCiN2R-u-%2SB3lcI;y(Yl!+sUPj2gdO#AqnYBbiTcUAA|DrAPMYOD6Cu02>v z9z1-~xL)HYjBo4JHvI7RgWJcC7&~QT+ri_8j~LTFzU}{S-R?NHqs$uh#P|{X9h=mC zblaqky`#x&BD;62?dbLqn2{X*OV(7^*G`?fHxT*G#mFTx>{9v0NK;BLJ8aGN|K84*T%7KS>TEvtZfYAne8jP3W#fjokMBK#+c7_~ZPf57 zV<+b)A3L$FqxTr>+OmAd36t;>+Z<G%Z2-Wm zIRaZcKVn=hQs7otag*D|p&sniQCLk1$4=(Q3?B;+sDlF&ya-Pe)eZqKD43s=xt7FPUB!D5W zlb<|%(&)Cy`4JPwk7^&Sns+x^)n|Cv^B&Rx{aSnvDXGdiFGKjG5hDQhyd%LF?*cHA z9KdlM?H#V(ViXk!RBvMY*f!3A4a3q^$#D~>#xU$VW4$8gk(#sJ_>YV4TUUaG+4_Hmtn?Rvn6vGdBxd{34cb>Zqm4jvF` zPYq~pKC*p4s(nB*nMw|5YHG%FzX3@CQUmb+z~muA^?yT?!Pm3vTAC$zNIPDv#cdsmrvyy@(uVC z%{ArgvaL9JFqTPSvduCr+lF49;Rt#8OT)@5@|@n#wQ%5Y21vRopWPetn^*<3!}9I0!HhX{#AlbJB! z;rh6YWfWbm&%_7i`$(6oRG-;5J4bq)$mUaZ`N5fVJ{ynbQkhEi=!uc2w14jrs+wBQ ze^pggEj>f~?T0je%0Hy{*aO&Bxm~@P&Ps?S;^}xK+L+7^4CiyHq`hEN*Q}*cgr>TQ zjyJ@clORKn zZNu*<#AoYw-IP(I+9okWtqOOsP)}|JdGm;D%pqK;SQ1_sc6iUw30zaIW(vw?i%MqM zYrCA?rGj$NqHz3E!Y>YF0j#(X52$tR)~ zW!ML6ODNKyOieyJs87Czi@mD9TC|=VS+JQL=xwAPb>t$+v`~s_mZ(()N@RQY1~xOv zdOV#Qn&#WFY)!!q@!&}De11?C+@n5~iN-;Fv+-OgFNz4)Y+;tX&w<%NnLPf4y}OVv z6dw0LW-KoR8HtB%>|5TPl(FqLk?kRxP^@ z?^BB(TuY(Ka1Ew`^Olb%Gx=l&(?)PDp!Ob-bsh@$Z&6e#QlG(G;!nSPbx5d^hG5Hs zW>uG26vIOpWaF+0Dv?`8L7^3VBcH2lO4Zj}OCc=mf}#M(Lm`e#7rCG;%UmQE z2Yb#A6~^cVVG?ukOmn0O{bK?45iB&Ek2Vd=XPe^jw6&8eL7R}8^RcIC?yv3DcWe{G*t(0v{)Pq7t zVzF>GR0xo@Sf7mMnaY^V@o7t`fr zxO1HmO@L1)V*98Kpc67KkWaWIu%{>(HdI1n<5M`1{Tl*_Mv}!sglMX{HJ`&miH5;J z$a=O7yZTpQ*K9L(HF~n`brbv7)m{55dXmdDq_!Eo=2s124QA}?uG(y>J~ud$iBojUKlWWzv|L4!cQEy_!JSf3S{#3H%qrDhHmu>`{4 z$iR3@x)9G|nTj$~MUr0yJr!CFX;#R$gQO@CNJl!JNu(P|`eXIkSW*Pt0$5lv)u!k` z(4gqRD#atAvJ@$p@}$=m^@a!<4cjHO&Qg>q zMe4GU+*0J-AeOmI3QBq^l8NP8Gx2)J##Egv*}G`ZGEiZPiRgKKq6r*11b}b>H_(<; z(gSnZoCxn6XDtL+YeZ*C4=h+LWl58eiwhP-X&fn@&o_{}Lzhf|uQWz7a1-S6B1%)F z13PkFJQY2urUoY|)0~aL zzJN_ArC}o}=yp-I^qAh1Sli)KM#F%TgzTL}>yY3@e%5o<35pcwkYfeMTAXEFh~64i zG85{iP~J(U4wfEB3RfH~NaR=zEtI+{DRMPKpULO<%3HvEo}Aao>Dg=l#Q2WM!^e+k z>$QKhITzY5gj`(%kU^gy#ZW@X4I#0Cr6B=v59XvqYg`nXT4hBL3IVAhpK3+}juEB` zMi?!pg8~UH)4G$F{B%NhO0FJ9Cn#KZvS27aG{iF$gJEmHnvW$~`-_n!o-2S#uhUIU zP}i_eVYAEka5Jv~!!5KdpG~zuCvpkfc2-#D>0#h_$}lM7k24C) zaF2qWZ|_TPvmA_FdF(;Xm3wepa9Q4%GAf5r=m1zsk?g>bo=7jWOxAfc8N)Kh-)JhC zZVHuvNu5QcPAfbPP0WO=1yjwqrnOo<1Jl6vP9)>0mK>#hl?#C%9HV|%=me}hhd75V z(k-R3NlMhZEY>8542@o~25Z+mZGf*|JN!hRwZk-wjR%9Kxms& zxnc24N;Dm%#e3jNgNL~hbDm6x`>JgYRZ+9~geaBaej47-g4gG0dx5s86>+`mWtrG{ zvh+l~0?}@Yb2Rcb(V>{(tlOL?j1n_HxFtFeDyT=JApLP=NsUcu(hcsJtW$3+k%2Wa zmx(mPXGt0x`mbojvMd;|whrotal}@F!P&944x$|vIcgU{H%vpR!VZc@n;;U!LPEBo zYH{Jlk}wk2Y9p}=BI`?rL0L*_lr&JK4IiEyX~)_n4QLOxOAHL&*E`T9QB)^Mjq_Bb zbC^!0)8#|qzDgKyDLV45>Q!YiSy@sG73ju#%yBGU*U}Jg&8hbFG#BSeA-)OCM+agV za3Xb=H9IcM)xEX&0I5%u%OA8ak;T-wY5rC?Kqd^+9~T6TVJO{G5eO0xaDbL(2tOIv z$Am%@0A*tG`4(-ZNG8NW(HrwW(57HY8&5@}jm-@<`EmnwCF#LXC$nNDuq|zhrU*qY z&XxU+4VuWI-BX1$Xm_qZ|o}n7ZD^{jeI+4paw$vTsbnr=yh=F8tIMfe>^mF{yk zmWRFq3y)rmdhi4cDN;ii6sYNxUtC}_ztTCK4ZF3r*Hq>K~2PFYZ*SWBd-UhyunE*OIcknSc$ zx^vM)eU-e48=$wgWd?-Z6;_hY&4893=`sUapghZJGoY>UDlNEi_}EdUG-0$_FWRuZ zxWs=GZEV!MSl%ZVO?GD7F3eI4pe~z%YckVcEgUN)Zz?1wP0-u^+Se&Z}DmWI*{mOq)iun$O)n2MaMu^d}?0L6>!3pJ@+L6 zEreHh0p8V8?_vcy?F&#>YmAmPd(q{AVc@hZp>XH}GPbTXS82yso(ZpzOp z)&<^``Us}higx)Ig)59QH(0|~1j>^6wqTKtHektQbLlkMmEO8~Tr76t#gU;AKUa1# zT=L^;l!RC*AT2Dy%FqX%8>@Sb!VA6f1qY5@^W+tg<~|{zA1-3uM~0n_TIvtkYzhLq zD|w3VTjXc=78NW|gJV&`P0qHz%4~ zYMsYI&KwkHx}vm_k>+S?qzUm_-nHk%aXA=vXKDK!+yeT_QlbPNk59g8U!xkNh=NW(j-$_&j9u8(Va ztU|P^svSoz^>dn?#4X#!TOW758ioCIT?@kxvRK&&1#`t^ zaicWWb*d#5Pw$bIT6Mq;xNjOUD24NBh3zm;?FBL@?1fCS6??&zkjiXJ zCx39=b>ax1fz*xSS!2q60sAS88ftRwC=wd{63M=5$0+MxU(Bl#C$#Dm?jz&MPG%8g zkma7${nTmc>VNU}P%TiT2zHl#&aU!k#S(Q=IAki$vl!1FK95A3@GMbEPr1PA*f@0I#jo&j~CJ$r_%v~YOu6wvUP z${}(m4I+e*4OP;kh#f9AC_A3a#S#i~M89^MMzv#-wq*tm=A-o>__2muorgRYWXYV8 zZ_t+$hT@sbAAaoQwh~6)z!woT$;VR`G_HHW6G1OORKnu)hwrWWOx?&H7VSWf(&(QNl zQJw^nQSX)34~eI85}0r|8p6;Z&TDH)=UDxT1dBiE15M&}i0NYjoC!bGD=?k`yw}S_ zL?F~T&gRt8b>3qg!*OlW`KYag*U%8+j&pUg?Ck|Pscv{j8%y;SLl6P5xeLJ7(;6~E zAU{HM+*W*0AqV|qiIqw?MbFk!>W7K%vyR;_)88Pjhq77rJ#!$wB^ zp-RT~3JDWMnSph1p%en7c3QGxH1@@Zq${WP1Um@*;~!J;e?D)C*U`Z(^&u^4^S6{E z&4{D-h?dhL2z#aU3l6vFc=2qisYRT5#USY)&Gv9xcsRVbn{EZ)4iMC=39E$XI;^$L zmoD&-AUat{Gl+AOH%J<+2tl_9s8P~&RdtI!q}GJR(iXP}lXVJ}1VO+n*ECz|0$*AW z4PFsirZrG1B}2t`r*kWwiYBxy&ieSC;>oX$w16Wxz6>k^dZ=Z-IztF!sG(+ttDy+N z8jH!p#Pto=_EFqKd6N6F`9e3Ll_l#?%md0|P^)|!%Jisw%(VX&Ii3lW@s|xNKGQ1j zPFsxtJGa+nt}(+X+1wEP;E9yJvh!-SgSJyNdlz!l;24$-sDJB4OX-ROh>cWjDY;s= zkI|r@BYQE764$F7WgJzSgjk3Xz2s8LR4bD~l|llvG1L3thfF{rP}+BCQHka#B5qxR zC-bsXsg;VFW$g)e7LtbM`RwAJ;3rZ-nn8TY9GwcsILSwS={T8g7TTLy}4Empy=UzB-50#t(Q#5U|P#S8MGQ;m1n?Ss5ID9!V1vOrJ^>v3nsXE zF#z@}_WQU5UvkY77-jVIkTio*z-wk1SKUwqmLP~dIxu3%a-4nbf~p5;s&V_I1R$NV zZO=M%%{7f;c2@^mJj&^K9=Pfw+e}e3oT>u}mQ4s6oT`^i0*WXJwVn~z&gD+Iwb8PG z+7Td1Hv|DBzmRZ8tWb%$sCGyZ?T@l5OJ!)cj`Am^v#JADN>3EEW0L71n((pt*r<+? zZ3U+P^ zq#XV@;G&IA;1r@#*$%QW^0*qqw4u8LKBzn5kQCRHi=CCi5PD;g4$=bhA8m^B&g-gyUNNXj(AIHZm<8`Ri>&Qr$`Ct- zWKJO+&T{kzPbj8h(YH?4kfXXh>Yz!&W2G2=VUa)qVdyfB4HWw3T{OBg6mI~SoX3GI z*GT}Fy)e9Cjn@0t&|%NxN1frxtBW|Nm221x9ABR$=S2p`qK$djnG-N}BuEhH7i`Ex zBy`y3mp#ks!M0%}%v9xL6Q;n&nx8nSZA3dAt5%P6f3|`sT^e_6b|U-?YEe?BpaG3R zLmoc~=({K!R;CoCc7YgfFy~lIZ$IV1;`!A2ID-07O+6zE8QO}-PMR7TlZY;emUXm` z9^W=H^e=T{$vGQXjT0T#8)()>pFjbEG|y#;Z7M>wwY_M|WC&8OFKpoU$+PO-u(H(F z_N}Vjr@Bv7O}Hl9)+^k%zONN7iG$o>u*cdyefw2~t7}@wJw#5+BvN7>N$Ve?xH<`t zcQ+b>!3V=ZEGH>CM@q(HiI(JlMQcnnH2zm4IGKjxkUB7xF+usV+$YO8cnT_GhJy+` zwH_NB2}%4Z6IPJ49Mjc;u#1FdhA@8G9Yv=hoTf5sxkK@(XRt3GE;AWN$38=Eg-2@D zOGt%k2ht#ER0j5JkSiVOt^v}Dm)2W4x=sB1mz50o#9CrVXy*~3E`+QlF$`hkT{C(F z*{#z0A@lAe6kE4AUm@J$bcJw>_ZGsfBT0quKA2Q2M5>6bDY%In5O{)p1jAt-@6`~m z)KKZ1{TqE_37kJeY$K0bxXZ?^K5rws^(xzlUV|R1DVGpfMppHe9imOa0+0z6T_D{8 zB{_q;9fYB2#zC^BtU6?znIWm>CS})gl2SwIGZj_LBcIpQuQM#!3~u?p*tzRS_ST-r z!vw9o+e)=^u^4X#NKmW}F|f9F4Kr^ofQsLhK95|KXR&C-^Qd=%>M=j`u3N_rysR$9C`=E8YV9lWOuiu0vGix60X6Vj1* z+F^%Uo>E}xf>pvg_l^^%2^-%H6l|gP+Omc&~!Dn zpIbBwIf7e>TqTcVMd6?|{?y_OueHVqK@yj}Bk#plVPxv&ud(ob{}A&u&^yrz&&w)EL$9Pbx$CuDj&I+>0#fNQS~!c$nh zSk`b@7x6@R5f6*Hbg$Alu2~go#d9f&Zt)k#1DB(88i`Y!DdZC`=NKfcIPWTDaEz!p zZ_)=jF+l?13RksZLQN!K)v-`BGzLe$;~C*xspf_h-FfVH$(%BVZKg9R$ng-2VFaxk znv3gr0e2R`Wy29DiCevf)3%YF*rARUlF-qokiwvFD_DdNY1w!Y9ka#D2P`|b3iDUS zRTa90byM5vo-WRmbBkgdY)+*!^*F>OT!LO#>4PJCdndRcQ)ZT9V|n3tB29&4~7!r&AIunc6HbeX3bEDLDQ5<0Y|)JlgYwsX2ciWe!+La!WG zJWhw9>xzmwP#zis7zqVOa1wM3i`fEHD#wIjr8g+5sD{x-b7f(zG|tE(hl0Q((Oq+g^O`m!acNRT`1 zb-dVw@$O2bkn?0X|CWwsQr5LkFy>n}e;D*J7NnDr3^d<ja0oLRJmD6BGy5Ty)q1 zAcdxmPPrlv6qV5712%&~cl*({q2Ts8Lb)|W<5G~b4iXYwBGIS=sFhL}QkV?u6;qIr zNQGT77NyMdjJ@FG*g9jfMZ_PPtzcCE&ydB9^YtznA>?p>EPQXC8VTzwwKnGJ4eIGSh`4oDGGY$h~N|3 zQW?N9}p46MDtFc8_+-a*r{xojk75`-C&+t|S% zUgs74{ESuSV9^mpYd*_}^9o0IwDZcMQ6BwWlXJ=mUZa)=OIDDm>*>^Bm|;L~g;}`G z4<)kI!qdG{moKR3Jcnk`#fewrXo1oFFH*-zc*x0=`-;~Hp>qccJ#xT+$PGgt%c!lG zYR%1U7!^l~4%*sb0Z)fQB|vCKr3Z$Uz~(R3`(hcdI*+kWcDZ`$Al2V?hWc(_S8TlNhxp3Oc0KnWPMPMrbJ3CoR%Vut`a-mAreTQ1nuMV8$FWDxBoi9j93s_EDTKE!po({TW7& zh7{OdyuRM1h9<4HBFT`oG2P!KIcF-8-Jrd$G5L z`C&mQHdEh}$kp?wND!Rz0=UeMT8;K0S|!yx7hhP%Xl*!kAsnvC!1ROI4;AWQwd-=B z+ikjF(jEsPJGD8MQ`8g_qpwJFGGwrHzn~cDFZ-ym?ce`HN_8As+kjJjtj1Ahg`8<1dm-Yg3>9i zP&ufFwpg@}GSnd$GFb<{lO2eI4df^A)NrXpa=0cao~Id^_tS=XjZB@J_L#&>%)2xafMFQ!4bF(w7#p~%MKf|LU22|5fHMLEGw7e z(gI0TJ~Kf+g$O9+A(Ibl!l;#rD(CDNg!{BQL1^8s;|`-imR=j^tjiqO4;D_@+p@bF zbBX$DvBNt_*HY(VkTA;S5~(LQAPDjp>G&@_Rx+p$8XUXIa8?& zucN9<;I`4`SR%qJ7iw#&l?4Mkh=-FE0g}PdVe8s=5g1O&^oEOlG1IV z&7&sDusycfqOPHIE_fIy#sw={67i*;`;MIubY+RPF5-2;WyHDmvoJ{FW?P%(S%le@ zC%CptOB`of7UJ6FKtkKWfic`aAOr#_{Dgk)guTNPtjIZUilTJEkki&W-ebvCTL~51 zxj9;01_LWI0fcprpu%3Ip^)Z%!Tj4%U_v^s)YL~vQv|00c~z-SGkX?ZuSC(jRJduty< zDq5=!8$ldbhdSW8!u3m;Awsc>-C(7%)wdtAliMaHC*aF0ljVppPjB*OUy0JQ5}M4A zytpZTaWkD@U;|rpS1E}uzEZT%ERy6}XckBlAwaYhUHwi>`(#irF1h8<+fxI70kn-21#w{%=yC% z8B8UW0+pPtw8&~_N`X>-3oS%QycmTl&_}wZ3W*3U(N3P!*4zRKEJdvm=1FC=7Tdoy zZT&Utb?$+(xUUN$OG!AXO$_l`B09L}x+Optgr=78rnoVrm#!dh2r@A+-F&E~)=^g= zG4KE@uJ|kNofww zTIl<3dl3n+lOwIls<7|>uqcNu9Ad+=5YIUGg>b07|DqA$Q5W3Vlo8s}K=ERk#}nO|@9IR7Yh^ za+bB}T3`DJ(KX`{@H#<}_AxM;^YaRB&CM8WAUAU3wOzzpZR!HO%|pS-Kh+^Vpzr5vqO-AUn z1v#J?OxHRLbzHsqNDDs95{Dx?A;FVaKy(&bPId&sLlaboW7YWwD6GmSpcaGP$(^9+ zPEjX`#hc;Wr|+1atKRtZRrNmoYx_d6sqG)`he*TPKJ|K#3!OqZrj9#Ow%I8}bXgv> zzKP)m3qedLuFyJ_mi=wx@brM|3pSDz47KUhH43rPw<~C{+^%3nFgd!tMUI`_%lXGq zH+vOn42*#I=xYjgcE~ANGM_J+!nt&1^WZj?t3ivPHf6>oz4)31corf-EFUB+UFxV6 z4JP?)ojPcR!OPawmyK*2G5lD{v7%h*8=>rwDP97ltZ`09`HG%fPMkdgUd|oj`4|Az z4=Eygzom^~qvHZRwb7LwL;T4tO=94&zBf>8JJDY{f={_5s!giZ#)R}z!(XCYl7f4| zvIu0yTE~P3hP+9^I2@l(!~_hPtZR5O+vtenmG?qjI4JkT1&R9u8kzma`spSoc~ zFQj-flExK4DMawrBf4I11TCp%3UUjk6*99(iUreZfn9r>bedgu3_6{h9kZ^>!JhG) z9@ET4L=fA<{$yNghC<7VNkr+gK=ZXkSF4L6Q@TAdRUo5G+se$^sNw*ly z&{4~(&53v2L@gf<18HR}Gv}Rl5*_=IZp!jv5gqYEqqo-YFrhRaVd>i5v#P2(eVc%m zRl~~nWu=_Gq7C(##v*q{f2>(rxYS3%M401cm(I!#BLt52LwsrnVQSHVu!D&S4~vyF zN@E?hP#E!93PXlGpXWCWaZwFFB#3X3j)Wl;>p`4lnIX7v(<|b5vZMl4Gy26h z@FIJ%)C6NmIj7U*`hzO#@?0)ACr@{dv;c#y?x4n9z^D>;T;Yb+A#MXSn6xXT$DQMt zrp5i{LPM>VgoS%K287s()GnNm=Sz9fq!TE#&9#C;i`@1MM?8 z6^?5d2MYfW$Mt`HlzC|7UBp`r7yZN?$vz)w_#p zcu5fS0(@SulIj7y3)-(ksCMi)tRDVWSTA7S2$g^dA*Y$nd&xBjRj39&ARW68F$D1m z>TrBzubL|NEk#hI<4FnR=4ZbU@r|f8i!IvjS-a&@*qSQh7(NavY1JX#tEPWVET)+N zKe&dVOUSS~P}Bj)3y78kJua2V)>w^eoyC(SEqP=*9hqfGe0`)k+@69{BaYZ!BzTs} z)_R;al`5f&RuZSOPODKFZZ<><`R>V+F{Z~Rfq3pZ1VQ1Z zx*P)xhE}_$Mj3M)DV+Lt3E|uV%e<714Xkxp38?p4YfZlCNQXRB;HD<$O6dZ)n(@J~ zSMsEOjM2Ef&)(AMA%#g8ryMxpwvaR4vW6JiFY*0-VS#W%5XS&e8C3*1q3-@ZT#0X; zqR-rc2@w(@1YxTph(q>}rFa)-%P@=h6q7)+7!^FPq*9nGMLeT}@1AvbEvEV+CiA73 zqwp#Jk~ebN(fKUPwxjfEi1tfiIK@WZ*_~+EuGm316gd$4&-q#-8jxccwX!R1XNNu4 zR&e1~KZ*!5C4)~Cjv7CVtL^=c@tbx4hv567q1*C`s;BaRTJuqyE%kXw3!FTxO}Um} zq@l8_PNG5FP2kHyO5Cqh4+*TYe(t{?9Pm1Z%7P()iq|Z8;0{Y=`$L*tOm~L6@%577)RQ!aSxs zn)W^VpD>ObT{qsFOr<=_CAZar+ilz5m_Uu$IWRn{32KD?r>kwRgDk?eTziZ>jMmZnX2{ zN*P;`jpC?xL^RnF#F(0{gCGSFlBRF>#GwW~x%!4xIr-EuWJsR-AkmCZIK>CyhHTtW z2W3%IX&e|=CI{S#ov-aL77+A}mt@!WhvY#;lNc~CSl(SR1>^V?zuSen>OfcBSTq#7 za;;LjF3LUWR(x@Y-&rM-(wFz)1}nt1>aREH8a=p5!g0`Xj73+eNr>~MA$!S`pd+1s zX$Yptf-emTIiXintW;p)jlxsib`;uvJzqNzfb3)$HT!Ft)`@yjp>5z?^lXPHo2$E^ ztShhhnQ$@jW8#$vk?8L6c#{eOkMutFES8|f=wT08z5#kD=YG7#)!DSwh zkvuF_cT?cfst`RV40In4sVK^nBCNx9n98)C z#vq^5tK{Vbsb&!+te=R7u(6aWSw&x$%BP`OqI;A;PqKs0zGrc`-VXiNzffxd4#)vN zVxQH)-JRpXdJLl)gAXaH(>cY60_&5?R{R!WxTp_TEpS2FDVatqW+aO3^}ptF0@vDt z0IQ{qu+|F-gb&N6(RyJ%?vUpR;OA|oRANa{tYd7yQq2~%kOw6EH719Y@fK`AV2-k1+H zRPQElEu9pyZ`yZVSG5goWe_Ti^SZyLCF{!GUsI+om1~sKtD^p4aQk%b{49|xe1_qn z{5X}YSvxwkGlmQymS6P-ox;VM@UN*`wj&^LxK4;)iD}4X8Kb8NuBQKmd9qHeske4R zwmI#X6Wl-{Ph2?hR@|DeJ?OZ}Ko+OE<+HXyxmN8MRQoVgKXtr}^v;P;)yJWl;<0K? z?fE7oHW3*Tk0dHe2mHIDa&TXJa^+QIw=;GEypk6i)zFS(1=$y7>P;H+UUCaX5q7$0 z<%pi45xCzp#F$Dkh(R{Q2LzNqS^bvrutu)|8(!RY@wLa8J6^c-!~YHuO2nT zo54CrBlum3xP143a7ig=lD3A(ZGv({*L`)9+als%NE3xeLtJh$*g=&9CJ}24v$H-+ z>j30U-Lg}yH)PtIB`w--i~*&Y3KkblP^uY>$|mKyAU5a{QN1 zED7b19T)qg+6k=2ohu_jSy9g2TF6@7a^QmIk@|F~7J?;t$pa3|iP&eUPuTaKV*|F8 zO3t0iDd)})Lr7tY&O#nr+s2QaFe$I&ZK4y#k7^$s(!qV!m$cD6>y!z5KsKfHGTsTHR z4d7!XA#2eys<1HAwcfaR#nghyq#fSU_^A_aHTI2#B=!w&sUs(fuRVf-i{teLi=^nY z)Cx;hfwKw3C;;^r>Wh+0NlR6l3UQf;f!4=ql;mxtkJ(YSPaiR-y&@>&?FoNJ0Z*8}}w$azN=*0Ae$QfRU45yGis$RH^C5Z`6 zAwxUC9Wx*v1KqR(re3S8bxR9A1(J;r#^keza$6|LN8gWRCwMy&!oEER&1=GCSwwW_Fbpxr zSenR2;9A4Aew}40A0o{}17jZR2>KvOFyS)F986`yu|F@YC0KWkpjrzYl9A;JRugG| zBCZsM6qV(zBCxeHgOUjdJ;XO*C+P<0@)>OlfJI8BofCTyF{25h6fGUO-rC8Q<~oz) zMTWpv{CK87MpJo+LY2(m(9oCxDbPA|0GUCGV2mJKwBS6XTGDXqA@Xu?I;p=}r#Fsk z6BK8vdwL4mwoj*D9Fv(9Kzx{ z_BH(dMaZOI$aC4PW45)RvPU_!1eN{Q`9Gbz_wB`%tB>}A#Dq_&fW z1{qshkU%fJS!u2ofy5Q6FA)yxx7*<9$(Qa*F?|A8`^v18bkQam+H(kR9fD0s3p&k_ za#F7qZQ;5oh`Si?;4$u4ww;ou9m}%gyg9Am{X+IYNYZK3z8_V8<$`xlTV2KHzhKMp z+FiYQGA5iBw`T6vEDQ6bfR=`$N!<5@NPT#hUDv^?YXv(Ii7*^8$JSD}yJ{)XjajfH ztIL`rTV3|zNKg3TL`cp@PiP;B^WTW}CohDzSAC~J?l3B@uQZO-2Y#1EAHk>`;oL<= zi!<#PXw(Kn%UQ2NEBM(as_EABOmb_F17{970m(g11!j)L&WXfPFpz_Ti zO0^IDR2(5|g-e(99U8P5fCUrOYyWfx#+yo_35uvRaQ%XZa&Rej<80hk%uZIW^nyho zrMJR{liq zip6B|2yHZ4U39F|lO%1JtC@ zNaxOxN@RI6)FaIBPS+tVM)^_Cu)2Ut=Q{H=c8210VLHYv=R-COLsQ>l#_1CI9y2Ub zG3d>F7X*W#eJJa^r=T<`E6zj-Im)ECSrP3k%F|jRuF)SH%Qk4)hhdcD>-vK*JpLf3 zM+$6wo@^OSYnoF@MC-T{4y}&RgC0%k!Pb!%7-?$|dGOb^&U#HoB~heZgw2Y#w={Pw z%0pvZ>R2K$#&M`+{nH2}SBu#Z3_PGqro}hGJuNs&1DmS67tCoqD;}3X032nOXa~>v zSXQRtx{K=OLUz$}c}vJ4p`Bo0PAwwKSMjbxQV?u+m^g{^};+QaOr_sIPh9@)<=(R1!CX zQcSWU7%}WMl#*nI55m^c;JIgb6h%CWVFDCX??rX>07U`Ta!xe2sb+?5# zTXv(@cvj=+x3K95FQ82ZTc}#Szm<}es@HJZmaes^>cI74#NkogIgCqg!5|QU%NQqK zeJUHNGbs~`&y(d^m$*ZmA4>$G!XUVIp=Wgp|KBfk64xt*VHr4gNl_SGSJT!&8}nRE zD*!6Cus&yU3$)?Ykf)w=E?*VeWtg%s`xv-qBGI~ z!Vmc>mSY95MtQ@g=+PdCOi(sDo@)#S6qxt0J(8%IavawYi<00{UHq%|6}z= zOeW~>KC;+J*Okafrw=SN_%`-X*)-M-ft8XC@*d6f+)Eq&cp5|Fa)2#XgI&*MzfrWAYZpD2)QlH(=Qf_ zCV6X}#dVA5aLN2)@kd5hB2UN+@JVKVV-wf3A%IAKZ4)=ei8RTrE5c`-7fdSt=D;!p z!dMM~4_-XF*P9@|;(VfGtnMUBXcJMj*){8M2HqZ5BuawD$a;`tMVhL1J`AN1WO32f zgfAP&v0z-KjaY6jIS-W40fGxLp^r8`gQ@C&IzR%2RJP1a!C3KX^D38sSt46cD05<# zqG=DCBO{f}*DGAqFxX}w%jILK!QfS*Dr$SRIM0ECo4@1ZhvUOm=_zB!woK&T*o0%o zE5EQ39wF;hDk;)+983VXj!|yQf1>j%M|y(vDsyB3A@% z$4sXKd~EutL`fA50U;rt!8aBe2_|1tfE!!IxY%(HV8>9vVLPy8OFPttU<{QgnzW7a z%K!zltE}QW%NbVt_;%P5eLW$!7^Ly|AX>ho{WxB2CZ+(FEZaxfXWS5Bfoky=o({o_ zla(m&f4%jc!^De?!BN0bB^bahVR^WyhnW%8rN2R9r{fEx-H!Dta(r19Q;j6UBk!v3 zdWIp%yH^S_rGPMf3_b!73$Wcef~v+R-HJdl7+bW}Q3nB9dtc*7#Qj$AY-zGFh4o~4 z!1S3FSXgjo#UVxL2$nUxZv1vuJOjQaza=!WldBM7(SZ{4fTF-v*CDvdsn~Xmo7-~V zKex50%>I_?J}VSjHc83*v#BcDH)!Lk!L$SuQPaRUs3lN(=}QhJ#> z{^c|x3)!W(IvR;qGm9^UV-ck;TPF%t;FNHEeweKzI|iZ(83a9Op5%Z~K^fS@_rl?_ zy&&E5$*6)tjB1@r3|P={ZL)lw14cy1unbH^yr?qcwc6iZD3Qr;FK7=4S9vs}El!B1 zk7!YW2BikvAjf6M-I=c(H+-*g?L6$~0uvYlRJ2WU9!71pP%{00n0puIHj?COR6hkV z5ubx&uY3vcA&$MX4iFC#BY=Pakd*eu4TM(1nbo%%X)RG}t-aU3{ho6&vmV_IQfsf{ zeq*nQuB`5^uFA^FclOSB1mM3^rO-FPf&b-vRYWw z<>gjfA}5LE`HCHZ>@pfwgzOB#_<#^|rN9@3i6vn=n0&gHx>}OFvA( zq0vNVk@D~uxQK+eiGZb;;>4V#3d?F)Q2J0)uv?2W|bQ9IEXIU7;7V1dXZg@x{vpjY~_DHNyI zP*X#1#3MuBo&lQ+DYDUrfPWxGvlTF8J1TMQh^$8Wc?bMP5fS@=9aw^?g*E$}IY;d6 ziC!YrE`Fn@H45czLu?RJ#eJZ^&LSj~tcpX!cvSj)9PJ>}lJ~DU zQ4{(`P^>sOjZADCyZ|TQ?4eO^Cdw2fbymhJ*zC?d3)E1^43QFCEw)QJ?q;`crmE-eUXU!NTl=2MeHj_5%r~pirrNOSv1JDh zofEU!j9`74U5zLoiC3#yM0hGD{751vg_9h*nqD!5S%11lM2KN4M%;~iH1Joo!X#_HOpnrwO{>vHJl`e6#UtP?j%vfg+d|zPNKKPj*g8Sfo zWLHwWEqs%)NiV1HUC>v;strb%@h4P~6xuVky6&uN2K&9vR-19AwS$xmw;6f>n-eo` z=xo*_w+YdH}lIU(;`l=@Z;c8 zZN6YGP#PX;z4}svl9`cFHQSGGf1bV9be&OVyCngXdFU4 zN{&6{VL_|j6P&MAMk1eGwt(}6n(z>>1%*8-jlR9SOPe4{o}NV}sqwIR^B%{t$4i*R z2QL|LEIbt4D$xSlu|VSvbmqRhJM_JsaA${;z9J^K*w0&6@v zb)a>E248$J8WE$5&4}7OEZ%}YLs(3Jg4Y`$V51Gb^<<>xtNG3Nzg0vup3q{Xgms=a z($7T<&K9nWV>x*=jO9d5-7pa&bZ30B8@_q-`Ipb{7-h!oP`3Z_4y8Ll9K#sSom`}S zrG4C*imj)ZV`rf%NjU)0yKYoS(?w}~#b^zFX`dfX8)#S%?yt>c{X)15G<0(wCYPg5 z#JX^#+zfAOzG+`4M`2D5{INEu4aA?c_2H7m;Y{US6uZ5KWuKm_K&t`vzQ$N&b?q>c zR8YN;m@9iccr#RpP{H3)tqms0gg|I1+G@ELEUCFShzcRmrpgI%up@t&)t1C+vJhwI zG|kVJJ)IJTwIH84`Pq`m&&vZd6<0fpWAnfK0pTgAx2t(@Z z{ipla@88@p-vBsE<@l;^F}@%vD0;QJ0`yfgxg27_5FJ#+l++`}(b;RYXnEz}vxcw2 zdTuT~_FFK@{7RyBwV2UwjR|VFR+h*Rh;p=dtG0n@iX#AQe0hb3reW311tB4qsW%r| z_LxJOui0#qOCp%!W%JywHY2k+M^_`4Abb08TC}eMianzR9YE_S_O*ynR@2}0qKlGPAc+Es$&#`~^0xL3|5@E3 zovz&=T`d?f_^M9l%i$KB)$tS2Ubk%X_bCQCSdLKb4&itf##=(knCGF~3g zf~hID9}pM_vMT6(=80tIX(R2;Rq#R-Wv#I8A0Dsc+i^b^L!eXbtCG$b{ zazH)`o)EZ&>ZaaT^)lj9YD5NNwqfXyjCFVj2Ypze=2m@e0)87sVz9o@ORSzAK{4}O z?1~gNpqNzIR5o;;(Irr`Nh%JdCbUdOtLJxrrYN(Ue|Y~heuG5<{UBh6 z%-~`aS*HfSLn6iWet}?(bdPY&PB?l}s!9igQdc?{eilQprEgSvSfk= z9aXxt7EoU$^Vo<*xlg^WjtX?2O0=h**UBE5)*A=|$1nL1!&~EKOqDcT2bb$!f*=Kd z(e5?TX=yc1j_bTLgXB!9XDs+@e}_%6t86Dh2W)Eo;@m83sqiRf#YHV4q-*j%I{R=8 zY-H+d9-!q8S+2y})=i!PBRE`BG~z?(ZL9Zy?X4PxpG21*mQ%*x!VeAyR2FxlG*Cwu ztqCJ~7dKO!+0)hTa)p0<%R9|(!*yF!3jr}x-Yfoz8|8=tf>G7~c_0&_G!JF`8@Pw` zupm4ZE`W5ifN2C&6{5fUd{f$ohy*Qm z$-mVQbru3)1I#zfenORZlzH@;lK)`k&6z~j7P$BK5Y2HAIlymh31~so!_ocr8Vn3x z>6xA+zlC19DUvpTKIyvcH}tCWxdm3S8uQoQhA%$+f$w2gr#_D8l3hAz@}o<> za!M?Gu%tJdw)t|DJshBumP~PTW{MO75nz4=@h1S1Ce|+zY6GT{e-d8drG{EOda53_ zd>!e1`=`%quYkib#uZa+IipH`s)p#X(G(2k<))kQ^mdN+p${MI`|wCY7WOQyr9}dj z*&M+-dDUqi-&N<3A>3-kQ~BWAf3}70?3l7eTF>lBN#2JlCD~5T!oc_G?awUT@CMEe ziP)J(E*9iiZo9(MKGhvudj@Cn1Yg-l=SxkJQBm5M#z>D^xUTY2Ju;5QA~d6HvbToE zPFB@zjOr?C0<<_-kU}2zY~y8%UM$66l-i}}VjHj#_rlCSZZYCn&o3UrWo&tI%X}u| zC93&IlZvTCx(nxcw2KamphQ$n?=OZFpy)p!&W2o`K|xq_Q10GD9j z>ck0BCT#hmHrdRx75>)6bVZZy{;?Q*n)*s37^tih8X zX$*ks3u-jX-`cFkbW=)ANXG%QYn3z)Kyp=99o;W<$9jb9dG*aD!-&$J#xU~Gh30{2 z?+g)@r8qH`RX=qr_{lcVQBVfGlRauqDx)fx&K>GkU}y7qAmemZ+sh{lith!|O+(mJ zE$7`7Icl%LWEun0OF(GGyE-KLrSwo&zr`$Hg8Vv$xOOsjOx;IlLRzpt$*C&dp*pcP zu)9tTP^bio*eIe>gY-;sj~4AWu*r|ik#Hmj4R~>8tvnWpyG)XeXoOzzTk}0X9UPwR zOdhc@9)9@_Cr+ndTmRXEj%@&^bc5U!i4W6~l09q8*`7}NKn^tYB+oSLbmfTBqQ_>x z_eJd>!_Kd&n?+uc7XUG&1loUvA`$tZ54>SR$8OoPI< zg`w8#{z2OktKtUg7Faj&&5U}5i5Zq7_e1D&!xIAP!4RO$^-7rrpM>3*ajpkX)79{0 z?`aR&NlcXwPEFYwJWyO29&FjT_;hkpt}`uux-v!+D9&0JS3M0jt{gE)mLBH6T3{n1 zj8Q{^VtDn`i_4cN!q9*fLXd5w?6+CJ;0a#e7+BNjqz8aOBw?_O_>kES(l5#V#g#kV zu()Arg|~xi08*25DSRXfuC120*wd2>CK-XI0iA6_E7E+iS!mwkLeqwG5T;S4ZPeMA zFS7(pjH$m*Jd+tWM1>3)!t8))JI3C^*Lpx_NfWq8ha?FCd$=RFG*)`@Th$?jmC5uE z&OEy^qU^vuG=;6Pa47Z8qAd;3lW=!Q5sT4~qyjv!$bnPQ5%t4xao6HGGYgncLl6`Vlhqmw!Z6~MzMD~>L+!+~!sN_rvBTN=Tl z55}2=DXVRX{XRz6Oua1=*-`mR@1mPiOxEoZ3#JbbL$GPJ=}m4fS_r_`&>PzB6RFm% zPQ@11!2Wi9(Re-Aw9!E?CmH3r1E&BKdNtCWE;Ye9lxy+!{rTsgHvb-v_Slh*4(ZWO zp^uO=yCB%O)T7-4zKoM;t3<@8baY90W5@gEdgC0gB{$(b;dJb@-nC$z?(`@9K|^ll z$x6BVe0V)Z%GZgEAq-joYuG}#C%1488>5b z_zGY~sBSt(W;1NW-Sp$@H}`KpypOjh9PaF-F=SE#3u`#KLh8U3X3_;2hBu;tujmk9 zOnOoHvgiUI1ldlT*u${b0%t52GHq-M6&?zQ(Xrog&79#VXeRI*E zMI`<(3|xNdXQ1#Ib6}9dNjHRt57D-L&eafmpSVBfJV_j*%RWIh5hxbCp&>5~)917C zj1Ip>W&0FJ^6U}KE+3da3ra_{YD^D(7j#o|`apAFb_L}g&KKtPei(IK-3aTjL@!_} zMX3T+41mU9JcGc!-Oie1ssAL%7L<0VnqBGe8=$3DmrJ>wJE_ z%4isV@+Qf;pS)jajNA3~1kMKT;hz|NJQ1y8h6=BsqO!FzQ!@pcXQ16un%JtT})io9{@u?Ad;$H@Y&u*NbgR~xD^a7gsj^be$? z<`374a|jJgkAYyUSG3S5thb{bCPj0uTKyj3J;6su4*Ia)v17ICVH|ss@=<792pDilPn!yAVmw!N5OPfSRA8@*ooa zc7u$@0k7md8pR{P*?IAZ80fI{V+bn*{1~odlu`$f`?J8sa&fo{WjrHiP|B!xum5zn z+uZ%@XXF}q`}*B(efQ?>Et+szwfYpmGyxY_cAWlr_;{O8t8CQ7+m5Pps27YBQn_T3 z+H$xm$gN@J;W@SbpXpb`vos;Y1pK;{|Dr)T?PjA&^+ zYk&&!qU31(or-5#g|?`cVDnSLbz7n}Q2jJd{TfzxmrHFmsMOm)>K+@`2mvZMMxI=# zJ{v-ilCoG2-AdHq*@i+VBgv|9QLHw;>0)=jd6mg2F0fqKBWHUw22D`HvgFQjP7>yu zQapM%UEP3v@I1W1f=iT>TR68R0ye=0t!e0)tfxb!MfpFZde8ohC_1!LZYcLl_T*59 zojxQmr@#&alR%;ChvD2kOc2Q{V47D_5enjyB~y@&5iXPVa2r&TP%-=Eqzdx_~wTMLBQWW z;dy0K+*@{_(*kKnGfuo?P+|Azrdk32*{1RX5nxS@9aErb@GkN*%PurAkejL3oDMhJ zWSIQ?-c6H8Ab~88J2@q8Zk>Cw9CCvqhg_`WW_-wasLkZ&iU(V4lX|P~>8zn@5t`W+ zWGS&{wBfop29`tjxViuE#{~+M=~!}I zWE(0`DG74iKd3U&)C-3+1Bi(;>Z7sRF+_x2EGGq;C09u^N5B0EvkmM^&6Rg5P#u{) z3#@nk*4*u`5la0Zy|+L8RS!U@7dhne3Hx5J5NJ8aas<5Mw|vXYLHs|@9z+j)Xl_{& zl0RnK5#00Z21h_H17}PJWlMEmov&Sve0Ez?UNmvr3X&j!!UaN)=-%op(`?sBL=3|} z9U&Pt{x+dnO%C0TR-778#H(sgQr|!bH((j~d3swU5;`ScqErC8-m}V|Y(4KoR?|y! zgfyC-*k;7uzJb?L70Fma3S4tkPQeH`S|6%GsfG1>sOe9%owrrqgOGtVzO0>cjbc(q zX1Y!XO>|Lt;P-vGXDT%9&vd(fmf|<*M#~c@R^nOaKZ1jV5SPe zN#R*3ni)++Yf7+Q66?eWA7~xmtyl8KZD{qaq=>0j4DzNomNllN)y+RIwhuO=*XN1D z3u-D1*DCYW$pGO&M@@@v;m)CNDuq^Xr_1@Z^48~{Zm$Z6NJQNk8B5NSx$41whhNw4 z?CZLno^$BVDpGkG<|b+m_;K(>lAIrM9Xu7)>;{rFwY2a}z@coAZ@a5eh%EBu^|!WJ zyNNF3W1plY(-a^E$!oO}#5B`~MU zRd5h5dseu*WT0Nf)r4PxB9uLUycBt49U`Y96pfG^E1tgtT#Ovd{`uPT*4SsPbE=C= z7&~E*(!a%I)T~0;Ne_;tN#frU>cC7L>}*v)6GDE91cg>{v2LsMH=h1GxXe<2qa^-j z(pHUH*3cbDNs}+Nx}H;6R4Ql zjpjDa2cO(SLk-86UEfo^`gI@4YIywW{Ztym3oDY*QqGaA4h+Zz(nEzd`4c4f&4DW$yngp@umAiB z+11{?eSi1uw><<6-M@Wy>T=M?S`a)M7u;w74%NRj85QJh4eOBKjj2g`TJ zE<58It-`-F(Kt@Hxj>4j7S6@WqEWpW+gDjNilH#H9Tz zXk^l_))*-Ec@RvOOK8Xe-o^Jf>`AAf+2ZL+tF{_Woot(|w#A}vk#wovGBr$3#muIh zNd1hPGLi7`Oq>yqhT~43gt`mX_!|NX% z)zyvwAJ&8ie+VV9l)Sy2N>3()}c1~!00eP1ySnT!i_o11uB1O0B)eh_yWS^9>477BNxq-fX zPs#8uF!ol?Nb!)#BlcXRqiFTD<1kOs0B1vU-q3~@0ufI44zdlDRmG1FIk>s+jvU;? zjZYTC6$vBmW&J|@8eJOCU`bu8_B_q_Bu?|{^3@z!G7{|$ZpYh&06UELVuq+%tRPYD zB~F^=2fO%~XJCC;tr-rH99<>v7)fg6P_L`>F($!TyJ!)<2tKIy$jSH15w;&c(5_07 zU3PN9&B=k!&JKJwl%r6yQMo!cg^M-kR;&vhO!p{qo1ip_=D{J`QP9^0Qwdu?j%ZS9 zeT&!&vdWCzmTw$wIu^-|Cy-5KD^zC71;VckT`Y}a=OJE!s6CTT^tPAvXn2Ieu=a0^ zE^sCI>u@pVX-=Cb)5IW@)zSqW9iB;wHSd8?m4c6F`u{ppQb!j}iqR0tx0T$WPcq%B=gC79#O8W2K^X<^VR*Ezy1u;j)9;DnBKX|5!P8HZVUW8_dttIEX>NT)jnlM#zO(u+n2&8dpM;P$Jobcoc>1*1r4prDS5L+(%0?lr{Zuf@2`vZr>!)pK1GKXq9(pF=aaYu;KZsK5MnjyGtj} zo0=MV5DZVr&{-}e!+dBie7jgJwYu;9d9gmXZ7vRY!bHpr%En+Md|Hf=7_>(?T}i2q~0=3){HqSFMW z7n1&APhP%~M{2#Afj4y@%^epydwoSs*9lxJo!v2q zMGL8;6_6xC&jq&sbH0}@_FsLMZ(@6~%xJj)2aYUK4oeKXxm<#GRg5o#Bzg>Soo}T$ z>+tbxK&0UtUt@W^Y;|mA?fMQtsnllrS$K98YHn-M49Co0%$HdGIIIz5ro)=bq;Bv1 z2E=I&a(E##F5>xod~_5tIwc5Hm>EE`Mdn;kwQ@MWo*d|3O6!B`-mg*J#IBLg=kL(w zK(xcR+v+Iu_}tJ<$qG(v{`~&U?>|D@_3u#Y!R6T-ZVR6BsO9`0 zw4RvKXgR{5mva>9+P;F?D1Ii@QQ6>HA>5K$FJ~8*NsW_Qp?B)&i|{49*WGmTZuCXw za^lOXf}sh)@Ph&}vsKPeYqpyphPWKPMBm5=GG3Y!u!52gjc_oHn96YD%%sw7CA=*I zol=5Y{OJP{v%P(Hr{fla@vF9nmbK~@&~Ug;TUrBtUvb^?#q5Z%&pg8ANHPwzD(1%< zMMz?T3bd;01*q`Jyb2%LQZ zsxP)IQSOMCLz1^bOI@`#s5g*e@DRTh@zym9mn2bfUcfu@mWAp+R5!$g5!8cHb??TP zw7LLeSd;-@(}M#i7cTMyV<~IgYXCI?nPF@yD>9P^S(!c}I&IR_ns2@20L-0Sb}$xGll#{gLvnu#YS z_zPyHptEfthQx>-Y8e<+(7^Hr&|k6H47dH$gW>w3|1121l*1sA=5vg>7bala!#5hr>x6AdoXDizU zdIFn^ScFJkd?vQvoTpbPaHHw67%i&ajLj+|e2b~??qCyLV&HKb19fERtlfNJs16i4 zk%2ib^?Bj~v0nQq6o^_AD#XND0Zen$^7>^1^Y`z20W%&aaP&M{2QsAdRUtYVtX1I= z0ot*=S?f@+pBkc}3b?uD*sW}Ij1Wqhq0y_3_=SI#YP`~=5*c5XS94Z-WrpWQ@k5tn ziaGD@P$9R?c7f?SOQD>DreHl`C}raGo+VC?pIdiH$cT&&%&1i<8<`-)K3vBx9vxA` z$3XQ05&*E&eaaG4-0v-8R@5|uT!5~TzCRr0B`=^o()KsoBVB*9{TPg$G|8rsULa_W zcJJAEKH*_&TILd#K*opAO?Pu`9EknaGSX>$24X+lLTa3$ii^k!&y~(B_KsY!0)WRXU7%x-E}TwQuwSK- zmyLRmaZ==>n6;a$4MtFlE-w}Ukezu$_xIec1uZTka0TB7HHepg*U2Zw2BZ*>+w0Nu zLPuVBBo{z^dqK8a+cME>gE-Ml4$!3;OekO#g8OD(M^e}nF6#Ax-P^DbMJEf4=LYGm zmLnp)_QOd|?r${(%4%BSgN#x$KvdFd%lOznY+5k%cV)Trw|-Aq2Bf=#eR$z&fMZ)T zE~f~h0F>uCG{Y06h=57hfIe0kBPq|=8U6&zUMAg9;&lC|0)vdHu z0;;6A3LJaIRTX8i?n9AA#3uWMLLWi&Nv1e;&}OHQTz@cRA3&jq3l=h)#iPY;C0i*% z!ei@M@u2o9?df4Np3Tzk5>_;5KZ#Cb{CMt&Ay__Zj_ysUrcB4X1!*%IMR9p-FU_*8 zKg~rg^~^v$EOviorbr83wQ9VaZ%}kNnj%rOFi2(I?9o7fxD@Lf%6F;7xlP~)?c=4# zA;eq@u1KV4PK*z^E(J35=pLoj_HTiRI(T zLrV*-lWyE5EhP_U9-&cWb2Nn3XSKV9-^+T40-PWz+<;(TZ2Qxk68riByn&O0UhY;> z0H4&jfsPV>g9>mXS{JHSR27E3NvLQOFWkUJFxq$sVq3O==%4M5jG!nP$T_@`7D&Pf ztOI|uMk>a0sF+~Ex6EUKvfTT50IrLD1soL;CxCXX{^;p^3-h+Q-W>ho@!{ZXaCCfndUSR&I6FJN`-h{mDID2# z`jX*94nf-plorU1qYZ^tkiodfYk>qjLTfrq{s4|GG-XISQ1VLgrQq(0FUv*{xW!Q7 zD_NyhreQhw=xj$NAe;eamI>zz>T0E?1Q9^0twblL7$A>P%o7gMT3zJY&?75%FE-CT z=lauXp&B4VS5#Zy(mY06C9SZ@q_Eio(OTgHrVFPqbZFw(lyPE!EMUknmd1#!Np+w| z&Atu;m*Nx);z=JcIG8p0XrW_+-UU8e0ytOcI8t--g2=+t!s!8>A-;_*jpo@zXBCpF zj6l#MrRhJOT&|xU@?S?2>~EMb7T}~+pPS=GzNaeUGBf2{2T^xK4 z5|w}z{s%Qky-78fE1r_>&6Ol+wCbE$js#uZE)Xl7i7YCcGUrF+KUUB%kxTX7Q z2;~ZWJr}2=Ja~e^kPRx7xpa7U{Y3)Eg$a2<1$_ki1yiPSX za9c#96~g^!c%|)YVtuji05E@GgBbDlB(1JCrqzQJFW!3&Ye~nVWSE9!6cS9zXf&uZ zA>mT9;bKG%sW={(tEQ=3Evj}PJv7KzT7tZK9ToFRpoS5vdO4E0B4ivqkUXJ9FSAtC zk@DTKRMg=Y#0?IPM#vQIx?UA`oh|A54B~0Nr&jSbHR^-nP{6S|I!>m~RhCKU_te239OR_iF~5*ln1o@l5YqGCVK%Pa6XiWhv)JF%8c*$VtZa8R0E_z zK@9{OKfWQUl%3!gD6^-BHbJr`y?f*LP&~n zY2;F*A;d_T!=_hW=zhyF2r}=He_wv`{}3R;RaT*r$#$xRjSJn0L1*y}Qvl^w!~3eU z9*+59$%c?ujT~mD^F-aQ_X-avjzAO2f1M$tVojv3F2eT!QeNF4m&|HCTQacXV!cF) zpRArdgdJbv;YtM$^Ii>mWG;Q^Dp;$0$lkg5A?pPZo6JH90J20G-zYVWC2g-5=OcxZ zQW#K4!XkRB=2G`|ut@*|F?ybmwq&>*Qs8XPu^C13Fk*Wf)b%89<`pfXRX0G4&3CI8 zFJTe=7iWzGRhyX@?Xe*?DU}5%)ju_R+xGWCGF}86AHa?1H<6C%xZ&Be^Tnr>vOfI_@ zY-48^UwTv^Fd?U6f_x=-x^{OksYfA|tT+JQQTAnds<}!KnCXeuXL26cpkew+QYSr} zNjyB%gQW!{X_r#Rt3ltL74~2-xsOyi7y1Clj9%5D&4JojLHo{^Yn*}m@&yJ|6T_q1 z{HNwRru?_YBhr(M*T*0iWs51T8Td!kIu6FMgS+g6CsN)KBn9D2SzWvu?%{6pub*Fk zyxV>J@Zmm|+;xOe5x4H6Pis<6mz;>}{A$c^hZIf+8#L3z&~(R0Wnhzd1u;<`>|Rq3 zc&pq%WEB`Ny4xZH#|TnT)@OTpNNspbAP(#(5Sf||u|F|m5VcuPyPw2J*CkdUeJ6r) zl{n~X0;e|;pZR1P>WN?)Fi`vIOZb;wCS`C^wQ@onq-Szll0fv=+M)K-kd($xOD8xU z-b6(s8L4rP$NH`ox-DJl&N$YS>)>X4y<%j38RNgVlZFNUp4$(lRLp|b%ME>NaV}Z+a+fSi3N5W#BXA$$)Yjn(&2m z|AeEJygPW)q#XFIQ4uvj^OXi;2>0N)X6O^HMSs};2PXVVck4>` zXSED3dBR1?%mSiO!0ZyaEW!|q+Kxy4`P`~I>R0AGt&|rga)tV95luqFIuv0@f|+uE5#&%+a32|2$sE2%9lJ@_XYtCa3v> z^o#6Yae*l9!!LY_+2o)X9=-nf;|BQ_KYwCM*B|eGk}a+U7~lP*8BAG3nn=p&Er7nN zAzcA;;2yKr?qb`LF36;dFw{$L&YK!`7w(-6_Ra-r1Hj0jy;NKa>ue;6DT!j46g9AB zQ^dm8LU%8dr4A_WDL$g)y`0&`3}eui6PRj=!tDYM2Wk;(;VKJ-;+u<~X<+3s$Ac;- zm^g|>cie13HM!*xLq|d+j6jMs!!N72<-9hv1UA<4OU*GR!|z+b%X-|Y?~;I(5b9m3)%fBw}7p&obl+b`3%(+|Qyw9sB0ZP`Ds ztk+K0yri`-4Naq^Jh^gLY|?zj<>t~WuY3*ndOqsDu75a+e(iY9a6*y^!WN&8ufhH> z1KA;BI>mQ63p7BJ$)a>;G3>&+D7?r# z=GGINNqNAGm9!n}v`j77L9SbGM29^yS*3P~c_s-7L;<_EcEK8$m9RfFAFL#S&KB;y zVB)AJHqNZe+I`(~%L(>1a=_%Y3=|hr1aBDRldcW52#Vjr8l#(3v!sleDF6kCz_C63 z%}Q}6?4+?u8G-I;X_cWwxl3@o)W#8kn7kxGNW#E<1r4f-Zgj+dAhT73f54*3g;Sze zNx#asYEBeVpKTVKQkN26^4$2No6NfP9J=CRHq+&`-tag8cwt$UWG!I~u)$ zKNjNF|MC~|GV0#$)j#>FZiBP0>UMJaRo%{xzp7imKlr+S$6xon4P6J~vczvKp2@%Fc`ISs6tQDnHflNH2#npSkhm3@zAw7Hhdr!Pwn_ce2XY2{roFFFrnhv?xzgn;X)07pB*z{vSo7F=AubQUg$Lpm`iZz=m2=lV#e>lKg% zq(@|B-;>}d_jnH+>5q0Ad`+jLujzEmPRWf2iewc?p;{C2^|6VE!fdEK6Husuk3@Ea zrWn@Cw7m{TDVutCyo^XOG|@mjVPq$TPyfjk%oV`xl*C<&%@3)K=TNvw*jtigt8tHuMo9S?p3YPmaj69;{WJ2+VYt6TCsav|3b;VvCWBs;zuYsBZzF zIx^g2tK0g^H>vb->V!*rfwc$ZYjm9QLuisnYBtb2A_ILB0i#`S=5eePiOa=>Gyrj- zPZ5FjK;%XtoHYvJ1P7DL40jqs$ou3x@tQMbs$Rcbg1j*P4MU;p3}}(-r!er8aG;*Q zt{(al><<@w&U=m{ah(TRI$j{5$?9s6^MqAi84lDeB(3%2cGg(U3Z!9Z%0dML!=gS- z3Iw?OVL(`67`bNj!MW@`Ny6$s946n7o8^Wss`V(#IySQfU z|8ZtDc3lC`?WC#MLyei0z!MiGze(l5z^d-M(ZoWIswo7QID_tG8tJ+?oXy8f|C-ZXqlcS^L3>Th1oA#F4gR{%|&= z6c9WcgotOMbi!YOe_ftXjVzlb_ z{9?P96hV(iWzgf1Ob4M~1+k*?ZZ$_fUOadpVTB~DYL!?)CQ5lK(|DZk)2W<*8dJg% z^XuDPLWUS!UZgwgD6a@zie7p|o>Y#jO|7yL4dRd)k#dszXwo;i70Da`&Fa#wGW_QE zuRn@Cq6*Gz1XSDcS7X%NiyfVcK@)eVx1EvWG@sFe=|fN?vg2J{(UG0x0-)mBW%6i| zhuNN(M&ux3uy88EYc)9fsKH?|kq+iiKzTCEeN59&P1cm2VcxKv!?3Uy!4%o0?^Oqb`FsD1_2BS8`1 zA_PyZ9MVuMV+$sJB0Lz~YD`@u&n!fTRk93YKG^(FzzIeI0U zLpV8?9iD}ptW$v2E;_c{4w10F)q+i+yrAZGPR%JudrB@6JZiB7UEnkovXfw_@KiIk zns$tB7}03VOx;I|&QTGq$g88lRAihmSr&EPYr^92#{mu`IW^@@4jO~6pp`HHW9~s? zaHI~#9f?oirh+_TGo&iK5brL3L8gKLvMWC$7V`Rhx{+q9Y|#27%OGOcfDZIzoNy9~wq zoQpSc$b0G=eA^5rMetIClK6PDWeX8|=$KRTcvv%Gu z>W5nG_O1}^VjB@%S|Qx}Jkx(HQ9?!EmoFU&EwiI>_~3cM_KTtx$W#we85m`1%v#S- zfwaJegXq3OX~EcaJjNF1NNNY<#x|Mf+)5O3zpQ}qvk~l2$Sb3p;2La`Zd#QMGF;a0 z)xO9;y*XAH-@Jl#y$QY>JsYSPaYfts`(fLek{8}{%M%#mNE6Uf8_9YOpVB&%>> zOY(yxC?&3-=QmipI_qYC=Y=4}=>hMdEo(aQS0GKNp&Lo9k*tz&et`LAN=Z5eVE4i| zPvKZnKY85uz~Yg~e%fK$0Q##Vh^)xMGoLFB5B|t7V!n+Ga_DAI@tFqH6G;q0>UqW! z6NUEVV(%G-EJ-ZgR6`X8XhjbY9E&Hp76L~GPE71gm1t(F% z)ZI>B?R}(qs;-1u`*x5xQlHa(eew(36uF+WEWBQljgx5VGRQC}GlvlxcDN%Kmiwf$ zsB{4bKc+~SD!j5dM%uvAcbJ|*d1a6kD`O}5iN|GO$i?Wi8Br>xS%nyChf8sxIk z{1tQX2IB0#g&l-9HeUJYZF)+)zOA+qZB2z}ThPIWpkFqGlKsYQheQlA}%{W_gpJ%=|Dh~>&0v$Iv4lrM>*=e(!F=F(7WRe&aG+j|wHD}6( zYNeX6VwHHd@_Ihfq+Lv^SH7y)6;WJ)MfzR<3?700ojH4jlY6 zlwH^ohENaP!z!)^K;H*?){jNil3eGl953xoxE^}#p@TjxOu~jMMm1=re%sHHvoi z(6s;XVtE7ag_{Y2jk)Hw?!{e{)j{>hpQ4X0RN@18@To!Msy%Ao4{@9&t7jE=%E>Q4njo?O9#6uetH78##%&w9EC2k2+2Osymw@`A_&I}sCdtv zP{_S%{s}?^>gXCp^15KFDYZ)wA!2&L)F4dxtg>S_Vfuh%Ol1TDKeMQUHR>NpOOczJ zmDHNXK%}UqTEzIrv>A~PmIfpIdBJiudT#=bU`}F8#u$;5^orA(P`%dReOk(%lwz61wlq`Bo*Id@_6_UkSzNfgakv=+9tS8_DR!!cV6IMd?Y22@cb5otq zsRh(6`qn~L$vHSmr9$07HyXj`LrqtlHJX*3L>9@Eqy>^E^@+SgQh=5nBD&B1fKon< zopd6?>g<-E@BjGueslNk?#;czP27sq1qU?^JE`}gLeb@v|5E58b)PA8u~LNMz%vgU zc-%CKo|<-a?`@SEP09A*%TYO(DS#^P@YEJ0oAk6RKgd9*UNb;`pnVz4YClLkl2Y7% z>+!*gK}I_193C7k%st4hOGyQB%IL#*;nEmNmQMw{3InOP>0l=H5RoDY=~Y*PgO(!; zIkXlK*O z3D1dOvu6JjKUtgY-|cBfB7QTGHE-zmfzt9Bg0cWk^S$DCT5Xz3P@!u!a%Wy6ks=@G zW9)?Ca#CUrjAW%{tH7afifo@DCWqCh2A0#&N##r~Z>JQ10-xeIBq0Ia#vY9hT0N)e z6x>J(`1h#S)o5P{SClcbcA$#fZu9wfjG2x1aBmy4f@h=*3bU&pCM@%GLvaSI5F&31 zzVe9*qVj8Y*T^xoye*CzetXk0` zibC#Ab2&gLIhS zpDj%^K2!&$u6D#>gm*JxAX-x=yw|sWHDzDAVSWS?>r8O5lXlyl!T`RFA^SR zM=H|1@je=wwngrxnF{o$`>`Yx1oUqZAiJksuN4OrN{KULh|;Bci2S;{$olda%uLw= z-0BZ@Ry#naAIlOX&fF62^K{L=0*7s10qDm`PUc+rtvIh5DH=e1Y#@sH^w<4sST#4{ zr#XR^X^fCZt&U0^O7TjkMAct$-j8)b=9PvQ_hR3>yCgmf3Y(lM$$4uI+f|)_)icb>Hq>n3?~9jIZTRAZ#VOG7 zqSaB);WmNOFE-m^^n7Vy#>KThOkS#|U=-kmGkLj!kLtnG{^5XXLEm_|+tg*IvWs_T zu--)~Dm@9>;hkvAWcZ>sfi^noL{`_R9J8J{pN{tM=ax-#^8$rt#FoaBw8>szw+p1_ zFkg*nCL5VYPmf?Rw6Jgpu!rza&$(UvlY9*#|4ZFRPZus11%U&ht0tdGg_BsBK{cNixZt= zKhVE&U-e(`A0*KN8Foub#EEvmoy!7m6T1pBacxnE246BbBp(f?$6vlsScNweqQ<7z zcoV`vjEm!}a;flWYTjom5KAphqRcIb-$|tB1XKkoD;^CrP-U7bSAN|h{>(-sKi{L> z9Fuc30yhhV^NZdowF>x;)=(>clySfRkNxikhu;m(zB@TNe0J6!oZLNq#`;GbP!=tu zaY=pz#iH%)rnL)_gL+3>7y;cLNT2#1{3Xd|mjQh)!x;&ur&`oh0)WR`0~2GiQ+1h4 zg-(j&KNgqz?=E$YlT*MnWPMON=@}TP&+hGM7iMrIrRWGH)c`C89NC)?%98;s*d8yO zmG^=OiTECXG%oY}h+x;k`3m`5u&i*FM*xqMOH!mj$cK0&b_a*MU7;TxeoIlTXL!qx zYl3WeEy`7_eVf|ZP$BkhF(a2t$jD=y5f)Q!`I8`qxTy!fj?IIXB5Bc%<|J(}Unn1H z*$H^APTs%%-Mc&3Q#SAJ?*6#=@Z+7%Qa7-)p+aPxH8{*R@D|%IX_T7#TGEJH6Tcs# zMw4bW`PYrGDVS{8gM-|>H;#co0?-SKEO8U zU|%vjoDWQMrwI`%S>#!_=TCyEdpx-amrC~T8fMeYnE?mc5lN|5bqZQlvPY~OSnyH7 z&Ft^0CuMDTijVAdv}s}TxuKZq_4C~iMIuyPCPWyMyPMGcu|ASxI2m4l5a2*<%m9>g zr5!Quiwvmhpj(BumS6)?M*X%LrtXY)2PP@(ok|I6By^!l5FpFdSpp8Cf4EP^N_wi? zE04(ISo_X+r%TOb5?1KW)s!O}Ks_>PG@1uX0cgGZ$f!}j%gfKXPY+vbZhfcYJc4J) zjmy1X>SGE@+}%O5SXlDp2Tx_7JMnRnE3n3H_|-N)_sLsWvt_`W{#N=Q@5z&YH~p<* zc)1c_p)GTB2-DzoiGejP;(?4$e?bQMMgLGt0wfr_(zof`BLvw|j>+ZIjvaAB-$3z*1Q<CDWL=qI1i`mqU0x%-r)%yBg z6t34rx(}oc)+CT8K17+i(85!wyoR7@e6G|QUg=RmN{11p)Q0QBb+$pE-k?ZIL}trQ z$AG9Ij2}o&udoo>y~s9CdR7B8bO5&2Ot~*oPW#qqg76Kd9ci`bt9TGaqKxb#UW6-V zpsx+Q9(M2UUVplWyUh+6J>R~+`_Z{4s;H<10RrQ%4JMZ)TFMX9Jx@uR__-dZWTi7b zN@+^@?uOIbn{x<^&zvbz(!}Q? znd3F4k`XaVL;~GgbtMEK0RiVIwsQ2G3P+5qcTjHRnBmD1LgFqLhf-Wj!4$!HM)#`b zgNu5QaV{VgyQpJXQYl(NWFIfDQ5grU_nAa_OM(Gu-U%KlmLATmf}rjvy>x}}&66k3 z*SqJFS8)G^&pF&ObfNkPJ7k?gi7Ka%Rd9rr6v8gFC%Zz=9_-AU@FNpC$^MPya~i1i zGaeS09d%-rAk#PUXtRM{zQ&mfq(=ztU^l!uhd|uuUBm2+SaGJ-H!4wPEFs~u=yoG} z_FJng`ouHA`*R`qY)om}mS`#2yId};ZZOoka8L^ui`+)`o3>A{%kDW4LrI+xU;IwfnLEsdOGoM^tAcylYvc6nxrWi+TJQK(X8;AGA1lR8+kk_H@z%O6JOgi-MaL zKIyf}WdNUv(R7HKBxQnw+?ciihJsB{hH&9RP==v8-9Qalm{~!Z>UqGiF1PUoo*T>T z6xJM^X+5A@-ex(?aj9jaUKAf3@(f}P5e-X{JD?k+@qSkjf>6@PZ3GHz&H&8~)EBJP z(T!Y9kgcE16wsHN)Ow~;qs?n^B-qhl1LPJ}^^nz!8B0d?$JbM0XLdr~x)ZWd{P1t% zibDAQtMYs59*g#hxl0Gq3Z4=bi{ITtGX~@8diR1Kn9`PblfXJdBnlodma<6}u%Sg3 zP++e&f;-x?e?0ofes6HtKRY~y0{!44T>V~uy8E{Ge{rL3R)8Bo3 z4Wml$Sfse*YQ6dHT~&pWnZs z(dOwVxE$i|C$#^=WD0@)~Sd-1P+J z5F79aVvZ1l!rm}(y| z&`K6Mg_Z&`SfQlwaTdpHcL&@V6ba$a(EAq@skk|Cv+hvbOwx275z#S8U*kk|E+;D3 zffTis5|(N+StMtf4ki6gSx~B$$b*vd;Abc^K)A=C-+NFW{5w+z-}Qlphz zYnG~|ksC|09=hqp9yO4nd0mE+4gq`s7%NzK`0sN5N|u_cMFb9YFV5%KQJdY1>ls4# zuE0~$pi+mW>nmK+t|1z_Nqj$*LNmC`i0L4jF_;Qk7pO0ixZJs;>XR8Kfe7iSis5R{=-M6%J3R; zG7zByT&eeUG4aMKAw%WG3DwpJrdUmOY$8=6((__jpeRyyuxeA#SGCo{SAmgR&-ScB z3uYtA;#I$GD=&e1g=7$yT#_ZqwU9L|b%#p8!xWAz+0%G#fO`;A#@~O!yP% zLxB%!gIArIe9)?oFP#4-3k>K6{%>+A70F;BAD)qwIf9SxbvNr%_});6E_TTO3WXY3 zTP9DcVH!aYBpCL{o|S0S09DSlh7+V+FUHnlxt}?g-Fp4Sj0dCSl6f zHTI)Ogk2ume$CD;t{=$_Yg3R|6;=If<%{hpML%mUs3{I&Q{0sHqP#5vN3;KKw9scx zoEY!x@Y{SZaOrJv#F|`9;g-+5qYXAzwxtV2vwsavL)I?kpR73UWQH z=u9j;)UJz_d)RW+I748%fh=7KkQcE1g zz;kK|G(7<|w$Lf2R!A4%(_N(v;R$)Nnp#~B(bFXXmS@&9-LZ0B+?8oJH@B-rwY}Qh z&b}^kh>$ZeoNY?aR4te5){hKV?2Y}S9Q}EHCGUlf#5E%Zhi0%o!Welfub{2R&OIZU z?$TbRcQ0UUtg){G>8XMDp*g^H<+$HyZ_`M3yM=8#6UmB*<_&`ne}Q+RGm_ zKpJCta^5ySsR67$imEIs4V4vPlJ$m-c74>ogjmFCoPh{Eg(~9~CB4u91deg?QOaF` zl%y0V@O}u;$v43HNi*OI>4TqCQ}Q;oN`k-p^ZnhM51(NJWlgazS$Z= zBOJkOQmBBk8&L^@k@#+TjU%ieF4mq5a-Tnbx}V>@ z|M~v+yZ+f0YWGh+-F^I|@5I4W+Uo!ggPrcqVZ;`Uu4q#ESoE_N+TG-Qw=l@ zFY070r4Q2i%c=+N!VEv0pS=mSoo%jebZOGYcF#9s`g~KkA|kG|s--1E2{?s$*YmVV zqlQ=SARB9P4v@1)a)g|jC4oso&CwB(@>E&B^1szni}#36rI0~hVYz~DRLwPYcG0*qk)~78NU8z44|;@Nb%+wKbU74V;%&SL`iZM+buQ#WlsvNh&FH?L0UvRxgM0@89fmTI;JNZkt| z$rZs_Pg29wUFU_VfVvaGCYZY0xke^g3^=v_()_0@Kl!-%c?KiM4}-jb3^PX9J@2*v zc*Q(12R7&jvbL0vtelk^wmvE#ge!I&Nn8F!rd&PUJf@G8PyfI0P-qYS_79Db9{*2_ z^l$pm7%6zY{7;PZZ~D*}Dbn#Y=5(+-{qN4{-}Ip| z($oKmk?wma$wS(?N4sa{@T+tRa8gB8HId=sTD%BJ^LPr`djPrGoGc$CP21BQ7O=3j|9N-YYo&c|?Q5@j5>0O$`Z$xg5ek zftm(|7g2hJv*?@cb>xO4_p#gU_PEVgI+|1_(lzl7pv@E55!ez&2VYp4lFW%;nUI+E z>QtiZ0l8_7HjITC!r|aJlaZc=O?=ct8N3YKmA*^QcR{p)>J>;Mm$FQzETB2WMPRl& zdvIc}StQjQ4tns?Hy%XTcF8E8ZkIt-tx)mEkef8weD^f`a@wL=7uaUcbfFfapbv0W zs9GAj#+5?d4UMP`C?p~yTi|z`ep&IN>N*mJo*iOWiU%qzo8R^xPZ-)P|8;uYNb!DR z^cI^IdS9GJoJ(8~p--a#B0U`=f(omQxCA+Pab-a88Y}ABj7RR#Qpa{s-~_qn2TW&m zAH#8MvW@LA4;-MomlnkGCWGdB0%aJF!o*o6PiDJJAGA^+pBPcgeu_ZG08>fHUaO_< z=TzhB75Lqnrl%XrF8T~9HIbI=*44{I^NiP+Wb%RkM4OZ1ouKMPArsV1mM@FREve1zP>NJ* z%%E+1gJ|OXkTI7V_{2bJ6Z#VMnn5sru<%#Miw2Ds4Zi9{k5w4!c+pYgMMuSp zl6aSeIM!F|c*=3(DaU+D*8Pnq!_lQ5$zYcv?ty-AnkTsGpnm+u4OVFN<3KTHqy{i( z8eVwZnYRfq3fCFWuSNfNyv5U#_!0X+H=&~KS33S{t1&Zu@_=q9UuVCLtn29xCh2qK zw?2`2F?fwr)hN{9HT7h;*2jYXfZH%!UoaNvMKJ}H-O_SVcqxNJMi=TXQ2FqAw4Z)I z)w`E6_+xsNTXZsBt(RLk&nSP`a6Y^m!PGmM+?<~EQcnBVFA6r?Nu56fXOA!MN#m98}7(q;sEh%RO}v!n*sV7j1+@#tz9V(2!ApnknF>JE6d z+VjbLdAoxv=wx%boR7n~Nl_&vim{3##pTtDnYral-d6jL9bZ&gUqM=B9m}+wLkVA!Jku;(( zb)7zF={n7ZF3+n{aMF+;!mUwxRSJ;av>aWm?jscXKbFRkhicHVIa{ws#OwcwSzCF$vSY)X-InhKHoSblt&_ z*0be$wtZC|5kTlE#%QJHOQ{J)ES z2YzD?E;k6!ZuI5+C6GGLPX~u*J7>#BsJ$sWH&Q-LXBRdbb!nQTijWpEScqUUvPk@` zcD04Z9@rmQ0^;XyzK4MCB5t((`uiT{J;->Owp)vx4b%J}V`?Jyf;8dp!D!Exy)X+f zwTpkb^~Jov>VvdvGod@)^O&~{W1R|zoGy18y+MK4RJ?g$H5XHaLD81{h4MIMRBAK{ ze^BZcY^-rXl|Om0A@}qk@`qaY#Kbo7Bw(6{;}#xNAmM=q2@(M8@B_2tT-s3Gq~$M! zN8d7vT;(g~pq}%sm?`_IuM}x=-@?<%)6iJ0INPbZqeuXS0Th>4@Eu<~q~&XM)euXu zb9K=cMbXyw>FDWu8CaOSJjh865cWNeWm zW-AJ=gs7_>%*KIVz!!%OcPN8XHBYvl$M?w&{_hq7zw3ST-wjOtCY@uJ_2N92vSdt9 zS9QUoL9@Kz1U-GH>X^kYEUEwti;B3AK@csE4r;?SDS;-z0$$Hov*~8;@?7#0-`h#)f zaB{jEzIpTcm(TBB-&@MS7VwvM_l`51AuJn|Bw%d!DG@ChR2g+)ExNM^MFNo{$L8}) zAI>ZsKrZ_)zJz!BOBzSVnMsE3Qr!Y-hU0)WS0$XH%?3>&@SHxwc@n~3Hh(~O2N&lg z&DF`;P7G9$DB)j9(cr8g^HEFDS_p#N$`x4O5=4QyPbeIWkF05>gieaP;REaEJe_~0U&E3C#zI%WF_Vv5n`tHr$+dthQ7nulO z-Kl^|K)R&-B`N0Ai6~dSk^&M?pF4Ir z!k*!ZJwNFr0STx{_0!SL-RzY5?CTW)nDA#w5r73i%w=bWU2E4%am#m+Aqbuar2{SN zqcM>vGX!zk!%CG*)+}|eX<^K&WlMm~EvhT@(8}AG%`Do)C}Dm{z`!RlcZ&#}HMs@R z0Xk2z0|6$)6Pg@;@%#|Nu@n!X4*I4zh{|$(Wl&2OTsNkbFLGNb<7mc-CPd%w495a~ z^GI-pKke|lJzdgxIg?Fm8^>ww>Q7gTq6nCQNAN6IsU_vbN-ZosM$BjOQSE@DB8u8QlR+0}jr`LM zt1cyB4%O*$_86!&GSGd!kkJ~PAE+j3TDX#bz>F*#iaA#)o*w}>x-5ypaVe)s*C|;i zP9dkwMN*Q0Xj$}~wH~1n&Dq^UH*>%|Sdh}PSNzs08Ii@@TB-;ihTC!)Ks_uo0aSgv z7SQeUP#l1xfb9xwCc?wTU6AA4+-_Wm2c@P>0ow7);6Qn>#AX??_T^@i`8vB!_(cB^ zEEd>TJ1x_tdhn3P{ouD}Q#<1QLQuGeBL-@F*8Ar7zt1vR>x9Bbf-UBt(nclWfO3Aj zq}Hq4EWa# ztFLf?aBpqct3k7(PFJdEVVpTobA~bb-)C6x)@e!N*4}ZLU{fE2jKPrBU)??8%sVEGOP2mebVqm1ZpGs0sufWP!A8krKI<5UppBE_ed0=G4}2#ito{^WC(kPv8SiRQZoXOS-?j zS?c6xI%vp?-OO^$9~QB%JktIN<8uH z=`$z}1x%wSo!H0;0=YrPn;X=*Z_$w^TsMN2nF`eHcnAL1)cIDvL%wTOFNAklk;l{< zjxTkOh#T48Bcew3_lTI0{XHULWPgvSU%9`>>7(EB3|kLAm6Uz64x;PqX~S)~&Bt)l zDz8ycNdmPZKh>`{M9uQ<}G_V z_!!a%AsL3aLQfbCLSkPaM+53kg2N-hG~_@l{MX-;V1h`_vCU?iDLiw8Q>tM@r3}}^ z-2wLbj>w)=0W*K@sogxY1U?!JJbm8M-oDKWic+fQwkJr_Wb~9i7EE)V%H}!plXJve z0eHRL!WgJoBz3aS1P0i*^GgT=3seA;?Rf#;B^SXEL_kL-QUiOn)$Ci3y;gf9v}^)3 z*x1{(fp1IA5^R0Fhrzyh()vrGLKfWAEMzudr=_<~-Dtdlr^!4<(0CBQ!EQOiwVqj^ z*2Yz1W@p|)e95G|txoQQOV?&a3P&stZR=`jD!J{?iYYE;zX`&=rC?#Dl9E3FN?qjz zYvUGoG?vn8WY9sjsKEsVmRx3e7k=Qd;zn+8Ya3*J1}E_t!?wAY7aW@yw&FT*aLJeo zCHHf19AzdeZ_xrcMPWAlV|NrQm~zk>g9wGdim*G+s{{Tc7Q}vly9f~GZVVeT{z-AN zRiE+oaLxvPsVR3#MUNl#kKHk3PE>kvKG?rdAU)VGjpV^zz=_Fv{$Q5}hgE2{(hDE^ z^v-*REbqSk`1a?nu@rYa^7%#2G@eJFxNi!IhviAgrt0Bp2j$qjcXa*4P7GQPzep3W zAcx^gu-=Dl%JMVhaNow;r@Ortda5;|lR)Thi0Y{b6? z>pZ1~)Ew1R=!ZWWb0W^9qnAyO>&8KM>A{%P<9@B}A7N-#qB18I@~Q7EWSM*EHQ8=V zpJN;(W(tC}k}k+RteCHy$g3DJh*ue);n~c@EONI*0ywvxbcnyXk zd~)rlsgv8ydUp}@byS<5gbAcGro#Z1xS*HYh&qQl$52%eVxC1FT1KSgDhY{^F2&oI zIOwN}Ve6TT@k`{o0_}w$hv%XuL^Ykj8+y|O z)jcKmfu*jer2(v8;vOWBkg~2cd`;M>St;H87_@M?Tue-zN1ZmxIB=HmT=1UcQGx}F z=^bN!TRVPFCylOTu#Q?Ti%qC*i6Ud&LXXuKD`3u*4q&XfN@iX%Y(?pYt0i1$;6c_= zz5zLB6f$=X`)nBLxJsUM#l+IOheqinn5@WY+b6`C6c>6(LC%mp0(g%YBql-E!BLc_ zOtH8w1-0RNDF`x574k0Crd8&n12bEQ^NF9}eTt55EWE@$ewaSm4-(D|b8x4%1&>Jo z1n}l8_5(d+c4^zwMv+B~l$V zngCZxOFaQ$JSu4u-GKx|r}npmL01psOj23_%LGP>){e4)7LoKihF>!nlmsl^lf65- zyXhS^Q4gJ8ATVvyPkQsE7ahl+7geoH+x7A0W;eZi@{&1-5m<;iISAANabIj!+!bd1 zn0`lB0G$aQ)`yhJS#=+W1r{F0n%fKon?_$s=5Ej?A02)hv{bM=9|2Vu^$X?lw>3kkdNYgP$L;(A?G4WPWwN`;|g8 z@I$00oUD=1g+JZdF!x4;A9G2=JrK$C5CO^X4&D2-$KVz>R6yAQD&+(V4qjo(1G80e z(3{FLYjdKH5bGJSpji525G|QGQh=y8syBHX41^|)!t^eV$Gkjs+D4v4XV}euXbRB* zxV@V$hEsU+rO5*ZE5hR{BXY-vNnIR?!JdXO01o~PFB)O;VM5dZ=n&-Dmm8Mz*ej)b zY_p4AA#9^Re=g?03>l>H$C4$w>O;9cr=?1Am3^ySbIJof*>g3SKz^F?Y?$)SFSQwT+^Ccp^5nn`G8G}M;`tIsKBWEiD^s41Sx0Zu z3y6XnoVJ?$l{su@Mm71lb#2W~oWI*II+5fw!3jfLMNMANN-#8X#};s{oKz+(*T^5t zZVMeo!Jaw7!+iz*2Iv9SO!Fw-jcXyffGdI@F#Au|3K;`6j$qxtX$Umx?`cu^<}mtm z+5h`7&s|R*eASa53vz}pb2a7xX6vYUa!k~>byRcLZO6Q=vWVJh5UYbkB=h^_E1GPz zT6Gi)Cauq01R2$|kSe1f^BQx?YIk${Wg4@eu}Aq>C% zb^r9+zw`>|?5c#GRlt>eBK+2Zi)B@J^Wc-a9+F*>*36O7bT|6t$AdS&{HUXhf4~3U zgkc8bOULYv@~Yr&w=lCZPHimEKb2j^Z$Gihd!rAJcvFItq?K;j#ev@4!H)BmyG5dy zT*0Ja9`x!pI_=OrdXmqr0C+N~*xiwp)xG>N-=$+|B}rvU!_ z;xbNYYDDZ|ZmH>fT7v0uu)jbjVMddKk0@^LKohH{vnu!_>n!?g-VnPi>kRE@*28**n5(#w(iS$Sg4n3|xz)YHj?&}S5TmsHvn6-l?y0;ho^?edwq3Fz=FR;xcS{=w7m4D=qs z!?0W%BM5r1vUhg}@heb^=*g?)daJh%pUhEf7phRG!#6p_z7@orL4pN`*?XvqdYHyB zSt_&x3zp6e7}2Z`tVA%EI78^NDNqlOmd$RG#_`uMO|lqskS2zyAU6BUv!Cq0IWU!U z!L6gECH06TyAh83fF%_wgt|OAETdN#i67;RTh-(y_m2U1hq8t4A1F;=WI}2jOuYic ziGK%t0M|km_aUm()Hf;Z4tM-gUS15&xN+NWzvl{;XyiYU2g%sHMFHRrAO3kag%3FfPz&qRg`u# zwZ2Dokr^lU%#nlPn{&Rdfw+8fyI!$KD9)HG#44&@D0$9~W-ZC&Pw?E|eE9tF&7BPP z&B=oie^0VtUqct{sWR_OC=7!;bIMbm>9Kxg%W3@xUh9-p`DSQ3%+u8DqWMxYDn3C$ z)l;aJOE=CMA}lC35;P%(hn#l4$BG!TqOrd=X@>A?@@lpwy&Z=V6kUII77SlSokH-_TPZ(Qxm3v6`<5SA)DUVF5P`}yRa?U zdSYj%hFtTUDpnoh4;{&@F5BYz4|MvU0@9uPd zae*nD%|Sxuh#Ta!=#~UFSQtQ>yfpk#RU00ba64Ab|KL4#oMj53l}2m{CW&O6p1DtJ zq7DUw2fnx-z%;_}QiO{HBKU81>!mAiy!P=4_SK(1ZQqh_WI;9gzvBH?+?K{Z4%`qM zjs**R2{6&KzcfI?0`u{pBgNHqwYMrjC%z$P%>1UAP_l_|-boM8`#GOZp;3PHP!kR0 z9IfQpCmq)71i0L@m0PhWueZ=;SM-$-;8YEk=9p>0K#fjh1FE~~Cf1TD6e$t^K zUxu3n@CvyY&tSlY;zGtyx*Yqp_A(J(%q*~ezK>EU z@PYOFnyTYQFMFZ$3uYIVu~pHXiDonb`Z7*PMAc?Hm!nw?)LSSRq@t=Oo0S&pHn8x# zfo(y|A9tbC^DHF^s8<*Tai>p68ktc~ZMU1WJzy}pgnBXa5y*FqSu5>Mu)d=DduPq? zR>3$;xDT!cO!JJ_VHf$%MP?7`@L+ni>UYYBWCsewyXDx+xLFo&%cQe!=pha6Pyq>DV9mG9sZm*T) zwN)VI!8Kh|#6Tb-q8_bi9b*=E8-!&+j68{zJ%rKNIM2ix!1dE^OKGmM1=mzF`C54S z@$>ubhmQyrO_LqfW>Z$Ky6j_6hE_LWqqMWIT_LbysR#=ivUrhpH<-XGgki!ocWcDl zUtRdbN##SFAlYO0E7ky!4<&8UhnP;eiG&(78l<-2#96)?1bwB6LP{~M0wvFj$vP=M zP1()$nQR-aApEe*8gqbAtRUwdJpB&7vcgvAvY=mBz?4!R;th~y#OOJ=U5^PPbDG;m zPTvWa)2ryy=8MXrkuZTvaSp*4Y6A3J`+B8hxtd&X7Hxe&2!KD{q*=GHIN+B_kjY0g zBub(+2^Is5F*gh~o}Gz=6)nq6Uo)6Iv@5R#&R~LQc>f=B@7mqQaixvwr{H+jn?+6R zgaAlNnmO?-5El{=LBIe=O8J5%TePDSS@cMhqr4|4zx_PVv-hq`cZ0HL@~$(G z?yj!dweJ_smZ5M0c=sSFOkMUdDH)R+#R&LJ8(7gZK|<=$!|m9Y(lu)5D(ttW#?^?t zp%U7k{qC9mH+^<8nb{F7*&m)zl(Xyc%M`6R-6DnDp`U+Xfiuc)fHcPw0CT&>YqsBn znyNpbpBDL<(FV_XdAY^AuP*1aIWi}*>Ty9Rz;l%HQ{AJ_=3Gh*x+YgPXuC!KlY=v| zYLQvU*LjT6MdCy(Y)HD)2sjn+b?fN@9&r(Ud=NjR5X~2st2Cl8n(Yxc(QNOd5`cL3 zmPZsTk!GUI59k=8B@u97?f(c;vvrY@;yPCkrj0o`(h2NlBBP1QH#+qotrFuo!BR0x zaQ*sVw)BRqw|Bnh{OUAYtLU6f=w7LY6qYWz+zYQ6-~*h!AD9hrLtAXh6mQtRY|<(T zlg=+eu6$34S?yXoW{0BI^YO!df|h==}q?`Phgs;41qJD%(MrrIB(!+nt)o`nd{CwGS{6O(em`AMzVseh-O7kItrYSG3dYoNBouMSvPB@1+F@8 zORBC=LysPBi7r7~=L>2|Rr35Ytky%%)tr9Ww|k)o^=uI0X}NE{ z$v!-Hr>_K7$xO38u&@$r)?;SLv!{o_AN*B~OZ4!fSI?Gd2--JeL_h*(nG?YgOSonQ zMx<{%h%xJZD&9z_7++L7+V*V!d2dJWp3H$q(jqse?8<3wainwSCfiWWpGZo!BbL!= zx-2z1bpuHS4i}t0MUzZPh;qC1CcW5#m8(vB@hR<2BgIG%4N^CBo{9XmDHNXUeG;aC zG?&$TN?u9_S&E`_vnVafrPg{+)AwMl>{?j0!QbOeT^ z$SU#xUB?|^7mi5HijEik5vRGYzmq>G?vEJFefLL%=Dz+;KBIVkL}%{1|B1UnHv6%_ z_wR3C{kZS@qkrG`NB_R>kN$n%AN~8jKl=B5fAsJB{^+;ZRN^ikXJir_eZ0SWfBW|C z)oVYoYKMA^j?Oq~%h4oDjit}ugC$qm0~5|<{xYUEgOMa9Hrq|#y_O-p>O^8Qb|hhp zM$%OdiuFi1(YEAv;IWsT+QpNmdNK0K1AZ)U5-PUr!e;2aqwaSunc&1|xElh8a8ZdW zA|XWPjPO+bFR@C!ufOggSswHM!!+_Aq)JFSvhMvGhjopDqz`Wd4P$wv{R6=l$Ky5_ zW)GgD3Les{!n6BIj(Ei@EXj#DIOZY1xc>|JC-@MI{Wty+u1<2FB;jBy2r8+kO;kK- zh4Q0dUBE!J6j+0yR=NM=P#P>}8^?LeOJAN)HV2@+*)3In&JP6L04^WH;Mj3Me)_#67IU}#{(_oUl zxQ))oau?hJiT65NwG5wDd=A9~e2Mr9F($TXlI)OaX$faItmAgNz)o+@-5O*o`_^%(*d*p}Rxab=<7;_}`0T0VCG=h8a4GMQfW2;zQ3jyY8|6 zM4o!`PRq;4bh^AeTSC7C?%?bS4k{4JkZ58Hm-}Bnv9isxP1fAok)ysV_vvNvxpbqRA?^s} zG+)5u)w!6qqjzIm{>CEjV!bN*#;R90g@$r^a|Ij{+FK3wv@<4OnDDXAzNr!IvRQw# z8E?|DtDChn@ojXOrxljfvazl{^{wX zkMBOb`QhE|>)v;Ne)XQ6k{|tWfoJcPVr6a?xRt6}9hsbRCejE&PQu29l?W_yfHxs6P}*P}?L5w^*8MgvcE(^h8pbi2lRBP|h|QG>Rr2 zgvTLs2KaK6S=qtn{)P!0KLosxoo@z%TFJ2kk^~)nlivHCOT$nk*IH3Z$0ttAJf&Zn z1V5zoIbp!=4@e-b_QGk$mFI>Dqq2Y(yib>UqAL&OKprlEU@YQiD*RkFm<|yHfF9}L zMmQ%52cmY)ynaOI9dPLW^*5RM;g`R}OZ5Em8%~$obE@cZ24c%0_wO!WUG9FodwnZB z1QSJsNIVjfBD`*p*zNixX%EJr;!T@1G-}(a;}^#+dxq$M2o72N#z2xb7W|f^9$cy! zYeWCwNMS-9UFH5kt})019YE|h`W%yal_5QyJYf>>1Fqnd&$d3TE) zyn9``#SY+NZ*H+Va@mS`e4^%!BZ!O;vwt&-D_ZWVvW=-8xqLWgv_~Nzc)>D@pJ-w#BOu@-8wTZpGDyY*lrs-k?M823_IqnY9q->?~=**=5bz-lEUde84_1cf$Y?$CUE6k`Ql^ z80ENEU+So)Rp1XO9c`~lhgcWAQ8M}O-u%W%O$uSQaC+t0B0@w{*6~x z@P!zyQF)Gq&rmQhw#3zJdj@G^f(?u`oLJN`dA)j5_l?pc#J6x)r71SXC0%MY0s(_p zhg@TBxf+)^d2iHc!8j1)Q6NYQ#UReiO&Tc+%L*@ECw00Lm$Jvd(-J8#Gc1Fx!5Y^M z)kNJ@@Te6q9$!)n(BreZ8Y!>-L_4oEu0Ys`WyJ_X@8vSm;c||A+jHol`0nBe?H#69 zQBK(a8j&ODr3~|Nk-ng`7+A8zmc?KW3c^(4jCCxNhy$F?nVVBl>VC9+NeM+|pC*%i zPvLENwqAw|;kvDkZu zV1SDt(nM5et9yi|LkvIz5Dc-44Esf>qt>Fa zJMDhmmS}J1Cy*&4JIGX}I(o*eIx`OAQCX9#8t7diAd>$it_E-jE&uJO+sW-@I zi~R6i4>==eWv;WyoPHU(Rob%m7SynNX-WkFB{L+sC;Q%-SD5+U4n<+XBN7`=;o7&e zB+^xjFcjCdr~xuKD)i_{hwjxwtdj*oq~eA|P^DgFyWX`>_RID{)<{iy)ozKEAL0>ZlR4KN7g1+Iae1fzR^GZ%;tMNC>BRXzcC z7V@%L!}O)V2mb2oXOo{BRLV7-&dkmY_$-sVaT+U6w%wM=c)<$hi2kG*!Pq^?c&Qg* zQX%Z!Y;wh%IS3qE_(K#gZz%2YBLvOtPT$;Le*E!UNawl&`(tT!fU}I|Lf(gap?xsV z><+9MJi5+3y9m{e(}lZBm<|%fG|1^-t50X=v&+T&%x-671#}iF?g>Q^EQVWi4Rwm@ ztatYqEmDE|Vf-(dvAV|wV>dk_1&6a)Mq&6A2;Cx5`j8AE+AI-A29qz4JF|Yc?uZD| zy$0t`;8F*2paKk7hO14HTo(iZN*Ul=aMP$_Yn2utf)zH=O5xkI`U?@e!q*{!2S)s@ zs%H#PLtXpE*Mk)CgQ!qHhi1x?x=+j1LBz2fUMaBVc^(|9hr!65 zf-O&mrc|Pb

7)BCbW@<7p{?6V{eLrdcD3vxaL((|N?!$sxsCw!Q@5_r(t-BBdC zE^5~3~CSJ)SsY|1qOaannJ*bcpOOOWX5g9-$4*$?t{CW=`9;?R{0x@`b zWcl6PzP|Mx+u=rI6aB9ly4!1@eYVNOL5Tp2vSP;Tnb|JqUd_cdq2!vW$(vq4 z4QgRb;Xs$JT%F0G)&><;(lG8H6(!cZyBGJF~xk$L<<$=Zgpx$3eigMujhD_>MTf>hKmiAMtYK|^Rnk0G_6B&cwDeT1PwXY{OHo4JUQ2; zD|=0GpC+FAG+bW@biw%X;B0?Bg?DN!bU=V;Y+;Gv$u+@ z0ay@kZcEmueX}6$@M$hpV|9-{p}@)R^=Am$0#jtPqEKU&TSh-bxj;Eb4K2oit#r;N z|ErypJ1wPn-YCvDH={)YeirkP;U7gi;ZG2F9EF~(MJs8n)tPECFk21xB-|VteYPtl z*OVNyRF}+nTC3F6KV&KcWS^r>_6GHU!G?fPw43c%(w4m0;ubg+DpH^T4V~M1fM$}~ z5jL@bHPMaGbZN+940qtXcAU#13|KL0mWuQu-lEX{bMygi#In(JZGH($W)e!v*=X0I zDhWQ6&@P%gXJ5+Z*s*p$=FNo4djAR<9E=S?OF++3}g!vLCj zW5o}V0rpB_lP9tQOq3MY)>e?MLtA+L=$ciPWCP>XS6{ENyv&7G_SGd`P6QcYLARr! z1%&oANuTX+!wPl`@U7=3YGPAEtW1Xd0<%aC-C*$wL8k1@5gKp~RTX z5KniA;JJURq@!Q_P@rXZ!TTpZG-i7A_@DUDnCUHpZd_4DT?7V)|9f_e{)U$sSk~rp8TJf>Ar_nCwI7eLW+^_$pfgyyGka2(d&D- z0CtH|0ZFgsCp8u7Wg6A)6vt-vBo)g`LZ=A5ihCGa!_2%iua+S_924z&eNeDS#Dz*J ztHQ+x-E?PDtEiW7`v|E?A%qTZKixZ4bCazW>%#ICL0_iG!NV8*)v$l@{HypuvKeL) z)>?7~iVAmfh!AkWI3ik1#<$+l5CtXJP8UzQOH!NUe5EU5n!WlkXWMRcr|)tb640D%b85C5rJ#b$O8ngB*Z{n1Idr`M9RgPLE6jf z)}l|VTT|AF{RYPro=Vwsu#RK!PK_sQ6iIrdOe?N+KnbZlDKJ>s$qyS$*%1pym95q- zn?!JF%Ha}zF*_}%VzN04_)xvvRwpF4>fv5e+>}%OvV_ znH>?UOuUybr%=r{m$@SkuMO0!1UKOGkgyetu@}%i(D33X`xf__!k&vXM195yBLo~&Jlp)a-WHDls@WiepY~_?FwuQ&emBCEL zN?(`N1wRn^#bm~Y_VeN=Itv~Oz$Y7j$M;FsW~pyQO5wWrr>%S#zE9{ z`qjq4R3MrL%f0R`PKqU4A!srcO8xl?$aMzzsKYsuH?fZfyf7Z+Fx$<6`F_?ZzDEcwJ zo=2q<+K8>}Cp`COBNQ}`njlcbd@7M0zDX@8}GMSLD^8r(nGE%**SYj=A;(q=-nvVv4nZ(pB_ezaqaqO!Ma% zy+qallmkFAe?#aK0YbA?vNBZY{U>Yjvi8%V1Q2@kfV#8Y3-ARFLgAAsOMH@cX%U~54*=%KVk-gvNUL7EALOhWo&p)ke#tP={tr3j^u|vI zkB#PFktR(agQ`n2;~8VAEpq4VrK3lUrMpI?TVWul^H3GKqhlLsPk?;D`u?55a!N1P zXCne#n@>hen;jVWXpg{p!o!;~=ZM7tdq5uK9@&Vv6!JfOfC&ma6NktIEpqTMMiL!Wb?$i}`j2G(RPpUoS6^ z%o)1(%k>C3N#Jli_Vf_$D-v*-(pi+*{aT&+l-e06CEj8)`fKpCQ-v5JOOJ(2s7d9M zDl#}!g^LgU)1dZA-Fl~?h~)T%m3sEsBuvjd3-16GEhIBcT z6dbNI9*T458%riJcWG8SZdUfVs&-y*`&f&P0hyNvN5Fz%5c=`UzC->fCZvuL6-cd+ zb(HB8B0fhsy7!%&#vsiZ=zE7m4{|`2)&LaJy!z52a{tQM+EXNw`HO(Gl@32~3@AAd zKU8wJ;Ig55Q($0`%Mxs`C_(u2DX)neTX?o$rbk0nTA~MG;Y#gVeucEG zQFk3$S}izPQ7(WR1K@M)SkN_lb)TNWCdymG#4mcKw&E7=xADXXI9KMpMf7#PPcrNn zrAI{4wr*35C3GwLl7^A&;QHbiB1~XSXAse3p4yb!x8v3O+YitR#J4*^l$&-vK(i5o z0p?lGH%;lR>Po8xl1m}RE25+;?LP0of5#%$m0`h%2K$XYfM5P6aP>?fR5*eB)9X%w z0_iKnydo4}g;L-&?L(LE_79j7-CZ(T;4Jwc8j?I=vcC&5@$gZ-#&c0X;q%Y^B{ipt z=VD97sEr!W-8&hm2=hnsrX$>x4{t;1wI_~gvx2(5NMq@qm4J)IqGpt|oZc>&NUR0$ zF46BP_IMBTQH-c=4XgX?9OjygUhrfx=4usq6-*tYLm%MztXnV9Vew=hF3yAEDPQw? zvT|o!I0wkr$qe|T5tV?Ti4Q8DI{SrxfG`f7keWVG6lkAMyy8>!YIZAybeVdQ@ufo>T1+(k*Bci z0+>Nd$Z7WKo%~|6+K%>FZKbD$jv4C%V7a=8tf?rUORfUm-e7^hQSzS(0R_% z{jJV48)=zOlXnJnhj5}^U4c!cTS>Qyt+T)2@>Kl6&xl7t2A0wR_F}0}w1JVIO;M&3 zay(L5T_Zbzrs~z3z>SevlkPhzPrzMdH@;%!0Aqn5-RqXR1Y|loPFXvLI2bV90FDXd zML3T{!6TMCk_^Yp!r;4Acc*dg#UGa4{=l5GbaMjs_(hSh)Ecyt9n~iX)s7~_!%DF% z6I=2olcG`3Xh+Ie*2)c{?T*1?Bd8AkIeB9^!*}x>vA9-jxZ*bU9H~fr8qdtU!-PNW z1XbLE+HKm{#qD}BN7=9*t+?S{NQA|M-C3hA4U(1xISinNVvbsPsTve2#|kVBD*gz* z?s{M>X(I>v;E{#dz|@@M&iEC%IR~Iwg+BW1pqe~Y4ajSWOx`rW_YS0XP(x6b{_YBV zqfuwD&AiYD$F7>@WjP+BvP}c7I)@0hvLYA;a)mJ?l|)U9I)~_H|1fC*@PUnT)~#L# z=IO;uSwpxP$ww#(M;W>RKMw@U5M>TR4$rG8R2}$Wm4Gn7d~i$_ahxQsK;IhQ6^jzI zR6{gJo$VY+w0;&g>fDAV0S4#S%;7qj;`L@n$2NtzjRIoeECpFE3}FYi2}EupE|{)_ z&X&EO@7}(;M_HfrMPcmSzJL+<0#rgF7I3g`SaRK7oQCPk(lT}QNhz9uQEGDAB@Je8 z=iWVS?;V`5UlWtMv*cwbXtL+_P6nD88 zgUg|#6+lb4rh={9kB-tHzYpkCd8pRC^h;|hq1N?_4d|}A^2$VxHqW}5F7p;;7=L17 zQ_-MNTqKCg3!|0?eFBaIWys1mS7FD@ja+6UyHp{-j}YkT0RZdjHt_PvHfqVSTpU=> z?P55X9ew&FK2WfR0AAIn0yWrCVGE>#9200GC!`TtBUlwsSp>P{p$6W9`BP&f-ar~+ zXAaB$W<^1!Ez*;-f)44|LRU0Kd>~RY397hgPkq{X!?aTUlFbiXOCz^N*PKqy3A>-w!5BT6pU{YcVp$UKn2aJS z!W=xT8`_?m$>!|BlRMF?1Pu!5udTn1>zn3ZZ?>g_?9QBZJ*}f(BnUM%&Q-;<5^|$m z)6Xo0tIhlZ`~{0>_E%p4Ue-lQtI65+wBO5#ns^Neg!GP_*;y;!%U@o1Br+3J zk$FQ$>s}%pPEV~_s|_}U7;kzBW2qx|93$fRl(jA{TyNk*)rz{WDP;4(VL2l6!C`#_ z5~Poin=wUfD4<~AOkdGx&u5B{Hu^NsIo0vVjX12UJ5;U$LkC#Ga(ZmF7m#vpdtm8z z^AbDMA|(J820S;Wa<$rOb^ett%N~94Avr3w2p&!m;q>JehF~(GD3rixvLtRFuuMex znBt4+>ctOcQFy~Nw3!>3isD;Cw_?#XDYc;>R~Ig*RO_7sbdVxFY$%B~I+U%}v@zgO zQJEOG!ghiA38#j&hPzQj>eYRE8_zK`2E*k1VY>2`X2bv3v;Ewj^7=xzdFPpm3;|b$4ft(5wTPw)oedEhCFD;2+>)RlnG?N8i)d$ zvPW~W6JY_1aJA01Mh{{{8#Y_HPdc$?qsP2#Fw(fk5l*bcrm{r~YM@A32d6Ne?%l=a zR6b6{wd4fGX6wH=B*3#SQW@4cuz!@3E`9>RR%4iwz|rdiL#X}al;FcN;G71UP`c8@ z$uwEID|vceFz4#K@lS8>$FJVL{r1&&f6)@!h;}Ch>ct#{gzPn)k$O`Uzil?s>4l_Z zIDl89RewtfM=EE`;=)Ku5QoZ36OTgtTeX-D6**ZlUstSj0~J-qPl+FnOZ;3Iv*`MH zV0Y{Vk0-R>3)3ZXoDQs50GuSuhbN3+GDap2|M`4{=K{-^eYDF&d>VTli& zbq8$`Q_}K)?$jUv@0h5kPTv0|(vCOS4UoX|n$cj3UO`}kBMp+SF^djFjzDc?K#AtT zBm<1GiS)LQH3Cj$$fL^=)JUdWWD$YI0{$5)_!}wjoW|@OWJnOXlxHjEF}m2S$Xn`o z@K#bftmM#Y&Bin{M7H`8WoHI{Y8H^Ae0H(PE754zdNjp00wJWf#A|}bp%s;itx{7N zR#b1-qeM(;tizYkl?~t5J4lVlYaj<)^t0o)EEj>-P)9?afmpQ@@Bb#xp z2N>AO2>@H_?;~j?+9g2K*>yP)2p&ZsYi6u_OtDQsNGo?xkU9jX1GJ3AD7vjj9lgL` zm^joF`|j!J)zXGdTgk}AOhv}b6=}+sEV=-k#D8bZYK3VV<*J;2lE_@qVTv6QZM{duc20%AFroEUY=3$@iIL1AbNS`_Y;>qVokybuy z7U?`~d!c|6FkJ3YKY~YneJII|6`h(qc+$~BxnMhbaqhScCSH*nUtd||<#;qcPYe&4 zPz^zrOC;W=a^oL%3w0865DwseVPfNQLk>1Bw|`VE*j==0t*M^rE~TO$Km z9exN4JRah;PD&MOmP6bXG>akL;5V7#g;WUK8%%9;w=nRC*n3%n8F4DRVOEMsvZ7C* zrBcrwdv$m4))tRFGvys5Q7#?bj^Vro_056)3ak1r@GmjM6g5O_L zX-M!r)0_AlE^<(rsDeXT;W@R14FKOiF2j1ZKxBP>gF^`?;X;>>qtl4N96)b%w(L;l zr|`;-h)b(n1Biz*bp@9pB<4qy3l7!rs2`;o%cRe$GH{5v3RRjkOi=bWpb6d+f%FMR zg$@#@&mCM@L@9X@5ukQPiVWyw!K>NzsG|l!<@4e6emC4CcO51YA`N7#Qm$ zEutFEN@7DHL0)anY6+4PjdO@|N)TV6VjAASFrC9srwqvvo2G)TjBuq_bEPe-dXged zD2g?;O=GvCz)u`1Hw(7!EN$Ne8a3BeF0W_Cu9Zz|J;-fjrjLO9C4Iij&UJey^u< zE}yzgGweFTgB~MtKR?bn^L(BTn61XE>fyzryO|SMBWX#SM@3uOZ^hHUn1QMwuKvX= zJ76|D1c4+{0L%4sHhvCdq;plqUWcE2)L+==4B8&2ZP4sp99>_KLo8e1Erupr_%N_M z?P(vdB^Y2^ff5D%R}z)bkJ#%r;KS*v=2TsRp1VGh*uN|nWaaI_uDMl?C9IKI3drBlv}_pAN9*6@>yfTpzngCJyIdR9 z`}^OqPsPo9h6mdo`~lfLICgEd?H&i+n_G9xV_OFN#mHU zLSO(lQ(+ebi)EMB3CwhqUdogSsm)QnsSTQbImgcpZ)Oo6o@$1^P%A4whZu?H?6g)? za;MORZE_!kJ?Vs*q=O#=Js5IrL1tKO7A^f$vsXYO(#A~OM09A`AHnD<0)iw&lglfH zqCzyDUz(E~JnRF?%ZjtJlmIImTlb99e4>vm)D*fR`Fk=lMsth8oqvQ&_U@0A$|ZZ} zOKkjX`ImbES~@IMo>m@4HfrjkYL4SbFKH2q7gu#thy}t||did_;8U zyIhgrYUKm}mpCf@{J%|+5Sr({XBUSRQ>92va}yOyDW#F9jMpz$yYbzRKYhH1fAC$~ z6wd)rh3*;h$XOduu5UoL18cd4pzhRnh-WcZQ#U#Lg;rjK75D?-D4KMH9}epTn;U!^ z+Izz2j5S1UtBv`Zq$@v6z|IX1onEG*?M^Wg+@A3mGFyCx=@CezQkOo0+XHnS(#FKl z?$|~2YdjR7bJUt0ePfk7;Mw@JM<%J=ta-pLFyBJeChE8VYC%JJI(X8?v>xE$W;76q z%^1QqqR|M5=ccQ51pNbe-l0RXXHPw9W0Mw}S78*h`&W)mYBE&hhW~0$vGPOgsRU6H z3T?DEYI-UwGU^G`|J$TL(PC2|Nr2~M@8NVX(pvqHs++O z3;25aVs-H8F^&)tzI?)eyIr=aju9utLhF7|`JwutTrN>@F6Nwo1nw|m87YyQ6Ci94 zr760#?9M*`0fT5@fl)rFaNq&uj@Ae)4eN5VJ#5I$cEpK_n`pKl?P)*W)BcRQDVbNn z&=RQJ8e@Lz1uJi2l5!-KaO}tS99~b`7Z1u|`v)1iQ{n@~ zy4u!p=Nz_4F`UbQyFpe_S;m%YFx#g{pVA9zTQ>`4g*E*R2#jSL6+yvs5~miu+F-KJ z+u`5^OPvwo0Br|f^$!OqH$s5Ii5+h?I3zkDc9rlp{C^!EQrEZ{zoQxsD}*3*tnYF; zgLVMN{TXW$MwDRTi4Dk(ed*|Ja$qTtC!<^j_dKH2iT<`ID(?Qas)B{8umt*IX>&g2 zno@GvlN(4(2rCJ5Coypcq);d;n7TroI~1q{_H`i-!?k*aiUv*EFcF3&&p-U(w-7z+ z9cy)K%K`vQb%1i#knZdIx<=?$d=`ihONbFva9&P7zW;E4ar^Fv`#}IMc1S*}u;}6|T?gSO=CVc3L8ONxl%6~C=&#`pK6dUAfmANc1@&mDH#SqPs zn?T2}#VZzvhra4RKQi&(tG7E%@W(gzoVv88^{}d6pIBC@ZybfxRV^yAEy41{KWHv( z1+-M}OIqLX1dgCT}w zNPIglvFI#T-|OmfrOyU%aSATRt&?uxhh?%uXjFCy)tIdz>A|5|I8Dp=Ne>Gn$|WX1 zIv5y)H)}8h(*=CyxuAog=idTngq0DT(d`$%bs%_jpcMk~g5Q;2kYhWtlMK@jys{Q6 zu)SsYsZM#(r-=!|sp(_(hVnu$GTZ|$C>?ONcuWUawBo9iNEzWFlQ-|=#No0g;!q$C z*fM{eRs)km?&(Uau{=d(#MOAcTp?bVc|wTdtig(Om%c_Pi`pTnZz=h4A8J1CL%7XO zKx^?0%`A*0ln-iV@VKMKH*^JQJ9HWAE@#DLiU=I`#L;u^(01DN3YExVXa2QvfMFr3 zX#ikJO_L<1T7D45YLE4IgSDKSZ^6kCR*HhelWr?tv#Z9Hvb-W&Q<3D+g@f=(gDsqh zs*x1R9o8hzhpKaf1WQQ%^rVN3i?%vE2Z(Z>(H~S%)X=twS#CBau|G6mB-fMmYLU4M z*uxl%5*>bMF2-iuEZvfO8FIS14I4#3Y2hTpI-t}rT~5!I+c~sTOQ6QmZI*ni`G6xS zAzbRk(gM)L#iaCn%|ci#32$ap6$LD04cdU4B$hm*WDV=ocC#%cdOb?13dv4DRepZ8 zI7KFTIGGegZunk;=42$wQ9(!}F5+U~5bfOFwYn$6G9qzN!%-=4?ubY`;Asn6in6zLHe=oiZX5NB=93vh!K0GZ7Eu}?lg!4?r zc3_@>#LQ%4G^P(uvL>L#9bMgz2sO-6i&!P-f&0(T|CId($1lgob_~UJ3BP%(rYn3@ z+9q9TiwvbX_fuy5?Dt6utwWml!R${a3uIPlP^#j=A|NR?cm%l-!|a3TS}rnCg)jrlx?(1eJCegUY-n z{NEMr1cWin?dk&RK4bY0>>rZ;^z-XKFadV&H&Dx`HYh>q>zmzkj7J-a^w4k3ueGwK z@+duoMDGqGTVA_g^Cu*p8>k?E2d|QM1cJtp)8i4_AYyrfY68k3wP7K8HQO~AOXC3n z3UqWazS=E8Wth}sewNNrAs`JNl#eW_o5UlmCU<)a9!}wR2bA!%jP?WelB)mEl^Wf> zp;GDYWz4KWs|9e;z%oM0UAnc zfS8SZ0^kt@2Lw3ZP_V%{e|3NV{>`@^?{BGx=pDSfd-Lus+;1KuswIG%L{f@aR78MM ziUJUs6!`Jzq$t9G0M012)#xRYu6e{-)rP3KjTf^bFJB~m@Q$4K!2=TL3)&-ZV6h8w z4J8F7;Hgj*&@yz1J`M5!=l~x8sC9Rsh&48>+&?jYMPh6^ZXsd7nW$x42t-BXECo`t zl1bI2-I0Gz0^L_1P}O0rM+QaMtc|Q^B?`Uh^q|}XiJrk|t{6gy|B@+IRod(5ch8Ov zPmWKHj-SFE@aW|D==Q7O;Al1+e0pTr5S7WOD5U+gBOT(NF_sT;r(9gfcD*kd7diFf zTvN+pO^&(id=g{UvV6hVq}}djHU;(uo3L4=BU6aT|yIc*o zA9m2qXnQbPpY^}QA1FF^I}}N~efI&T9fI-y%iI<6ZbSl&>E=sL0E6MzsGH>P#2FoY z@!`X(``-UL{Id7I`uK0~1w8q`_ya5M=tesBe=*0E-tuMd3+v&ta6afYg{Q+iD&t`& z$QP>wHJ*Hnc%DevJN;B6e+#Clb0a0-vnTklmil6I1xZsC5J+=n9e_Om!Fb<&_wmP% z$aZrJjiDH*s_)0Q_h`onru_v=>4LKDM8cZmzrrnL{X}cp4npBq1kNP!@x_ zx`hpZ!=T-8GB)fHL7*uk2y~K|4Sn)OekmBLBhwiq3{0N_27POiRYfryusJg$=673$ zhhPV}j(m&xxa?5|Nc1iA1T9pHOkiXl48LLl zlvU$ISQGfdB|O=24VTKU4_u9JGBy|BbVI9sb>(N9(}?VBA||`uhd+KL&?7WFqrJ?M=4h4CR%gDqyNXw4WIQtc5bjm{g0g+>|y_7=l1NsKexTG3>5g; z58rDH1v#f6XzaWXthUbYoJ)@nRjS#d4d zPC_wi?hjQ!Vj82{-`>6Zq4yEY#SiapUkmLu8DqoNnQL)=*^xL|mbgR44q$(w$ih6* z?$@is7sLX+Nz17LX9d8PamNUH(X9u7k*u^Vyl$viOapMVhf)D4_p3f^(d+`{MnYrI zL5w^5ai7wSu6jp#HK5fYeWCusx5JfPX+4S&`k>T-gq+lto-RQ((9=7h5kzdY2lK2^ zgSNbeLj}TVNC9&#!V^gs#kGJ+cV!oMR|qiZizG@`tR=jQ#pb6g-5IkBiKz&>@7V0- zDBE&!VbEuEsv4VJrDei|Pp9_o>jIlHo3%D7%)-{Z< z=jKxjAZLvcJG+t6*zfM;$3xq#B+#YxwHJ z`Huh&Sx7)-!O1i|!-_S9dtNH&ScfgMUF@q=E}I)V&7@gkHF7@o+1vR$mH^QikajCJ zRBkvaDheC91KgwW`9O!)Vj_xGhiUl{(O?VqzRZN0Jcr6Ytu;h}#T81(nzD<6 z0WN_uc<33sA4Qs2IPwza@$|=q7YD!utONLRw<`oPI!8qfl;A{MCkyB~i5OC> zVKR#DQChB8OR6fkK=9m>?8jXw+JqzM(U1zVRq1Zb)r~xc{8txOm8Gz3FZM_ahIQa_ zTOe0unx}tsq#Sl)*VUgNm?3It*s!z*m7Ti9=o=+GD_n$>+LcREyFb6F&_`kZWyrE% ztnSurraCTD;~m{>@}YoRO6-w}Fi!x5(w-lBmY`Ozp32Rm&`#Gny2e_GdL&7LRdC4M zy@26&x3{l%sZy?Fb9^%#lKSWJ5Qz)zuuapH&N#hO=}Vf8c<9xn$XDkaAu^4z&<_)i zaRF@pKK(sI^bwyB3y*4}T7BO!Z&G)ri~zqz$W|u0?mJq!KAATu@50(7RW#QO=aY_( zEChF1n9BbvsNar>qj5ho<>Mcq0KeeYhX_FeiH?-ahE4O*5iHN!=EuB#n9GCSyDF}N zH57cG(tBs^OrytZ)yWfzLUF`-m+)ReVcu7-cblJHy}uoy_KqN{qkZ@ETcJ=3>mb{a z(mUkiBEU}i7AS0PvKZuo4qWI3-as<+rU!Hh^mAbK0DgnSS1HnZV1B`|tif|yK6^(} zB(m2_lw74n6a^Niz;kvy8m%NA8|Z9Ob*upsFXas(adrIfwvY<_6ZJL&jEp%bd)ur_NdB4-LO4rZYhY?S7mr(8NW`xJ+tBV!%qe#3YA} z=huCDyxf_f^8z)sspR;L++`!_pC=U^|HvVk^N^jmNgO0_*PCEir|l+5Z}*DRs_R;MIWoD<^^iUw^_K$>OP z$0BDst=fiMcET-LHkH!=IYbI%aOc-C{X??2zC9Q=L0Xl1r|UkgFV}?(3cXYYvx<5( zx-^_m@UqJgK~cHj6PY*=mtf?Iln|&eO6jf4Y*+Q_f&835E@yZ@{z4)`{f=UPxhSTD zE_qQR?M6@H6%{jpjV8Kpe0?xC)eud>P9mp5qokF%AkeE2gVehn?TJQjUmPM!Q@kug za_p%0>rK&y!~rlaN^65P959SuU?Ta3J|+evb}4TGwAqj(r<2#vO?g%6XDpEbi-t1_ zhb6gdXhr)x1{&WIr&7M8hB(EXNkofy)MV^VL-Zf9_3CgscuKtW%Y6=>LTr)CK}7cM zi;XlEx$4zHkm8($$t%F+M&=%^yM4DY<*`#GLuj>rEAMJSCdB4Qoh~@A@_4|QP>Z0V z&DP{`$E?jlqa|XEyc?I(n~V8rWZ>ITTZc7vK}V3usj6Z^eRjLY=;PQ$`#6|C*vH4> z*o$j^uY^J8yXaa$o@{jik0BuEp_unpYazS9;M-AdN*?;^(kvKeS?0$l%WU>cqlx%? zwp+sgc0|eRPWNCw%KQibGxU-&bfV-BL};Q615k!~b*rwl zs5q@;sO9(L&KziJS-}QcT_xH;;g^r!-Ot~>xu3ni`*HO8)lc`guMr;iToRL<~~0(zFh(-CDKr}YM%qaOc>utrU;tAKK@O&G&^(`4|y)11G?Io1^#%A z&GHQKEtje&8M2O&Argd0k}9FIHB5`GlVXXt3cpK%Ja~Bv8v_uS_>Vil(JI*(&yB~w z&eD&ic_^!E0>KnY!dq;}_{`4$yI zfVt1M8xauBl0u-JMhc(EjerSg_HqT~Auwgd93>$(<6g5t^I>CICDS9#G?)${+cT#R z+&&?*QvX*88N_#GdKHt=0s%t65L`qKkxulQJGC!(r|C^fKN(JhZid-)!WASFmgX&) zlsG+Qzn+@_biVMMfd;KlM1}x2@ErRlC&B91{GxZp42h^&-?OE37L^*!PM8Y`5LhN} zJdx2Eb5%@n;RFQWL;(kVogqwZnsR}t6hOoZpok;T0I+XV1%MMl^gS*k2cV&6Y*{@# zXg-$`F947KU(r`7>Zs6Hk=LKi0R{9}XO40<&=!N=YR~8ogXqYLNDTyt#x_O1U$qK2 zc`idKRYZCC!mcA5S%;b?Gf}35%8m=$4N@QR>4hzV2t)}()TfPQ5Q#fhAr}}Is%r6b zhhw+7Jhh+@#2*#8$h=3-iVvJHm<~SAaFMm2>C;<1`h0<@8w8pvth!IHvB(8@rvZ0v zPd$}QTje zdWm1;&+wD&1>Nj#pPeKi8u*($*Ooh8z&MlX`n7 z&z9?#yV+vgv!m^kmhL`xrbAMtHGpw2QlgOY4}zrv^W}wB!|98aU^r=%U^o#cxEx>3 zQKP|hFj5GF@Fy+4yY0&51uB?Ol82uY_^GG>2PfsnEn!VVsVh^ytFw>oHScj&Vwp$D{dm5+pe6#Bu>dzx$ zp3GTooNm=_L(4cD2vw+?sj8{!rt5ntuZ5K&g@^91oaAy$%!|jAM&Hf)n~rb|wF(Mi zd{R1BTu`f5D1=j%F_+n!#RH@(JyXu)=0%MFrPeEhJR{`k}V-+HOh0w);v_p*wU;T`8~e*sC?3a>;` zwiu$75SN&I$o;H~O^ua{eXxq=36jg zX|ySt^>Be_ekFA!4Xsw$satf8!N!cAJ6WU?M0eQ5GpRtF36GRLJ5LWx*H*3}r$h`j zpeywTb5x=+J*yBA3GdOhFFnXdCt zs+i4Y3^`^44d7@(Jx~31lKtigJ*rh|l`(_xn)#EqnAKLn$K`KK33#`V5K(hAzN*pg zi%2jahA{=yMWKv>9tvSN+Z@S!4GM#Jl58(UVui5%CYxzFNV6|@vED}GcKC8iyj1Jp zhTZ{Ty5gexiu^`$u~Xv=po}gS93}a%l)7_R$;uw0hKx*zeX@Q6Wg;vn^PK4lYd#a^ z7$CNw-vd<~FjChcVuy#QV#0lr&WYH%0%=HR?!rqI6mnDL@_xF~8<_Zv2>uXG3=1$c zVW%*bz0sRjkPNBSYvf}hD~BFfS^n|0#} zdj{zN(!UMG-?TUzFp6c5ynMjR!vdj@9bZ-Od-snC7pYc;r8v>*TUySe%q$|3#$ZYA z)2;L_bzk|3@<5O4s3(GE zcJq9CBQOM%GTO{okJHiR^8@}7@vf7wo4IL~@NwGV+bsKqP1Y_YpMzQ28 z1X$RbC)RFY>mJ0~@G|Xi2;qc)B-uyiU?J(Q4lNkSB0MiHp$D?(F$mSM#1lKn)b3|wH_LGHac~Ke^Nu;9G}!^)+g25VU9Aug9+EsF;a_+Nf1Ala9FncCx@f* z5?*r10hh{q>sl|Yj&h`6N_M@>he8vHXCmDq@f*KOPC?A;4W=fR!o#du-I`72R#U!C zo}6Enc_odsb;W&I5pRijL-oaxxlhA|aLAz|z6fj?L}mQ2Qb1GQ_3f)Cl z_alVN0u>=mkFW-Q?2fT6gh}FDdS1aBW4CCOe#G^oEux1vFIlzreY!|?gdGB!Q4l&_+uDIEi9(D5)< zxStX|_QgK}3F3N2+zU<>Sb^E4v~)?WH?XD5*Mc0JTqyAG;imNC5iqhC9bJ_+hH_9V zAXi=|POW)b18)^#={KnJlth3=yTNaZ&y$M-zT1*N#WRCRlu+T~C;4f?g~{UMi}k~@ zII#vjfKsMp!sRvc@u_G6b4iS1;WNhPel}T1r7Gm(?W3sLIt4#dL!ijh|FTCO&ckYBUpk< z<=?tGNV`{%ov4MJ9XjcVdNlaw_qX4#{`%wW{q27W`E&MW!|rS1A_nj?qA%Tb->@f4 zL6?xvhzr6wdpM>xniHDCS%sQi%Ii?%^bE_8aCG!0=(hUHxwkhGlbqxpvBS}Wn#BR%43&Ub0gaX^WZ^J0gH8hGJI@lr6|;sil90rRA}87F&$TI07rxSoHwy9NvU{H?Z+iWd_d> zDojqP|5!4C616{TVC+*^xGW0{%9Ekw1H|SVSZ;x~u%U94f|XTxdm!;5HR5SR1Kc=4 zCk`CkOWRjbRaT&pzoTgJ!rhP#cKM6Jq^QJ?G}dSN0w87noh5uJnN;=K>nj0gnx8=_BM$Ss`!I_ z0|UHVEWi}A!B97(HVE!bNt(ylU^;Da2QdfRGb?_VEl1pnntkKs7*Gqm@(4|n_SLpEh$UfD)$>&q73_lss` zCgLQ>Cn^8Pyl-h0DYKM~QbCFGP8P^IG(=W8&?}RAu~E$<-ciV|K)aA=?>-<)ok|o> zHUOs4xur!x_I#WbJ3>xufWYRk$c0AvlUjjAR zYxVge$)~Vu73C=0iLBAJ|5H#zA|qTVn3FRWIs}0ddg0eVIcq>U35?CARA(~w%1pz* zC4h~uP|z9wLT!@OLD(T=_-rhKwkWce$eEc~7pHNsFFLi=rvncxQ{`RT!7~~@?d2T# zDjsnRrEVQjtEMwJLjh71oX2R)+2zhgpB7KDsM!NINNnA?bG?hRCF~-YISQ}iL*~(b$XtHCdCe`c>)dtWd#y@K?G|6 z3iA$Ce(ph@SzuIlXtBlQisJ~HnSTSNUaLiCM61^12~N6s0yH}hA=BS_hp=M1-%NqW zI0N|ReMg|#CBjB@0{3DG??6=Gf5%5qHt*wyN3%~nW}n0opOPi+9cT)p87-HKVQ@b@ z*@>kK2>R!Q`SP*gvwmHiZ@THB_%7uJLPmGEOkb_X(@Loi%mVN!l)6RMq|&lop(Z&f z6sic6Eyg>LDnXnEQj@b%CUz|jor}Pk1x+iL!&EJ3jOBi~#)TeO;Y?q?c#X)xB4WD6>4dfDuWasBQ%YD{xhaPdE|#JDs9KUo8&gutzvm zW>&k_*#RyLok8hs4+#z_`-CaMu9hzM0r6Fy^TGDPJm*CsKhZOlg#c?PU{FzWHfQPI z)E1TW|I|*cr`&#Ow?>^_GS?Ru@xTEM6nYOn-Eg^EE(W~8_Q$gtk4Kl_c~8%fs?ayi z^~ps)?r5g%0xYx}VNZdM6LHJ@qTb)}yyk7h#mKuyoSM8zsrCfz^Z!9#MQ>=5#q}JD zEI30sJ}z=AHwb%OO0_yW5zHag=u?p?7s&i;xlBMg{i?4zv&oCgSsMuzZk2QQEgh81 zttM$KH?1j(@m*2DNn{gw@3+$Pv|0t4+Cs(%BR@i^oGIHyjr^d>p1r>CV%FJ&J#0}> zA5zRudXGn*vz_%9`4T?=KxO_}HVzkBlR$;q=}e|YrtWH9U>Ke_$w@bKvjQZ-kK zVJ<4ka&d793Qx8%A~#yy0*(@1`z{lQQQ3B#n@PtdfWwspB1`fqOudGGBO`$S7Nu%& z?vpdRv_5IXg~?>Z9Mj;zc&<9-8Tslbvq z>GrBf!(O#!NX1*|vgCDv1Ed78sY~#rq`&eWhP-WhrAAXyFHxPaelZzcUu5-yUF*FK zw28bVjTWSjN$$|fnbNWjQ(;8GDta};6cT;8v|P=68&8U3@OHm$yZiq854ZPs-z&B5 zm$1sAS}L`(-+p}a_WsSgUG(>CK+i{%dIM&BPhw`gO-zRpR#>-QMiK}gKF~S*g>v8M zIi-2$MtE$;5DfV5(_UAj)-dh0J7<{=v+==u25BOhTa&r%0Y!6Ha69j5D4Mm0wH^{- zS|$DJ9--L;@wW8NuJ%m+9OmB!+EMu+SZ1u7^=brx3{3ImbLa{1b423R(OfZ7$o+*E zBacbp)Nw2UsAhMMold#yj_pSa97W2SLwuR}X~cAG9M|Zf#g6DWM{gg%WK4G^{R1Og z-3x8Pue3cRfuJxwM4PQnmQ7QRfYKmRcI)#*WIUW@(15@VKHDfiscZ&VR+M=gZ8m{Oe=!=N2DE4;KWC{h?=Pr88AUf7r@Z zp{ilv@eojQqug}KkmozjX>{~T(DY=G$q&o@qlE)4X{1Cu3mby95jw`p$raYRCV8Zj zWv>wnG9gw?TOb zx6rL84PHSbi%!i>q#c~ts(-Hg?BOrkBxMIo+`Co8NVUKGFWHfk>Q!tds5rpA%t(#}~A^xlfbj zdvGX|#<@||wo~mK9+^i$7DvOb72`@8d7N&UKFZWw~DQc`> zNXT6$T zwLjCv<#RBY7H)v5k1)N1-*@Mh@M`-y#XdHBfYH<-E#@z%0qjEmGEi}bULoM_7rr%BSS`?6cKn0IRQrR zUcJ5hVFoed_B~28r{ojXYYpX?NBIb(T#fmNtcJxAY4^{ULo5ybl2NS>!tF?7&jXE%@HGHZ#D0F3XA54Jm#`phX;wI(q{pwl51xO1$mjd8A8@@p3l zR7$?wC!V8=$*GxuU}=i7q{BlMw!;QO5a{O4TYV;!%VdVW>F((1q4|@$#6U&IW1?v) z_f3$2vYflEa9~md+&7e;@%Y>_^jeb7vbmH}=r>i<^O6jsQ(s6(&)ZU!4l}gH?=#k= zmvIi4HFuP6-9(B^*EtjW@hdRPz(J*!$Lun1zQ-z*&1J%Z@p#JgXnX*F;?E~V03%id zQVruHl|M%BFzj=F0ZzKe9TjD$V zY(6P{fu6!_1x2>B4a#mYAVW&Kj&@s1cpZyNh48nk zR18|ms#h=8sr&|76)L*mB20sHcsO{RBr|34%?}%U zN}(zbD3e^vMeDdfXgD{b3LDQbY+WaN$Y{IMV6t$L);cSH47iN-WM!44`c#voD_EWF zcrGAHpr~~CyKsB>eXLilQtro?$eVX>KK!|-W+snj9rx7y2o*QHpe)xmUFj*rflX~Q z`M{_?B1gTr5NQwW@A+Qf0fUtar1+$r%B>!!4OJu{L(Wo4=>n%35s%dSn+lk?Ah}1+ z5=Y}CqlHp2zUq3kLEtFA7s*w3SRrg>q}qVz=4hDm#PmWRk=;;h& zxUOXa35E(gEIAQv_S%lS6VdwoiJ_pvspvRN2v9mwm<2a!vHm#g{ZVnsvD{#x8P$8S z0-Ikf6wpcRMdY-KQCgWK@GzWkm<1kPYAXxcg>|l6ayMYH6BfkrMc(yoRvmkT9BR+1YBAEmsF(1Q^-IN|I#L_|A;YK0u2&{eL&Id-=84|`Q7{9Pi{Z_<^Jxc z-y;$F|8x77`&aM3y?t~4`fBEp!tM6`qkD}H;{dD_2{{8Xp{_g#5c68WZPjTm;^zz=Aqx@b17TtPcfQ#ol zSgh)kYxuWwkWUECeXx#AaUV_GI5N|(`p1(=QI1K-8I%aQm&66R(G<3_M8xQ!u3eH^ zO%Y&Y?0?BCfOFxg^NP)1eLa2u{_g$w?)5EHK0J)P-9pEhW4Z9iuWQ#5MgAj=_;pOSRf_qq9d_?0cAj&EYKmZ4Ng#ne*^%BfS`rKr=% zx?_MolK?DhqKEhEBSr3M4|gy`wg_?Ph{D3p*~*I& zSIkuDtF(vJ$`S_P1>}a@96V}p!t5Fc8Hvv9_gVo+*wU}Qwgv(pot1eY)9}Y+WgP(V zzyMJElp_s2PV#s?a^HAqnyeZR>&3{ox|e=AqAyFdLRjl?k*P)`%^Lh+7f5yB2eP5a z^G@vs7ao8IMH;dlYsu4tF#FV{!4NPkF))?nl1z#QDdwmtLTMjq|Rv&Qf)Fl&|ezl;uoY> z4a^A_ykMG-Ec+dixmwAf7!h8=(jZ}sIuvpPTR_E>bNxg_SY$9DrS?!?aryJ@`^kG&-6N6n-Zvju?k{y^`EQIF@0jckQ4N=g+93%{(X4Hf z6eK?`Q&9M~X|E}-5uwDteprT~BVs^a^u@n|F-bYJ{sM}M-+EzJl-O{vs3j>0tE76= zbn@(7wb-HDqgN)nNoT-JFLO{DJm3%3w?80n&zGmDk2*rQ#qEa=0*~tYH>%LPro%j$ zPR`kImfg%GOUZ2>-bl1I#gNpVJnaEKT449&@kH`*rS%99P)V+{zeXq&9tp!^+V#3QJxHohRPhQ`D5;@?w8!S-b;oov6*?!ABY#wCmei~# zNvsTMbAS?E9nxlMHoiYATh_knmuQ0#O-N^Ki8XXm`wShyCk>5vJ7_X<3R6JE52(Fdp}RU8fl6K? zDhVjxmAGgl=~QFG7;?D;7Q0wcYJo1ROS#wX%m+EbIxf#PVaUnep)KFOu6*IOZy!9y z|3os$T}WAV#`wt*eWIOTF3MD^<6$V>-mnZXYD zzK;>pJxT0@UFoy*O$-4aW370Bg~QMJjOS6}`)G}d!2+2wP3m+7bqJq8)u6*?EUfhj zG}$EV%M#2yeq4naTfE~y2K$5^%nVs>Sh;4gW>=MSiXS{rAt?LpZX-wlu{Oci~giuDy|VX;zCwuHxiTMklL#h zW_h*+il&0sue6p~@|=J&unI-JL#a`tMT3Df{|IYFM8YaR*9M}*cFbH4%-YP^rIp*; z#m^-*Vs=i@LggBUx}&^IM7Y`Lw76;>pXaPBRY#`XRr3oJU|lXw=a+BsaCgOpVUU4TU072QVp6uk`f*g2ouMJS5M}Hu#u_Qy}{%!$Z3Il8m`8C zIV|2|1a7QL1k84+^Vr!67Q(zSN0NP_$*gcnnkKm~9ftqXoxqssX&?RvOAJ)P;kF~{rb(_ zU~z}?CU<4^iH_b!^niq1c{MGUa7ceYTOsTugo_l~uUs_4L+PpeQ`9Sjo|@D^_ALvv z6-8j7i=s^c0h%-pUFd)UrrCzAng(r<75C8W)EWv)W^&q*lc(&|EmW7Fl<98w>i+)y zn{Pkf-|lvx_8)Fvi;M%oUg5-UXIls(pFBMr^d3?8q@;d~Y_n0LV{?PVDqcd$ zDN&)HRDr|~Om&EK9XfpwLy#n5a4DA7Q$`G=CD*tq7?fR2 zwL@sSgaI?Ur)=#d_#_&@a zX(F|{Pv0uqDf=bWQ{(5JkIiPNrVF%*4qKvb5DaumEm$__-J9_{GW|$1h*DADuaIW! z=Jd)Un?V3|B3y`BU$|RA7HT}#mw5xMcTam7Z>k{XQ#j&apyZiBlS^h^cbJ-@0% z#kxn6j{`M9?5k>z;UDQRpch0+sNATv=SGqeu|Cz+^l}U`2`}*Juy>N;wn1Yd4l29H z=e?XEo&q48Nrsm*@yY4vYO;oTB_|<7N}pIw@EKR;CpDs^Db)?)3c%o>vh>F;OwTYN zU0h#etyiO6AEN~|-GEtLtYHHQ^AuD8%Oh-N93)D`TnL-xONU1IP12hPL5A+}=CmhC zrs}B|yNc4w%Uw0=@h-_mMx$;gq2b^WR1lK^BX7QcbNlu+b3=W+mFXcuZjlGd+J4j1 zklw%iOOJ1O-23|LqD9k$;O_N+4Cp+vBY=?%o0iH-2q65k3ahNT^t_UK`$ME{o1GeG zm@Vs9sVN)Qi|4JuoD`RXwC&9r8U_CykWmfE)3T~ya6i%{<4S8!^Z6WS`gFX78^LIc zSi;H63fpB$RRx!U$-)xFi$gENN;9ze;MFjJ@jzG16$*hClWuhRu1H)e7zoEAJe19@ ztTQ>Cjn-x^(wh@h0!Nhz*MHmNmXzVm-5G6_fGK|)&Kyw$ihOOx=S|yiT7kwW{~WMi zNL38+vz?`~*(K6IqDEafh*2LtRH6=zHtm~`6r6exO*_ya8CN5hGR}%{FGmp{0s$pV z1HK1MXxZF-eE%K910A7u<8Sm>d3#_yFoV<*d}7u1A3dPv`RpZhO=lKnz?oRFam@)g z#2LIMUEZWhpGG~i~V zAaj_(1vntU0%n68CulI5O&HEd6*e-t6s<7jS|ipUF(+VefMzy}-p_Y$5p?kOws-Kw zhufbK#%Dg2PxmV5xc!aZ1dmZ*W@0gug54v)bi#xS>;m%7W$l%1biuExx> zM+@oDY~xIsuvI3|rW|NAg4ST3&Obt}gxmxP%VdvM;~}G4QwGSm)83V%72+L}qU$_q z^Z`E{496su#-S%WfCV17nt_G^m7#ltG|sSSpkNJs+!FOAFT=NnZG79SuJj!V!vvs! zIQl-w*4M~XoKhAOJ>l`O`sdVkV;$ikP~oS5(e_L8WZ^HXmjlQAky27T$+PMRxCpM-6|`vyMt-f&|rWUo|X%_v!;lgvk_0 zeS(usJ&J*L%KOndL^sFDqC-o{KneTpsw|w=)hWm+ILL-OnpYe_z8Dfsumm%Zz->>G za-$KTu$iEv@((Crq1}l)2xI0>+d^*5E`!H#n+v!5e624rjRXU82DuRDO^wlD3@ej) z1jJbtFRdnVv!o?@dOLneW`stkZb)a{@Q41>_| z9wxWdhn@TeAS+tc+Q>$ay>fHIG>iJ%#8jG6)vr$m0#JCv`3+Ly-oV!hmW0dk^dNo+ z7vu||16j-B{I`4J%(r_^aDoXIu#o~-h7@m#iW=6cIm!CQ^q5$CnEmiCOKMucN2^(z zV7QSWakYkXrsq&+t7|Ry>oCDw{pJt<;H_k{aJx+sumvT5%0i;!rRs;GeC9mm-D6Tss zSegKNwK}2Fj2<;KP)IzXE(bL*a4-#A8ehj;p+Ksw)9DZ9n7&u?SElR9E>B z(xf|usi&uXa|5sE&2?6v)vPm12SPssONXYcIz%iJS>26bqdx^9|&b2(gz?K zjQdDTLBELNl-9bggku>n-O!X_#v4>wb^2ksIS#(68)^0JebrNLFC)a|Y8Btt?sSF1 z0#t53?xz?%cW2~Lwu)Qo)CUF+Xa4X_f*mrybPcw_V6@FnNyJS?o5%T}PhaTb#7M4c z;#50K(gxSH&ixt0md4mlAClckirNEAwTdzsjC+$lL$5D9jTQc+&h+JsGrqanriF4* zn2VCSG+2ZVxD!+aF77S;hygczYF46LS_nFU_S#MOLNBWjyMOq*0#@QIKKBPAPa zA;yfcp6b)Hfp2EOcSv+*bx(;NEb#|Ulx6+s9}XDP%8xnUD|&bICW1`1iFq}btD>xS z*~n=M6iH}ClQJq$$m+>Mkc|V{?$7B(r!U6SYm}CDACx5Arlgj6fEGkzOL)0L74<8; zTn9k4f``m}wt_0mWK7vrDeDrJEuf~^rIo?yNGYu3pg;X|54r;nhGK>xa$zua?Zn&z zcO@LS!COtTeS0_sqbaH!GnPVAiJ(n(no>3<3pm>B~6f{X~&U;8uBKX}tandteUo1CX+ z@bt53YFL><9JNxrf&v|Wdh)%&fLY25E1nJ?P$x8QC4l2_Gujhd24yi49DQES#PGrG zr~Ai>B#80ieUi0|2x-^h zf+!E3%RG#ojN%0$KSTyQ$rp()sao|qJqp2MU~?v@@aUL4A(&RTRz`?3y6r_zuCQiOM9XB&1HahijX$7ehBohb3-^ags5gQ#^M{-!; zlbZ!G=F?2ekkCENN^p=ZMNc}sJJ5!eDTBG%d~QcC?!i~7OkGZ%fc;#3_4Mled147D zrv!TtVhXR3FB0(%6V!Th4#bIi-KT|0k#lG3<<(01&AKUn`U(`9*)y*D8IB=6+s4ZR za0Rq+wc1UVH%iGc{AEYpm@l7sMmMhq+$2t-Rti&eK2|vjpY-{#95p5zf;wbo?iAr zn?=2f`Q%Zx1vU)Sq#_J@J{nV+E1U))$q0pvGpJ}r@bvgv{(tG3AR*hDwdchD2ryx~ z{K}0_B!pS4Td>0x>$q2H82R8s>u@5lU;RthG8BWjFZJ-pZ&>g4psLa z=E`b#z@1$i$PA;hSPkXHrCdx)vc}7 z_cwiB?K2gff%U_wPy`BS{pZU9TfnZ?hlP;9(G&tv=`9Kr(CW@)SBh7}SeMCUbDOrP znAu6h#<*&>nHjqdN(exlG>2(HM5+~cgdlrbc|*O;<4x*Zuq1s^>9RpHvo(dTemQYh z$-?Q&fH1R3$rH?vpKdO@ZB`*EVoKxdxfS0A-M6hxa%Ae&O~f(+nA0UaqAP%T0)W|} zR5WvvZBcP4>v(!bPIz-yciyAY&k^r~wm^JBR*%a%v_Sy{nkY(in05d>K{ZIz<|1p_ zjNcd_8y^pWQYhnuP_qCKht45w40)EqXT2=yAk^lIv}cH3X`f8utZYaO=e?XDBuTWr zZgOOMnG39EcN5Nh^NC%0D)D2|3G4f#G(^>tJ{sBwl_$3N5OWSCb>E=^$nL|N|9!i= z-~G9l*#Y>^DWC)e;sZ~N#SY-{@b=k%_B#6?U92vyVV}#6h0&1R3XRbN&!|)+)s-M$ zOcV3$b;FZxs5a}$b>2$6XLxjLPk9JL}r zjQO*}vjUP63eqb0^MLv|8CC5E45~a@^qd)uF6L**zK4pI?h&zX2-ql9n)%Ey7NdcX zTmp