diff --git a/.mxproject b/.mxproject index 0d4d2e0..95b5290 100644 --- a/.mxproject +++ b/.mxproject @@ -1,25 +1,25 @@ [PreviousLibFiles] -LibFiles=Drivers\STM32F3xx_HAL_Driver\Inc\stm32f3xx_hal_can.h;Drivers\STM32F3xx_HAL_Driver\Inc\Legacy\stm32_hal_legacy.h;Drivers\STM32F3xx_HAL_Driver\Inc\stm32f3xx_hal.h;Drivers\STM32F3xx_HAL_Driver\Inc\stm32f3xx_hal_def.h;Drivers\STM32F3xx_HAL_Driver\Inc\stm32f3xx_hal_rcc.h;Drivers\STM32F3xx_HAL_Driver\Inc\stm32f3xx_hal_rcc_ex.h;Drivers\STM32F3xx_HAL_Driver\Inc\stm32f3xx_ll_bus.h;Drivers\STM32F3xx_HAL_Driver\Inc\stm32f3xx_ll_rcc.h;Drivers\STM32F3xx_HAL_Driver\Inc\stm32f3xx_ll_crs.h;Drivers\STM32F3xx_HAL_Driver\Inc\stm32f3xx_ll_system.h;Drivers\STM32F3xx_HAL_Driver\Inc\stm32f3xx_ll_utils.h;Drivers\STM32F3xx_HAL_Driver\Inc\stm32f3xx_hal_gpio.h;Drivers\STM32F3xx_HAL_Driver\Inc\stm32f3xx_hal_gpio_ex.h;Drivers\STM32F3xx_HAL_Driver\Inc\stm32f3xx_ll_gpio.h;Drivers\STM32F3xx_HAL_Driver\Inc\stm32f3xx_hal_dma_ex.h;Drivers\STM32F3xx_HAL_Driver\Inc\stm32f3xx_hal_dma.h;Drivers\STM32F3xx_HAL_Driver\Inc\stm32f3xx_ll_dma.h;Drivers\STM32F3xx_HAL_Driver\Inc\stm32f3xx_hal_cortex.h;Drivers\STM32F3xx_HAL_Driver\Inc\stm32f3xx_ll_cortex.h;Drivers\STM32F3xx_HAL_Driver\Inc\stm32f3xx_hal_pwr.h;Drivers\STM32F3xx_HAL_Driver\Inc\stm32f3xx_hal_pwr_ex.h;Drivers\STM32F3xx_HAL_Driver\Inc\stm32f3xx_ll_pwr.h;Drivers\STM32F3xx_HAL_Driver\Inc\stm32f3xx_hal_flash.h;Drivers\STM32F3xx_HAL_Driver\Inc\stm32f3xx_hal_flash_ex.h;Drivers\STM32F3xx_HAL_Driver\Inc\stm32f3xx_hal_i2c.h;Drivers\STM32F3xx_HAL_Driver\Inc\stm32f3xx_hal_i2c_ex.h;Drivers\STM32F3xx_HAL_Driver\Inc\stm32f3xx_hal_exti.h;Drivers\STM32F3xx_HAL_Driver\Inc\stm32f3xx_ll_exti.h;Drivers\STM32F3xx_HAL_Driver\Inc\stm32f3xx_ll_i2c.h;Drivers\STM32F3xx_HAL_Driver\Inc\stm32f3xx_hal_spi.h;Drivers\STM32F3xx_HAL_Driver\Inc\stm32f3xx_ll_spi.h;Drivers\STM32F3xx_HAL_Driver\Inc\stm32f3xx_hal_spi_ex.h;Drivers\STM32F3xx_HAL_Driver\Inc\stm32f3xx_hal_tim.h;Drivers\STM32F3xx_HAL_Driver\Inc\stm32f3xx_hal_tim_ex.h;Drivers\STM32F3xx_HAL_Driver\Inc\stm32f3xx_ll_tim.h;Drivers\STM32F3xx_HAL_Driver\Inc\stm32f3xx_hal_uart.h;Drivers\STM32F3xx_HAL_Driver\Inc\stm32f3xx_ll_usart.h;Drivers\STM32F3xx_HAL_Driver\Inc\stm32f3xx_hal_uart_ex.h;Drivers\STM32F3xx_HAL_Driver\Src\stm32f3xx_hal_can.c;Drivers\STM32F3xx_HAL_Driver\Src\stm32f3xx_hal.c;Drivers\STM32F3xx_HAL_Driver\Src\stm32f3xx_hal_rcc.c;Drivers\STM32F3xx_HAL_Driver\Src\stm32f3xx_hal_rcc_ex.c;Drivers\STM32F3xx_HAL_Driver\Src\stm32f3xx_hal_gpio.c;Drivers\STM32F3xx_HAL_Driver\Src\stm32f3xx_hal_dma.c;Drivers\STM32F3xx_HAL_Driver\Src\stm32f3xx_hal_cortex.c;Drivers\STM32F3xx_HAL_Driver\Src\stm32f3xx_hal_pwr.c;Drivers\STM32F3xx_HAL_Driver\Src\stm32f3xx_hal_pwr_ex.c;Drivers\STM32F3xx_HAL_Driver\Src\stm32f3xx_hal_flash.c;Drivers\STM32F3xx_HAL_Driver\Src\stm32f3xx_hal_flash_ex.c;Drivers\STM32F3xx_HAL_Driver\Src\stm32f3xx_hal_i2c.c;Drivers\STM32F3xx_HAL_Driver\Src\stm32f3xx_hal_i2c_ex.c;Drivers\STM32F3xx_HAL_Driver\Src\stm32f3xx_hal_exti.c;Drivers\STM32F3xx_HAL_Driver\Src\stm32f3xx_hal_spi.c;Drivers\STM32F3xx_HAL_Driver\Src\stm32f3xx_hal_spi_ex.c;Drivers\STM32F3xx_HAL_Driver\Src\stm32f3xx_hal_tim.c;Drivers\STM32F3xx_HAL_Driver\Src\stm32f3xx_hal_tim_ex.c;Drivers\STM32F3xx_HAL_Driver\Src\stm32f3xx_hal_uart.c;Drivers\STM32F3xx_HAL_Driver\Src\stm32f3xx_hal_uart_ex.c;Drivers\STM32F3xx_HAL_Driver\Inc\stm32f3xx_hal_can.h;Drivers\STM32F3xx_HAL_Driver\Inc\Legacy\stm32_hal_legacy.h;Drivers\STM32F3xx_HAL_Driver\Inc\stm32f3xx_hal.h;Drivers\STM32F3xx_HAL_Driver\Inc\stm32f3xx_hal_def.h;Drivers\STM32F3xx_HAL_Driver\Inc\stm32f3xx_hal_rcc.h;Drivers\STM32F3xx_HAL_Driver\Inc\stm32f3xx_hal_rcc_ex.h;Drivers\STM32F3xx_HAL_Driver\Inc\stm32f3xx_ll_bus.h;Drivers\STM32F3xx_HAL_Driver\Inc\stm32f3xx_ll_rcc.h;Drivers\STM32F3xx_HAL_Driver\Inc\stm32f3xx_ll_crs.h;Drivers\STM32F3xx_HAL_Driver\Inc\stm32f3xx_ll_system.h;Drivers\STM32F3xx_HAL_Driver\Inc\stm32f3xx_ll_utils.h;Drivers\STM32F3xx_HAL_Driver\Inc\stm32f3xx_hal_gpio.h;Drivers\STM32F3xx_HAL_Driver\Inc\stm32f3xx_hal_gpio_ex.h;Drivers\STM32F3xx_HAL_Driver\Inc\stm32f3xx_ll_gpio.h;Drivers\STM32F3xx_HAL_Driver\Inc\stm32f3xx_hal_dma_ex.h;Drivers\STM32F3xx_HAL_Driver\Inc\stm32f3xx_hal_dma.h;Drivers\STM32F3xx_HAL_Driver\Inc\stm32f3xx_ll_dma.h;Drivers\STM32F3xx_HAL_Driver\Inc\stm32f3xx_hal_cortex.h;Drivers\STM32F3xx_HAL_Driver\Inc\stm32f3xx_ll_cortex.h;Drivers\STM32F3xx_HAL_Driver\Inc\stm32f3xx_hal_pwr.h;Drivers\STM32F3xx_HAL_Driver\Inc\stm32f3xx_hal_pwr_ex.h;Drivers\STM32F3xx_HAL_Driver\Inc\stm32f3xx_ll_pwr.h;Drivers\STM32F3xx_HAL_Driver\Inc\stm32f3xx_hal_flash.h;Drivers\STM32F3xx_HAL_Driver\Inc\stm32f3xx_hal_flash_ex.h;Drivers\STM32F3xx_HAL_Driver\Inc\stm32f3xx_hal_i2c.h;Drivers\STM32F3xx_HAL_Driver\Inc\stm32f3xx_hal_i2c_ex.h;Drivers\STM32F3xx_HAL_Driver\Inc\stm32f3xx_hal_exti.h;Drivers\STM32F3xx_HAL_Driver\Inc\stm32f3xx_ll_exti.h;Drivers\STM32F3xx_HAL_Driver\Inc\stm32f3xx_ll_i2c.h;Drivers\STM32F3xx_HAL_Driver\Inc\stm32f3xx_hal_spi.h;Drivers\STM32F3xx_HAL_Driver\Inc\stm32f3xx_ll_spi.h;Drivers\STM32F3xx_HAL_Driver\Inc\stm32f3xx_hal_spi_ex.h;Drivers\STM32F3xx_HAL_Driver\Inc\stm32f3xx_hal_tim.h;Drivers\STM32F3xx_HAL_Driver\Inc\stm32f3xx_hal_tim_ex.h;Drivers\STM32F3xx_HAL_Driver\Inc\stm32f3xx_ll_tim.h;Drivers\STM32F3xx_HAL_Driver\Inc\stm32f3xx_hal_uart.h;Drivers\STM32F3xx_HAL_Driver\Inc\stm32f3xx_ll_usart.h;Drivers\STM32F3xx_HAL_Driver\Inc\stm32f3xx_hal_uart_ex.h;Drivers\CMSIS\Device\ST\STM32F3xx\Include\stm32f302xc.h;Drivers\CMSIS\Device\ST\STM32F3xx\Include\stm32f3xx.h;Drivers\CMSIS\Device\ST\STM32F3xx\Include\system_stm32f3xx.h;Drivers\CMSIS\Device\ST\STM32F3xx\Source\Templates\system_stm32f3xx.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; +LibFiles=Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_can.h;Drivers/STM32F3xx_HAL_Driver/Inc/Legacy/stm32_hal_legacy.h;Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal.h;Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_def.h;Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_rcc.h;Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_rcc_ex.h;Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_ll_bus.h;Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_ll_rcc.h;Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_ll_crs.h;Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_ll_system.h;Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_ll_utils.h;Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_gpio.h;Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_gpio_ex.h;Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_ll_gpio.h;Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_dma_ex.h;Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_dma.h;Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_ll_dma.h;Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_cortex.h;Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_ll_cortex.h;Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_pwr.h;Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_pwr_ex.h;Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_ll_pwr.h;Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_flash.h;Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_flash_ex.h;Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_i2c.h;Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_i2c_ex.h;Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_exti.h;Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_ll_exti.h;Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_ll_i2c.h;Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_spi.h;Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_ll_spi.h;Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_spi_ex.h;Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_tim.h;Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_tim_ex.h;Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_ll_tim.h;Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_uart.h;Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_ll_usart.h;Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_uart_ex.h;Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c;Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c;Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c;Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c;Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c;Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c;Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c;Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.c;Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr_ex.c;Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c;Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c;Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c;Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c_ex.c;Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c;Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c;Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi_ex.c;Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_tim.c;Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_tim_ex.c;Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_uart.c;Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_uart_ex.c;Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_can.h;Drivers/STM32F3xx_HAL_Driver/Inc/Legacy/stm32_hal_legacy.h;Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal.h;Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_def.h;Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_rcc.h;Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_rcc_ex.h;Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_ll_bus.h;Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_ll_rcc.h;Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_ll_crs.h;Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_ll_system.h;Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_ll_utils.h;Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_gpio.h;Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_gpio_ex.h;Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_ll_gpio.h;Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_dma_ex.h;Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_dma.h;Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_ll_dma.h;Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_cortex.h;Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_ll_cortex.h;Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_pwr.h;Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_pwr_ex.h;Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_ll_pwr.h;Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_flash.h;Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_flash_ex.h;Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_i2c.h;Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_i2c_ex.h;Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_exti.h;Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_ll_exti.h;Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_ll_i2c.h;Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_spi.h;Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_ll_spi.h;Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_spi_ex.h;Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_tim.h;Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_tim_ex.h;Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_ll_tim.h;Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_uart.h;Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_ll_usart.h;Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_uart_ex.h;Drivers/CMSIS/Device/ST/STM32F3xx/Include/stm32f302xc.h;Drivers/CMSIS/Device/ST/STM32F3xx/Include/stm32f3xx.h;Drivers/CMSIS/Device/ST/STM32F3xx/Include/system_stm32f3xx.h;Drivers/CMSIS/Device/ST/STM32F3xx/Source/Templates/system_stm32f3xx.c;Drivers/CMSIS/Include/core_cm7.h;Drivers/CMSIS/Include/core_cm23.h;Drivers/CMSIS/Include/cmsis_armclang.h;Drivers/CMSIS/Include/core_armv8mml.h;Drivers/CMSIS/Include/core_cm3.h;Drivers/CMSIS/Include/core_cm0plus.h;Drivers/CMSIS/Include/cmsis_compiler.h;Drivers/CMSIS/Include/mpu_armv8.h;Drivers/CMSIS/Include/core_cm4.h;Drivers/CMSIS/Include/core_cm0.h;Drivers/CMSIS/Include/cmsis_version.h;Drivers/CMSIS/Include/tz_context.h;Drivers/CMSIS/Include/core_armv8mbl.h;Drivers/CMSIS/Include/mpu_armv7.h;Drivers/CMSIS/Include/core_sc000.h;Drivers/CMSIS/Include/core_cm1.h;Drivers/CMSIS/Include/cmsis_armcc.h;Drivers/CMSIS/Include/cmsis_gcc.h;Drivers/CMSIS/Include/core_cm33.h;Drivers/CMSIS/Include/cmsis_iccarm.h;Drivers/CMSIS/Include/core_sc300.h; [PreviousUsedMakefileFiles] -SourceFiles=Core\Src\main.c;Core\Src\stm32f3xx_it.c;Core\Src\stm32f3xx_hal_msp.c;Drivers\STM32F3xx_HAL_Driver\Src\stm32f3xx_hal_can.c;Drivers\STM32F3xx_HAL_Driver\Src\stm32f3xx_hal.c;Drivers\STM32F3xx_HAL_Driver\Src\stm32f3xx_hal_rcc.c;Drivers\STM32F3xx_HAL_Driver\Src\stm32f3xx_hal_rcc_ex.c;Drivers\STM32F3xx_HAL_Driver\Src\stm32f3xx_hal_gpio.c;Drivers\STM32F3xx_HAL_Driver\Src\stm32f3xx_hal_dma.c;Drivers\STM32F3xx_HAL_Driver\Src\stm32f3xx_hal_cortex.c;Drivers\STM32F3xx_HAL_Driver\Src\stm32f3xx_hal_pwr.c;Drivers\STM32F3xx_HAL_Driver\Src\stm32f3xx_hal_pwr_ex.c;Drivers\STM32F3xx_HAL_Driver\Src\stm32f3xx_hal_flash.c;Drivers\STM32F3xx_HAL_Driver\Src\stm32f3xx_hal_flash_ex.c;Drivers\STM32F3xx_HAL_Driver\Src\stm32f3xx_hal_i2c.c;Drivers\STM32F3xx_HAL_Driver\Src\stm32f3xx_hal_i2c_ex.c;Drivers\STM32F3xx_HAL_Driver\Src\stm32f3xx_hal_exti.c;Drivers\STM32F3xx_HAL_Driver\Src\stm32f3xx_hal_spi.c;Drivers\STM32F3xx_HAL_Driver\Src\stm32f3xx_hal_spi_ex.c;Drivers\STM32F3xx_HAL_Driver\Src\stm32f3xx_hal_tim.c;Drivers\STM32F3xx_HAL_Driver\Src\stm32f3xx_hal_tim_ex.c;Drivers\STM32F3xx_HAL_Driver\Src\stm32f3xx_hal_uart.c;Drivers\STM32F3xx_HAL_Driver\Src\stm32f3xx_hal_uart_ex.c;Drivers\CMSIS\Device\ST\STM32F3xx\Source\Templates\system_stm32f3xx.c;Core\Src\system_stm32f3xx.c;Drivers\STM32F3xx_HAL_Driver\Src\stm32f3xx_hal_can.c;Drivers\STM32F3xx_HAL_Driver\Src\stm32f3xx_hal.c;Drivers\STM32F3xx_HAL_Driver\Src\stm32f3xx_hal_rcc.c;Drivers\STM32F3xx_HAL_Driver\Src\stm32f3xx_hal_rcc_ex.c;Drivers\STM32F3xx_HAL_Driver\Src\stm32f3xx_hal_gpio.c;Drivers\STM32F3xx_HAL_Driver\Src\stm32f3xx_hal_dma.c;Drivers\STM32F3xx_HAL_Driver\Src\stm32f3xx_hal_cortex.c;Drivers\STM32F3xx_HAL_Driver\Src\stm32f3xx_hal_pwr.c;Drivers\STM32F3xx_HAL_Driver\Src\stm32f3xx_hal_pwr_ex.c;Drivers\STM32F3xx_HAL_Driver\Src\stm32f3xx_hal_flash.c;Drivers\STM32F3xx_HAL_Driver\Src\stm32f3xx_hal_flash_ex.c;Drivers\STM32F3xx_HAL_Driver\Src\stm32f3xx_hal_i2c.c;Drivers\STM32F3xx_HAL_Driver\Src\stm32f3xx_hal_i2c_ex.c;Drivers\STM32F3xx_HAL_Driver\Src\stm32f3xx_hal_exti.c;Drivers\STM32F3xx_HAL_Driver\Src\stm32f3xx_hal_spi.c;Drivers\STM32F3xx_HAL_Driver\Src\stm32f3xx_hal_spi_ex.c;Drivers\STM32F3xx_HAL_Driver\Src\stm32f3xx_hal_tim.c;Drivers\STM32F3xx_HAL_Driver\Src\stm32f3xx_hal_tim_ex.c;Drivers\STM32F3xx_HAL_Driver\Src\stm32f3xx_hal_uart.c;Drivers\STM32F3xx_HAL_Driver\Src\stm32f3xx_hal_uart_ex.c;Drivers\CMSIS\Device\ST\STM32F3xx\Source\Templates\system_stm32f3xx.c;Core\Src\system_stm32f3xx.c;;; -HeaderPath=Drivers\STM32F3xx_HAL_Driver\Inc;Drivers\STM32F3xx_HAL_Driver\Inc\Legacy;Drivers\CMSIS\Device\ST\STM32F3xx\Include;Drivers\CMSIS\Include;Core\Inc; +SourceFiles=Core/Src/main.c;Core/Src/stm32f3xx_it.c;Core/Src/stm32f3xx_hal_msp.c;Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c;Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c;Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c;Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c;Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c;Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c;Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c;Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.c;Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr_ex.c;Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c;Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c;Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c;Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c_ex.c;Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c;Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c;Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi_ex.c;Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_tim.c;Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_tim_ex.c;Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_uart.c;Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_uart_ex.c;Drivers/CMSIS/Device/ST/STM32F3xx/Source/Templates/system_stm32f3xx.c;Core/Src/system_stm32f3xx.c;Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c;Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c;Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c;Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c;Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c;Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c;Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c;Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.c;Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr_ex.c;Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c;Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c;Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c;Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c_ex.c;Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c;Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c;Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi_ex.c;Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_tim.c;Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_tim_ex.c;Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_uart.c;Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_uart_ex.c;Drivers/CMSIS/Device/ST/STM32F3xx/Source/Templates/system_stm32f3xx.c;Core/Src/system_stm32f3xx.c;;; +HeaderPath=Drivers/STM32F3xx_HAL_Driver/Inc;Drivers/STM32F3xx_HAL_Driver/Inc/Legacy;Drivers/CMSIS/Device/ST/STM32F3xx/Include;Drivers/CMSIS/Include;Core/Inc; CDefines=USE_HAL_DRIVER;STM32F302xC;USE_HAL_DRIVER;USE_HAL_DRIVER; [PreviousGenFiles] AdvancedFolderStructure=true HeaderFileListSize=3 -HeaderFiles#0=..\Core\Inc\stm32f3xx_it.h -HeaderFiles#1=..\Core\Inc\stm32f3xx_hal_conf.h -HeaderFiles#2=..\Core\Inc\main.h +HeaderFiles#0=../Core/Inc/stm32f3xx_it.h +HeaderFiles#1=../Core/Inc/stm32f3xx_hal_conf.h +HeaderFiles#2=../Core/Inc/main.h HeaderFolderListSize=1 -HeaderPath#0=..\Core\Inc +HeaderPath#0=../Core/Inc HeaderFiles=; SourceFileListSize=3 -SourceFiles#0=..\Core\Src\stm32f3xx_it.c -SourceFiles#1=..\Core\Src\stm32f3xx_hal_msp.c -SourceFiles#2=..\Core\Src\main.c +SourceFiles#0=../Core/Src/stm32f3xx_it.c +SourceFiles#1=../Core/Src/stm32f3xx_hal_msp.c +SourceFiles#2=../Core/Src/main.c SourceFolderListSize=1 -SourcePath#0=..\Core\Src +SourcePath#0=../Core/Src SourceFiles=; diff --git a/Core/Inc/AMS_CAN.h b/Core/Inc/AMS_CAN.h deleted file mode 100644 index 611ce6d..0000000 --- a/Core/Inc/AMS_CAN.h +++ /dev/null @@ -1,37 +0,0 @@ -/* - * AMS_CAN.h - * - * Created on: Mar 19, 2022 - * Author: jasper - */ - -#ifndef INC_AMS_CAN_H_ -#define INC_AMS_CAN_H_ - -#include "main.h" - -#include "stm32f3xx_hal.h" -#include "stm32f3xx_hal_can.h" -#include "stm32f3xx_hal_def.h" -#include -typedef struct { - uint8_t pwrgndfans; -} rx_status_frame; -uint8_t txbuffer; -uint8_t rxbuffer; -void ams_can_init(CAN_HandleTypeDef* hcan); -void ams_can_handle_ams_msg(CAN_RxHeaderTypeDef* header, uint8_t* data); -void ams_can_send_status(); -/** - * @brief Send an AMS Error via CAN. - * - * Data is taken from error_data - */ -void ams_can_send_error(); - -HAL_StatusTypeDef ams_can_wait_for_free_mailboxes(CAN_HandleTypeDef* handle, - int num_mailboxes, - uint32_t timeout); -void ams_can_send_log(); - -#endif /* INC_AMS_CAN_H_ */ diff --git a/Core/Inc/AMS_HighLevel.h b/Core/Inc/AMS_HighLevel.h index 78a8609..5ac241a 100644 --- a/Core/Inc/AMS_HighLevel.h +++ b/Core/Inc/AMS_HighLevel.h @@ -11,7 +11,12 @@ #include "ADBMS_Abstraction.h" #include "ADBMS_CMD_MAKROS.h" #include "ADBMS_LL_Driver.h" -#include "AMS_CAN.h" +#include "can.h" +#include "TMP1075.h" +#include "can-halal.h" +#include "errors.h" +#include "stm32f3xx_hal.h" +#include typedef enum { AMSDEACTIVE, diff --git a/Core/Inc/PWM_control.h b/Core/Inc/PWM_control.h new file mode 100644 index 0000000..d88cdf8 --- /dev/null +++ b/Core/Inc/PWM_control.h @@ -0,0 +1,33 @@ +#ifndef INC_PWM_CONTROL_H +#define INC_PWM_CONTROL_H + +#include "stm32f3xx_hal.h" +#include "ADBMS_LL_Driver.h" +#include "state_machine.h" +#include +#include "main.h" + +/* The PWM period (1/FPWM) is defined by the following parameters: +ARR value, the Prescaler value, and the internal clock itself which drives the timer module FCLK. +F_PWM = (F_CLK)/((ARR + 1) * (PSC + 1)) + +F_CLK = 16 MHz + +POWERGROUND ESC Signal: pulse every 20 ms, 1 ms = 0%, 2 ms = 100% +FREQ = 50 Hz -> 16 MHz/50 Hz = 320000 = ((39999 + 1) * (7 + 1)) +DUTY CYCLE = 1/20 -> 0%, DUTY CYCLE = 2/20 -> 100% +CCR * DUTY_CYCLE +CCR: 1/20 -> 500, 2/20 -> 1000 +*/ +#define POWERGROUND_FREQ 50 +#define POWERGROUND_MAX_DUTY_CYCLE 0.1 +#define POWERGROUND_MIN_DUTY_CYCLE 0.05 + +//#define BATTERY_COOLING_FREQ 20000 + +void PWM_control_init(TIM_HandleTypeDef* powerground, TIM_HandleTypeDef* battery_cooling); + +void PWM_powerground_control(uint8_t percent); +void PWM_battery_cooling_control(uint8_t percent); + +#endif /* INC_CHANNEL_CONTROL_H */ diff --git a/Core/Inc/TMP1075.h b/Core/Inc/TMP1075.h index 9c7dd5c..345b2fe 100644 --- a/Core/Inc/TMP1075.h +++ b/Core/Inc/TMP1075.h @@ -1,15 +1,17 @@ #ifndef INC_TMP1075_H_ #define INC_TMP1075_H_ -#include "AMS_CAN.h" +#include "can.h" #include "common_defs.h" #include "stm32f3xx_hal.h" -#include "stm32f3xx_hal_def.h" -#include "stm32f3xx_hal_i2c.h" +#include "TMP1075.h" +#include "can-halal.h" +#include "errors.h" #include extern uint32_t tmp1075_failed_sensors; extern int16_t tmp1075_temps[N_TEMP_SENSORS]; + HAL_StatusTypeDef tmp1075_init(I2C_HandleTypeDef* hi2c); HAL_StatusTypeDef tmp1075_measure(); HAL_StatusTypeDef tmp1075_sensor_init(int n); diff --git a/Core/Inc/can.h b/Core/Inc/can.h new file mode 100644 index 0000000..ee48dec --- /dev/null +++ b/Core/Inc/can.h @@ -0,0 +1,23 @@ +#ifndef INC_CAN_H +#define INC_CAN_H + +#include "stm32f3xx_hal.h" +#include "ADBMS_Abstraction.h" +#include "main.h" +#include "can-halal.h" +#include "AMS_HighLevel.h" +#include "state_machine.h" +#include + +#define CAN_ID_IN 0x501 +#define CAN_ID_OUT 0x502 +#define CAN_STATUS_FREQ 1000 +void can_init(CAN_HandleTypeDef* hcan); + +void can_handle_send_status(); + +void can_handle_recieve_command(const uint8_t *data); + +void ftcan_msg_received_cb(uint16_t id, size_t datalen, const uint8_t *data); + +#endif /* "INC_CAN_H" */ \ No newline at end of file diff --git a/Core/Inc/common_defs.h b/Core/Inc/common_defs.h index 316cb67..faff2dd 100644 --- a/Core/Inc/common_defs.h +++ b/Core/Inc/common_defs.h @@ -8,7 +8,7 @@ #ifndef INC_COMMON_DEFS_H_ #define INC_COMMON_DEFS_H_ -#define N_CELLS 14 -#define N_TEMP_SENSORS 14 +#define N_CELLS 12 +#define N_TEMP_SENSORS 12 #endif /* INC_COMMON_DEFS_H_ */ diff --git a/Core/Inc/eeprom.h b/Core/Inc/eeprom.h deleted file mode 100644 index 3d21c7a..0000000 --- a/Core/Inc/eeprom.h +++ /dev/null @@ -1,17 +0,0 @@ -#ifndef INC_EEPROM_H_ -#define INC_EEPROM_H_ - -#include "stm32f3xx_hal.h" - -#include - -__attribute__((packed)) typedef struct { - uint8_t id; -} EEPROMConfig; - -extern EEPROMConfig eeprom_config; - -void eeprom_init(I2C_HandleTypeDef* hi2c); -void eeprom_config_save(); - -#endif // INC_EEPROM_H_ diff --git a/Core/Inc/main.h b/Core/Inc/main.h index 0d9d39e..6eb33f1 100644 --- a/Core/Inc/main.h +++ b/Core/Inc/main.h @@ -73,10 +73,8 @@ void Error_Handler(void); #define STATUS_LED_G_GPIO_Port GPIOB #define PRECHARGE_EN_Pin GPIO_PIN_11 #define PRECHARGE_EN_GPIO_Port GPIOB -#define AUX_IN_Pin GPIO_PIN_13 -#define AUX_IN_GPIO_Port GPIOB -#define AUX_OUT_Pin GPIO_PIN_14 -#define AUX_OUT_GPIO_Port GPIOB +#define PWM_Battery_Cooling_Pin GPIO_PIN_15 +#define PWM_Battery_Cooling_GPIO_Port GPIOB #define RELAY_BATT_SIDE_ON_Pin GPIO_PIN_8 #define RELAY_BATT_SIDE_ON_GPIO_Port GPIOA #define RELAY_ESC_SIDE_ON_Pin GPIO_PIN_9 diff --git a/Core/Inc/state_machine.h b/Core/Inc/state_machine.h new file mode 100644 index 0000000..b08e0ce --- /dev/null +++ b/Core/Inc/state_machine.h @@ -0,0 +1,96 @@ +#ifndef INC_STATE_MACHINE_H +#define INC_STATE_MACHINE_H + +#include +#include +#include "ADBMS_LL_Driver.h" +#include "AMS_HighLevel.h" +#include "errors.h" +#include "PWM_control.h" +#include "TMP1075.h" +#include + +// Minimum vehicle side voltage to exit precharge +#define MIN_VEHICLE_SIDE_VOLTAGE 150000 // mV +// Time to wait after reaching 95% of battery voltage before exiting precharge +// Set this to 1000 in scruti to demonstrate the voltage on the multimeter +#define PRECHARGE_95_DURATION 0 // ms +// Time to wait for discharge +#define DISCHARGE_DURATION 5000 // ms +// Time to wait after there is no more error condition before exiting TS_ERROR +#define NO_ERROR_TIME 1000 // ms +// Time to wait for charger voltage before going to TS_ERROR +#define MAX_CHARGING_CHECK_DURATION 2000 // ms +// Time to wait between closing relays +#define RELAY_CLOSE_WAIT 10 // ms + +#warning +typedef enum { // states -> 3 bit. valid transitions: (all could transition to error) + STATE_INACTIVE, // INACTIVE -> PRECHARGE, CHARGING, ERROR + STATE_PRECHARGE, // PRECHARGE -> INACTIVE, READY, DISCHARGE, ERROR + STATE_READY, // READY -> ACTIVE, DISCHARGE, ERROR + STATE_ACTIVE, // ACTIVE -> READY, DISCHARGE, ERROR + STATE_DISCHARGE, // DISCHARGE -> INACTIVE, PRECHARGE, ERROR + STATE_CHARGING_PRECHARGE, + STATE_CHARGING, // CHARGING -> INACTIVE, DISCHARGE, ERROR + STATE_ERROR, // ERROR -> INACTIVE, DISCHARGE, ERROR +} State; + +typedef struct { + + uint16_t bms_timeout : 1; + uint16_t bms_fault : 1; + uint16_t temperature_error : 1; + uint16_t current_error : 1; + uint16_t current_sensor_missing : 1; + uint16_t voltage_error : 1; + uint16_t voltage_missing : 1; + uint16_t state_transition_fail : 1; + +} ErrorKind; + +//typedef enum {} WarningKind; + +typedef struct { + State current_state; + State target_state; + uint16_t error_source; // TSErrorSource (bitmask) + ErrorKind error_type; // TSErrorKind +} StateHandle; + +extern StateHandle state; +static bool relay_closed = 0; +static bool precharge_closed = 0; +extern int16_t RELAY_BAT_SIDE_VOLTAGE; +extern int16_t RELAY_ESC_SIDE_VOLTAGE; +extern int16_t CURRENT_MEASUREMENT; +extern uint8_t powerground_status; + + +void sm_init(); +void sm_update(); + +State sm_update_inactive(); +State sm_update_precharge(); +State sm_update_ready(); +State sm_update_active(); +State sm_update_discharge(); +State sm_update_charging_precharge(); +State sm_update_charging(); +State sm_update_error(); + +typedef enum { RELAY_MAIN, RELAY_PRECHARGE } Relay; +void sm_set_relay_positions(State state); +void sm_set_relay(Relay relay, bool closed); +void sm_check_charging(); +void sm_check_battery_temperature(int8_t* id, int16_t* temp); + +int16_t sm_return_cell_temperature(int id); +int16_t sm_return_cell_voltage(int id); + +void sm_handle_ams_in(const uint8 *data); +void sm_check_errors(); +void sm_set_error(ErrorKind error_kind, bool is_errored); +void sm_test_cycle_states(); + +#endif /* "INC_STATE_MACHINE_H" */ \ No newline at end of file diff --git a/Core/Inc/stm32f3xx_hal_conf.h b/Core/Inc/stm32f3xx_hal_conf.h index 23d581a..f70f764 100644 --- a/Core/Inc/stm32f3xx_hal_conf.h +++ b/Core/Inc/stm32f3xx_hal_conf.h @@ -81,7 +81,7 @@ * (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 */ + #define HSE_VALUE ((uint32_t)16000000) /*!< Value of the External oscillator in Hz */ #endif /* HSE_VALUE */ /** diff --git a/Core/Inc/stm32f3xx_it.h b/Core/Inc/stm32f3xx_it.h index 3c19d5a..7e2721d 100644 --- a/Core/Inc/stm32f3xx_it.h +++ b/Core/Inc/stm32f3xx_it.h @@ -55,6 +55,8 @@ void SVC_Handler(void); void DebugMon_Handler(void); void PendSV_Handler(void); void SysTick_Handler(void); +void USB_LP_CAN_RX0_IRQHandler(void); +void CAN_RX1_IRQHandler(void); /* USER CODE BEGIN EFP */ /* USER CODE END EFP */ diff --git a/Core/Src/AMS_CAN.c b/Core/Src/AMS_CAN.c deleted file mode 100644 index 532e8f5..0000000 --- a/Core/Src/AMS_CAN.c +++ /dev/null @@ -1,115 +0,0 @@ -/* - * AMS_CAN.c - * - * Created on: Mar 19, 2022 - * Author: jasper - */ - -#include "AMS_CAN.h" - -#include "ADBMS_Abstraction.h" - -#include "AMS_HighLevel.h" -#include "TMP1075.h" -#include "common_defs.h" -#include "eeprom.h" -#include "errors.h" -#include "main.h" -#include "stm32f3xx.h" -#include "stm32f3xx_hal.h" -#include "stm32f3xx_hal_can.h" - -#include "can-halal.h" -#include "stm32f3xx_hal_gpio.h" - -#include -#include -#include - -#define CAN_ID_SLAVE_PANIC 0x009 -#define CAN_ID_SLAVE_STATUS_BASE 0x080 -#define CAN_ID_SLAVE_LOG_BASE 0x600 - -rx_status_frame rxstate = {}; -volatile uint8_t canmsg_received = 0; -void ams_can_init(CAN_HandleTypeDef* hcan) { ftcan_init(hcan); } - -#define ITER_COUNT 10 -static uint8_t count = 0; -static bool isOn = false; - -void ams_can_send_status() { - if (count == ITER_COUNT) { - HAL_GPIO_WritePin(STATUS_LED_G_GPIO_Port, STATUS_LED_G_Pin, isOn ? GPIO_PIN_SET : GPIO_PIN_RESET); - - count = 0; - isOn = !isOn; - } else { - count++; - } - - static uint8_t data[8]; - int error = error_data.error_sources != 0; - data[0] = eeprom_config.id | (error << 7); - data[1] = stateofcharge; - uint8_t* ptr = &data[2]; - uint16_t min_volt = 0xFFFF; - uint16_t max_volt = 0; - for (size_t i = 0; i < numberofCells; i++) { - if (module.cellVoltages[i] < min_volt) { - min_volt = module.cellVoltages[i]; - } - if (module.cellVoltages[i] > max_volt) { - max_volt = module.cellVoltages[i]; - } - } - ptr = ftcan_marshal_unsigned(ptr, min_volt, 2); - ptr = ftcan_marshal_unsigned(ptr, max_volt, 2); - int16_t max_temp = -0x8000; - for (size_t i = 0; i < N_TEMP_SENSORS; i++) { - if (tmp1075_temps[i] > max_temp && - (tmp1075_failed_sensors & (1 << i)) == 0) { - max_temp = tmp1075_temps[i]; - } - } - ftcan_marshal_unsigned(ptr, max_temp, 2); - uint16_t id = CAN_ID_SLAVE_STATUS_BASE | eeprom_config.id; - ftcan_transmit(id, data, sizeof(data)); -} - -void ams_can_send_error() { - static uint8_t data[6]; - data[0] = eeprom_config.id; - data[1] = error_data.data_kind; - memcpy(&data[2], error_data.data, 4); - ftcan_transmit(CAN_ID_SLAVE_PANIC, data, sizeof(data)); -} - -void ams_can_send_log() { - static uint8_t call_count = 0; - static uint8_t data[8]; - - uint16_t can_addr = - CAN_ID_SLAVE_LOG_BASE | (eeprom_config.id << 4) | call_count; - uint8_t* ptr = &data[0]; - - if (call_count < N_CELLS / 4) { - for (size_t i = 0; i < 4; i++) { - size_t offset = call_count * 4; - ptr = ftcan_marshal_unsigned(ptr, module.cellVoltages[offset + i], 2); - } - ftcan_transmit(can_addr, data, sizeof(data)); - } else if (call_count == N_CELLS / 4) { - // Send last cell & failed temperature sensors - ptr = ftcan_marshal_unsigned(ptr, module.cellVoltages[N_CELLS - 1], 2); - ptr = ftcan_marshal_unsigned(ptr, tmp1075_failed_sensors, 4); - ftcan_transmit(can_addr, data, 6); - } else { - size_t offset = (call_count - N_CELLS / 4 - 1) * 8; - for (size_t i = 0; i < 8; i++) { - data[i] = tmp1075_temps[offset + i] >> 4; - } - ftcan_transmit(can_addr, data, sizeof(data)); - } - call_count = (call_count + 1) % (N_CELLS / 4 + 1 + N_TEMP_SENSORS / 8); -} diff --git a/Core/Src/AMS_HighLevel.c b/Core/Src/AMS_HighLevel.c index 8008693..0ea74de 100644 --- a/Core/Src/AMS_HighLevel.c +++ b/Core/Src/AMS_HighLevel.c @@ -6,14 +6,7 @@ */ #include "AMS_HighLevel.h" -#include "ADBMS_Abstraction.h" -#include "ADBMS_LL_Driver.h" -#include "AMS_CAN.h" -#include "TMP1075.h" -#include "can-halal.h" -#include "errors.h" -#include "stm32f3xx_hal.h" -#include + Cell_Module module = {}; uint32_t balancedCells = 0; diff --git a/Core/Src/PWM_control.c b/Core/Src/PWM_control.c new file mode 100644 index 0000000..09adf92 --- /dev/null +++ b/Core/Src/PWM_control.c @@ -0,0 +1,41 @@ +#include "PWM_control.h" + +uint8_t battery_cooling_status; +//uint32_t powerground1_CCR, powerground2_CCR, battery_cooling_CCR; + +TIM_HandleTypeDef* powerground, *battery_cooling; + +/* + Pulse width modulation mode allows for generating a signal with a frequency determined by + the value of the TIMx_ARR register and a duty cycle determined by the value of the TIMx_CCRx register. +*/ + +void PWM_control_init(TIM_HandleTypeDef* pg, TIM_HandleTypeDef* bat_cool){ + powerground_status = 0; + battery_cooling_status = 0; + + HAL_TIM_PWM_Start(pg, TIM_CHANNEL_1); //TIM15CH1 + HAL_TIM_PWM_Start(pg, TIM_CHANNEL_2); //TIM15CH2 + HAL_TIM_PWM_Start(bat_cool, TIM_CHANNEL_3); //TIM1CH3 + + powerground = pg; + battery_cooling = bat_cool; + __HAL_TIM_SET_COMPARE(powerground, TIM_CHANNEL_1, 2000); + __HAL_TIM_SET_COMPARE(powerground, TIM_CHANNEL_2, 2000); + //__HAL_TIM_SET_COMPARE(battery_cooling, TIM_CHANNEL_3, 2000); +} + +/* + controls the duty cycle of the fans by setting the CCR of the channel percent/100 = x/ARR +*/ +void PWM_powerground_control(uint8_t percent){ + if (percent > 100) //something went wrong + return; + powerground_status = percent; + int ccr = 2000 + ((2000) * (percent/100.0)); + __HAL_TIM_SET_COMPARE(powerground, TIM_CHANNEL_1, ccr); + __HAL_TIM_SET_COMPARE(powerground, TIM_CHANNEL_2, 2000 + ((2000) * (percent/100.0))); + //TIM15->CCR1 = (TIM15->ARR*POWERGROUND_MAX_DUTY_CYCLE-TIM15->ARR*POWERGROUND_MIN_DUTY_CYCLE) * (percent/100.0) + TIM15->ARR*POWERGROUND_MIN_DUTY_CYCLE; +} + +void PWM_battery_cooling_control(uint8_t percent){} \ No newline at end of file diff --git a/Core/Src/TMP1075.c b/Core/Src/TMP1075.c index cf9a1e0..9fd4aae 100644 --- a/Core/Src/TMP1075.c +++ b/Core/Src/TMP1075.c @@ -1,11 +1,5 @@ #include "TMP1075.h" -#include "can-halal.h" - -#include "errors.h" -#include "stm32f3xx_hal_def.h" -#include "stm32f3xx_hal_i2c.h" - #define MAX_TEMP ((int16_t)(59 / 0.0625f)) #define MAX_FAILED_TEMP 12 //TODO: change value for compliance with the actual number of sensors #warning "change value for compliance with the actual number of sensors" diff --git a/Core/Src/can.c b/Core/Src/can.c new file mode 100644 index 0000000..0e4aebe --- /dev/null +++ b/Core/Src/can.c @@ -0,0 +1,150 @@ +/* + * can.c + * Created on: Mai 23, 2024 + * Author: Hamza + */ + +#include "can.h" + +//#define CAN_ID_IN 0x501 +//#define CAN_ID_OUT 0x502 +int can_delay_manager = 0; +void can_init(CAN_HandleTypeDef* hcan) { + ftcan_init(hcan); + ftcan_add_filter(CAN_ID_IN, 0xFFF); +} + +/* +This function sends the status of the mvbms, the battery and of powerground. +once every 1s in states: INACTIVE, PRECHARGE, DISCHARGE, CHARGING, ERROR. +once every 0.5s in states: READY, ACTIVE. +with format of: +CAN Messages: + Error bit + MVBMS state + Powerground Status 0-100% + Errors + Battery state of charge + Pack Voltage + Current + Battery temperature (12 bit) + + Min/Max. Cell Temp (ID, Min Temp, ID, Max Temp)(3B), + Min/Max Cell Voltage (ID, Min Voltage, ID, Max Voltage)(3B) + +bit 0 (1b): empty +bit 1-3 (3b): state +bit 4-11 (8b): powerground status +bit 12-19 (8b): error +bit 20-27 (8b): state of charge from 0-100% +bit 28-39 (12b): battery voltage +bit 40-51 (12b): current measurement +bit 52-63 (12b): temperature of the cell with highest temperature + + +bit 0-3 (4b): ID of the sensor with highest temperature +bit 4-7 (4b): ID of the sensor with lowest temperataure +bit 8-19 (12b): temperature of the coldest cell +bit 20-23 (4b): ID of the cell with the lowest voltage +bit 24-35 (12b): lowest cell voltage +bit 36-39 (4b): ID of the cell the the highest voltage +bit 40-51 (12b): highest cell voltage +bit 52-63 (12b): empty +*/ + +void can_handle_send_status() { + if (can_delay_manager > HAL_GetTick()) + return; + else + can_delay_manager = HAL_GetTick() + CAN_STATUS_FREQ; + + uint8_t data[8] = {}; + int8_t id_highest_temp = -1; + int16_t highest_temp = INT16_MIN; + sm_check_battery_temperature(&id_highest_temp, &highest_temp); + + data[0] = ((state.current_state << 4) | (powerground_status >> 4)); // 1 bit emptyy | 3 bit state | 4 bit powerground + data[1] = ((powerground_status << 4) | (state.error_source >> 4)); // 4 bit powerground | 4 bit error + data[2] = ((state.error_source << 4) | (0)); // 4 bit error | 4 bit state of charge + data[3] = ((0) + (RELAY_BAT_SIDE_VOLTAGE >> 12)); // 4 bit state of charge | 4 bit battery voltage + data[4] = ((RELAY_BAT_SIDE_VOLTAGE >> 4)); + data[5] = ((CURRENT_MEASUREMENT >> 8)); + data[6] = ((CURRENT_MEASUREMENT & 0x00F0) | (highest_temp >> 12)); + data[7] = ((highest_temp) >> 4); + + ftcan_transmit(CAN_ID_OUT, data, sizeof(data)); + + int8_t id_lowest_temp = -1; + int16_t lowest_temp = INT16_MIN; + for (int i = 0; i < N_TEMP_SENSORS; i++) { + if (tmp1075_temps[i] < lowest_temp){ + id_lowest_temp = i; + lowest_temp = tmp1075_temps[i]; + } + } + + int8_t id_lowest_volt = -1; + int16_t lowest_volt = INT16_MIN; + int8_t id_highest_volt = -1; + int16_t highest_volt = INT16_MIN; + + for (int i = 0; i < module.sumOfCellMeasurements; i++) { + if (sm_return_cell_voltage(i) < lowest_temp){ + id_lowest_volt = i; + lowest_volt = sm_return_cell_voltage(i); + } + if (sm_return_cell_voltage(i) > highest_temp){ + id_highest_volt = i; + highest_volt = sm_return_cell_voltage(i); + } + } + + data[0] = ((id_highest_temp & 0x0F) << 4 | (id_lowest_temp & 0x0F)); + data[1] = ((lowest_temp) >> 8); + data[2] = ((lowest_temp & 0x00F0) | (id_lowest_volt & 0x0F)); + data[3] = (lowest_volt >> 8); + data[4] = ((lowest_volt & 0x00F0) | (id_highest_volt & 0x0F)); + data[5] = ((highest_volt >> 8)); + data[6] = ((highest_volt & 0x00F0)); + data[7] = 0; + + ftcan_transmit(CAN_ID_OUT, data, sizeof(data)); +} + +/* +can_handle_recieve_command() should only check if the message is valid and then hand it +to the sm_handle_ams_in() which handles the state machine transition. + +This function recieves a command from the Autobox with the CAN ID of 0x501. +with format of: +data[0] = target state + 0x0 STATE_INACTIVE | disconnect power to the ESC of powerground. Send it to return the mvbms to idle/monitoring mode. If data[1] != 0 -> assume bad CAN message. + 0x1 STATE_READY | conneect power to the ESC of powerground and but with no PWM signal. If data[1] != 0 -> assume bad CAN message. + 0x2 STATE_ACTIVE | activate powerground at (data[1]) percent. If data[1] > 100 -> assume bad CAN message. + +allowed transitions: + STATE_INACTIVE -> STATE_READY + STATE_READY -> STATE_INACTIVE, STATE_ACTIVE + STATE_ACTIVE -> STATE_INACTIVE, STATE_READY +*/ +void can_handle_recieve_command(const uint8_t *data){ + if (data[0] == 0x00 && data[1] == 0x00){ + sm_handle_ams_in(data); + } else if (data[0] == 0x01 && data[1] == 0x00){ + sm_handle_ams_in(data); + } else if (data[0] == 0x02 && data[1] <= 100) { + sm_handle_ams_in(data); + } +} + +/* +implements the _weak method ftcan_msg_recieved_cb() which throws an interrupt when a CAN message is recieved. +it only checks if the id is and datalen is correct thans hands data over to can_handle_recieve_command(). + +in MXCUBE under CAN NVIC settings "USB low priority or CAN_RX0 interrupts" has to be on +*/ +void ftcan_msg_received_cb(uint16_t id, size_t datalen, const uint8_t *data){ + if (id == 0x501 && datalen == 2){ + can_handle_recieve_command(data); + } +} diff --git a/Core/Src/eeprom.c b/Core/Src/eeprom.c deleted file mode 100644 index e119142..0000000 --- a/Core/Src/eeprom.c +++ /dev/null @@ -1,55 +0,0 @@ -#include "eeprom.h" -#include "errors.h" -#include "stm32f3xx_hal.h" -#include "stm32f3xx_hal_exti.h" -#include "stm32f3xx_hal_i2c.h" - -#include - -#define EEPROM_I2C_ADDR 0xA0 -// Don't use the beginning of the EEPROM, since the testbench writes there -#define EEPROM_CONFIG_BASE 0x0100 -#define EEPROM_CONFIG_ECC_OFFSET 0x20 - -EEPROMConfig eeprom_config; - -static I2C_HandleTypeDef* hi2c; - -void eeprom_init(I2C_HandleTypeDef* handle) { - hi2c = handle; - uint8_t buf[sizeof(EEPROMConfig) * 3]; - // Read 3 EEPROM config buffers at 32 byte offsets - for (size_t ecc_i = 0; ecc_i < 3; ecc_i++) { - HAL_I2C_Mem_Read(hi2c, EEPROM_I2C_ADDR, - EEPROM_CONFIG_BASE + EEPROM_CONFIG_ECC_OFFSET * ecc_i, 2, - buf + sizeof(EEPROMConfig) * ecc_i, sizeof(EEPROMConfig), - 100); - } - // ECC - for (size_t i = 0; i < sizeof(EEPROMConfig); i++) { - uint8_t a = buf[i + sizeof(EEPROMConfig) * 0]; - uint8_t b = buf[i + sizeof(EEPROMConfig) * 1]; - uint8_t c = buf[i + sizeof(EEPROMConfig) * 2]; - if (a == b || a == c) { - buf[i] = a; - } else if (b == c) { - buf[i] = b; - } else { - set_error_source(ERROR_SOURCE_EEPROM); - } - } - - memcpy(&eeprom_config, buf, sizeof(EEPROMConfig)); - // Write back config - eeprom_config.id = 10; - eeprom_config_save(); -} - -void eeprom_config_save() { - for (size_t ecc_i = 0; ecc_i < 3; ecc_i++) { - HAL_I2C_Mem_Write(hi2c, EEPROM_I2C_ADDR, - EEPROM_CONFIG_BASE + EEPROM_CONFIG_ECC_OFFSET * ecc_i, 2, - (uint8_t*)&eeprom_config, sizeof(eeprom_config), 100); - HAL_Delay(100); - } -} diff --git a/Core/Src/main.c b/Core/Src/main.c index 8e23a21..95262f3 100644 --- a/Core/Src/main.c +++ b/Core/Src/main.c @@ -23,15 +23,15 @@ /* USER CODE BEGIN Includes */ #include "ADBMS_Abstraction.h" #include "ADBMS_CMD_MAKROS.h" -#include "AMS_CAN.h" +#include "PWM_control.h" +#include "can.h" #include "AMS_HighLevel.h" +#include "state_machine.h" #include "TMP1075.h" -#include "eeprom.h" #include "errors.h" +#include "stm32f302xc.h" #include "stm32f3xx_hal.h" -#include "stm32f3xx_hal_gpio.h" -#include - +#include "stm32f3xx_hal_tim.h" /* USER CODE END Includes */ /* Private typedef -----------------------------------------------------------*/ @@ -119,14 +119,12 @@ int main(void) MX_TIM1_Init(); MX_TIM2_Init(); /* USER CODE BEGIN 2 */ + sm_init(); tmp1075_init(&hi2c1); AMS_Init(&hspi1); - ams_can_init(&hcan); - - bool relay_actual = false; - bool relay_target = true; - - uint32_t target_time = HAL_GetTick() + 10000; + can_init(&hcan); + PWM_control_init(&htim15, &htim1); + HAL_Delay(10); /* USER CODE END 2 */ /* Infinite loop */ @@ -137,23 +135,9 @@ int main(void) /* USER CODE BEGIN 3 */ AMS_Loop(); - - ams_can_send_status(); - if (error_data.error_sources && - HAL_GetTick() - error_data.errors_since >= ERROR_TIME_THRESH) { - ams_can_send_error(); - } - ams_can_send_log(); - - if (HAL_GetTick() >= target_time) { - HAL_GPIO_WritePin(RELAY_EN_GPIO_Port, RELAY_EN_Pin, relay_target ? GPIO_PIN_SET : GPIO_PIN_RESET); - HAL_GPIO_WritePin(STATUS_LED_R_GPIO_Port, STATUS_LED_R_Pin, relay_target ? GPIO_PIN_RESET : GPIO_PIN_SET); - target_time = HAL_GetTick() + 10000; - relay_target = !relay_target; - ChannelControl_UpdatePWMs( x.pwrgndfans ) - - ); - } + sm_update(); + //sm_test_cycle_states(); + can_handle_send_status(); } /* USER CODE END 3 */ } @@ -171,12 +155,11 @@ void SystemClock_Config(void) /** Initializes the RCC Oscillators according to the specified parameters * in the RCC_OscInitTypeDef structure. */ - RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI; + RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI|RCC_OSCILLATORTYPE_HSE; + RCC_OscInitStruct.HSEState = RCC_HSE_ON; RCC_OscInitStruct.HSIState = RCC_HSI_ON; RCC_OscInitStruct.HSICalibrationValue = RCC_HSICALIBRATION_DEFAULT; - RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON; - RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSI; - RCC_OscInitStruct.PLL.PLLMUL = RCC_PLL_MUL4; + RCC_OscInitStruct.PLL.PLLState = RCC_PLL_NONE; if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK) { Error_Handler(); @@ -186,7 +169,7 @@ void SystemClock_Config(void) */ RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2; - RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK; + RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_HSE; RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1; RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1; RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1; @@ -222,15 +205,15 @@ static void MX_CAN_Init(void) /* USER CODE END CAN_Init 1 */ hcan.Instance = CAN; - hcan.Init.Prescaler = 16; + hcan.Init.Prescaler = 2; hcan.Init.Mode = CAN_MODE_NORMAL; hcan.Init.SyncJumpWidth = CAN_SJW_1TQ; - hcan.Init.TimeSeg1 = CAN_BS1_1TQ; - hcan.Init.TimeSeg2 = CAN_BS2_1TQ; + hcan.Init.TimeSeg1 = CAN_BS1_13TQ; + hcan.Init.TimeSeg2 = CAN_BS2_2TQ; hcan.Init.TimeTriggeredMode = DISABLE; - hcan.Init.AutoBusOff = DISABLE; + hcan.Init.AutoBusOff = ENABLE; hcan.Init.AutoWakeUp = DISABLE; - hcan.Init.AutoRetransmission = DISABLE; + hcan.Init.AutoRetransmission = ENABLE; hcan.Init.ReceiveFifoLocked = DISABLE; hcan.Init.TransmitFifoPriority = DISABLE; if (HAL_CAN_Init(&hcan) != HAL_OK) @@ -418,14 +401,15 @@ static void MX_TIM2_Init(void) /* USER CODE BEGIN TIM2_Init 1 */ - /* USER CODE END TIM2_Init 1 */ - htim2.Instance = TIM2; - htim2.Init.Prescaler = 0; - htim2.Init.CounterMode = TIM_COUNTERMODE_UP; - htim2.Init.Period = 65535; - htim2.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1; - htim2.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE; - if (HAL_TIM_PWM_Init(&htim2) != HAL_OK) + /* USER CODE END TIM15_Init 1 */ + htim15.Instance = TIM15; + htim15.Init.Prescaler = 7; + htim15.Init.CounterMode = TIM_COUNTERMODE_UP; + htim15.Init.Period = 39999; + htim15.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1; + htim15.Init.RepetitionCounter = 0; + htim15.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE; + if (HAL_TIM_PWM_Init(&htim15) != HAL_OK) { Error_Handler(); } @@ -509,7 +493,7 @@ static void MX_GPIO_Init(void) HAL_GPIO_WritePin(GPIOB, STATUS_LED_R_Pin|STATUS_LED_B_Pin|STATUS_LED_G_Pin, GPIO_PIN_SET); /*Configure GPIO pin Output Level */ - HAL_GPIO_WritePin(GPIOB, PRECHARGE_EN_Pin|AUX_IN_Pin, GPIO_PIN_RESET); + HAL_GPIO_WritePin(PRECHARGE_EN_GPIO_Port, PRECHARGE_EN_Pin, GPIO_PIN_RESET); /*Configure GPIO pins : PC13 PC14 PC15 */ GPIO_InitStruct.Pin = GPIO_PIN_13|GPIO_PIN_14|GPIO_PIN_15; @@ -524,35 +508,21 @@ static void MX_GPIO_Init(void) GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); - /*Configure GPIO pin : PA3 */ - GPIO_InitStruct.Pin = GPIO_PIN_3; - GPIO_InitStruct.Mode = GPIO_MODE_ANALOG; - GPIO_InitStruct.Pull = GPIO_NOPULL; - HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); - - /*Configure GPIO pins : STATUS_LED_R_Pin STATUS_LED_B_Pin STATUS_LED_G_Pin PRECHARGE_EN_Pin - AUX_IN_Pin */ - GPIO_InitStruct.Pin = STATUS_LED_R_Pin|STATUS_LED_B_Pin|STATUS_LED_G_Pin|PRECHARGE_EN_Pin - |AUX_IN_Pin; + /*Configure GPIO pins : STATUS_LED_R_Pin STATUS_LED_B_Pin STATUS_LED_G_Pin PRECHARGE_EN_Pin */ + GPIO_InitStruct.Pin = STATUS_LED_R_Pin|STATUS_LED_B_Pin|STATUS_LED_G_Pin|PRECHARGE_EN_Pin; GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; GPIO_InitStruct.Pull = GPIO_NOPULL; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; HAL_GPIO_Init(GPIOB, &GPIO_InitStruct); - /*Configure GPIO pins : PB10 PB12 PB4 PB5 - PB8 */ - GPIO_InitStruct.Pin = GPIO_PIN_10|GPIO_PIN_12|GPIO_PIN_4|GPIO_PIN_5 - |GPIO_PIN_8; + /*Configure GPIO pins : PB10 PB12 PB13 PB14 + PB4 PB5 PB8 */ + GPIO_InitStruct.Pin = GPIO_PIN_10|GPIO_PIN_12|GPIO_PIN_13|GPIO_PIN_14 + |GPIO_PIN_4|GPIO_PIN_5|GPIO_PIN_8; GPIO_InitStruct.Mode = GPIO_MODE_ANALOG; GPIO_InitStruct.Pull = GPIO_NOPULL; HAL_GPIO_Init(GPIOB, &GPIO_InitStruct); - /*Configure GPIO pin : AUX_OUT_Pin */ - GPIO_InitStruct.Pin = AUX_OUT_Pin; - GPIO_InitStruct.Mode = GPIO_MODE_INPUT; - GPIO_InitStruct.Pull = GPIO_NOPULL; - HAL_GPIO_Init(AUX_OUT_GPIO_Port, &GPIO_InitStruct); - /*Configure GPIO pins : RELAY_BATT_SIDE_ON_Pin RELAY_ESC_SIDE_ON_Pin CURRENT_SENSOR_ON_Pin */ GPIO_InitStruct.Pin = RELAY_BATT_SIDE_ON_Pin|RELAY_ESC_SIDE_ON_Pin|CURRENT_SENSOR_ON_Pin; GPIO_InitStruct.Mode = GPIO_MODE_INPUT; diff --git a/Core/Src/state_machine.c b/Core/Src/state_machine.c new file mode 100644 index 0000000..7008496 --- /dev/null +++ b/Core/Src/state_machine.c @@ -0,0 +1,326 @@ +#include "state_machine.h" +#include "AMS_HighLevel.h" +#include "TMP1075.h" +#include "errors.h" +#include "stm32f3xx_hal.h" +#include +#include + +StateHandle state; +int16_t RELAY_BAT_SIDE_VOLTAGE; +int16_t RELAY_ESC_SIDE_VOLTAGE; +int16_t CURRENT_MEASUREMENT; +uint8_t powerground_status; + +uint32_t timestamp; + +void sm_init(){ + state.current_state = STATE_INACTIVE; + state.target_state = STATE_INACTIVE; + state.error_source = 0; +} + +void sm_update(){ + sm_check_errors(); + + RELAY_BAT_SIDE_VOLTAGE = module.auxVoltages[0] * 12.42; // the calculation says the factor is 11.989. 12.42 yields the better result + RELAY_ESC_SIDE_VOLTAGE = module.auxVoltages[1] * 12.42; + CURRENT_MEASUREMENT = (module.auxVoltages[2] - 2496) * 300; + + switch (state.current_state) { + case STATE_INACTIVE: + state.current_state = sm_update_inactive(); // monitor only + break; + case STATE_PRECHARGE: + state.current_state = sm_update_precharge(); // set PRECHARGE and turn on cooling at 50% or such + break; + case STATE_READY: + state.current_state = sm_update_ready(); // keep cooling at 50%, get ready to turn on powerground + break; + case STATE_ACTIVE: + state.current_state = sm_update_active(); // set PRECHARGE and turn on cooling at 50% or such + break; + case STATE_DISCHARGE: + state.current_state = sm_update_discharge(); // open the main relay, keep PRECHARGE closed + break; + case STATE_CHARGING_PRECHARGE: + state.current_state = sm_update_charging_precharge(); + break; + case STATE_CHARGING: + state.current_state = sm_update_charging(); // monitor and turn on cooling if needed. + break; + case STATE_ERROR: + state.current_state = sm_update_error(); // enter the correct ERROR state + break; + } + + sm_set_relay_positions(state.current_state); + state.target_state = state.current_state; +} + +State sm_update_inactive(){ + switch (state.target_state) { + case STATE_PRECHARGE: + return STATE_PRECHARGE; + case STATE_CHARGING_PRECHARGE: + return STATE_CHARGING_PRECHARGE; + default: + return STATE_INACTIVE; + } +} + +State sm_update_precharge(){ + switch (state.target_state) { + case STATE_INACTIVE: // if CAN Signal 0000 0000 then immidiete shutdown + return STATE_DISCHARGE; + case STATE_PRECHARGE: + if (RELAY_BAT_SIDE_VOLTAGE-RELAY_ESC_SIDE_VOLTAGE < 100) + return STATE_READY; + break; + case STATE_DISCHARGE: + return STATE_DISCHARGE; + default: + return STATE_PRECHARGE; + } +} + +State sm_update_ready(){ + switch (state.target_state) { + case STATE_ACTIVE: // if CAN Signal 1100 0000 then turn on powerground + return STATE_ACTIVE; + case STATE_DISCHARGE: // if CAN Signal 0000 0000 then shutdown + return STATE_DISCHARGE; + default: + return STATE_READY; + } +} + +State sm_update_active(){ + switch (state.target_state) { + case STATE_READY: // if CAN Signal 1000 0000 then turn oof powerground but stay ready + return STATE_READY; + case STATE_DISCHARGE: // if CAN Signal 0000 0000 then shutdown + return STATE_DISCHARGE; + default: + return STATE_ACTIVE; + } +} + +State sm_update_discharge(){ + switch (state.target_state) { + case STATE_DISCHARGE: + if (RELAY_ESC_SIDE_VOLTAGE < 5000) + return STATE_INACTIVE; + case STATE_PRECHARGE: // if CAN Signal 1000 0000 then get ready + return STATE_PRECHARGE; + default: + return STATE_DISCHARGE; + } +} + +State sm_update_charging_precharge(){ + switch (state.target_state) { + case STATE_CHARGING: + return STATE_CHARGING; + case STATE_DISCHARGE: + return STATE_DISCHARGE; + default: + return STATE_CHARGING_PRECHARGE; + } +} + +State sm_update_charging(){ + switch (state.target_state) { + case STATE_DISCHARGE: + return STATE_DISCHARGE; + default: + return STATE_CHARGING; + } +} + + +State sm_update_error(){ + switch (state.target_state) { + case STATE_DISCHARGE: + return STATE_DISCHARGE; + default: + return STATE_ERROR; + } +} + +void sm_set_relay_positions(State current_state){ + switch (state.current_state) { + case STATE_INACTIVE: + sm_set_relay(RELAY_MAIN, 0); + sm_set_relay(RELAY_PRECHARGE, 0); + break; + case STATE_PRECHARGE: + sm_set_relay(RELAY_MAIN, 0); + sm_set_relay(RELAY_PRECHARGE, 1); + break; + case STATE_READY: + sm_set_relay(RELAY_MAIN, 1); + sm_set_relay(RELAY_PRECHARGE, 0); + break; + case STATE_ACTIVE: + sm_set_relay(RELAY_MAIN, 1); + sm_set_relay(RELAY_PRECHARGE, 0); + break; + case STATE_DISCHARGE: + sm_set_relay(RELAY_MAIN, 0); + sm_set_relay(RELAY_PRECHARGE, 0); + break; + case STATE_CHARGING_PRECHARGE: + sm_set_relay(RELAY_MAIN, 0); + sm_set_relay(RELAY_PRECHARGE, 1); + break; + case STATE_CHARGING: + sm_set_relay(RELAY_MAIN, 1); + sm_set_relay(RELAY_PRECHARGE, 0); + break; + case STATE_ERROR: + sm_set_relay(RELAY_MAIN, 0); + sm_set_relay(RELAY_PRECHARGE, 0); + break; + } +} + +void sm_set_relay(Relay relay, bool closed){ + GPIO_PinState state = closed ? GPIO_PIN_SET : GPIO_PIN_RESET; + switch (relay) { + case RELAY_MAIN: + HAL_GPIO_WritePin(RELAY_EN_GPIO_Port, RELAY_EN_Pin, state); + relay_closed = closed; + break; + case RELAY_PRECHARGE: + HAL_GPIO_WritePin(PRECHARGE_EN_GPIO_Port, PRECHARGE_EN_Pin, state); + precharge_closed = closed; + break; + } +} + +void sm_check_charging(){ + if (RELAY_BAT_SIDE_VOLTAGE < RELAY_ESC_SIDE_VOLTAGE && timestamp == 0) + timestamp = HAL_GetTick() + 5000; + if (timestamp < HAL_GetTick()) + state.target_state = STATE_CHARGING_PRECHARGE; +} + +/* returns the ID and temperature of the hottest cell */ +void sm_check_battery_temperature(int8_t *id, int16_t *temp){ + for (int i = 0; i < N_TEMP_SENSORS; i++) { + if (tmp1075_temps[i] > *temp){ + *id = i; + *temp = tmp1075_temps[i]; + } + } +} + +int16_t sm_return_cell_temperature(int id){ + return tmp1075_temps[id]; +} + +int16_t sm_return_cell_voltage(int id){ + return module.cellVoltages[id]; +} + +void sm_handle_ams_in(const uint8_t *data){ + switch (data[0]) { + case 0x00: + if (state.current_state != STATE_INACTIVE){ + PWM_powerground_control(0); + state.target_state = STATE_DISCHARGE; + } + break; + case 0x01: + if (state.target_state == STATE_INACTIVE || state.target_state == STATE_DISCHARGE){ + PWM_powerground_control(0); + state.target_state = STATE_PRECHARGE; + } else if (state.target_state == STATE_ACTIVE){ + PWM_powerground_control(0); + state.target_state = STATE_READY; + } + break; + case 0x02: + if (state.current_state == STATE_READY){ + PWM_powerground_control(data[1]); + state.target_state = STATE_ACTIVE; // READY -> ACTIVE + } + break; + } +} + +void sm_set_error(ErrorKind error_kind, bool is_errored){} + +#warning TODO: add error checking for everything here +void sm_check_errors(){ + switch (error_data.data_kind) { + case SEK_OVERTEMP: + case SEK_UNDERTEMP: + case SEK_TOO_FEW_TEMPS: + state.error_type.temperature_error = 1; + case SEK_OVERVOLT: + case SEK_UNDERVOLT: + case SEK_OPENWIRE: + case SEK_EEPROM_ERR: + case SEK_INTERNAL_BMS_TIMEOUT: + state.error_type.bms_timeout = 1; + case SEK_INTERNAL_BMS_CHECKSUM_FAIL: + case SEK_INTERNAL_BMS_OVERTEMP: + case SEK_INTERNAL_BMS_FAULT: + state.error_type.bms_fault = 1; + break; + } + + if (1){ + state.error_type.current_error = 1; + } + + if (1){ + state.error_type.current_sensor_missing = 1; + } + + if (RELAY_BAT_SIDE_VOLTAGE < 30000){ + state.error_type.voltage_error = 1; + } + + if (1){ + state.error_type.voltage_missing = 1; + } +} + +void sm_test_cycle_states(){ + RELAY_BAT_SIDE_VOLTAGE = module.auxVoltages[0]; + RELAY_ESC_SIDE_VOLTAGE = module.auxVoltages[1]; + CURRENT_MEASUREMENT = module.auxVoltages[2]; + sm_set_relay_positions(state.current_state); + + if (timestamp > HAL_GetTick()) + return; + switch (state.current_state) { + case STATE_INACTIVE: + state.current_state = STATE_PRECHARGE; + timestamp = HAL_GetTick() + 30000; + PWM_powerground_control(0); + break; + case STATE_PRECHARGE: + state.current_state = STATE_READY; + timestamp = HAL_GetTick() + 10000; + break; + case STATE_READY: + state.current_state = STATE_ACTIVE; + timestamp = HAL_GetTick() + 10000; + break; + case STATE_ACTIVE: + state.current_state = STATE_DISCHARGE; + timestamp = HAL_GetTick() + 10000; + PWM_powerground_control(1); + break; + case STATE_DISCHARGE: + state.current_state = STATE_INACTIVE; + timestamp = HAL_GetTick() + 10000; + break; + } + + state.target_state = state.current_state; +} \ No newline at end of file diff --git a/Core/Src/stm32f3xx_hal_msp.c b/Core/Src/stm32f3xx_hal_msp.c index ca39578..2cc20a9 100644 --- a/Core/Src/stm32f3xx_hal_msp.c +++ b/Core/Src/stm32f3xx_hal_msp.c @@ -108,6 +108,11 @@ void HAL_CAN_MspInit(CAN_HandleTypeDef* hcan) GPIO_InitStruct.Alternate = GPIO_AF9_CAN; HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); + /* CAN interrupt Init */ + HAL_NVIC_SetPriority(USB_LP_CAN_RX0_IRQn, 0, 0); + HAL_NVIC_EnableIRQ(USB_LP_CAN_RX0_IRQn); + HAL_NVIC_SetPriority(CAN_RX1_IRQn, 0, 0); + HAL_NVIC_EnableIRQ(CAN_RX1_IRQn); /* USER CODE BEGIN CAN_MspInit 1 */ /* USER CODE END CAN_MspInit 1 */ @@ -137,6 +142,9 @@ void HAL_CAN_MspDeInit(CAN_HandleTypeDef* hcan) */ HAL_GPIO_DeInit(GPIOA, GPIO_PIN_11|GPIO_PIN_12); + /* CAN interrupt DeInit */ + HAL_NVIC_DisableIRQ(USB_LP_CAN_RX0_IRQn); + HAL_NVIC_DisableIRQ(CAN_RX1_IRQn); /* USER CODE BEGIN CAN_MspDeInit 1 */ /* USER CODE END CAN_MspDeInit 1 */ @@ -331,12 +339,12 @@ void HAL_TIM_MspPostInit(TIM_HandleTypeDef* htim) /**TIM1 GPIO Configuration PB15 ------> TIM1_CH3N */ - GPIO_InitStruct.Pin = GPIO_PIN_15; + GPIO_InitStruct.Pin = PWM_Battery_Cooling_Pin; GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; GPIO_InitStruct.Pull = GPIO_NOPULL; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; GPIO_InitStruct.Alternate = GPIO_AF4_TIM1; - HAL_GPIO_Init(GPIOB, &GPIO_InitStruct); + HAL_GPIO_Init(PWM_Battery_Cooling_GPIO_Port, &GPIO_InitStruct); /* USER CODE BEGIN TIM1_MspPostInit 1 */ diff --git a/Core/Src/stm32f3xx_it.c b/Core/Src/stm32f3xx_it.c index f45aa76..71d43b5 100644 --- a/Core/Src/stm32f3xx_it.c +++ b/Core/Src/stm32f3xx_it.c @@ -55,7 +55,7 @@ /* USER CODE END 0 */ /* External variables --------------------------------------------------------*/ - +extern CAN_HandleTypeDef hcan; /* USER CODE BEGIN EV */ /* USER CODE END EV */ @@ -198,6 +198,34 @@ void SysTick_Handler(void) /* please refer to the startup file (startup_stm32f3xx.s). */ /******************************************************************************/ +/** + * @brief This function handles USB low priority or CAN_RX0 interrupts. + */ +void USB_LP_CAN_RX0_IRQHandler(void) +{ + /* USER CODE BEGIN USB_LP_CAN_RX0_IRQn 0 */ + + /* USER CODE END USB_LP_CAN_RX0_IRQn 0 */ + HAL_CAN_IRQHandler(&hcan); + /* USER CODE BEGIN USB_LP_CAN_RX0_IRQn 1 */ + + /* USER CODE END USB_LP_CAN_RX0_IRQn 1 */ +} + +/** + * @brief This function handles CAN RX1 interrupt. + */ +void CAN_RX1_IRQHandler(void) +{ + /* USER CODE BEGIN CAN_RX1_IRQn 0 */ + + /* USER CODE END CAN_RX1_IRQn 0 */ + HAL_CAN_IRQHandler(&hcan); + /* USER CODE BEGIN CAN_RX1_IRQn 1 */ + + /* USER CODE END CAN_RX1_IRQn 1 */ +} + /* USER CODE BEGIN 1 */ /* USER CODE END 1 */ diff --git a/Documentation/State machine diagram.drawio b/Documentation/State machine diagram.drawio new file mode 100644 index 0000000..69a3678 --- /dev/null +++ b/Documentation/State machine diagram.drawio @@ -0,0 +1,192 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Documentation/State machine diagram.svg b/Documentation/State machine diagram.svg new file mode 100644 index 0000000..58f8d46 --- /dev/null +++ b/Documentation/State machine diagram.svg @@ -0,0 +1,4 @@ + + + +CAN Signal: 1000 0000RELAY_BAT_SIDE > RELAY_ESC_SIDEfor longer than 5 seconds
INACTIVE
INACTIVE
Allows quick shutdown. Could be done with ERRORRELAY_BAT_SIDE = RELAY_ESC_SIDEif it is around 90% done
PRECHARGE
PRECHARGE
Allows quick reactivation instead of shutdownRELAY_ESC_SIDE == 0
DISCHARGE
DISCHARGE
CAN Signal = 1100 0000
READY
READY
CAN Signal: 0000 0000 ORBattery out of charge
CAN_Signal: 1000 0000
CAN_Signal: 1000 0000
ACTIVE
ACTIVE
PRECHARGE is done
CHARGING
PRECHAGE
CHARGING...
CHARGING is done
CHARGING
CHARGING
CAN_Signal: 0000 0000
PRECHARGE failure
PRECHARGE failure
Text is not SVG - cannot display
\ No newline at end of file diff --git a/Makefile b/Makefile index 5ca49d2..9e893cd 100644 --- a/Makefile +++ b/Makefile @@ -1,5 +1,5 @@ ########################################################################################################################## -# File automatically-generated by tool: [projectgenerator] version: [4.3.0-B58] date: [Thu May 23 18:55:59 CEST 2024] +# File automatically-generated by tool: [projectgenerator] version: [4.3.0-B58] date: [Mon Jun 03 16:11:34 EEST 2024] ########################################################################################################################## # ------------------------------------------------ @@ -13,7 +13,7 @@ ###################################### # target ###################################### -TARGET = mvbms-test-24 +TARGET = mvbms ###################################### diff --git a/STM32-for-VSCode.config.yaml b/STM32-for-VSCode.config.yaml index d854716..1caed20 100644 --- a/STM32-for-VSCode.config.yaml +++ b/STM32-for-VSCode.config.yaml @@ -10,7 +10,7 @@ target: mvbms-test-24 # Can be C or C++ language: C -optimization: Og +optimization: O0 # MCU settings targetMCU: stm32f3x @@ -96,6 +96,7 @@ sourceFiles: - Src/** - Core/Src/** - Core/Lib/** + - Drivers/STM32F3xx_HAL_Driver/Src/** # When no makefile is present it will show a warning pop-up. diff --git a/mvbms.ioc b/mvbms.ioc new file mode 100644 index 0000000..e918736 --- /dev/null +++ b/mvbms.ioc @@ -0,0 +1,268 @@ +#MicroXplorer Configuration settings - do not modify +CAD.formats= +CAD.pinconfig= +CAD.provider= +CAN.ABOM=ENABLE +CAN.BS1=CAN_BS1_13TQ +CAN.BS2=CAN_BS2_2TQ +CAN.CalculateBaudRate=500000 +CAN.CalculateTimeBit=2000 +CAN.CalculateTimeQuantum=125.0 +CAN.IPParameters=CalculateTimeQuantum,CalculateTimeBit,CalculateBaudRate,BS1,BS2,ABOM,Prescaler,NART +CAN.NART=ENABLE +CAN.Prescaler=2 +File.Version=6 +GPIO.groupedBy=Group By Peripherals +KeepUserPlacement=true +Mcu.CPN=STM32F302CBT6 +Mcu.Family=STM32F3 +Mcu.IP0=CAN +Mcu.IP1=I2C1 +Mcu.IP2=NVIC +Mcu.IP3=RCC +Mcu.IP4=SPI1 +Mcu.IP5=SYS +Mcu.IP6=TIM1 +Mcu.IP7=TIM15 +Mcu.IP8=USART1 +Mcu.IPNb=9 +Mcu.Name=STM32F302C(B-C)Tx +Mcu.Package=LQFP48 +Mcu.Pin0=PF0-OSC_IN +Mcu.Pin1=PF1-OSC_OUT +Mcu.Pin10=PB0 +Mcu.Pin11=PB1 +Mcu.Pin12=PB2 +Mcu.Pin13=PB11 +Mcu.Pin14=PB15 +Mcu.Pin15=PA8 +Mcu.Pin16=PA9 +Mcu.Pin17=PA10 +Mcu.Pin18=PA11 +Mcu.Pin19=PA12 +Mcu.Pin2=PA0 +Mcu.Pin20=PA13 +Mcu.Pin21=PA14 +Mcu.Pin22=PA15 +Mcu.Pin23=PB3 +Mcu.Pin24=PB6 +Mcu.Pin25=PB7 +Mcu.Pin26=PB9 +Mcu.Pin27=VP_SYS_VS_Systick +Mcu.Pin3=PA1 +Mcu.Pin4=PA2 +Mcu.Pin5=PA3 +Mcu.Pin6=PA4 +Mcu.Pin7=PA5 +Mcu.Pin8=PA6 +Mcu.Pin9=PA7 +Mcu.PinsNb=28 +Mcu.ThirdPartyNb=0 +Mcu.UserConstants= +Mcu.UserName=STM32F302CBTx +MxCube.Version=6.11.1 +MxDb.Version=DB.6.0.111 +NVIC.BusFault_IRQn=true\:0\:0\:false\:false\:true\:false\:false\:false +NVIC.CAN_RX1_IRQn=true\:0\:0\:false\:false\:true\:true\:true\:true +NVIC.DebugMonitor_IRQn=true\:0\:0\:false\:false\:true\:false\:false\:false +NVIC.ForceEnableDMAVector=true +NVIC.HardFault_IRQn=true\:0\:0\:false\:false\:true\:false\:false\:false +NVIC.MemoryManagement_IRQn=true\:0\:0\:false\:false\:true\:false\:false\:false +NVIC.NonMaskableInt_IRQn=true\:0\:0\:false\:false\:true\:false\:false\:false +NVIC.PendSV_IRQn=true\:0\:0\:false\:false\:true\:false\:false\:false +NVIC.PriorityGroup=NVIC_PRIORITYGROUP_4 +NVIC.SVCall_IRQn=true\:0\:0\:false\:false\:true\:false\:false\:false +NVIC.SysTick_IRQn=true\:15\:0\:false\:false\:true\:false\:true\:false +NVIC.USB_LP_CAN_RX0_IRQn=true\:0\:0\:false\:false\:true\:true\:true\:true +NVIC.UsageFault_IRQn=true\:0\:0\:false\:false\:true\:false\:false\:false +PA0.GPIOParameters=PinState,GPIO_Label +PA0.GPIO_Label=RELAY_EN +PA0.Locked=true +PA0.PinState=GPIO_PIN_RESET +PA0.Signal=GPIO_Output +PA1.GPIOParameters=PinState,GPIO_Label +PA1.GPIO_Label=_60V_EN +PA1.Locked=true +PA1.PinState=GPIO_PIN_RESET +PA1.Signal=GPIO_Output +PA10.GPIOParameters=GPIO_Label +PA10.GPIO_Label=CURRENT_SENSOR_ON +PA10.Locked=true +PA10.Signal=GPIO_Input +PA11.Locked=true +PA11.Mode=CAN_Activate +PA11.Signal=CAN_RX +PA12.Locked=true +PA12.Mode=CAN_Activate +PA12.Signal=CAN_TX +PA13.Locked=true +PA13.Mode=Trace_Asynchronous_SW +PA13.Signal=SYS_JTMS-SWDIO +PA14.Locked=true +PA14.Mode=Trace_Asynchronous_SW +PA14.Signal=SYS_JTCK-SWCLK +PA15.Locked=true +PA15.Mode=I2C +PA15.Signal=I2C1_SCL +PA2.GPIOParameters=GPIO_Label +PA2.GPIO_Label=PWM_PG_FAN1 +PA2.Locked=true +PA2.Signal=S_TIM15_CH1 +PA3.GPIOParameters=GPIO_Label +PA3.GPIO_Label=PWM_PG_FAN2 +PA3.Locked=true +PA3.Signal=S_TIM15_CH2 +PA4.GPIOParameters=GPIO_Label +PA4.GPIO_Label=CSB +PA4.Locked=true +PA4.Signal=GPIO_Output +PA5.Locked=true +PA5.Mode=Full_Duplex_Master +PA5.Signal=SPI1_SCK +PA6.Locked=true +PA6.Mode=Full_Duplex_Master +PA6.Signal=SPI1_MISO +PA7.Locked=true +PA7.Mode=Full_Duplex_Master +PA7.Signal=SPI1_MOSI +PA8.GPIOParameters=GPIO_Label +PA8.GPIO_Label=RELAY_BATT_SIDE_ON +PA8.Locked=true +PA8.Signal=GPIO_Input +PA9.GPIOParameters=GPIO_Label +PA9.GPIO_Label=RELAY_ESC_SIDE_ON +PA9.Locked=true +PA9.Signal=GPIO_Input +PB0.GPIOParameters=PinState,GPIO_Label +PB0.GPIO_Label=STATUS_LED_R +PB0.Locked=true +PB0.PinState=GPIO_PIN_SET +PB0.Signal=GPIO_Output +PB1.GPIOParameters=PinState,GPIO_Label +PB1.GPIO_Label=STATUS_LED_B +PB1.Locked=true +PB1.PinState=GPIO_PIN_SET +PB1.Signal=GPIO_Output +PB11.GPIOParameters=PinState,GPIO_Label +PB11.GPIO_Label=PRECHARGE_EN +PB11.Locked=true +PB11.PinState=GPIO_PIN_RESET +PB11.Signal=GPIO_Output +PB15.GPIOParameters=GPIO_Label +PB15.GPIO_Label=PWM_Battery_Cooling +PB15.Locked=true +PB15.Mode=PWM Generation3 CH3N +PB15.Signal=TIM1_CH3N +PB2.GPIOParameters=PinState,GPIO_Label +PB2.GPIO_Label=STATUS_LED_G +PB2.Locked=true +PB2.PinState=GPIO_PIN_SET +PB2.Signal=GPIO_Output +PB3.Locked=true +PB3.Mode=Trace_Asynchronous_SW +PB3.Signal=SYS_JTDO-TRACESWO +PB6.Locked=true +PB6.Mode=Asynchronous +PB6.Signal=USART1_TX +PB7.Locked=true +PB7.Mode=Asynchronous +PB7.Signal=USART1_RX +PB9.Locked=true +PB9.Mode=I2C +PB9.Signal=I2C1_SDA +PF0-OSC_IN.Locked=true +PF0-OSC_IN.Mode=HSE-External-Oscillator +PF0-OSC_IN.Signal=RCC_OSC_IN +PF1-OSC_OUT.Locked=true +PF1-OSC_OUT.Mode=HSE-External-Oscillator +PF1-OSC_OUT.Signal=RCC_OSC_OUT +PinOutPanel.RotationAngle=0 +ProjectManager.AskForMigrate=true +ProjectManager.BackupPrevious=false +ProjectManager.CompilerOptimize=6 +ProjectManager.ComputerToolchain=false +ProjectManager.CoupleFile=false +ProjectManager.CustomerFirmwarePackage= +ProjectManager.DefaultFWLocation=true +ProjectManager.DeletePrevious=true +ProjectManager.DeviceId=STM32F302CBTx +ProjectManager.FirmwarePackage=STM32Cube FW_F3 V1.11.4 +ProjectManager.FreePins=true +ProjectManager.HalAssertFull=false +ProjectManager.HeapSize=0x200 +ProjectManager.KeepUserCode=true +ProjectManager.LastFirmware=false +ProjectManager.LibraryCopy=1 +ProjectManager.MainLocation=Core/Src +ProjectManager.NoMain=false +ProjectManager.PreviousToolchain= +ProjectManager.ProjectBuild=false +ProjectManager.ProjectFileName=mvbms.ioc +ProjectManager.ProjectName=mvbms +ProjectManager.ProjectStructure= +ProjectManager.RegisterCallBack= +ProjectManager.StackSize=0x400 +ProjectManager.TargetToolchain=Makefile +ProjectManager.ToolChainLocation= +ProjectManager.UAScriptAfterPath= +ProjectManager.UAScriptBeforePath= +ProjectManager.UnderRoot=false +ProjectManager.functionlistsort=1-SystemClock_Config-RCC-false-HAL-false,2-MX_GPIO_Init-GPIO-false-HAL-true,3-MX_CAN_Init-CAN-false-HAL-true,4-MX_I2C1_Init-I2C1-false-HAL-true,5-MX_SPI1_Init-SPI1-false-HAL-true,6-MX_TIM15_Init-TIM15-false-HAL-true,7-MX_USART1_UART_Init-USART1-false-HAL-true,8-MX_TIM1_Init-TIM1-false-HAL-true +RCC.ADC12outputFreq_Value=16000000 +RCC.AHBFreq_Value=16000000 +RCC.APB1Freq_Value=16000000 +RCC.APB1TimFreq_Value=16000000 +RCC.APB2Freq_Value=16000000 +RCC.APB2TimFreq_Value=16000000 +RCC.CortexFreq_Value=16000000 +RCC.FCLKCortexFreq_Value=16000000 +RCC.FamilyName=M +RCC.HCLKFreq_Value=16000000 +RCC.HSEPLLFreq_Value=16000000 +RCC.HSE_VALUE=16000000 +RCC.HSIPLLFreq_Value=4000000 +RCC.HSI_VALUE=8000000 +RCC.I2C1Freq_Value=8000000 +RCC.I2C2Freq_Value=8000000 +RCC.IPParameters=ADC12outputFreq_Value,AHBFreq_Value,APB1Freq_Value,APB1TimFreq_Value,APB2Freq_Value,APB2TimFreq_Value,CortexFreq_Value,FCLKCortexFreq_Value,FamilyName,HCLKFreq_Value,HSEPLLFreq_Value,HSE_VALUE,HSIPLLFreq_Value,HSI_VALUE,I2C1Freq_Value,I2C2Freq_Value,LSE_VALUE,LSI_VALUE,MCOFreq_Value,PLLCLKFreq_Value,PLLMCOFreq_Value,PLLMUL,RTCFreq_Value,RTCHSEDivFreq_Value,SYSCLKFreq_VALUE,SYSCLKSourceVirtual,TIM1Freq_Value,TIM2Freq_Value,USART1Freq_Value,USART2Freq_Value,USART3Freq_Value,USBFreq_Value,VCOOutput2Freq_Value +RCC.LSE_VALUE=32768 +RCC.LSI_VALUE=40000 +RCC.MCOFreq_Value=16000000 +RCC.PLLCLKFreq_Value=16000000 +RCC.PLLMCOFreq_Value=8000000 +RCC.PLLMUL=RCC_PLL_MUL4 +RCC.RTCFreq_Value=40000 +RCC.RTCHSEDivFreq_Value=500000 +RCC.SYSCLKFreq_VALUE=16000000 +RCC.SYSCLKSourceVirtual=RCC_SYSCLKSOURCE_HSE +RCC.TIM1Freq_Value=16000000 +RCC.TIM2Freq_Value=16000000 +RCC.USART1Freq_Value=16000000 +RCC.USART2Freq_Value=16000000 +RCC.USART3Freq_Value=16000000 +RCC.USBFreq_Value=16000000 +RCC.VCOOutput2Freq_Value=4000000 +SH.S_TIM15_CH1.0=TIM15_CH1,PWM Generation1 CH1 +SH.S_TIM15_CH1.ConfNb=1 +SH.S_TIM15_CH2.0=TIM15_CH2,PWM Generation2 CH2 +SH.S_TIM15_CH2.ConfNb=1 +SPI1.BaudRatePrescaler=SPI_BAUDRATEPRESCALER_32 +SPI1.CalculateBaudRate=500.0 KBits/s +SPI1.DataSize=SPI_DATASIZE_8BIT +SPI1.Direction=SPI_DIRECTION_2LINES +SPI1.IPParameters=VirtualType,Mode,Direction,CalculateBaudRate,DataSize,BaudRatePrescaler +SPI1.Mode=SPI_MODE_MASTER +SPI1.VirtualType=VM_MASTER +TIM1.Channel-PWM\ Generation3\ CH3N=TIM_CHANNEL_3 +TIM1.IPParameters=Channel-PWM Generation3 CH3N +TIM15.Channel-PWM\ Generation1\ CH1=TIM_CHANNEL_1 +TIM15.Channel-PWM\ Generation2\ CH2=TIM_CHANNEL_2 +TIM15.IPParameters=Channel-PWM Generation1 CH1,Channel-PWM Generation2 CH2,Prescaler,Period,Pulse-PWM Generation1 CH1 +TIM15.Period=39999 +TIM15.Prescaler=7 +TIM15.Pulse-PWM\ Generation1\ CH1=0 +USART1.IPParameters=VirtualMode-Asynchronous +USART1.VirtualMode-Asynchronous=VM_ASYNC +VP_SYS_VS_Systick.Mode=SysTick +VP_SYS_VS_Systick.Signal=SYS_VS_Systick +board=custom