diff --git a/CMakeLists.txt b/CMakeLists.txt index 6dfc772..9427cb9 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -67,6 +67,7 @@ target_sources(${CMAKE_PROJECT_NAME} PRIVATE app/ring_buffer.c app/ranging.c app/util.c + app/battery_monitor.c ${APP_SOURCE} ) diff --git a/Inc/adc.h b/Inc/adc.h index 797598d..1e1046f 100644 --- a/Inc/adc.h +++ b/Inc/adc.h @@ -32,12 +32,15 @@ extern "C" { /* USER CODE END Includes */ +extern ADC_HandleTypeDef hadc1; + extern ADC_HandleTypeDef hadc2; /* USER CODE BEGIN Private defines */ /* USER CODE END Private defines */ +void MX_ADC1_Init(void); void MX_ADC2_Init(void); /* USER CODE BEGIN Prototypes */ diff --git a/Inc/stm32f3xx_it.h b/Inc/stm32f3xx_it.h index 9ce2ab1..29dfe71 100644 --- a/Inc/stm32f3xx_it.h +++ b/Inc/stm32f3xx_it.h @@ -57,6 +57,7 @@ void PendSV_Handler(void); void SysTick_Handler(void); void EXTI0_IRQHandler(void); void EXTI4_IRQHandler(void); +void ADC1_2_IRQHandler(void); void TIM1_TRG_COM_TIM17_IRQHandler(void); void EXTI15_10_IRQHandler(void); /* USER CODE BEGIN EFP */ diff --git a/Inc/tim.h b/Inc/tim.h index be5cc5d..1437221 100644 --- a/Inc/tim.h +++ b/Inc/tim.h @@ -36,6 +36,8 @@ extern TIM_HandleTypeDef htim1; extern TIM_HandleTypeDef htim2; +extern TIM_HandleTypeDef htim6; + extern TIM_HandleTypeDef htim17; /* USER CODE BEGIN Private defines */ @@ -44,6 +46,7 @@ extern TIM_HandleTypeDef htim17; void MX_TIM1_Init(void); void MX_TIM2_Init(void); +void MX_TIM6_Init(void); void MX_TIM17_Init(void); void HAL_TIM_MspPostInit(TIM_HandleTypeDef *htim); diff --git a/Src/adc.c b/Src/adc.c index f0b366b..1168b8b 100644 --- a/Src/adc.c +++ b/Src/adc.c @@ -24,9 +24,72 @@ /* USER CODE END 0 */ +ADC_HandleTypeDef hadc1; ADC_HandleTypeDef hadc2; DMA_HandleTypeDef hdma_adc2; +/* ADC1 init function */ +void MX_ADC1_Init(void) +{ + + /* USER CODE BEGIN ADC1_Init 0 */ + // This ADC is used to read the battery voltage through a voltage divider, triggered regularly + // by TIM6 update events. + /* USER CODE END ADC1_Init 0 */ + + ADC_MultiModeTypeDef multimode = {0}; + ADC_ChannelConfTypeDef sConfig = {0}; + + /* USER CODE BEGIN ADC1_Init 1 */ + + /* USER CODE END ADC1_Init 1 */ + + /** Common config + */ + hadc1.Instance = ADC1; + hadc1.Init.ClockPrescaler = ADC_CLOCK_ASYNC_DIV1; + hadc1.Init.Resolution = ADC_RESOLUTION_12B; + hadc1.Init.ScanConvMode = ADC_SCAN_DISABLE; + hadc1.Init.ContinuousConvMode = DISABLE; + hadc1.Init.DiscontinuousConvMode = DISABLE; + hadc1.Init.ExternalTrigConvEdge = ADC_EXTERNALTRIGCONVEDGE_FALLING; + hadc1.Init.ExternalTrigConv = ADC_EXTERNALTRIGCONV_T6_TRGO; + hadc1.Init.DataAlign = ADC_DATAALIGN_RIGHT; + hadc1.Init.NbrOfConversion = 1; + hadc1.Init.DMAContinuousRequests = DISABLE; + hadc1.Init.EOCSelection = ADC_EOC_SINGLE_CONV; + hadc1.Init.LowPowerAutoWait = DISABLE; + hadc1.Init.Overrun = ADC_OVR_DATA_OVERWRITTEN; + if (HAL_ADC_Init(&hadc1) != HAL_OK) + { + Error_Handler(); + } + + /** Configure the ADC multi-mode + */ + multimode.Mode = ADC_MODE_INDEPENDENT; + if (HAL_ADCEx_MultiModeConfigChannel(&hadc1, &multimode) != HAL_OK) + { + Error_Handler(); + } + + /** Configure Regular Channel + */ + sConfig.Channel = ADC_CHANNEL_2; + sConfig.Rank = ADC_REGULAR_RANK_1; + sConfig.SingleDiff = ADC_SINGLE_ENDED; + sConfig.SamplingTime = ADC_SAMPLETIME_1CYCLE_5; + sConfig.OffsetNumber = ADC_OFFSET_NONE; + sConfig.Offset = 0; + if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK) + { + Error_Handler(); + } + /* USER CODE BEGIN ADC1_Init 2 */ + + /* USER CODE END ADC1_Init 2 */ + +} /* ADC2 init function */ void MX_ADC2_Init(void) { @@ -109,17 +172,49 @@ void MX_ADC2_Init(void) } +static uint32_t HAL_RCC_ADC12_CLK_ENABLED=0; + void HAL_ADC_MspInit(ADC_HandleTypeDef* adcHandle) { GPIO_InitTypeDef GPIO_InitStruct = {0}; - if(adcHandle->Instance==ADC2) + if(adcHandle->Instance==ADC1) + { + /* USER CODE BEGIN ADC1_MspInit 0 */ + + /* USER CODE END ADC1_MspInit 0 */ + /* ADC1 clock enable */ + HAL_RCC_ADC12_CLK_ENABLED++; + if(HAL_RCC_ADC12_CLK_ENABLED==1){ + __HAL_RCC_ADC12_CLK_ENABLE(); + } + + __HAL_RCC_GPIOA_CLK_ENABLE(); + /**ADC1 GPIO Configuration + PA1 ------> ADC1_IN2 + */ + GPIO_InitStruct.Pin = GPIO_PIN_1; + GPIO_InitStruct.Mode = GPIO_MODE_ANALOG; + GPIO_InitStruct.Pull = GPIO_NOPULL; + HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); + + /* ADC1 interrupt Init */ + HAL_NVIC_SetPriority(ADC1_2_IRQn, 0, 0); + HAL_NVIC_EnableIRQ(ADC1_2_IRQn); + /* USER CODE BEGIN ADC1_MspInit 1 */ + + /* USER CODE END ADC1_MspInit 1 */ + } + else if(adcHandle->Instance==ADC2) { /* USER CODE BEGIN ADC2_MspInit 0 */ /* USER CODE END ADC2_MspInit 0 */ /* ADC2 clock enable */ - __HAL_RCC_ADC12_CLK_ENABLE(); + HAL_RCC_ADC12_CLK_ENABLED++; + if(HAL_RCC_ADC12_CLK_ENABLED==1){ + __HAL_RCC_ADC12_CLK_ENABLE(); + } __HAL_RCC_GPIOA_CLK_ENABLE(); /**ADC2 GPIO Configuration @@ -150,6 +245,9 @@ void HAL_ADC_MspInit(ADC_HandleTypeDef* adcHandle) __HAL_LINKDMA(adcHandle,DMA_Handle,hdma_adc2); + /* ADC2 interrupt Init */ + HAL_NVIC_SetPriority(ADC1_2_IRQn, 0, 0); + HAL_NVIC_EnableIRQ(ADC1_2_IRQn); /* USER CODE BEGIN ADC2_MspInit 1 */ /* USER CODE END ADC2_MspInit 1 */ @@ -159,13 +257,45 @@ void HAL_ADC_MspInit(ADC_HandleTypeDef* adcHandle) void HAL_ADC_MspDeInit(ADC_HandleTypeDef* adcHandle) { - if(adcHandle->Instance==ADC2) + if(adcHandle->Instance==ADC1) + { + /* USER CODE BEGIN ADC1_MspDeInit 0 */ + + /* USER CODE END ADC1_MspDeInit 0 */ + /* Peripheral clock disable */ + HAL_RCC_ADC12_CLK_ENABLED--; + if(HAL_RCC_ADC12_CLK_ENABLED==0){ + __HAL_RCC_ADC12_CLK_DISABLE(); + } + + /**ADC1 GPIO Configuration + PA1 ------> ADC1_IN2 + */ + HAL_GPIO_DeInit(GPIOA, GPIO_PIN_1); + + /* ADC1 interrupt Deinit */ + /* USER CODE BEGIN ADC1:ADC1_2_IRQn disable */ + /** + * Uncomment the line below to disable the "ADC1_2_IRQn" interrupt + * Be aware, disabling shared interrupt may affect other IPs + */ + /* HAL_NVIC_DisableIRQ(ADC1_2_IRQn); */ + /* USER CODE END ADC1:ADC1_2_IRQn disable */ + + /* USER CODE BEGIN ADC1_MspDeInit 1 */ + + /* USER CODE END ADC1_MspDeInit 1 */ + } + else if(adcHandle->Instance==ADC2) { /* USER CODE BEGIN ADC2_MspDeInit 0 */ /* USER CODE END ADC2_MspDeInit 0 */ /* Peripheral clock disable */ - __HAL_RCC_ADC12_CLK_DISABLE(); + HAL_RCC_ADC12_CLK_ENABLED--; + if(HAL_RCC_ADC12_CLK_ENABLED==0){ + __HAL_RCC_ADC12_CLK_DISABLE(); + } /**ADC2 GPIO Configuration PA4 ------> ADC2_IN1 @@ -177,6 +307,16 @@ void HAL_ADC_MspDeInit(ADC_HandleTypeDef* adcHandle) /* ADC2 DMA DeInit */ HAL_DMA_DeInit(adcHandle->DMA_Handle); + + /* ADC2 interrupt Deinit */ + /* USER CODE BEGIN ADC2:ADC1_2_IRQn disable */ + /** + * Uncomment the line below to disable the "ADC1_2_IRQn" interrupt + * Be aware, disabling shared interrupt may affect other IPs + */ + /* HAL_NVIC_DisableIRQ(ADC1_2_IRQn); */ + /* USER CODE END ADC2:ADC1_2_IRQn disable */ + /* USER CODE BEGIN ADC2_MspDeInit 1 */ /* USER CODE END ADC2_MspDeInit 1 */ diff --git a/Src/gpio.c b/Src/gpio.c index c189b22..2f7c102 100644 --- a/Src/gpio.c +++ b/Src/gpio.c @@ -53,7 +53,7 @@ void MX_GPIO_Init(void) HAL_GPIO_WritePin(GPIOF, GPIO_PIN_0|GPIO_PIN_1, GPIO_PIN_RESET); /*Configure GPIO pin Output Level */ - HAL_GPIO_WritePin(GPIOA, GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_8|GPIO_PIN_11, GPIO_PIN_RESET); + HAL_GPIO_WritePin(GPIOA, GPIO_PIN_0|GPIO_PIN_8|GPIO_PIN_11, GPIO_PIN_RESET); /*Configure GPIO pin Output Level */ HAL_GPIO_WritePin(GPIOB, GPIO_PIN_1|GPIO_PIN_3, GPIO_PIN_RESET); @@ -65,8 +65,8 @@ void MX_GPIO_Init(void) GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; HAL_GPIO_Init(GPIOF, &GPIO_InitStruct); - /*Configure GPIO pins : PA0 PA1 PA8 PA11 */ - GPIO_InitStruct.Pin = GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_8|GPIO_PIN_11; + /*Configure GPIO pins : PA0 PA8 PA11 */ + GPIO_InitStruct.Pin = GPIO_PIN_0|GPIO_PIN_8|GPIO_PIN_11; GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; GPIO_InitStruct.Pull = GPIO_NOPULL; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; diff --git a/Src/main.c b/Src/main.c index 4ec36b2..efeb7bd 100644 --- a/Src/main.c +++ b/Src/main.c @@ -95,7 +95,7 @@ int main(void) MX_DMA_Init(); MX_USART2_UART_Init(); /* USER CODE BEGIN 2 */ - app_init(); + app_init(); /* USER CODE END 2 */ /* Infinite loop */ diff --git a/Src/stm32f3xx_it.c b/Src/stm32f3xx_it.c index c324297..7616f8f 100644 --- a/Src/stm32f3xx_it.c +++ b/Src/stm32f3xx_it.c @@ -55,6 +55,8 @@ /* USER CODE END 0 */ /* External variables --------------------------------------------------------*/ +extern ADC_HandleTypeDef hadc1; +extern ADC_HandleTypeDef hadc2; extern TIM_HandleTypeDef htim1; extern TIM_HandleTypeDef htim17; /* USER CODE BEGIN EV */ @@ -227,6 +229,21 @@ void EXTI4_IRQHandler(void) /* USER CODE END EXTI4_IRQn 1 */ } +/** + * @brief This function handles ADC1 and ADC2 interrupts. + */ +void ADC1_2_IRQHandler(void) +{ + /* USER CODE BEGIN ADC1_2_IRQn 0 */ + + /* USER CODE END ADC1_2_IRQn 0 */ + HAL_ADC_IRQHandler(&hadc1); + HAL_ADC_IRQHandler(&hadc2); + /* USER CODE BEGIN ADC1_2_IRQn 1 */ + + /* USER CODE END ADC1_2_IRQn 1 */ +} + /** * @brief This function handles TIM1 trigger and commutation and TIM17 interrupts. */ diff --git a/Src/tim.c b/Src/tim.c index 46db034..4ee0b52 100644 --- a/Src/tim.c +++ b/Src/tim.c @@ -26,6 +26,7 @@ TIM_HandleTypeDef htim1; TIM_HandleTypeDef htim2; +TIM_HandleTypeDef htim6; TIM_HandleTypeDef htim17; /* TIM1 init function */ @@ -134,6 +135,39 @@ void MX_TIM2_Init(void) /* USER CODE END TIM2_Init 2 */ HAL_TIM_MspPostInit(&htim2); +} +/* TIM6 init function */ +void MX_TIM6_Init(void) +{ + + /* USER CODE BEGIN TIM6_Init 0 */ + // Emit update events to trigger conversions on the battery monitor ADC channel. + /* USER CODE END TIM6_Init 0 */ + + TIM_MasterConfigTypeDef sMasterConfig = {0}; + + /* USER CODE BEGIN TIM6_Init 1 */ + // Divide down to 1KHz, then set the period to 499, to trigger every 500ms. + /* USER CODE END TIM6_Init 1 */ + htim6.Instance = TIM6; + htim6.Init.Prescaler = 63999; + htim6.Init.CounterMode = TIM_COUNTERMODE_UP; + htim6.Init.Period = 499; + htim6.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE; + if (HAL_TIM_Base_Init(&htim6) != HAL_OK) + { + Error_Handler(); + } + sMasterConfig.MasterOutputTrigger = TIM_TRGO_UPDATE; + sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE; + if (HAL_TIMEx_MasterConfigSynchronization(&htim6, &sMasterConfig) != HAL_OK) + { + Error_Handler(); + } + /* USER CODE BEGIN TIM6_Init 2 */ + + /* USER CODE END TIM6_Init 2 */ + } /* TIM17 init function */ void MX_TIM17_Init(void) @@ -201,6 +235,17 @@ void HAL_TIM_Base_MspInit(TIM_HandleTypeDef* tim_baseHandle) /* USER CODE END TIM1_MspInit 1 */ } + else if(tim_baseHandle->Instance==TIM6) + { + /* USER CODE BEGIN TIM6_MspInit 0 */ + + /* USER CODE END TIM6_MspInit 0 */ + /* TIM6 clock enable */ + __HAL_RCC_TIM6_CLK_ENABLE(); + /* USER CODE BEGIN TIM6_MspInit 1 */ + + /* USER CODE END TIM6_MspInit 1 */ + } else if(tim_baseHandle->Instance==TIM17) { /* USER CODE BEGIN TIM17_MspInit 0 */ @@ -297,6 +342,17 @@ void HAL_TIM_Base_MspDeInit(TIM_HandleTypeDef* tim_baseHandle) /* USER CODE END TIM1_MspDeInit 1 */ } + else if(tim_baseHandle->Instance==TIM6) + { + /* USER CODE BEGIN TIM6_MspDeInit 0 */ + + /* USER CODE END TIM6_MspDeInit 0 */ + /* Peripheral clock disable */ + __HAL_RCC_TIM6_CLK_DISABLE(); + /* USER CODE BEGIN TIM6_MspDeInit 1 */ + + /* USER CODE END TIM6_MspDeInit 1 */ + } else if(tim_baseHandle->Instance==TIM17) { /* USER CODE BEGIN TIM17_MspDeInit 0 */ diff --git a/app/app.c b/app/app.c index bc60b6c..455e18c 100644 --- a/app/app.c +++ b/app/app.c @@ -1,4 +1,5 @@ #include "VL53L4CD_api.h" +#include "battery_monitor.h" #include "debug.h" #include "drivers/ir_remote.h" #include "drivers/line_sensor.h" @@ -10,6 +11,7 @@ void app_init(void) { + battery_monitor_init(); // Used by microsecond sleep utility, and for IR remote input capture. MX_TIM17_Init(); if (HAL_TIM_Base_Start(&htim17) != HAL_OK) diff --git a/app/app_config.h b/app/app_config.h index b93ab09..3f47002 100644 --- a/app/app_config.h +++ b/app/app_config.h @@ -1,4 +1,13 @@ #pragma once #include -#define IR_REMOTE_ADDR ((uint16_t)0xBF00) \ No newline at end of file +// IR Remote +#define IR_REMOTE_ADDR ((uint16_t)0xBF00) + +// Battery +#define LOW_BATTERY_THRESHOLD_MV 6700U +// The duration the battery threshold needs to be crossed before taking action. +#define LOW_BATTERY_THRESHOLD_DURATION_MS 3000U + +// Ranging +#define RANGING_MAX_DISTANCE_MM 400U diff --git a/app/battery_monitor.c b/app/battery_monitor.c new file mode 100644 index 0000000..3915fda --- /dev/null +++ b/app/battery_monitor.c @@ -0,0 +1,87 @@ +#include + +#include "adc.h" +#include "app_config.h" +#include "debug.h" +#include "drivers/motor_driver.h" +#include "main.h" +#include "tim.h" + +#define ADC_VOLTAGE_REF_MV 3300U +#define ADC_12_BIT_RESOLUTION 4095U +#define BATTERY_MONITOR_R1_OHM 75000U +#define BATTERY_MONITOR_R2_OHM 24000U + +volatile uint32_t adc_val = 0; +uint32_t latest_valid_reading = 0; + +/** + * @brief Read the latest battery monitor voltage measurement in mV. + */ +static uint32_t battery_monitor_get_voltage_mv() +{ + // Convert the 12 bit ADC reading to millivolts. + uint32_t adc_raw = adc_val; + uint32_t adc_voltage_mv = adc_raw * ADC_VOLTAGE_REF_MV / ADC_12_BIT_RESOLUTION; + + // Apply the battery monitor voltage divider ratio to get the battery voltage. + uint32_t battery_voltage_mv = + adc_voltage_mv * (BATTERY_MONITOR_R1_OHM + BATTERY_MONITOR_R2_OHM) / BATTERY_MONITOR_R2_OHM; + + if (battery_voltage_mv > LOW_BATTERY_THRESHOLD_MV) + { + latest_valid_reading = HAL_GetTick(); + } + + return battery_voltage_mv; +} + +bool battery_monitor_check_low_voltage() +{ + uint32_t battery_voltage = battery_monitor_get_voltage_mv(); + + return battery_voltage < LOW_BATTERY_THRESHOLD_MV && + HAL_GetTick() - latest_valid_reading > LOW_BATTERY_THRESHOLD_DURATION_MS; +} + +void battery_monitor_low_voltage_shutdown(void) +{ + motor_drive(0, DRIVE_STOP); + + while (1) + { + DEBUG_PRINTF("Battery voltage critically low: %dmV\n", battery_monitor_get_voltage_mv()); + + HAL_GPIO_TogglePin(GPIOF, GPIO_PIN_1); + HAL_Delay(500); + } +} + +// cppcheck-suppress constParameterPointer +void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef *hadc) +{ + if (hadc->Instance == ADC1) + { + adc_val = HAL_ADC_GetValue(&hadc1); + } +} + +void battery_monitor_init(void) +{ + MX_TIM6_Init(); + MX_ADC1_Init(); + + if (HAL_ADC_Start_IT(&hadc1) != HAL_OK) + { + Error_Handler(); + } + + if (HAL_TIM_Base_Start(&htim6) != HAL_OK) + { + Error_Handler(); + } + + // Trigger the initial ADC conversion immediately, so we don't need to wait for the first + // timer reload. + HAL_TIM_GenerateEvent(&htim6, TIM_EVENTSOURCE_UPDATE); +} \ No newline at end of file diff --git a/app/battery_monitor.h b/app/battery_monitor.h new file mode 100644 index 0000000..b2a8106 --- /dev/null +++ b/app/battery_monitor.h @@ -0,0 +1,20 @@ +#pragma once + +#include + +/** + * @brief Check whether the battery voltage is below the safe threshold. + */ +bool battery_monitor_check_low_voltage(); + +/** + * @brief Shut down the motor, and indicate failure with LEDs in an infinite loop. + */ +void battery_monitor_low_voltage_shutdown(void); + +/** + * @brief Initialize the battery monitor. + * + * Initialize and start the conversion triggering timer peripheral and the ADC. + */ +void battery_monitor_init(void); \ No newline at end of file diff --git a/app/state.c b/app/state.c index 55b6732..06c1175 100644 --- a/app/state.c +++ b/app/state.c @@ -3,6 +3,8 @@ #include #include +#include "app_config.h" +#include "battery_monitor.h" #include "debug.h" #include "drivers/line_sensor.h" #include "drivers/motor_driver.h" @@ -142,6 +144,11 @@ static void process_event(StateEvent event) */ static StateEvent process_input(void) { + if (battery_monitor_check_low_voltage()) + { + battery_monitor_low_voltage_shutdown(); + } + IrCommand cmd = ir_remote_get_cmd(); LineType line = get_line(); // TODO: if data is ready this will do I2C reads which can take a few ms, we @@ -177,8 +184,6 @@ static StateEvent process_input(void) if (enemy.bearing != BEARING_NONE) { - DEBUG_PRINTF("Enemy bearing: %d, distance: %dmm, state: %d\n", enemy.bearing, - enemy.distance_mm, ctx.state); return EVT_ENEMY; } diff --git a/sumo.ioc b/sumo.ioc index 96997e2..88ec06d 100644 --- a/sumo.ioc +++ b/sumo.ioc @@ -1,4 +1,16 @@ #MicroXplorer Configuration settings - do not modify +ADC1.Channel-0\#ChannelRegularConversion=ADC_CHANNEL_2 +ADC1.ExternalTrigConv=ADC_EXTERNALTRIGCONV_T6_TRGO +ADC1.ExternalTrigConvEdge=ADC_EXTERNALTRIGCONVEDGE_FALLING +ADC1.IPParameters=SubFamily,Rank-0\#ChannelRegularConversion,master,Channel-0\#ChannelRegularConversion,SamplingTime-0\#ChannelRegularConversion,SamplingTimeOPAMP-0\#ChannelRegularConversion,OffsetNumber-0\#ChannelRegularConversion,Offset-0\#ChannelRegularConversion,NbrOfConversionFlag,ExternalTrigConv,ExternalTrigConvEdge +ADC1.NbrOfConversionFlag=1 +ADC1.Offset-0\#ChannelRegularConversion=0 +ADC1.OffsetNumber-0\#ChannelRegularConversion=ADC_OFFSET_NONE +ADC1.Rank-0\#ChannelRegularConversion=1 +ADC1.SamplingTime-0\#ChannelRegularConversion=ADC_SAMPLETIME_1CYCLE_5 +ADC1.SamplingTimeOPAMP-0\#ChannelRegularConversion=ADC_SAMPLETIME_61CYCLES_5 +ADC1.SubFamily=STM32F303x8 +ADC1.master=1 ADC2.Channel-6\#ChannelRegularConversion=ADC_CHANNEL_1 ADC2.Channel-7\#ChannelRegularConversion=ADC_CHANNEL_2 ADC2.Channel-8\#ChannelRegularConversion=ADC_CHANNEL_3 @@ -54,17 +66,19 @@ I2C1.Timing=0x00100001 KeepUserPlacement=false Mcu.CPN=STM32F303K8T6 Mcu.Family=STM32F3 -Mcu.IP0=ADC2 -Mcu.IP1=DMA -Mcu.IP2=I2C1 -Mcu.IP3=NVIC -Mcu.IP4=RCC -Mcu.IP5=SYS -Mcu.IP6=TIM1 -Mcu.IP7=TIM2 -Mcu.IP8=TIM17 -Mcu.IP9=USART2 -Mcu.IPNb=10 +Mcu.IP0=ADC1 +Mcu.IP1=ADC2 +Mcu.IP10=TIM17 +Mcu.IP11=USART2 +Mcu.IP2=DMA +Mcu.IP3=I2C1 +Mcu.IP4=NVIC +Mcu.IP5=RCC +Mcu.IP6=SYS +Mcu.IP7=TIM1 +Mcu.IP8=TIM2 +Mcu.IP9=TIM6 +Mcu.IPNb=12 Mcu.Name=STM32F303K(6-8)Tx Mcu.Package=LQFP32 Mcu.Pin0=PF0 / OSC_IN @@ -86,7 +100,8 @@ Mcu.Pin22=PB6 Mcu.Pin23=PB7 Mcu.Pin24=VP_SYS_VS_Systick Mcu.Pin25=VP_TIM1_VS_ClockSourceINT -Mcu.Pin26=VP_TIM17_VS_ClockSourceINT +Mcu.Pin26=VP_TIM6_VS_ClockSourceINT +Mcu.Pin27=VP_TIM17_VS_ClockSourceINT Mcu.Pin3=PA1 Mcu.Pin4=PA2 Mcu.Pin5=PA3 @@ -94,12 +109,13 @@ Mcu.Pin6=PA4 Mcu.Pin7=PA5 Mcu.Pin8=PA6 Mcu.Pin9=PA7 -Mcu.PinsNb=27 +Mcu.PinsNb=28 Mcu.ThirdPartyNb=0 Mcu.UserConstants= Mcu.UserName=STM32F303K8Tx MxCube.Version=6.17.0 MxDb.Version=DB.6.0.170 +NVIC.ADC1_2_IRQn=true\:0\:0\:false\:false\:true\:true\:true\:true NVIC.BusFault_IRQn=true\:0\:0\:false\:false\:true\:false\:false\:false NVIC.DebugMonitor_IRQn=true\:0\:0\:false\:false\:true\:false\:false\:false NVIC.EXTI0_IRQn=true\:0\:0\:false\:false\:true\:true\:true\:true @@ -118,7 +134,8 @@ NVIC.UsageFault_IRQn=true\:0\:0\:false\:false\:true\:false\:false\:false PA0.Locked=true PA0.Signal=GPIO_Output PA1.Locked=true -PA1.Signal=GPIO_Output +PA1.Mode=IN2-Single-Ended +PA1.Signal=ADC1_IN2 PA10.Locked=true PA10.Signal=S_TIM2_CH4 PA11.Locked=true @@ -266,6 +283,10 @@ TIM2.Channel-PWM\ Generation4\ CH4=TIM_CHANNEL_4 TIM2.IPParameters=Period,Channel-PWM Generation3 CH3,Channel-PWM Generation4 CH4,Prescaler TIM2.Period=100 - 1 TIM2.Prescaler=31 +TIM6.IPParameters=Prescaler,Period,TIM_MasterOutputTrigger +TIM6.Period=4999 +TIM6.Prescaler=63999 +TIM6.TIM_MasterOutputTrigger=TIM_TRGO_UPDATE USART2.BaudRate=115200 USART2.IPParameters=VirtualMode-Asynchronous,BaudRate,Mode USART2.Mode=MODE_TX @@ -276,4 +297,6 @@ VP_TIM17_VS_ClockSourceINT.Mode=Enable_Timer VP_TIM17_VS_ClockSourceINT.Signal=TIM17_VS_ClockSourceINT VP_TIM1_VS_ClockSourceINT.Mode=Internal VP_TIM1_VS_ClockSourceINT.Signal=TIM1_VS_ClockSourceINT +VP_TIM6_VS_ClockSourceINT.Mode=Enable_Timer +VP_TIM6_VS_ClockSourceINT.Signal=TIM6_VS_ClockSourceINT board=custom