1991 lines
67 KiB
C
1991 lines
67 KiB
C
/**
|
||
******************************************************************************
|
||
* @file Demonstrations/Src/main.c
|
||
* @author MCD Application Team
|
||
* @brief Buck LED Demonstration of STM32F3348-DISCO board
|
||
******************************************************************************
|
||
* @attention
|
||
*
|
||
* Copyright (c) 2016 STMicroelectronics.
|
||
* All rights reserved.
|
||
*
|
||
* This software is licensed under terms that can be found in the LICENSE file
|
||
* in the root directory of this software component.
|
||
* If no LICENSE file comes with this software, it is provided AS-IS.
|
||
*
|
||
******************************************************************************
|
||
*/
|
||
|
||
/* Includes ------------------------------------------------------------------*/
|
||
#include "main.h"
|
||
|
||
/** @addtogroup STM32F3348-Discovery_Demo
|
||
* @{
|
||
*/
|
||
|
||
/* Private typedef -----------------------------------------------------------*/
|
||
|
||
/* Private define ------------------------------------------------------------*/
|
||
#define MIN_INTENSITY 625
|
||
#define MAX_INTENSITY 0
|
||
#define MAX_INTENSITY_DIMMER 419
|
||
|
||
/* Test mode */
|
||
#define ADC_TRIGGER_VALUE 1000 /* ADC trigger Event time where noise is not present */
|
||
#define BLANK_TIME_TIMA 500 /* Blank Time between alternate BuckBoost Timer A initialization */
|
||
#define MAX_VOLTAGE 5500
|
||
#define MIN_TIME_TIMA 500 /* Min time corresponding to DutyCycle Max = 97% */
|
||
#define MIN_VOLTAGE 4500
|
||
#define SET_PERIOD 18432 /* Period equivalent to 250kHz frequency */
|
||
|
||
/* Private macro -------------------------------------------------------------*/
|
||
/* Private variables ---------------------------------------------------------*/
|
||
__IO uint16_t TriangCmp = 0x100;
|
||
__IO uint8_t TriangleGeneration = 0;
|
||
HRTIM_HandleTypeDef HrtimHandle;
|
||
|
||
static COMP_HandleTypeDef CompHandle;
|
||
static DAC_HandleTypeDef DacHandle;
|
||
static DMA_HandleTypeDef DmaHandle;
|
||
static __IO uint8_t Converter_Mode_Change = TRUE;
|
||
static __IO uint8_t Current_Mode = BUCK;
|
||
static __IO uint8_t DownUp = FALSE; /* UP DOWN LED intensity */
|
||
static __IO uint8_t NoWait = TRUE;
|
||
static __IO uint8_t StateMachine = STATE_OFF;
|
||
static __IO uint8_t TestMode = FALSE;
|
||
static const uint16_t DitherTab[8][8] = {{0,0,0,0,0,0,0,0},
|
||
{0,0,0,0,0,0,0,1},
|
||
{0,0,0,1,0,0,0,1},
|
||
{0,0,1,0,0,1,0,1},
|
||
{0,1,0,1,0,1,0,1},
|
||
{0,1,0,1,1,0,1,1},
|
||
{0,1,1,1,0,1,1,1},
|
||
{0,1,1,1,1,1,1,1}};
|
||
static __IO uint16_t Keypressed = FALSE;
|
||
static __IO uint32_t CurrentSenseTab[5] = {280, 240, 200, 360, 320}; /* Current table centered around ~250mA in the Power LED */
|
||
static __IO float fIntensity = MIN_INTENSITY;
|
||
|
||
/* Test mode */
|
||
ADC_HandleTypeDef AdcHandle;
|
||
|
||
static uint16_t AdcReferenceConvertedValue = 0;
|
||
static __IO uint32_t Adc_Channel1_ConvertedValue_In = 0;
|
||
static __IO uint32_t Adc_Channel1_ConvertedValue_Out = 0;
|
||
|
||
/* Private function prototypes -----------------------------------------------*/
|
||
/* Private functions ---------------------------------------------------------*/
|
||
static void ADC_Config(void);
|
||
static void BuckInit(void);
|
||
static void COMP_Config(void);
|
||
static void DAC_Config(void);
|
||
static void DMA_Config(void);
|
||
static void Error_Handler(void);
|
||
static void HRTIM_Config(void);
|
||
static void HRTIM_SetBurstCompare(float BurstCompare);
|
||
static void HRTIM_Unselect_OutputTIMx(void);
|
||
static void SetHRTIM_BoostMode(void);
|
||
static void SetHRTIM_BuckMode(void);
|
||
static void SystemClock_Config(void);
|
||
static void TestProgram(void);
|
||
static void TriangleGenerationInit(void);
|
||
|
||
/**
|
||
* @brief Main program
|
||
* @param None
|
||
* @retval None
|
||
*/
|
||
int main(void)
|
||
{
|
||
uint8_t toggle = FALSE;
|
||
uint32_t sensetab[5] = {0,0,0,0,0}; /* mA */
|
||
uint32_t i;
|
||
uint32_t tempo = 400;
|
||
double midvalue = MIN_INTENSITY;
|
||
float y;
|
||
|
||
/*!< At this stage the microcontroller clock setting is already configured,
|
||
this is done through SystemInit() function which is called from startup
|
||
files (startup_stm32f334x8.s) before to branch to application main.
|
||
To reconfigure the default setting of SystemInit() function, refer to
|
||
system_stm32f3xx.c file
|
||
*/
|
||
|
||
/* STM32F3xx HAL library initialization:
|
||
- Configure the Flash prefetch
|
||
- Systick timer is configured by default as source of time base, but user
|
||
can eventually implement his proper time base source (a general purpose
|
||
timer for example or other time source), keeping in mind that Time base
|
||
duration should be kept 1ms since PPP_TIMEOUT_VALUEs are defined and
|
||
handled in milliseconds basis.
|
||
- Set NVIC Group Priority to 4
|
||
- Low Level Initialization
|
||
*/
|
||
HAL_Init();
|
||
|
||
/* Configure the system clock to have a system clock = 72 Mhz */
|
||
SystemClock_Config();
|
||
|
||
/*Configure the SysTick to have interrupt in 10<31>s time basis*/
|
||
HAL_SYSTICK_Config(HAL_RCC_GetHCLKFreq()/100000);
|
||
|
||
/* Allows temporization */
|
||
NoWait = FALSE;
|
||
|
||
/* Initialize LEDs available on STM32F3348-DISCO */
|
||
BSP_LED_Init(LED3);
|
||
BSP_LED_Init(LED4);
|
||
BSP_LED_Init(LED5);
|
||
BSP_LED_Init(LED6);
|
||
|
||
/* Initialize User_Button on STM32F3348-DISCO */
|
||
BSP_PB_Init(BUTTON_USER, BUTTON_MODE_EXTI);
|
||
|
||
/* Check if TestProgram is called by User button at startup*/
|
||
if((BSP_PB_GetState(BUTTON_USER) == SET))
|
||
{
|
||
while((BSP_PB_GetState(BUTTON_USER) == SET))
|
||
{
|
||
/* Toggle LED5/LED6 to show TestProgram selection until key pressed */
|
||
BSP_LED_On(LED6);
|
||
HAL_Delay(70);
|
||
BSP_LED_Off(LED6);
|
||
BSP_LED_On(LED5);
|
||
HAL_Delay(70);
|
||
BSP_LED_Off(LED5);
|
||
}
|
||
BSP_LED_Off(LED6);
|
||
BSP_LED_Off(LED5);
|
||
/* Jump to TestProgram function */
|
||
TestMode = TRUE;
|
||
TestProgram();
|
||
}
|
||
|
||
/* Initializes HRTIM, DAC, DMA and COMP to drive Buck LED*/
|
||
BuckInit();
|
||
|
||
/* Initializes HRTIM to generate a triangle signal on PB14 */
|
||
TriangleGenerationInit();
|
||
|
||
/* Infinite loop */
|
||
while (1)
|
||
{
|
||
switch (StateMachine)
|
||
{
|
||
case STATE_MAN:
|
||
/* Disable HRTIM Master Burst period interrupt */
|
||
__HAL_HRTIM_DISABLE_IT(&HrtimHandle, HRTIM_IT_BMPER);
|
||
|
||
/* Reset all signal LEDs */
|
||
BSP_LED_Off(LED3);
|
||
BSP_LED_Off(LED4);
|
||
BSP_LED_Off(LED5);
|
||
BSP_LED_Off(LED6);
|
||
|
||
TriangleGeneration = 0;
|
||
|
||
/* Disable the TD1 output */
|
||
if(HAL_HRTIM_WaveformOutputStop(&HrtimHandle, HRTIM_OUTPUT_TD1) != HAL_OK)
|
||
{
|
||
Error_Handler();
|
||
}
|
||
|
||
/* By keeping pressed User push-button, intensity can be adjusted manually */
|
||
/* Alternatively the LED intensity is increased or decreased */
|
||
/* Always starts with low intensity value for first time */
|
||
/* Decrease LED intensity */
|
||
while((BSP_PB_GetState(BUTTON_USER) == SET) && (DownUp==TRUE))
|
||
{
|
||
/* Display Decrease LED */
|
||
BSP_LED_On(LED6);
|
||
BSP_LED_Off(LED3);
|
||
|
||
/* Temporization active */
|
||
NoWait = FALSE;
|
||
HRTIM_SetBurstCompare(midvalue);
|
||
midvalue++;
|
||
HAL_Delay(10);
|
||
/* Check if min. intensity reached */
|
||
if (midvalue >= MIN_INTENSITY)
|
||
{
|
||
midvalue = MIN_INTENSITY;
|
||
/* Then blink display LED min. intensity */
|
||
BSP_LED_Off(LED6);
|
||
HAL_Delay(100);
|
||
}
|
||
}
|
||
|
||
/* Increase LED intensity */
|
||
while((BSP_PB_GetState(BUTTON_USER) == SET) && (DownUp==FALSE))
|
||
{
|
||
/* Display Increase LED */
|
||
BSP_LED_Off(LED6);
|
||
BSP_LED_On(LED3);
|
||
|
||
/* Temporization active */
|
||
NoWait = FALSE;
|
||
HRTIM_SetBurstCompare(midvalue);
|
||
midvalue--;
|
||
HAL_Delay(10);
|
||
|
||
/* Check if max. intensity reached */
|
||
if (midvalue <= MAX_INTENSITY)
|
||
{
|
||
midvalue = MAX_INTENSITY;
|
||
/* Then blink display LED max. intensity */
|
||
BSP_LED_Off(LED3);
|
||
HAL_Delay(100);
|
||
}
|
||
}
|
||
|
||
break;
|
||
|
||
case STATE_OFF:
|
||
/* This mode disables LED dimmer or flash */
|
||
/* Disable HRTIM Master Burst period interrupt */
|
||
__HAL_HRTIM_DISABLE_IT(&HrtimHandle, HRTIM_IT_BMPER);
|
||
DownUp = TRUE;
|
||
midvalue = MIN_INTENSITY;
|
||
|
||
/* BUCK LED is OFF, only signal LEDs are blinking */
|
||
HRTIM_SetBurstCompare(MIN_INTENSITY);
|
||
|
||
/* Define initial blinking time between two LEDs 400ms */
|
||
NoWait = FALSE;
|
||
|
||
/* Red LED ON */
|
||
BSP_LED_On(LED3);
|
||
HAL_Delay(tempo);
|
||
BSP_LED_Off(LED3);
|
||
|
||
/* Green LED ON */
|
||
BSP_LED_On(LED5);
|
||
HAL_Delay(tempo);
|
||
BSP_LED_Off(LED5);
|
||
|
||
/* Blue LED ON */
|
||
BSP_LED_On(LED6);
|
||
HAL_Delay(tempo);
|
||
BSP_LED_Off(LED6);
|
||
|
||
/* Orange LED ON */
|
||
BSP_LED_On(LED4);
|
||
HAL_Delay(tempo);
|
||
BSP_LED_Off(LED4);
|
||
|
||
TriangleGeneration = 1;
|
||
|
||
/* Enable the TD1 output */
|
||
if(HAL_HRTIM_WaveformOutputStart(&HrtimHandle, HRTIM_OUTPUT_TD1) != HAL_OK)
|
||
{
|
||
Error_Handler();
|
||
}
|
||
|
||
/* Decrease time between blinking sequence */
|
||
tempo = tempo / 2;
|
||
if(tempo == 1)
|
||
{
|
||
tempo = 400;
|
||
}
|
||
break;
|
||
|
||
case STATE_DIMMER:
|
||
|
||
/* The LED intensity is automatically controlled */
|
||
/* Levels of current thresholds are progressively set */
|
||
/* Intensity variation and flicker removal are enhanced thanks to dither sequences
|
||
that allows greater precision by steps */
|
||
DownUp = TRUE;
|
||
midvalue = MIN_INTENSITY;
|
||
|
||
/* Reset all signal LEDs */
|
||
BSP_LED_Off(LED3);
|
||
BSP_LED_Off(LED4);
|
||
BSP_LED_Off(LED5);
|
||
BSP_LED_Off(LED6);
|
||
|
||
TriangleGeneration = 0;
|
||
|
||
/* Disable the TD1 output */
|
||
if(HAL_HRTIM_WaveformOutputStop(&HrtimHandle, HRTIM_OUTPUT_TD1) != HAL_OK)
|
||
{
|
||
Error_Handler();
|
||
}
|
||
|
||
NoWait = FALSE;
|
||
|
||
/* Set signal LEDs to rising mode */
|
||
BSP_LED_On(LED3);
|
||
BSP_LED_Off(LED6);
|
||
|
||
/* Start with current thresholds set to minimum */
|
||
sensetab[0] = 80;
|
||
sensetab[1] = 40;
|
||
sensetab[2] = 0;
|
||
sensetab[3] = 160;
|
||
sensetab[4] = 120;
|
||
CurrentSenseTab[0] = 0;
|
||
CurrentSenseTab[1] = 0;
|
||
CurrentSenseTab[2] = 0;
|
||
CurrentSenseTab[3] = 0;
|
||
CurrentSenseTab[4] = 0;
|
||
|
||
/* Set fIntensity at minimum intensity */
|
||
fIntensity = MIN_INTENSITY;
|
||
|
||
/* Enable HRTIM Master Burst period interrupt */
|
||
/* Each time the interrupt is serviced, the LED is driven */
|
||
__HAL_HRTIM_ENABLE_IT(&HrtimHandle, HRTIM_IT_BMPER);
|
||
|
||
/* Intensity changes from Min to Max */
|
||
for(fIntensity = MIN_INTENSITY; (fIntensity >= MAX_INTENSITY_DIMMER) && (NoWait == FALSE); fIntensity -= 0.1f)
|
||
{
|
||
/* Increment progressively all thresholds up to the setting value (centered value is ~250mA)*/
|
||
if(fIntensity > (605 + 0.1))
|
||
{
|
||
for(i = 0; i < 5; i++)
|
||
{
|
||
sensetab[i]++;
|
||
CurrentSenseTab[i] = (sensetab[i] * 4096) / 3300;
|
||
}
|
||
}
|
||
|
||
/* Delay between 2 steps is decreased exponentially */
|
||
y = ((fIntensity / 100) * 1.1f);
|
||
y = exp((double)y);
|
||
HAL_Delay((uint32_t)(y / 100));
|
||
}
|
||
|
||
/* Set signal LEDs to falling mode */
|
||
/* Intensity falling phase */
|
||
BSP_LED_On(LED6);
|
||
BSP_LED_Off(LED3);
|
||
|
||
/* Intensity changes from Max to Min */
|
||
for(fIntensity = MAX_INTENSITY_DIMMER; (fIntensity <= MIN_INTENSITY) && (NoWait == FALSE); fIntensity += 0.1f)
|
||
{
|
||
/* Decrement progressively all thresholds down to 0*/
|
||
if(fIntensity > 605)
|
||
{
|
||
for (i = 0; i < 5; i++)
|
||
{
|
||
sensetab[i]--;
|
||
CurrentSenseTab[i] = (sensetab[i] * 4096) / 3300;
|
||
}
|
||
}
|
||
/* Delay between 2 steps is increased exponentially */
|
||
y = ((fIntensity / 100) * 1.1f);
|
||
y = exp((double)y);
|
||
HAL_Delay((uint32_t)(y / 100));
|
||
}
|
||
break;
|
||
|
||
case STATE_FLASH:
|
||
/* Flash mode consists to drive the LED @10Hz frequency (20% time ON) at maximum intensity */
|
||
/* Disable HRTIM Master Burst period interrupt */
|
||
__HAL_HRTIM_DISABLE_IT(&HrtimHandle, HRTIM_IT_BMPER);
|
||
|
||
/* (Re)Initialization of Current thresholds */
|
||
DownUp = TRUE;
|
||
midvalue = MIN_INTENSITY;
|
||
|
||
/* Reset all signal LEDs except green*/
|
||
BSP_LED_Off(LED3);
|
||
BSP_LED_Off(LED6);
|
||
/* Alternatively signals LED4 and LED5 are toggled */
|
||
if (toggle != FALSE)
|
||
{
|
||
BSP_LED_On(LED4);
|
||
BSP_LED_Off(LED5);
|
||
}
|
||
else
|
||
{
|
||
BSP_LED_Off(LED4);
|
||
BSP_LED_On(LED5);
|
||
}
|
||
|
||
TriangleGeneration = 0;
|
||
|
||
/* Disable the TD1 output */
|
||
if(HAL_HRTIM_WaveformOutputStop(&HrtimHandle, HRTIM_OUTPUT_TD1) != HAL_OK)
|
||
{
|
||
Error_Handler();
|
||
}
|
||
|
||
NoWait = FALSE;
|
||
|
||
/* freq= 10Hz tON = 20ms; tOFF = 80ms */
|
||
/* BUCK LED ON */
|
||
HRTIM_SetBurstCompare(MAX_INTENSITY);
|
||
/* tON = 20ms */
|
||
HAL_Delay(20);
|
||
|
||
/* Alternatively signals LED4 and LED5 are toggled */
|
||
if (toggle != FALSE)
|
||
{
|
||
BSP_LED_Off(LED4);
|
||
BSP_LED_On(LED5);
|
||
}
|
||
else
|
||
{
|
||
BSP_LED_On(LED4);
|
||
BSP_LED_Off(LED5);
|
||
}
|
||
|
||
/* BUCK LED OFF */
|
||
HRTIM_SetBurstCompare(MIN_INTENSITY);
|
||
/* tOFF = 80 ms */
|
||
HAL_Delay(80);
|
||
toggle = (!toggle);
|
||
|
||
break;
|
||
|
||
default :
|
||
Error_Handler();
|
||
}
|
||
}
|
||
}
|
||
|
||
|
||
/**
|
||
* @brief Configures Buck
|
||
* @param None
|
||
* @retval None
|
||
*/
|
||
static void BuckInit(void)
|
||
{
|
||
uint8_t index;
|
||
|
||
/* Convert current sense value thresholds for DAC */
|
||
for (index =0; index < 5; index++)
|
||
{
|
||
CurrentSenseTab[index] = (CurrentSenseTab[index] * 4096) / 3300;
|
||
}
|
||
|
||
/* DMA Configuration */
|
||
DMA_Config();
|
||
|
||
/* DAC Configuration */
|
||
DAC_Config();
|
||
|
||
/* COMP Configuration */
|
||
COMP_Config();
|
||
|
||
/* HRTIM Configuration */
|
||
HRTIM_Config();
|
||
}
|
||
|
||
/**
|
||
* @brief DMA configuration
|
||
* @param None
|
||
* @retval None
|
||
*/
|
||
static void DMA_Config(void)
|
||
{
|
||
/* Enable DMA1 clock -------------------------------------------------------*/
|
||
__HAL_RCC_DMA1_CLK_ENABLE();
|
||
|
||
/* Configure the DMA1 CH5 IRQ Channel */
|
||
DmaHandle.Init.Direction = DMA_MEMORY_TO_PERIPH; /* M2P transfer mode */
|
||
DmaHandle.Init.PeriphInc = DMA_PINC_DISABLE; /* Peripheral increment mode Disable */
|
||
DmaHandle.Init.MemInc = DMA_MINC_ENABLE; /* Memory increment mode Enable */
|
||
DmaHandle.Init.PeriphDataAlignment = DMA_PDATAALIGN_WORD; /* Peripheral data alignment : Word */
|
||
DmaHandle.Init.MemDataAlignment = DMA_MDATAALIGN_WORD; /* memory data alignment : Word */
|
||
DmaHandle.Init.Mode = DMA_CIRCULAR; /* Circular Normal DMA mode */
|
||
DmaHandle.Init.Priority = DMA_PRIORITY_HIGH; /* priority level : high */
|
||
|
||
DmaHandle.Instance = DMA1_Channel5;
|
||
|
||
if(HAL_DMA_Init(&DmaHandle) != HAL_OK)
|
||
{
|
||
Error_Handler();
|
||
}
|
||
}
|
||
|
||
/**
|
||
* @brief DAC channel1 configuration
|
||
* @param None
|
||
* @retval None
|
||
*/
|
||
static void DAC_Config(void)
|
||
{
|
||
DAC_ChannelConfTypeDef DAC_ConfigStructure;
|
||
|
||
#ifdef DEBUG
|
||
GPIO_InitTypeDef GPIO_InitStructure;
|
||
|
||
/* Configure DAC1 OUT1 ******************************************************/
|
||
/* GPIO Periph clock enable */
|
||
__HAL_RCC_GPIOA_CLK_ENABLE();
|
||
|
||
/* Configure PA4 (DAC1_OUT1) as analog */
|
||
GPIO_InitStructure.Pin = GPIO_PIN_4;
|
||
GPIO_InitStructure.Mode = GPIO_MODE_ANALOG;
|
||
GPIO_InitStructure.Pull = GPIO_NOPULL;
|
||
HAL_GPIO_Init(GPIOA, &GPIO_InitStructure);
|
||
#endif
|
||
|
||
/* DAC1 Periph clock enable */
|
||
__HAL_RCC_DAC1_CLK_ENABLE();
|
||
|
||
/* DAC1 deinitialize */
|
||
DacHandle.Instance = DAC1;
|
||
if(HAL_DAC_DeInit(&DacHandle) != HAL_OK)
|
||
{
|
||
Error_Handler();
|
||
}
|
||
|
||
/* DAC Channel1 Init */
|
||
if(HAL_DAC_Init(&DacHandle) != HAL_OK)
|
||
{
|
||
Error_Handler();
|
||
}
|
||
|
||
/* Fill DAC ConfigStructure */
|
||
DAC_ConfigStructure.DAC_OutputBuffer = DAC_OUTPUTBUFFER_DISABLE;
|
||
DAC_ConfigStructure.DAC_Trigger = DAC_TRIGGER_NONE;
|
||
if(HAL_DAC_ConfigChannel(&DacHandle, &DAC_ConfigStructure, DAC_CHANNEL_1) != HAL_OK)
|
||
{
|
||
Error_Handler();
|
||
}
|
||
|
||
/* Enable DAC Channel1 */
|
||
if(HAL_DAC_Start(&DacHandle, DAC_CHANNEL_1) != HAL_OK)
|
||
{
|
||
Error_Handler();
|
||
}
|
||
|
||
/* Set DAC Channel1 DHR register: DAC1_OUT */
|
||
if(HAL_DAC_SetValue(&DacHandle, DAC_CHANNEL_1, DAC_ALIGN_12B_R, CurrentSenseTab[0]) != HAL_OK)
|
||
{
|
||
Error_Handler();
|
||
}
|
||
}
|
||
|
||
/**
|
||
* @brief COMP configuration
|
||
* @param None
|
||
* @retval None
|
||
*/
|
||
static void COMP_Config(void)
|
||
{
|
||
GPIO_InitTypeDef GPIO_InitStructure;
|
||
|
||
/* Enable SYSCFG clock */
|
||
// __HAL_RCC_SYSCFG_CLK_ENABLE();
|
||
|
||
/* GPIOB Peripheral clock enable */
|
||
__HAL_RCC_GPIOB_CLK_ENABLE();
|
||
|
||
/* Configure PB0 in analog mode: PB0 is connected to COMP4 non inverting input */
|
||
GPIO_InitStructure.Pin = GPIO_PIN_0;
|
||
GPIO_InitStructure.Mode = GPIO_MODE_ANALOG;
|
||
GPIO_InitStructure.Pull = GPIO_NOPULL;
|
||
HAL_GPIO_Init(GPIOB, &GPIO_InitStructure);
|
||
|
||
#ifdef DEBUG
|
||
/* COMP4 output config: PB1 for debug */
|
||
GPIO_InitStructure.Pin = GPIO_PIN_1;
|
||
GPIO_InitStructure.Mode = GPIO_MODE_AF_PP;
|
||
GPIO_InitStructure.Speed = GPIO_SPEED_FREQ_HIGH;
|
||
GPIO_InitStructure.Pull = GPIO_NOPULL;
|
||
/* Alternate function configuration : Comparator4 Out2 / PB1 */
|
||
GPIO_InitStructure.Alternate = GPIO_AF8_GPCOMP4;
|
||
HAL_GPIO_Init(GPIOB, &GPIO_InitStructure);
|
||
#endif
|
||
|
||
/* COMP4 deinitialize */
|
||
CompHandle.Instance = COMP4;
|
||
if(HAL_COMP_DeInit(&CompHandle) != HAL_OK)
|
||
{
|
||
Error_Handler();
|
||
}
|
||
|
||
/* COMP4 config */
|
||
CompHandle.Init.InvertingInput = COMP_INVERTINGINPUT_DAC1;
|
||
CompHandle.Init.NonInvertingInput = 0;
|
||
CompHandle.Init.Output = COMP_OUTPUT_NONE;
|
||
CompHandle.Init.OutputPol = COMP_OUTPUTPOL_NONINVERTED;
|
||
CompHandle.Init.Hysteresis = COMP_HYSTERESIS_NONE;
|
||
CompHandle.Init.Mode = 0;
|
||
CompHandle.Init.BlankingSrce = COMP_BLANKINGSRCE_NONE;
|
||
CompHandle.Init.WindowMode = COMP_WINDOWMODE_DISABLE;
|
||
CompHandle.Init.TriggerMode = COMP_TRIGGERMODE_NONE;
|
||
if(HAL_COMP_Init(&CompHandle) != HAL_OK)
|
||
{
|
||
Error_Handler();
|
||
}
|
||
|
||
/* Enable COMP4 */
|
||
if(HAL_COMP_Start(&CompHandle) != HAL_OK)
|
||
{
|
||
Error_Handler();
|
||
}
|
||
}
|
||
|
||
/**
|
||
* @brief HRTIM TIMC configuration
|
||
* @param None
|
||
* @retval None
|
||
*/
|
||
static void HRTIM_Config(void)
|
||
{
|
||
GPIO_InitTypeDef GPIO_InitStructure;
|
||
HRTIM_BurstModeCfgTypeDef HRTIM_BurstStructure;
|
||
HRTIM_CompareCfgTypeDef HRTIM_CompareStructure;
|
||
HRTIM_EventCfgTypeDef HRTIM_ExternalEventStructure;
|
||
HRTIM_OutputCfgTypeDef HRTIM_OutputStructure;
|
||
HRTIM_TimeBaseCfgTypeDef HRTIM_TimeBaseStructure;
|
||
HRTIM_TimerCfgTypeDef HRTIM_TimerWaveStructure;
|
||
|
||
/* Configure HRTIM TIM C ****************************************************/
|
||
/* HRTIM output channel configuration : HRTIM_CHC1 (Buck drive) / PB12 */
|
||
GPIO_InitStructure.Pin = GPIO_PIN_12;
|
||
GPIO_InitStructure.Mode = GPIO_MODE_AF_PP;
|
||
GPIO_InitStructure.Speed = GPIO_SPEED_FREQ_HIGH;
|
||
GPIO_InitStructure.Pull = GPIO_NOPULL;
|
||
/* Alternate function configuration : HRTIM_CHC1 / PB12 */
|
||
GPIO_InitStructure.Alternate = GPIO_AF13_HRTIM1;
|
||
HAL_GPIO_Init(GPIOB, &GPIO_InitStructure);
|
||
|
||
/* Use the PLLx2 clock for HRTIM */
|
||
__HAL_RCC_HRTIM1_CONFIG(RCC_HRTIM1CLK_PLLCLK);
|
||
__HAL_RCC_HRTIM1_CLK_ENABLE();
|
||
|
||
HrtimHandle.Instance = HRTIM1;
|
||
HAL_HRTIM_Init(&HrtimHandle);
|
||
|
||
/* DMA Configuration */
|
||
__HAL_LINKDMA(&HrtimHandle, hdmaTimerC, DmaHandle);
|
||
|
||
/* HRTIM initialization startup */
|
||
if(HAL_HRTIM_DLLCalibrationStart(&HrtimHandle, HRTIM_CALIBRATIONRATE_14) != HAL_OK)
|
||
{
|
||
Error_Handler();
|
||
}
|
||
|
||
if(HAL_HRTIM_PollForDLLCalibration(&HrtimHandle, HAL_MAX_DELAY) != HAL_OK)
|
||
{
|
||
Error_Handler();
|
||
}
|
||
|
||
/* Configure the output features */
|
||
HRTIM_OutputStructure.Polarity = HRTIM_OUTPUTPOLARITY_HIGH;
|
||
HRTIM_OutputStructure.SetSource = HRTIM_OUTPUTSET_TIMPER;
|
||
HRTIM_OutputStructure.ResetSource = HRTIM_OUTPUTRESET_EEV_2;
|
||
HRTIM_OutputStructure.IdleMode = HRTIM_OUTPUTIDLEMODE_IDLE;
|
||
HRTIM_OutputStructure.IdleLevel = HRTIM_OUTPUTIDLELEVEL_INACTIVE;
|
||
HRTIM_OutputStructure.FaultLevel = HRTIM_OUTPUTFAULTLEVEL_NONE;
|
||
HRTIM_OutputStructure.ChopperModeEnable = HRTIM_OUTPUTCHOPPERMODE_DISABLED;
|
||
HRTIM_OutputStructure.BurstModeEntryDelayed = HRTIM_OUTPUTBURSTMODEENTRY_REGULAR;
|
||
|
||
if(HAL_HRTIM_WaveformOutputConfig(&HrtimHandle, HRTIM_TIMERINDEX_TIMER_C,
|
||
HRTIM_OUTPUT_TC1, &HRTIM_OutputStructure) != HAL_OK)
|
||
{
|
||
Error_Handler();
|
||
}
|
||
|
||
/* Configure HRTIM1_TIMC Deadtime */
|
||
HRTIM_TimerWaveStructure.InterruptRequests = (HRTIM_MASTER_IT_NONE | HRTIM_TIM_IT_NONE);
|
||
HRTIM_TimerWaveStructure.DMARequests = (HRTIM_TIM_DMA_REP | HRTIM_TIM_DMA_CMP1 | HRTIM_TIM_DMA_CMP2 |
|
||
HRTIM_TIM_DMA_CMP3 | HRTIM_TIM_DMA_CMP4);
|
||
HRTIM_TimerWaveStructure.DMASrcAddress = (uint32_t)CurrentSenseTab;
|
||
HRTIM_TimerWaveStructure.DMADstAddress = (uint32_t)(&((&DacHandle)->Instance->DHR12R1));
|
||
HRTIM_TimerWaveStructure.DMASize = 5;
|
||
HRTIM_TimerWaveStructure.HalfModeEnable = HRTIM_HALFMODE_DISABLED;
|
||
HRTIM_TimerWaveStructure.StartOnSync = HRTIM_SYNCSTART_DISABLED;
|
||
HRTIM_TimerWaveStructure.ResetOnSync = HRTIM_SYNCRESET_DISABLED;
|
||
HRTIM_TimerWaveStructure.DACSynchro = HRTIM_DACSYNC_NONE;
|
||
HRTIM_TimerWaveStructure.PreloadEnable = HRTIM_PRELOAD_DISABLED;
|
||
HRTIM_TimerWaveStructure.UpdateGating = HRTIM_UPDATEGATING_INDEPENDENT;
|
||
HRTIM_TimerWaveStructure.BurstMode = HRTIM_TIMERBURSTMODE_MAINTAINCLOCK;
|
||
HRTIM_TimerWaveStructure.RepetitionUpdate = HRTIM_UPDATEONREPETITION_DISABLED;
|
||
HRTIM_TimerWaveStructure.PushPull = HRTIM_TIMPUSHPULLMODE_DISABLED;
|
||
HRTIM_TimerWaveStructure.FaultEnable = HRTIM_TIMFAULTENABLE_NONE;
|
||
HRTIM_TimerWaveStructure.FaultLock = HRTIM_TIMFAULTLOCK_READWRITE;
|
||
HRTIM_TimerWaveStructure.DeadTimeInsertion = HRTIM_TIMDEADTIMEINSERTION_DISABLED;
|
||
HRTIM_TimerWaveStructure.DelayedProtectionMode = HRTIM_TIMER_A_B_C_DELAYEDPROTECTION_DISABLED;
|
||
HRTIM_TimerWaveStructure.UpdateTrigger = HRTIM_TIMUPDATETRIGGER_TIMER_C;
|
||
HRTIM_TimerWaveStructure.ResetTrigger = HRTIM_TIMRESETTRIGGER_NONE;
|
||
HRTIM_TimerWaveStructure.ResetUpdate = HRTIM_TIMUPDATEONRESET_DISABLED;
|
||
|
||
if(HAL_HRTIM_WaveformTimerConfig(&HrtimHandle, HRTIM_TIMERINDEX_TIMER_C, &HRTIM_TimerWaveStructure) != HAL_OK)
|
||
{
|
||
Error_Handler();
|
||
}
|
||
|
||
HRTIM_CompareStructure.AutoDelayedMode = HRTIM_AUTODELAYEDMODE_REGULAR;
|
||
HRTIM_CompareStructure.AutoDelayedTimeout = 0;
|
||
HRTIM_CompareStructure.CompareValue = 3686; /* 20% time */
|
||
|
||
if(HAL_HRTIM_WaveformCompareConfig(&HrtimHandle, HRTIM_TIMERINDEX_TIMER_C,
|
||
HRTIM_COMPAREUNIT_1, &HRTIM_CompareStructure) != HAL_OK)
|
||
{
|
||
Error_Handler();
|
||
}
|
||
|
||
HRTIM_CompareStructure.AutoDelayedMode = HRTIM_AUTODELAYEDMODE_REGULAR;
|
||
HRTIM_CompareStructure.AutoDelayedTimeout = 0;
|
||
HRTIM_CompareStructure.CompareValue = 7373; /* 40% time */
|
||
|
||
if(HAL_HRTIM_WaveformCompareConfig(&HrtimHandle, HRTIM_TIMERINDEX_TIMER_C,
|
||
HRTIM_COMPAREUNIT_2, &HRTIM_CompareStructure) != HAL_OK)
|
||
{
|
||
Error_Handler();
|
||
}
|
||
|
||
HRTIM_CompareStructure.AutoDelayedMode = HRTIM_AUTODELAYEDMODE_REGULAR;
|
||
HRTIM_CompareStructure.AutoDelayedTimeout = 0;
|
||
HRTIM_CompareStructure.CompareValue = 11059; /* 60% time */
|
||
|
||
if(HAL_HRTIM_WaveformCompareConfig(&HrtimHandle, HRTIM_TIMERINDEX_TIMER_C,
|
||
HRTIM_COMPAREUNIT_3, &HRTIM_CompareStructure) != HAL_OK)
|
||
{
|
||
Error_Handler();
|
||
}
|
||
|
||
HRTIM_CompareStructure.AutoDelayedMode = HRTIM_AUTODELAYEDMODE_REGULAR;
|
||
HRTIM_CompareStructure.AutoDelayedTimeout = 0;
|
||
HRTIM_CompareStructure.CompareValue = 14746; /* 80% time */
|
||
|
||
if(HAL_HRTIM_WaveformCompareConfig(&HrtimHandle, HRTIM_TIMERINDEX_TIMER_C,
|
||
HRTIM_COMPAREUNIT_4, &HRTIM_CompareStructure) != HAL_OK)
|
||
{
|
||
Error_Handler();
|
||
}
|
||
|
||
HRTIM_TimeBaseStructure.Period = 18432; /* 1 period = 4 <20>s = 100% time */
|
||
HRTIM_TimeBaseStructure.RepetitionCounter = 0x00;
|
||
HRTIM_TimeBaseStructure.PrescalerRatio = HRTIM_PRESCALERRATIO_MUL32;
|
||
HRTIM_TimeBaseStructure.Mode = HRTIM_MODE_CONTINUOUS;
|
||
|
||
if(HAL_HRTIM_TimeBaseConfig(&HrtimHandle, HRTIM_TIMERINDEX_TIMER_C, &HRTIM_TimeBaseStructure) != HAL_OK)
|
||
{
|
||
Error_Handler();
|
||
}
|
||
|
||
/* Configure External Event Source 2 */
|
||
HRTIM_ExternalEventStructure.Source = HRTIM_EVENTSRC_2;
|
||
HRTIM_ExternalEventStructure.Polarity = HRTIM_EVENTPOLARITY_HIGH;
|
||
HRTIM_ExternalEventStructure.Sensitivity = HRTIM_EVENTSENSITIVITY_LEVEL;
|
||
HRTIM_ExternalEventStructure.FastMode = HRTIM_EVENTFASTMODE_ENABLE;
|
||
HRTIM_ExternalEventStructure.Filter = HRTIM_EVENTFILTER_NONE;
|
||
|
||
if(HAL_HRTIM_EventConfig(&HrtimHandle, HRTIM_EVENT_2, &HRTIM_ExternalEventStructure) != HAL_OK)
|
||
{
|
||
Error_Handler();
|
||
}
|
||
|
||
/* Burst Mode configuration */
|
||
HRTIM_BurstStructure.Mode = HRTIM_BURSTMODE_CONTINOUS;
|
||
HRTIM_BurstStructure.ClockSource = HRTIM_BURSTMODECLOCKSOURCE_TIMER_C;
|
||
HRTIM_BurstStructure.Prescaler = HRTIM_BURSTMODEPRESCALER_DIV1;
|
||
HRTIM_BurstStructure.PreloadEnable = HRIM_BURSTMODEPRELOAD_ENABLED;
|
||
HRTIM_BurstStructure.Trigger = HRTIM_BURSTMODETRIGGER_NONE;
|
||
HRTIM_BurstStructure.IdleDuration = MIN_INTENSITY;
|
||
HRTIM_BurstStructure.Period = MIN_INTENSITY;
|
||
|
||
if(HAL_HRTIM_BurstModeConfig(&HrtimHandle, &HRTIM_BurstStructure) != HAL_OK)
|
||
{
|
||
Error_Handler();
|
||
}
|
||
|
||
/* Enable the TC1 output */
|
||
if(HAL_HRTIM_WaveformOutputStart(&HrtimHandle, HRTIM_OUTPUT_TC1) != HAL_OK)
|
||
{
|
||
Error_Handler();
|
||
}
|
||
|
||
if(HAL_HRTIM_BurstModeCtl(&HrtimHandle, HRTIM_BURSTMODECTL_ENABLED) != HAL_OK)
|
||
{
|
||
Error_Handler();
|
||
}
|
||
|
||
/* Start slave*/
|
||
if(HAL_HRTIM_WaveformCountStart_DMA(&HrtimHandle, HRTIM_TIMERID_TIMER_C) != HAL_OK)
|
||
{
|
||
Error_Handler();
|
||
}
|
||
|
||
/* Configure and enable HRTIM interrupt */
|
||
HAL_NVIC_SetPriority(HRTIM1_Master_IRQn, 0, 0);
|
||
HAL_NVIC_EnableIRQ(HRTIM1_Master_IRQn);
|
||
|
||
/* Enable Burst mode period completed interrupt */
|
||
HrtimHandle.Init.HRTIMInterruptResquests = HRTIM_IT_BMPER;
|
||
|
||
/* Select Burst Trigger */
|
||
if(HAL_HRTIM_BurstModeSoftwareTrigger(&HrtimHandle) != HAL_OK)
|
||
{
|
||
Error_Handler();
|
||
}
|
||
}
|
||
|
||
/**
|
||
* @brief Set HRTIM to generate a triangle on channel D1
|
||
* @param None
|
||
* @retval None
|
||
*/
|
||
static void TriangleGenerationInit(void)
|
||
{
|
||
GPIO_InitTypeDef GPIO_InitStructure;
|
||
HRTIM_OutputCfgTypeDef HRTIM_OutputStructure;
|
||
HRTIM_TimeBaseCfgTypeDef HRTIM_TimeBaseStructure;
|
||
HRTIM_TimerCfgTypeDef HRTIM_TimerWaveStructure;
|
||
HRTIM_CompareCfgTypeDef HRTIM_CompareStructure;
|
||
|
||
/* GPIOB Peripheral clock enable */
|
||
__HAL_RCC_GPIOB_CLK_ENABLE();
|
||
|
||
/* HRTIM output channel configuration : HRTIM_CHD1 / PB14 */
|
||
GPIO_InitStructure.Pin = GPIO_PIN_14;
|
||
GPIO_InitStructure.Mode = GPIO_MODE_AF_PP;
|
||
GPIO_InitStructure.Speed = GPIO_SPEED_FREQ_HIGH;
|
||
GPIO_InitStructure.Pull = GPIO_NOPULL;
|
||
/* Alternate function configuration : HRTIM_CHD1 / PB14 */
|
||
GPIO_InitStructure.Alternate = GPIO_AF13_HRTIM1;
|
||
HAL_GPIO_Init(GPIOB, &GPIO_InitStructure);
|
||
|
||
/* Configure the output features */
|
||
HRTIM_OutputStructure.Polarity = HRTIM_OUTPUTPOLARITY_HIGH;
|
||
HRTIM_OutputStructure.SetSource = HRTIM_OUTPUTSET_TIMPER;
|
||
HRTIM_OutputStructure.ResetSource = HRTIM_OUTPUTRESET_TIMCMP1;
|
||
HRTIM_OutputStructure.IdleMode = HRTIM_OUTPUTIDLEMODE_NONE;
|
||
HRTIM_OutputStructure.IdleLevel = HRTIM_OUTPUTIDLELEVEL_INACTIVE;
|
||
HRTIM_OutputStructure.FaultLevel = HRTIM_OUTPUTFAULTLEVEL_NONE;
|
||
HRTIM_OutputStructure.ChopperModeEnable = HRTIM_OUTPUTCHOPPERMODE_DISABLED;
|
||
HRTIM_OutputStructure.BurstModeEntryDelayed = HRTIM_OUTPUTBURSTMODEENTRY_REGULAR;
|
||
|
||
if(HAL_HRTIM_WaveformOutputConfig(&HrtimHandle, HRTIM_TIMERINDEX_TIMER_D,
|
||
HRTIM_OUTPUT_TD1, &HRTIM_OutputStructure) != HAL_OK)
|
||
{
|
||
Error_Handler();
|
||
}
|
||
|
||
/* Configure HRTIM1_TIMD Deadtime */
|
||
HRTIM_TimerWaveStructure.InterruptRequests = (HRTIM_MASTER_IT_NONE | HRTIM_TIM_IT_NONE);
|
||
HRTIM_TimerWaveStructure.DMARequests = (HRTIM_MASTER_DMA_NONE | HRTIM_TIM_DMA_NONE);
|
||
HRTIM_TimerWaveStructure.DMASrcAddress = 0;
|
||
HRTIM_TimerWaveStructure.DMADstAddress = 0;
|
||
HRTIM_TimerWaveStructure.DMASize = 0;
|
||
HRTIM_TimerWaveStructure.HalfModeEnable = HRTIM_HALFMODE_DISABLED;
|
||
HRTIM_TimerWaveStructure.StartOnSync = HRTIM_SYNCSTART_DISABLED;
|
||
HRTIM_TimerWaveStructure.ResetOnSync = HRTIM_SYNCRESET_DISABLED;
|
||
HRTIM_TimerWaveStructure.DACSynchro = HRTIM_DACSYNC_NONE;
|
||
HRTIM_TimerWaveStructure.PreloadEnable = HRTIM_PRELOAD_DISABLED;
|
||
HRTIM_TimerWaveStructure.UpdateGating = HRTIM_UPDATEGATING_INDEPENDENT;
|
||
HRTIM_TimerWaveStructure.BurstMode = HRTIM_TIMERBURSTMODE_MAINTAINCLOCK;
|
||
HRTIM_TimerWaveStructure.RepetitionUpdate = HRTIM_UPDATEONREPETITION_DISABLED;
|
||
HRTIM_TimerWaveStructure.PushPull = HRTIM_TIMPUSHPULLMODE_DISABLED;
|
||
HRTIM_TimerWaveStructure.FaultEnable = HRTIM_TIMFAULTENABLE_NONE;
|
||
HRTIM_TimerWaveStructure.FaultLock = HRTIM_TIMFAULTLOCK_READWRITE;
|
||
HRTIM_TimerWaveStructure.DeadTimeInsertion = HRTIM_TIMDEADTIMEINSERTION_DISABLED;
|
||
HRTIM_TimerWaveStructure.DelayedProtectionMode = HRTIM_TIMER_D_E_DELAYEDPROTECTION_DISABLED;
|
||
HRTIM_TimerWaveStructure.UpdateTrigger = HRTIM_TIMUPDATETRIGGER_TIMER_D;
|
||
HRTIM_TimerWaveStructure.ResetTrigger = HRTIM_TIMRESETTRIGGER_NONE;
|
||
HRTIM_TimerWaveStructure.ResetUpdate = HRTIM_TIMUPDATEONRESET_DISABLED;
|
||
|
||
if(HAL_HRTIM_WaveformTimerConfig(&HrtimHandle, HRTIM_TIMERINDEX_TIMER_D, &HRTIM_TimerWaveStructure) != HAL_OK)
|
||
{
|
||
Error_Handler();
|
||
}
|
||
|
||
HRTIM_TimeBaseStructure.Period = 0x900; /* 2MHz => 2304 = 0x900 (timer input clock freq is 144MHz x 32)*/
|
||
HRTIM_TimeBaseStructure.RepetitionCounter = 0x00;
|
||
HRTIM_TimeBaseStructure.PrescalerRatio = HRTIM_PRESCALERRATIO_MUL32;
|
||
HRTIM_TimeBaseStructure.Mode = HRTIM_MODE_CONTINUOUS;
|
||
|
||
if(HAL_HRTIM_TimeBaseConfig(&HrtimHandle, HRTIM_TIMERINDEX_TIMER_D, &HRTIM_TimeBaseStructure) != HAL_OK)
|
||
{
|
||
Error_Handler();
|
||
}
|
||
|
||
HRTIM_CompareStructure.AutoDelayedMode = HRTIM_AUTODELAYEDMODE_REGULAR;
|
||
HRTIM_CompareStructure.AutoDelayedTimeout = 0; /* meaningless in regular mode */
|
||
HRTIM_CompareStructure.CompareValue = TriangCmp;
|
||
|
||
if(HAL_HRTIM_WaveformCompareConfig(&HrtimHandle, HRTIM_TIMERINDEX_TIMER_D,
|
||
HRTIM_COMPAREUNIT_1, &HRTIM_CompareStructure) != HAL_OK)
|
||
{
|
||
Error_Handler();
|
||
}
|
||
|
||
/* Enable the TD1 output */
|
||
if(HAL_HRTIM_WaveformOutputStart(&HrtimHandle, HRTIM_OUTPUT_TD1) != HAL_OK)
|
||
{
|
||
Error_Handler();
|
||
}
|
||
|
||
/* Start slave timer D*/
|
||
if(HAL_HRTIM_WaveformCountStart(&HrtimHandle, HRTIM_TIMERID_TIMER_D) != HAL_OK)
|
||
{
|
||
Error_Handler();
|
||
}
|
||
}
|
||
|
||
/**
|
||
* @brief Set Burst Compare value
|
||
* @param BurstCompare: Burst Compare value, it can be a value between 0x0 and 0xFFFF
|
||
* @retval None
|
||
*/
|
||
static void HRTIM_SetBurstCompare(float BurstCompare)
|
||
{
|
||
/* Set Burst Compare value */
|
||
HrtimHandle.Instance->sCommonRegs.BMCMPR = (uint16_t)BurstCompare;
|
||
}
|
||
|
||
/**
|
||
* @brief Checks the Discovery Kit features.
|
||
* @param None
|
||
* @retval None
|
||
*/
|
||
static void TestProgram(void)
|
||
{
|
||
uint16_t refint_cal = (uint16_t) *(__IO uint32_t *)((uint32_t)0x1FFFF7BA);
|
||
uint32_t duty_cycle_timA = 2500; /*Buck Boost duty cycle Timer A initialization */
|
||
uint32_t vin = 0;
|
||
uint32_t vout = 0;
|
||
uint32_t vout_target = 5000; /* Default Vout target set in mV */
|
||
float ratio = 2.0;
|
||
|
||
GPIO_InitTypeDef GPIO_InitStructure;
|
||
HRTIM_CompareCfgTypeDef HRTIM_CompareStructure;
|
||
HRTIM_DeadTimeCfgTypeDef HRTIM_DeadTimeStructure;
|
||
HRTIM_OutputCfgTypeDef HRTIM_OutputStructure;
|
||
HRTIM_TimeBaseCfgTypeDef HRTIM_TimeBaseStructure;
|
||
HRTIM_TimerCfgTypeDef HRTIM_TimerWaveStructure;
|
||
|
||
/* Use the PLLx2 clock for HRTIM */
|
||
__HAL_RCC_HRTIM1_CONFIG(RCC_HRTIM1CLK_PLLCLK);
|
||
|
||
/* Enable the HRTIM, SYSCFG and GPIOs (port A, B, C) Clocks */
|
||
__HAL_RCC_HRTIM1_CLK_ENABLE();
|
||
__HAL_RCC_SYSCFG_CLK_ENABLE();
|
||
__HAL_RCC_GPIOA_CLK_ENABLE();
|
||
__HAL_RCC_GPIOB_CLK_ENABLE();
|
||
__HAL_RCC_GPIOC_CLK_ENABLE();
|
||
|
||
/* Configure H bridge BuckBoost converter N and P MOS output config */
|
||
GPIO_InitStructure.Pin = (GPIO_PIN_8|GPIO_PIN_9|GPIO_PIN_10|GPIO_PIN_11);
|
||
GPIO_InitStructure.Mode = GPIO_MODE_AF_PP;
|
||
GPIO_InitStructure.Speed = GPIO_SPEED_FREQ_HIGH;
|
||
GPIO_InitStructure.Pull = GPIO_NOPULL;
|
||
/* Configure HRTIM drivers PA8/PA9/PA10/PA11 HRTIM_CHA1/A2/B1/B2 */
|
||
/* Alternate function configuration : HRTIM_CHA1/A2/B1/B2 / PA8-9-10-11 */
|
||
GPIO_InitStructure.Alternate = GPIO_AF13_HRTIM1;
|
||
HAL_GPIO_Init(GPIOA, &GPIO_InitStructure);
|
||
|
||
#ifdef Debug
|
||
/* For Debug only */
|
||
GPIO_InitStructure.Pin = GPIO_PIN_4;
|
||
GPIO_InitStructure.Mode = GPIO_MODE_OUTPUT_PP;
|
||
GPIO_InitStructure.Speed = GPIO_SPEED_FREQ_HIGH;
|
||
GPIO_InitStructure.Pull = GPIO_NOPULL;
|
||
HAL_GPIO_Init(GPIOB, &GPIO_InitStructure);
|
||
#endif
|
||
|
||
/* Initialize User_Button on STM32F3348-DISCO */
|
||
BSP_PB_Init(BUTTON_USER, BUTTON_MODE_EXTI);
|
||
|
||
/* HRTIM initialisation startup */
|
||
HrtimHandle.Instance = HRTIM1;
|
||
if(HAL_HRTIM_DLLCalibrationStart(&HrtimHandle, HRTIM_CALIBRATIONRATE_14) != HAL_OK)
|
||
{
|
||
Error_Handler();
|
||
}
|
||
|
||
if(HAL_HRTIM_PollForDLLCalibration(&HrtimHandle, HAL_MAX_DELAY) != HAL_OK)
|
||
{
|
||
Error_Handler();
|
||
}
|
||
|
||
/* Configure the output features */
|
||
HRTIM_OutputStructure.Polarity = HRTIM_OUTPUTPOLARITY_HIGH;
|
||
HRTIM_OutputStructure.SetSource = HRTIM_OUTPUTSET_TIMPER;
|
||
HRTIM_OutputStructure.ResetSource = HRTIM_OUTPUTRESET_TIMCMP1;
|
||
HRTIM_OutputStructure.IdleMode = HRTIM_OUTPUTIDLEMODE_NONE;
|
||
HRTIM_OutputStructure.IdleLevel = HRTIM_OUTPUTIDLELEVEL_INACTIVE;
|
||
HRTIM_OutputStructure.FaultLevel = HRTIM_OUTPUTFAULTLEVEL_NONE;
|
||
HRTIM_OutputStructure.ChopperModeEnable = HRTIM_OUTPUTCHOPPERMODE_DISABLED;
|
||
HRTIM_OutputStructure.BurstModeEntryDelayed = HRTIM_OUTPUTBURSTMODEENTRY_REGULAR;
|
||
|
||
if(HAL_HRTIM_WaveformOutputConfig(&HrtimHandle, HRTIM_TIMERINDEX_TIMER_A,
|
||
HRTIM_OUTPUT_TA1, &HRTIM_OutputStructure) != HAL_OK)
|
||
{
|
||
Error_Handler();
|
||
}
|
||
|
||
if(HAL_HRTIM_WaveformOutputConfig(&HrtimHandle, HRTIM_TIMERINDEX_TIMER_B,
|
||
HRTIM_OUTPUT_TB1, &HRTIM_OutputStructure) != HAL_OK)
|
||
{
|
||
Error_Handler();
|
||
}
|
||
|
||
/* Initialize HRTIM1_TIMA and HRTIM1_TIMB */
|
||
/* HRTIM1_TIMA and HRTIM1_TIMB Deadtime enable */
|
||
HRTIM_TimerWaveStructure.InterruptRequests = (HRTIM_MASTER_IT_NONE | HRTIM_TIM_IT_NONE);
|
||
HRTIM_TimerWaveStructure.DMARequests = (HRTIM_MASTER_DMA_NONE | HRTIM_TIM_DMA_NONE);
|
||
HRTIM_TimerWaveStructure.DMASrcAddress = 0;
|
||
HRTIM_TimerWaveStructure.DMADstAddress = 0;
|
||
HRTIM_TimerWaveStructure.DMASize = 0;
|
||
HRTIM_TimerWaveStructure.HalfModeEnable = HRTIM_HALFMODE_DISABLED;
|
||
HRTIM_TimerWaveStructure.StartOnSync = HRTIM_SYNCSTART_DISABLED;
|
||
HRTIM_TimerWaveStructure.ResetOnSync = HRTIM_SYNCRESET_DISABLED;
|
||
HRTIM_TimerWaveStructure.DACSynchro = HRTIM_DACSYNC_NONE;
|
||
HRTIM_TimerWaveStructure.PreloadEnable = HRTIM_PRELOAD_ENABLED;
|
||
HRTIM_TimerWaveStructure.UpdateGating = HRTIM_UPDATEGATING_INDEPENDENT;
|
||
HRTIM_TimerWaveStructure.BurstMode = HRTIM_TIMERBURSTMODE_MAINTAINCLOCK;
|
||
HRTIM_TimerWaveStructure.RepetitionUpdate = HRTIM_UPDATEONREPETITION_ENABLED;
|
||
HRTIM_TimerWaveStructure.PushPull = HRTIM_TIMPUSHPULLMODE_DISABLED;
|
||
HRTIM_TimerWaveStructure.FaultEnable = HRTIM_TIMFAULTENABLE_NONE;
|
||
HRTIM_TimerWaveStructure.FaultLock = HRTIM_TIMFAULTLOCK_READWRITE;
|
||
HRTIM_TimerWaveStructure.DeadTimeInsertion = HRTIM_TIMDEADTIMEINSERTION_ENABLED;
|
||
HRTIM_TimerWaveStructure.DelayedProtectionMode = HRTIM_TIMER_A_B_C_DELAYEDPROTECTION_DISABLED;
|
||
HRTIM_TimerWaveStructure.UpdateTrigger = HRTIM_TIMUPDATETRIGGER_NONE;
|
||
HRTIM_TimerWaveStructure.ResetTrigger = HRTIM_TIMRESETTRIGGER_NONE;
|
||
HRTIM_TimerWaveStructure.ResetUpdate = HRTIM_TIMUPDATEONRESET_DISABLED;
|
||
|
||
if(HAL_HRTIM_WaveformTimerConfig(&HrtimHandle, HRTIM_TIMERINDEX_TIMER_A, &HRTIM_TimerWaveStructure) != HAL_OK)
|
||
{
|
||
Error_Handler();
|
||
}
|
||
|
||
if(HAL_HRTIM_WaveformTimerConfig(&HrtimHandle, HRTIM_TIMERINDEX_TIMER_B, &HRTIM_TimerWaveStructure) != HAL_OK)
|
||
{
|
||
Error_Handler();
|
||
}
|
||
|
||
/* Configure HRTIM1_TIMA Deadtime */
|
||
HRTIM_DeadTimeStructure.FallingLock = HRTIM_TIMDEADTIME_FALLINGLOCK_WRITE;
|
||
HRTIM_DeadTimeStructure.FallingSign = HRTIM_TIMDEADTIME_FALLINGSIGN_POSITIVE;
|
||
HRTIM_DeadTimeStructure.FallingSignLock = HRTIM_TIMDEADTIME_FALLINGSIGNLOCK_WRITE;
|
||
HRTIM_DeadTimeStructure.FallingValue = QB_ON_DEADTIME;
|
||
HRTIM_DeadTimeStructure.Prescaler = HRTIM_TIMDEADTIME_PRESCALERRATIO_MUL8;
|
||
HRTIM_DeadTimeStructure.RisingLock = HRTIM_TIMDEADTIME_RISINGLOCK_WRITE;
|
||
HRTIM_DeadTimeStructure.RisingSign = HRTIM_TIMDEADTIME_RISINGSIGN_POSITIVE;
|
||
HRTIM_DeadTimeStructure.RisingSignLock = HRTIM_TIMDEADTIME_RISINGSIGNLOCK_WRITE;
|
||
HRTIM_DeadTimeStructure.RisingValue = QB_OFF_DEADTIME;
|
||
|
||
if(HAL_HRTIM_DeadTimeConfig(&HrtimHandle, HRTIM_TIMERINDEX_TIMER_A, &HRTIM_DeadTimeStructure) != HAL_OK)
|
||
{
|
||
Error_Handler();
|
||
}
|
||
|
||
/* Configure HRTIM1_TIMB Deadtime */
|
||
HRTIM_DeadTimeStructure.FallingLock = HRTIM_TIMDEADTIME_FALLINGLOCK_WRITE;
|
||
HRTIM_DeadTimeStructure.FallingSign = HRTIM_TIMDEADTIME_FALLINGSIGN_POSITIVE;
|
||
HRTIM_DeadTimeStructure.FallingSignLock = HRTIM_TIMDEADTIME_FALLINGSIGNLOCK_WRITE;
|
||
HRTIM_DeadTimeStructure.FallingValue = QD_ON_DEADTIME;
|
||
HRTIM_DeadTimeStructure.Prescaler = HRTIM_TIMDEADTIME_PRESCALERRATIO_MUL8;
|
||
HRTIM_DeadTimeStructure.RisingLock = HRTIM_TIMDEADTIME_RISINGLOCK_WRITE;
|
||
HRTIM_DeadTimeStructure.RisingSign = HRTIM_TIMDEADTIME_RISINGSIGN_POSITIVE;
|
||
HRTIM_DeadTimeStructure.RisingSignLock = HRTIM_TIMDEADTIME_RISINGSIGNLOCK_WRITE;
|
||
HRTIM_DeadTimeStructure.RisingValue = QD_OFF_DEADTIME;
|
||
|
||
if(HAL_HRTIM_DeadTimeConfig(&HrtimHandle, HRTIM_TIMERINDEX_TIMER_B, &HRTIM_DeadTimeStructure) != HAL_OK)
|
||
{
|
||
Error_Handler();
|
||
}
|
||
|
||
/*HRTIM 250KHz configuration */
|
||
HRTIM_TimeBaseStructure.Period = SET_PERIOD; /* 1 period = 4 <20>s = 100% time */
|
||
HRTIM_TimeBaseStructure.RepetitionCounter = 10;
|
||
HRTIM_TimeBaseStructure.PrescalerRatio = HRTIM_PRESCALERRATIO_MUL32;
|
||
HRTIM_TimeBaseStructure.Mode = HRTIM_MODE_CONTINUOUS;
|
||
|
||
if(HAL_HRTIM_TimeBaseConfig(&HrtimHandle, HRTIM_TIMERINDEX_TIMER_A, &HRTIM_TimeBaseStructure) != HAL_OK)
|
||
{
|
||
Error_Handler();
|
||
}
|
||
|
||
HRTIM_CompareStructure.AutoDelayedMode = HRTIM_AUTODELAYEDMODE_REGULAR;
|
||
HRTIM_CompareStructure.AutoDelayedTimeout = duty_cycle_timA;
|
||
HRTIM_CompareStructure.CompareValue = duty_cycle_timA;
|
||
|
||
if(HAL_HRTIM_WaveformCompareConfig(&HrtimHandle, HRTIM_TIMERINDEX_TIMER_A,
|
||
HRTIM_COMPAREUNIT_1, &HRTIM_CompareStructure) != HAL_OK)
|
||
{
|
||
Error_Handler();
|
||
}
|
||
|
||
HRTIM_CompareStructure.AutoDelayedMode = HRTIM_AUTODELAYEDMODE_REGULAR;
|
||
HRTIM_CompareStructure.AutoDelayedTimeout = duty_cycle_timA + BLANK_TIME_TIMA;
|
||
HRTIM_CompareStructure.CompareValue = duty_cycle_timA + BLANK_TIME_TIMA;
|
||
|
||
if(HAL_HRTIM_WaveformCompareConfig(&HrtimHandle, HRTIM_TIMERINDEX_TIMER_A,
|
||
HRTIM_COMPAREUNIT_2, &HRTIM_CompareStructure) != HAL_OK)
|
||
{
|
||
Error_Handler();
|
||
}
|
||
|
||
HRTIM_CompareStructure.AutoDelayedMode = HRTIM_AUTODELAYEDMODE_REGULAR;
|
||
HRTIM_CompareStructure.AutoDelayedTimeout = (uint32_t)ratio*duty_cycle_timA + BLANK_TIME_TIMA;
|
||
HRTIM_CompareStructure.CompareValue = (uint32_t)ratio*duty_cycle_timA + BLANK_TIME_TIMA;
|
||
|
||
if(HAL_HRTIM_WaveformCompareConfig(&HrtimHandle, HRTIM_TIMERINDEX_TIMER_A,
|
||
HRTIM_COMPAREUNIT_4, &HRTIM_CompareStructure) != HAL_OK)
|
||
{
|
||
Error_Handler();
|
||
}
|
||
|
||
if(HAL_HRTIM_TimeBaseConfig(&HrtimHandle, HRTIM_TIMERINDEX_TIMER_B, &HRTIM_TimeBaseStructure) != HAL_OK)
|
||
{
|
||
Error_Handler();
|
||
}
|
||
|
||
HRTIM_CompareStructure.AutoDelayedMode = HRTIM_AUTODELAYEDMODE_REGULAR;
|
||
HRTIM_CompareStructure.AutoDelayedTimeout = ADC_TRIGGER_VALUE;
|
||
HRTIM_CompareStructure.CompareValue = ADC_TRIGGER_VALUE;
|
||
|
||
if(HAL_HRTIM_WaveformCompareConfig(&HrtimHandle, HRTIM_TIMERINDEX_TIMER_B,
|
||
HRTIM_COMPAREUNIT_2, &HRTIM_CompareStructure) != HAL_OK)
|
||
{
|
||
Error_Handler();
|
||
}
|
||
|
||
/* End HRTIM 250KHz configuration */
|
||
|
||
/* Configure and enable HRTIM interrupt */
|
||
HAL_NVIC_SetPriority(HRTIM1_TIMA_IRQn, 0, 0);
|
||
HAL_NVIC_EnableIRQ(HRTIM1_TIMA_IRQn);
|
||
|
||
/* Enable the TA1 output */
|
||
if(HAL_HRTIM_WaveformOutputStart(&HrtimHandle, HRTIM_OUTPUT_TA1) != HAL_OK)
|
||
{
|
||
Error_Handler();
|
||
}
|
||
/* Enable the TA2 output */
|
||
if(HAL_HRTIM_WaveformOutputStart(&HrtimHandle, HRTIM_OUTPUT_TA2) != HAL_OK)
|
||
{
|
||
Error_Handler();
|
||
}
|
||
/* Enable the TB1 output */
|
||
if(HAL_HRTIM_WaveformOutputStart(&HrtimHandle, HRTIM_OUTPUT_TB1) != HAL_OK)
|
||
{
|
||
Error_Handler();
|
||
}
|
||
/* Enable the TB2 output */
|
||
if(HAL_HRTIM_WaveformOutputStart(&HrtimHandle, HRTIM_OUTPUT_TB2) != HAL_OK)
|
||
{
|
||
Error_Handler();
|
||
}
|
||
|
||
/* Start H bridge converter in Buck Mode */
|
||
SetHRTIM_BuckMode();
|
||
|
||
if(HAL_HRTIM_SimpleBaseStart_IT(&HrtimHandle, HRTIM_TIMERINDEX_TIMER_A) != HAL_OK)
|
||
{
|
||
Error_Handler();
|
||
}
|
||
|
||
/* ADC Configuration */
|
||
ADC_Config();
|
||
|
||
HAL_Delay(100);
|
||
while(1)
|
||
{
|
||
uint32_t timeout = 0 ;
|
||
|
||
/* Check if VIN connected to 5V and wait until voltage is present and included in the expected range */
|
||
/* Range is 4.5V to 5.5V */
|
||
while ((vin < MIN_VOLTAGE) || (vin > MAX_VOLTAGE))
|
||
{
|
||
/* Enable next trigger on ADC during data process*/
|
||
if(HAL_ADCEx_InjectedStart_IT(&AdcHandle) != HAL_OK)
|
||
{
|
||
Error_Handler();
|
||
}
|
||
|
||
/* Compute the voltage (Voltages have to be multiplied by ~5 as bridge divider is ~20%) */
|
||
Adc_Channel1_ConvertedValue_In = (Adc_Channel1_ConvertedValue_In * refint_cal) / AdcReferenceConvertedValue;
|
||
vin = (Adc_Channel1_ConvertedValue_In * 3300) / 0xFFF;
|
||
|
||
/* VIN bridge conversion is 4.97 (6.8K / 6.8K + 27K) */
|
||
vin = (497 * vin ) / 100;
|
||
timeout++;
|
||
if (timeout >= 100)
|
||
{
|
||
while(1)
|
||
{
|
||
/* Orange LED is blinking to alert on missing input voltage */
|
||
BSP_LED_On(LED4);
|
||
HAL_Delay(100);
|
||
BSP_LED_Off(LED4);
|
||
HAL_Delay(100);
|
||
}
|
||
}
|
||
}
|
||
|
||
/* Input voltage connected with expected value: Green LED is ON */
|
||
BSP_LED_On(LED5);
|
||
|
||
/* Set Boost Mode and Vout target value to 10V */
|
||
vout_target = 10000;
|
||
Current_Mode = BOOST;
|
||
Converter_Mode_Change = TRUE;
|
||
HAL_Delay(100);
|
||
|
||
/* Enable next trigger on ADC during data process*/
|
||
if(HAL_ADCEx_InjectedStart_IT(&AdcHandle) != HAL_OK)
|
||
{
|
||
Error_Handler();
|
||
}
|
||
|
||
while((vout < (vout_target - 5)) || (vout > (vout_target + 5)))
|
||
{
|
||
/* VIN and VOUT ADC sampling */
|
||
Adc_Channel1_ConvertedValue_In = (Adc_Channel1_ConvertedValue_In * refint_cal) / AdcReferenceConvertedValue;
|
||
Adc_Channel1_ConvertedValue_Out = (Adc_Channel1_ConvertedValue_Out * refint_cal) / AdcReferenceConvertedValue;
|
||
|
||
vin = (Adc_Channel1_ConvertedValue_In * 3300) / 0xFFF;
|
||
vout = (Adc_Channel1_ConvertedValue_Out * 3300) / 0xFFF;
|
||
vin = (497 * vin )/100;
|
||
|
||
/* VOUT bridge conversion is 5.03 (3.3K / 3.3K + 13.3K) */
|
||
vout = (503 * vout)/100;
|
||
|
||
/* Control Timer A Duty Cycle to reach the VOUT target */
|
||
if(vout <= vout_target)
|
||
{
|
||
duty_cycle_timA += 10;
|
||
if (duty_cycle_timA >= (SET_PERIOD - MIN_TIME_TIMA))
|
||
{
|
||
duty_cycle_timA = (SET_PERIOD - MIN_TIME_TIMA);
|
||
}
|
||
}
|
||
else
|
||
{
|
||
duty_cycle_timA -= 10;
|
||
if (duty_cycle_timA <= MIN_TIME_TIMA)
|
||
{
|
||
duty_cycle_timA = MIN_TIME_TIMA;
|
||
}
|
||
}
|
||
timeout++;
|
||
|
||
HRTIM_CompareStructure.AutoDelayedMode = HRTIM_AUTODELAYEDMODE_REGULAR;
|
||
HRTIM_CompareStructure.AutoDelayedTimeout = duty_cycle_timA;
|
||
HRTIM_CompareStructure.CompareValue = duty_cycle_timA;
|
||
|
||
if(HAL_HRTIM_WaveformCompareConfig(&HrtimHandle, HRTIM_TIMERINDEX_TIMER_A,
|
||
HRTIM_COMPAREUNIT_1, &HRTIM_CompareStructure) != HAL_OK)
|
||
{
|
||
Error_Handler();
|
||
}
|
||
|
||
HAL_Delay(1);
|
||
|
||
/* Enable next trigger on ADC during data process*/
|
||
if(HAL_ADCEx_InjectedStart_IT(&AdcHandle) != HAL_OK)
|
||
{
|
||
Error_Handler();
|
||
}
|
||
|
||
/* Verify if timeout not reached OR VIN not in expected range */
|
||
if ((timeout > 10000) || (vin < MIN_VOLTAGE) || (vin > MAX_VOLTAGE))
|
||
{
|
||
BSP_LED_Off(LED5);
|
||
while (1)
|
||
{
|
||
/* Red LED is set to alert on Buck boost function failure */
|
||
BSP_LED_On(LED3);
|
||
HAL_Delay(100);
|
||
BSP_LED_Off(LED3);
|
||
HAL_Delay(100);
|
||
}
|
||
}
|
||
}
|
||
|
||
while(Keypressed == FALSE)
|
||
{
|
||
/* Boost mode successful */
|
||
/* Blue LED is toggling */
|
||
BSP_LED_On(LED6);
|
||
HAL_Delay(100);
|
||
BSP_LED_Off(LED6);
|
||
HAL_Delay(100);
|
||
}
|
||
Keypressed = FALSE;
|
||
|
||
/* Set Buck Mode and Vout target value to 2V */
|
||
vout_target = 2000;
|
||
Current_Mode = BUCK;
|
||
Converter_Mode_Change = TRUE;
|
||
HAL_Delay(10);
|
||
timeout = 0;
|
||
|
||
BSP_LED_On(LED6);
|
||
BSP_LED_Off(LED5);
|
||
|
||
while((vout < (vout_target - 5)) || (vout > (vout_target + 5)))
|
||
{
|
||
/* VIN and VOUT ADC sampling */
|
||
Adc_Channel1_ConvertedValue_In = (Adc_Channel1_ConvertedValue_In * refint_cal) / AdcReferenceConvertedValue;
|
||
Adc_Channel1_ConvertedValue_Out = (Adc_Channel1_ConvertedValue_Out * refint_cal) / AdcReferenceConvertedValue;
|
||
|
||
vin = (Adc_Channel1_ConvertedValue_In * 3300) / 0xFFF;
|
||
vout = (Adc_Channel1_ConvertedValue_Out * 3300) / 0xFFF;
|
||
vin = (497 * vin )/100;
|
||
vout = (503 * vout)/100;
|
||
|
||
/* Control Timer A Duty Cycle to reach the VOUT target */
|
||
if(vout <= vout_target)
|
||
{
|
||
duty_cycle_timA += 10;
|
||
if (duty_cycle_timA >= (SET_PERIOD - MIN_TIME_TIMA))
|
||
{
|
||
duty_cycle_timA = (SET_PERIOD - MIN_TIME_TIMA);
|
||
}
|
||
}
|
||
else
|
||
{
|
||
duty_cycle_timA -= 10;
|
||
if (duty_cycle_timA <= MIN_TIME_TIMA)
|
||
{
|
||
duty_cycle_timA = MIN_TIME_TIMA;
|
||
}
|
||
}
|
||
timeout++;
|
||
|
||
HRTIM_CompareStructure.AutoDelayedMode = HRTIM_AUTODELAYEDMODE_REGULAR;
|
||
HRTIM_CompareStructure.AutoDelayedTimeout = duty_cycle_timA;
|
||
HRTIM_CompareStructure.CompareValue = duty_cycle_timA;
|
||
|
||
if(HAL_HRTIM_WaveformCompareConfig(&HrtimHandle, HRTIM_TIMERINDEX_TIMER_A,
|
||
HRTIM_COMPAREUNIT_1, &HRTIM_CompareStructure) != HAL_OK)
|
||
{
|
||
Error_Handler();
|
||
}
|
||
|
||
HAL_Delay(1);
|
||
|
||
/* Enable next trigger on ADC during data process*/
|
||
if(HAL_ADCEx_InjectedStart_IT(&AdcHandle) != HAL_OK)
|
||
{
|
||
Error_Handler();
|
||
}
|
||
|
||
/* Verify if timeout not reached OR VIN not in expected range */
|
||
if ((timeout > 10000) || (vin < MIN_VOLTAGE) || (vin > MAX_VOLTAGE))
|
||
{
|
||
BSP_LED_Off(LED6);
|
||
while (1)
|
||
{
|
||
/* Red LED is set to alert on Buck boost function failure */
|
||
BSP_LED_On(LED3);
|
||
HAL_Delay(100);
|
||
BSP_LED_Off(LED3);
|
||
HAL_Delay(100);
|
||
}
|
||
}
|
||
}
|
||
|
||
while(Keypressed == FALSE)
|
||
{
|
||
/* Buck mode successful */
|
||
/* Green LED is toggling */
|
||
BSP_LED_On(LED5);
|
||
HAL_Delay(100);
|
||
BSP_LED_Off(LED5);
|
||
HAL_Delay(100);
|
||
}
|
||
|
||
/* Test complete */
|
||
while (1)
|
||
{
|
||
/* All LEDs are toggling : TEST SUCCESSFUL */
|
||
BSP_LED_On(LED3);
|
||
BSP_LED_On(LED4);
|
||
BSP_LED_On(LED5);
|
||
BSP_LED_On(LED6);
|
||
HAL_Delay(150);
|
||
BSP_LED_Off(LED3);
|
||
BSP_LED_Off(LED4);
|
||
BSP_LED_Off(LED5);
|
||
BSP_LED_Off(LED6);
|
||
HAL_Delay(150);
|
||
}
|
||
}
|
||
}
|
||
|
||
|
||
/**
|
||
* @brief ADC configuration
|
||
* @param None
|
||
* @retval None
|
||
*/
|
||
static void ADC_Config(void)
|
||
{
|
||
ADC_ChannelConfTypeDef ChannelConfig;
|
||
ADC_InjectionConfTypeDef InjectedConfig;
|
||
ADC_MultiModeTypeDef MultiModeConfig;
|
||
GPIO_InitTypeDef GPIO_InitStructure;
|
||
HRTIM_ADCTriggerCfgTypeDef ADCTriggerConfig;
|
||
|
||
/* ADC configuration */
|
||
/* ADC is first set in single channel to record VREF */
|
||
/* then turned into injected mode to monitor VIN and VOUT voltages */
|
||
|
||
/* Configure the ADC clock */
|
||
__HAL_RCC_ADC12_CONFIG(RCC_ADC12PLLCLK_DIV2);
|
||
|
||
/* Enable ADC1 clock */
|
||
__HAL_RCC_ADC12_CLK_ENABLE();
|
||
|
||
/* ADC Channel configuration */
|
||
/* Configure ADC Channel2 as analog input / PA1/VIN */
|
||
GPIO_InitStructure.Pin = GPIO_PIN_1;
|
||
GPIO_InitStructure.Mode = GPIO_MODE_ANALOG;
|
||
GPIO_InitStructure.Pull = GPIO_NOPULL;
|
||
HAL_GPIO_Init(GPIOA, &GPIO_InitStructure);
|
||
|
||
/* Configure ADC Channel4 as analog input / PA3/VOUT */
|
||
GPIO_InitStructure.Pin = GPIO_PIN_3;
|
||
GPIO_InitStructure.Mode = GPIO_MODE_ANALOG;
|
||
GPIO_InitStructure.Pull = GPIO_NOPULL;
|
||
HAL_GPIO_Init(GPIOA, &GPIO_InitStructure);
|
||
|
||
/* Insert delay equal to 100 <20>s */
|
||
HAL_Delay(1);
|
||
|
||
AdcHandle.Instance = ADC1;
|
||
|
||
/* Start single channel voltage reference measurement */
|
||
MultiModeConfig.DMAAccessMode = ADC_DMAACCESSMODE_DISABLED;
|
||
MultiModeConfig.Mode = ADC_MODE_INDEPENDENT;
|
||
MultiModeConfig.TwoSamplingDelay = ADC_TWOSAMPLINGDELAY_1CYCLE;
|
||
|
||
if(HAL_ADCEx_MultiModeConfigChannel(&AdcHandle, &MultiModeConfig) != HAL_OK)
|
||
{
|
||
Error_Handler();
|
||
}
|
||
|
||
AdcHandle.Init.ClockPrescaler = ADC_CLOCK_SYNC_PCLK_DIV4; /* AHB clock / 4 = 16MHz : 12-bit resolution */
|
||
AdcHandle.Init.ContinuousConvMode = DISABLE;
|
||
AdcHandle.Init.DataAlign = ADC_DATAALIGN_RIGHT;
|
||
AdcHandle.Init.DiscontinuousConvMode = DISABLE;
|
||
AdcHandle.Init.DMAContinuousRequests = DISABLE;
|
||
AdcHandle.Init.EOCSelection = ADC_EOC_SINGLE_CONV;
|
||
AdcHandle.Init.ExternalTrigConv = ADC_EXTERNALTRIGCONV_T1_CC1;
|
||
AdcHandle.Init.ExternalTrigConvEdge = ADC_EXTERNALTRIGINJECCONV_EDGE_NONE;
|
||
AdcHandle.Init.LowPowerAutoWait = DISABLE;
|
||
AdcHandle.Init.NbrOfConversion = 1;
|
||
AdcHandle.Init.NbrOfDiscConversion = 1;
|
||
AdcHandle.Init.Overrun = ADC_OVR_DATA_PRESERVED;
|
||
AdcHandle.Init.Resolution = ADC_RESOLUTION_12B;
|
||
AdcHandle.Init.ScanConvMode = DISABLE;
|
||
|
||
if(HAL_ADC_Init(&AdcHandle) != HAL_OK)
|
||
{
|
||
Error_Handler();
|
||
}
|
||
|
||
/* Calibration procedure */
|
||
if(HAL_ADCEx_Calibration_Start(&AdcHandle, ADC_SINGLE_ENDED) != HAL_OK)
|
||
{
|
||
Error_Handler();
|
||
}
|
||
|
||
/* 61.5 clock cycles @16MHz = 3.84us */
|
||
ChannelConfig.Channel = ADC_CHANNEL_18;
|
||
ChannelConfig.Offset = 0;
|
||
ChannelConfig.OffsetNumber = ADC_OFFSET_NONE;
|
||
ChannelConfig.Rank = ADC_REGULAR_RANK_1;
|
||
ChannelConfig.SamplingTime = ADC_SAMPLETIME_61CYCLES_5;
|
||
ChannelConfig.SingleDiff = ADC_SINGLE_ENDED;
|
||
|
||
if(HAL_ADC_ConfigChannel(&AdcHandle, &ChannelConfig) != HAL_OK)
|
||
{
|
||
Error_Handler();
|
||
}
|
||
|
||
HAL_Delay(1);
|
||
|
||
/* Start ADC1 Software Conversion */
|
||
if(HAL_ADC_Start(&AdcHandle) != HAL_OK)
|
||
{
|
||
Error_Handler();
|
||
}
|
||
|
||
if(HAL_ADC_PollForConversion(&AdcHandle, HAL_MAX_DELAY) != HAL_OK)
|
||
{
|
||
Error_Handler();
|
||
}
|
||
|
||
/* Get ADC converted data */
|
||
AdcReferenceConvertedValue = HAL_ADC_GetValue(&AdcHandle);
|
||
|
||
/* check and wait ADC is disabled */
|
||
if(HAL_ADC_Stop(&AdcHandle) != HAL_OK)
|
||
{
|
||
Error_Handler();
|
||
}
|
||
|
||
HAL_Delay(1);
|
||
|
||
/* Switch to ADC injected mode after VREFINT calibration */
|
||
MultiModeConfig.DMAAccessMode = ADC_DMAACCESSMODE_DISABLED;
|
||
MultiModeConfig.Mode = ADC_DUALMODE_INJECSIMULT;
|
||
MultiModeConfig.TwoSamplingDelay = ADC_TWOSAMPLINGDELAY_1CYCLE;
|
||
|
||
if(HAL_ADCEx_MultiModeConfigChannel(&AdcHandle, &MultiModeConfig) != HAL_OK)
|
||
{
|
||
Error_Handler();
|
||
}
|
||
|
||
AdcHandle.Init.ClockPrescaler = ADC_CLOCK_ASYNC_DIV1;
|
||
AdcHandle.Init.ContinuousConvMode = DISABLE;
|
||
AdcHandle.Init.DataAlign = ADC_DATAALIGN_RIGHT;
|
||
AdcHandle.Init.DiscontinuousConvMode = DISABLE;
|
||
AdcHandle.Init.DMAContinuousRequests = DISABLE;
|
||
AdcHandle.Init.EOCSelection = ADC_EOC_SEQ_CONV;
|
||
AdcHandle.Init.ExternalTrigConv = ADC_SOFTWARE_START;
|
||
AdcHandle.Init.ExternalTrigConvEdge = ADC_EXTERNALTRIGCONVEDGE_NONE;
|
||
AdcHandle.Init.LowPowerAutoWait = DISABLE;
|
||
AdcHandle.Init.NbrOfConversion = 1;
|
||
AdcHandle.Init.NbrOfDiscConversion = 1;
|
||
AdcHandle.Init.Overrun = ADC_OVR_DATA_OVERWRITTEN;
|
||
AdcHandle.Init.Resolution = ADC_RESOLUTION_12B;
|
||
AdcHandle.Init.ScanConvMode = ENABLE;
|
||
|
||
if(HAL_ADC_Init(&AdcHandle) != HAL_OK)
|
||
{
|
||
Error_Handler();
|
||
}
|
||
|
||
/* ADC1 channel1 configuration */
|
||
/* Example VIN Tconv = Tsamp (7.5) + 12.5 ADC clock cycles = 20 ADC clock samples = 278ns @72MHz */
|
||
InjectedConfig.AutoInjectedConv = DISABLE;
|
||
InjectedConfig.ExternalTrigInjecConv = ADC_EXTERNALTRIGINJECCONV_HRTIM_TRG2;
|
||
InjectedConfig.ExternalTrigInjecConvEdge = ADC_EXTERNALTRIGINJECCONV_EDGE_RISING;
|
||
InjectedConfig.InjectedChannel = ADC_CHANNEL_2; /* corresponds to PA1 VIN */
|
||
InjectedConfig.InjectedDiscontinuousConvMode = ENABLE;
|
||
InjectedConfig.InjectedNbrOfConversion = 2;
|
||
InjectedConfig.InjectedOffset = 0;
|
||
InjectedConfig.InjectedOffsetNumber = ADC_OFFSET_NONE;
|
||
InjectedConfig.InjectedRank = ADC_INJECTED_RANK_1;
|
||
InjectedConfig.InjectedSamplingTime = ADC_SAMPLETIME_7CYCLES_5;
|
||
InjectedConfig.InjectedSingleDiff = ADC_SINGLE_ENDED;
|
||
InjectedConfig.QueueInjectedContext = DISABLE;
|
||
|
||
if(HAL_ADCEx_InjectedConfigChannel(&AdcHandle, &InjectedConfig) != HAL_OK)
|
||
{
|
||
Error_Handler();
|
||
}
|
||
|
||
InjectedConfig.InjectedChannel = ADC_CHANNEL_4; /* corresponds to PA3 VOUT */
|
||
InjectedConfig.InjectedRank = ADC_INJECTED_RANK_2;
|
||
InjectedConfig.InjectedSamplingTime = ADC_SAMPLETIME_19CYCLES_5;
|
||
|
||
if(HAL_ADCEx_InjectedConfigChannel(&AdcHandle, &InjectedConfig) != HAL_OK)
|
||
{
|
||
Error_Handler();
|
||
}
|
||
|
||
/* Configure and enable ADC1 interrupt */
|
||
HAL_NVIC_SetPriority(ADC1_2_IRQn, 0, 0);
|
||
HAL_NVIC_EnableIRQ(ADC1_2_IRQn);
|
||
|
||
/*HRTIM trigger configuration for ADC1 */
|
||
ADCTriggerConfig.Trigger = HRTIM_ADCTRIGGEREVENT24_TIMERB_CMP2;
|
||
ADCTriggerConfig.UpdateSource = HRTIM_ADCTRIGGERUPDATE_TIMER_B;
|
||
|
||
if(HAL_HRTIM_ADCTriggerConfig(&HrtimHandle, HRTIM_ADCTRIGGER_2, &ADCTriggerConfig) != HAL_OK)
|
||
{
|
||
Error_Handler();
|
||
}
|
||
|
||
/* Start ADC1 Software Conversion */
|
||
if(HAL_ADCEx_InjectedStart_IT(&AdcHandle) != HAL_OK)
|
||
{
|
||
Error_Handler();
|
||
}
|
||
}
|
||
|
||
|
||
/**
|
||
* @brief Configure HRTIM for Buck Mode configuration
|
||
* @param None
|
||
* @retval None
|
||
*/
|
||
static void SetHRTIM_BuckMode(void)
|
||
{
|
||
HRTIM_OutputCfgTypeDef HRTIM_OutputStructure;
|
||
|
||
HRTIM_Unselect_OutputTIMx();
|
||
|
||
HRTIM_OutputStructure.Polarity = HRTIM_OUTPUTPOLARITY_HIGH;
|
||
HRTIM_OutputStructure.IdleMode = HRTIM_OUTPUTIDLEMODE_IDLE;
|
||
HRTIM_OutputStructure.IdleLevel = HRTIM_OUTPUTIDLELEVEL_INACTIVE;
|
||
HRTIM_OutputStructure.FaultLevel = HRTIM_OUTPUTFAULTLEVEL_NONE;
|
||
HRTIM_OutputStructure.ChopperModeEnable = HRTIM_OUTPUTCHOPPERMODE_DISABLED;
|
||
HRTIM_OutputStructure.BurstModeEntryDelayed = HRTIM_OUTPUTBURSTMODEENTRY_REGULAR;
|
||
|
||
/* Set TIMA A1(PA8) and A2(PA9) opposite PWM outputs */
|
||
HRTIM_OutputStructure.SetSource = HRTIM_OUTPUTSET_TIMPER;
|
||
HRTIM_OutputStructure.ResetSource = HRTIM_OUTPUTRESET_TIMCMP1;
|
||
|
||
if(HAL_HRTIM_WaveformOutputConfig(&HrtimHandle, HRTIM_TIMERINDEX_TIMER_A,
|
||
HRTIM_OUTPUT_TA1, &HRTIM_OutputStructure) != HAL_OK)
|
||
{
|
||
Error_Handler();
|
||
}
|
||
|
||
/* Reset Output B1(PA10) to open T12 NMOS and set B2 (PA11) to close T5 PMOS bridge, operated as I/O */
|
||
HRTIM_OutputStructure.SetSource = HRTIM_OUTPUTSET_NONE;
|
||
HRTIM_OutputStructure.ResetSource = HRTIM_OUTPUTRESET_TIMPER;
|
||
|
||
if(HAL_HRTIM_WaveformOutputConfig(&HrtimHandle, HRTIM_TIMERINDEX_TIMER_B,
|
||
HRTIM_OUTPUT_TB1, &HRTIM_OutputStructure) != HAL_OK)
|
||
{
|
||
Error_Handler();
|
||
}
|
||
|
||
HRTIM_OutputStructure.SetSource = HRTIM_OUTPUTSET_TIMPER;
|
||
HRTIM_OutputStructure.ResetSource = HRTIM_OUTPUTRESET_NONE;
|
||
|
||
if(HAL_HRTIM_WaveformOutputConfig(&HrtimHandle, HRTIM_TIMERINDEX_TIMER_B,
|
||
HRTIM_OUTPUT_TB2, &HRTIM_OutputStructure) != HAL_OK)
|
||
{
|
||
Error_Handler();
|
||
}
|
||
|
||
/* Start both TIMA and TIMB */
|
||
if(HAL_HRTIM_WaveformCountStart(&HrtimHandle, HRTIM_TIMERID_TIMER_A | HRTIM_TIMERID_TIMER_B) != HAL_OK)
|
||
{
|
||
Error_Handler();
|
||
}
|
||
|
||
Converter_Mode_Change = FALSE;
|
||
}
|
||
|
||
/**
|
||
* @brief Configure HRTIM for Boost Mode configuration
|
||
* @param None
|
||
* @retval None
|
||
*/
|
||
void SetHRTIM_BoostMode(void)
|
||
{
|
||
HRTIM_OutputCfgTypeDef HRTIM_OutputStructure;
|
||
|
||
HRTIM_Unselect_OutputTIMx();
|
||
|
||
HRTIM_OutputStructure.Polarity = HRTIM_OUTPUTPOLARITY_HIGH;
|
||
HRTIM_OutputStructure.IdleMode = HRTIM_OUTPUTIDLEMODE_IDLE;
|
||
HRTIM_OutputStructure.IdleLevel = HRTIM_OUTPUTIDLELEVEL_INACTIVE;
|
||
HRTIM_OutputStructure.FaultLevel = HRTIM_OUTPUTFAULTLEVEL_NONE;
|
||
HRTIM_OutputStructure.ChopperModeEnable = HRTIM_OUTPUTCHOPPERMODE_DISABLED;
|
||
HRTIM_OutputStructure.BurstModeEntryDelayed = HRTIM_OUTPUTBURSTMODEENTRY_REGULAR;
|
||
|
||
/* Set TIMA B1(PA10) and B2(PA11) opposite PWM outputs */
|
||
HRTIM_OutputStructure.SetSource = HRTIM_OUTPUTSET_TIMPER;
|
||
HRTIM_OutputStructure.ResetSource = HRTIM_OUTPUTRESET_TIMEV_1;
|
||
|
||
if(HAL_HRTIM_WaveformOutputConfig(&HrtimHandle, HRTIM_TIMERINDEX_TIMER_B,
|
||
HRTIM_OUTPUT_TB1, &HRTIM_OutputStructure) != HAL_OK)
|
||
{
|
||
Error_Handler();
|
||
}
|
||
|
||
/* Set Output A1(PA8) to open T4 PMOS and reset A2(PA9) to close T5 NMOS bridge, operated as I/O */
|
||
HRTIM_OutputStructure.SetSource = HRTIM_OUTPUTSET_NONE;
|
||
HRTIM_OutputStructure.ResetSource = HRTIM_OUTPUTRESET_TIMPER;
|
||
|
||
if(HAL_HRTIM_WaveformOutputConfig(&HrtimHandle, HRTIM_TIMERINDEX_TIMER_A,
|
||
HRTIM_OUTPUT_TA2, &HRTIM_OutputStructure) != HAL_OK)
|
||
{
|
||
Error_Handler();
|
||
}
|
||
|
||
HRTIM_OutputStructure.SetSource = HRTIM_OUTPUTSET_TIMPER;
|
||
HRTIM_OutputStructure.ResetSource = HRTIM_OUTPUTRESET_NONE;
|
||
|
||
if(HAL_HRTIM_WaveformOutputConfig(&HrtimHandle, HRTIM_TIMERINDEX_TIMER_A,
|
||
HRTIM_OUTPUT_TA1, &HRTIM_OutputStructure) != HAL_OK)
|
||
{
|
||
Error_Handler();
|
||
}
|
||
|
||
/* Start both TIMA and TIMB */
|
||
if(HAL_HRTIM_WaveformCountStart(&HrtimHandle, HRTIM_TIMERID_TIMER_A | HRTIM_TIMERID_TIMER_B) != HAL_OK)
|
||
{
|
||
Error_Handler();
|
||
}
|
||
|
||
Converter_Mode_Change = FALSE;
|
||
}
|
||
|
||
/**
|
||
* @brief Reset ALL HRTIM Setx and Rstx registers Output Disable
|
||
* @param None
|
||
* @retval None
|
||
*/
|
||
static void HRTIM_Unselect_OutputTIMx(void)
|
||
{
|
||
HRTIM_OutputCfgTypeDef HRTIM_OutputStructure;
|
||
|
||
HRTIM_OutputStructure.Polarity = HRTIM_OUTPUTPOLARITY_HIGH;
|
||
HRTIM_OutputStructure.IdleMode = HRTIM_OUTPUTIDLEMODE_IDLE;
|
||
HRTIM_OutputStructure.IdleLevel = HRTIM_OUTPUTIDLELEVEL_INACTIVE;
|
||
HRTIM_OutputStructure.FaultLevel = HRTIM_OUTPUTFAULTLEVEL_NONE;
|
||
HRTIM_OutputStructure.ChopperModeEnable = HRTIM_OUTPUTCHOPPERMODE_DISABLED;
|
||
HRTIM_OutputStructure.BurstModeEntryDelayed = HRTIM_OUTPUTBURSTMODEENTRY_REGULAR;
|
||
HRTIM_OutputStructure.SetSource = HRTIM_OUTPUTSET_NONE;
|
||
HRTIM_OutputStructure.ResetSource = HRTIM_OUTPUTRESET_NONE;
|
||
|
||
if(HAL_HRTIM_WaveformOutputConfig(&HrtimHandle, HRTIM_TIMERINDEX_TIMER_A,
|
||
HRTIM_OUTPUT_TA1, &HRTIM_OutputStructure) != HAL_OK)
|
||
{
|
||
Error_Handler();
|
||
}
|
||
|
||
if(HAL_HRTIM_WaveformOutputConfig(&HrtimHandle, HRTIM_TIMERINDEX_TIMER_A,
|
||
HRTIM_OUTPUT_TA2, &HRTIM_OutputStructure) != HAL_OK)
|
||
{
|
||
Error_Handler();
|
||
}
|
||
|
||
if(HAL_HRTIM_WaveformOutputConfig(&HrtimHandle, HRTIM_TIMERINDEX_TIMER_B,
|
||
HRTIM_OUTPUT_TB1, &HRTIM_OutputStructure) != HAL_OK)
|
||
{
|
||
Error_Handler();
|
||
}
|
||
|
||
if(HAL_HRTIM_WaveformOutputConfig(&HrtimHandle, HRTIM_TIMERINDEX_TIMER_B,
|
||
HRTIM_OUTPUT_TB2, &HRTIM_OutputStructure) != HAL_OK)
|
||
{
|
||
Error_Handler();
|
||
}
|
||
}
|
||
|
||
/**
|
||
* @brief Injected conversion complete callback in non blocking mode
|
||
* @param hadc: ADC handle
|
||
* @retval None
|
||
*/
|
||
void HAL_ADCEx_InjectedConvCpltCallback(ADC_HandleTypeDef* hadc)
|
||
{
|
||
if( __HAL_ADC_GET_FLAG(hadc, ADC_FLAG_JEOS))
|
||
{
|
||
__HAL_HRTIM_TIMER_CLEAR_IT(&HrtimHandle, HRTIM_TIMERINDEX_TIMER_B, HRTIM_TIM_IT_CMP2);
|
||
|
||
/* Get ADC converted data */
|
||
Adc_Channel1_ConvertedValue_In = HAL_ADCEx_InjectedGetValue(hadc, ADC_INJECTED_RANK_1);
|
||
Adc_Channel1_ConvertedValue_Out = HAL_ADCEx_InjectedGetValue(hadc, ADC_INJECTED_RANK_2);
|
||
}
|
||
|
||
/* Disable next trigger on ADC during data process*/
|
||
HAL_ADCEx_InjectedStop_IT(hadc);
|
||
}
|
||
|
||
/**
|
||
* @brief EXTI line detection callbacks.
|
||
* @param GPIO_Pin: Specifies the pins connected EXTI line
|
||
* @retval None
|
||
*/
|
||
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
|
||
{
|
||
uint32_t i=0;
|
||
|
||
BSP_LED_Off(LED4);
|
||
BSP_LED_Off(LED5);
|
||
Keypressed = TRUE;
|
||
|
||
if(TestMode == FALSE)
|
||
{
|
||
NoWait = TRUE;
|
||
|
||
/* Change state machine mode */
|
||
StateMachine++;
|
||
|
||
/* Wait until USER button released */
|
||
while((BSP_PB_GetState(BUTTON_USER) == SET))
|
||
{
|
||
i++;
|
||
if(i == 1000000)
|
||
{
|
||
StateMachine = STATE_MAN;
|
||
DownUp = (!DownUp);
|
||
break;
|
||
}
|
||
}
|
||
|
||
/* Reinitialize thresholds */
|
||
CurrentSenseTab[0] = 280;
|
||
CurrentSenseTab[1] = 240;
|
||
CurrentSenseTab[2] = 200;
|
||
CurrentSenseTab[3] = 360;
|
||
CurrentSenseTab[4] = 320;
|
||
|
||
/* Convert current sense value thresholds for DAC */
|
||
for (i = 0; i < 5; i++)
|
||
{
|
||
CurrentSenseTab[i] = (CurrentSenseTab[i] * 4096) / 3300;
|
||
}
|
||
|
||
if (StateMachine >= MAX_STATE)
|
||
{
|
||
StateMachine = STATE_OFF;
|
||
}
|
||
}
|
||
}
|
||
|
||
/**
|
||
* @brief Callback function invoked when timer repetition period has elapsed
|
||
* @param hhrtim: pointer to HAL HRTIM handle
|
||
* @param TimerIdx: Timer index
|
||
* This parameter can be one of the following values:
|
||
* @arg HRTIM_TIMERINDEX_MASTER for master timer
|
||
* @arg HRTIM_TIMERINDEX_TIMER_A for timer A
|
||
* @arg HRTIM_TIMERINDEX_TIMER_B for timer B
|
||
* @arg HRTIM_TIMERINDEX_TIMER_C for timer C
|
||
* @arg HRTIM_TIMERINDEX_TIMER_D for timer D
|
||
* @arg HRTIM_TIMERINDEX_TIMER_E for timer E
|
||
* @retval None
|
||
*/
|
||
void HAL_HRTIM_RepetitionEventCallback(HRTIM_HandleTypeDef * hhrtim,
|
||
uint32_t TimerIdx)
|
||
{
|
||
if (TimerIdx == HRTIM_TIMERINDEX_TIMER_A)
|
||
{
|
||
/* Converter mode is changed during interrupt to synchronize HRTIM output changes */
|
||
if(Converter_Mode_Change == TRUE)
|
||
{
|
||
switch(Current_Mode)
|
||
{
|
||
case BUCK:
|
||
SetHRTIM_BuckMode();
|
||
break;
|
||
|
||
case BOOST:
|
||
SetHRTIM_BoostMode();
|
||
break;
|
||
|
||
default:
|
||
Error_Handler();
|
||
}
|
||
}
|
||
}
|
||
}
|
||
|
||
/**
|
||
* @brief Callback function invoked when the end of the burst mode period is reached
|
||
* @param hhrtim: pointer to HAL HRTIM handle
|
||
* @retval None
|
||
*/
|
||
void HAL_HRTIM_BurstModePeriodCallback(HRTIM_HandleTypeDef * hhrtim)
|
||
{
|
||
static uint8_t index1 =0;
|
||
uint32_t i_intensity = 0;
|
||
float index2;
|
||
|
||
/* Each Master Burst mode period interrupt, the burst compare is updated */
|
||
i_intensity = (uint32_t) fIntensity;
|
||
index2 = fIntensity - i_intensity;
|
||
index2 *= 8;
|
||
|
||
if (DitherTab[(uint32_t)index2][index1] == 0)
|
||
{
|
||
/* If Dither table value is zero then standard drive ...*/
|
||
HRTIM_SetBurstCompare(i_intensity);
|
||
}
|
||
else
|
||
{
|
||
/* or extra period is added */
|
||
HRTIM_SetBurstCompare(i_intensity + 1);
|
||
}
|
||
|
||
/* Each interrupt the table data are rolling from 1 to 7 */
|
||
index1++;
|
||
if (index1 > 7)
|
||
{
|
||
index1 = 0;
|
||
}
|
||
}
|
||
|
||
/**
|
||
* @brief System Clock Configuration
|
||
* The system Clock is configured as follow :
|
||
* System Clock source = PLL (HSE)
|
||
* SYSCLK(Hz) = 72000000
|
||
* HCLK(Hz) = 72000000
|
||
* AHB Prescaler = 1
|
||
* APB1 Prescaler = 2
|
||
* APB2 Prescaler = 1
|
||
* HSE Frequency(Hz) = 8000000
|
||
* HSE PREDIV = 1
|
||
* PLLMUL = RCC_PLL_MUL9 (9)
|
||
* Flash Latency(WS) = 2
|
||
* @param None
|
||
* @retval None
|
||
*/
|
||
static void SystemClock_Config(void)
|
||
{
|
||
RCC_ClkInitTypeDef RCC_ClkInitStruct;
|
||
RCC_OscInitTypeDef RCC_OscInitStruct;
|
||
|
||
/* Enable HSE Oscillator and activate PLL with HSE as source */
|
||
RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;
|
||
RCC_OscInitStruct.HSEState = RCC_HSE_ON;
|
||
RCC_OscInitStruct.HSEPredivValue = RCC_HSE_PREDIV_DIV1;
|
||
RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
|
||
RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;
|
||
RCC_OscInitStruct.PLL.PLLMUL = RCC_PLL_MUL9;
|
||
if (HAL_RCC_OscConfig(&RCC_OscInitStruct)!= HAL_OK)
|
||
{
|
||
Error_Handler();
|
||
}
|
||
|
||
/* 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)
|
||
{
|
||
Error_Handler();
|
||
}
|
||
}
|
||
|
||
/**
|
||
* @brief This function is executed in case of error occurrence.
|
||
* @param None
|
||
* @retval None
|
||
*/
|
||
static void Error_Handler(void)
|
||
{
|
||
while(1)
|
||
{
|
||
/* All LEDs are ON */
|
||
BSP_LED_On(LED3);
|
||
BSP_LED_On(LED4);
|
||
BSP_LED_On(LED5);
|
||
BSP_LED_On(LED6);
|
||
}
|
||
}
|
||
|
||
#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
|
||
|
||
/**
|
||
* @}
|
||
*/
|