Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependents: DISCO-F334C8_HiBrightLED_demo
Diff: HiBrightLED.cpp
- Revision:
- 0:c95c484b95a9
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/HiBrightLED.cpp Wed Jun 17 06:30:59 2015 +0000
@@ -0,0 +1,448 @@
+/* Copyright (c) 2010-2011 mbed.org, MIT License
+*
+* Permission is hereby granted, free of charge, to any person obtaining a copy of this software
+* and associated documentation files (the "Software"), to deal in the Software without
+* restriction, including without limitation the rights to use, copy, modify, merge, publish,
+* distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the
+* Software is furnished to do so, subject to the following conditions:
+*
+* The above copyright notice and this permission notice shall be included in all copies or
+* substantial portions of the Software.
+*
+* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING
+* BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
+* DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+*/
+
+#if !defined(TARGET_DISCO_F334C8)
+#error "This library must be used on DISCO_F334C8 board only."
+#endif
+
+#include "HiBrightLED.h"
+
+/**
+ * @brief LED intensity
+ */
+#define MIN_INTENSITY (625)
+#define MAX_INTENSITY (0)
+
+
+// Constructor
+HiBrightLED::HiBrightLED()
+{
+ // Current table centered around ~250mA in the Power LED
+ CurrentSenseTab[0] = 280;
+ CurrentSenseTab[1] = 240;
+ CurrentSenseTab[2] = 200;
+ CurrentSenseTab[3] = 360;
+ CurrentSenseTab[4] = 320;
+ CurrentSenseTabInit();
+
+ DMA_Config();
+ DAC_Config();
+ COMP_Config();
+ HRTIM_Config();
+}
+
+
+// Destructor
+HiBrightLED::~HiBrightLED()
+{
+ // DMA
+ DmaHandle.Instance = DMA1_Channel5;
+ HAL_DMA_DeInit(&DmaHandle);
+ __DMA1_CLK_DISABLE();
+
+ // DAC
+ DacHandle.Instance = DAC1;
+ HAL_DAC_DeInit(&DacHandle);
+ __DAC1_CLK_DISABLE();
+
+ // COMP
+ CompHandle.Instance = COMP4;
+ HAL_COMP_DeInit(&CompHandle);
+
+ // HRTIM
+ HrtimHandle.Instance = HRTIM1;
+ HAL_HRTIM_DeInit(&HrtimHandle);
+ __HRTIM1_CLK_DISABLE();
+}
+
+
+//=================================================================================================================
+// Public methods
+//=================================================================================================================
+
+void HiBrightLED::write(float value)
+{
+ uint16_t val;
+ _value = value; // Save current value
+
+ if (value < 0.0f) {
+ val = MIN_INTENSITY;
+ } else if (value > 1.0f) {
+ val = MAX_INTENSITY;
+ } else {
+ val = (uint16_t)((1.0f - value) * (float)MIN_INTENSITY);
+ }
+
+ HRTIM_SetBurstCompare(val);
+}
+
+float HiBrightLED::read()
+{
+ return _value;
+}
+
+//=================================================================================================================
+// Private methods
+//=================================================================================================================
+
+void HiBrightLED::CurrentSenseTabInit(void)
+{
+ uint8_t index;
+ for (index =0; index < 5; index++)
+ {
+ CurrentSenseTab[index] = (CurrentSenseTab[index] * 4096) / 3300;
+ }
+}
+
+
+void HiBrightLED::DMA_Config(void)
+{
+ /* Enable DMA1 clock -------------------------------------------------------*/
+ __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("HAL_DMA_Init failed");
+ }
+}
+
+
+void HiBrightLED::DAC_Config(void)
+{
+ DAC_ChannelConfTypeDef DAC_ConfigStructure;
+
+#ifdef DEBUG_HIBRIGHT_LED
+ GPIO_InitTypeDef GPIO_InitStructure;
+
+ /* Configure DAC1 OUT1 */
+ /* GPIO Periph clock enable */
+ __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 */
+ __DAC1_CLK_ENABLE();
+
+ /* DAC1 deinitialize */
+ DacHandle.Instance = DAC1;
+ if(HAL_DAC_DeInit(&DacHandle) != HAL_OK)
+ {
+ error("HAL_DAC_DeInit failed");
+ }
+
+ /* DAC Channel1 Init */
+ if(HAL_DAC_Init(&DacHandle) != HAL_OK)
+ {
+ error("HAL_DAC_Init failed");
+ }
+
+ /* Fill DAC ConfigStructure */
+ DAC_ConfigStructure.DAC_OutputBuffer = DAC_OUTPUTBUFFER_DISABLE;
+ DAC_ConfigStructure.DAC_Trigger = DAC_TRIGGER_NONE;
+ if(HAL_DAC_ConfigChannel(&DacHandle, &DAC_ConfigStructure, DAC1_CHANNEL_1) != HAL_OK)
+ {
+ error("HAL_DAC_ConfigChannel failed");
+ }
+
+ /* Enable DAC Channel1 */
+ if(HAL_DAC_Start(&DacHandle, DAC1_CHANNEL_1) != HAL_OK)
+ {
+ error("HAL_DAC_Start failed");
+ }
+
+ /* Set DAC Channel1 DHR register: DAC1_OUT */
+ if(HAL_DAC_SetValue(&DacHandle, DAC1_CHANNEL_1, DAC_ALIGN_12B_R, CurrentSenseTab[0]) != HAL_OK)
+ {
+ error("HAL_DAC_SetValue failed");
+ }
+}
+
+
+void HiBrightLED::COMP_Config(void)
+{
+ GPIO_InitTypeDef GPIO_InitStructure;
+
+ /* Enable SYSCFG clock */
+ //__SYSCFG_CLK_ENABLE();
+
+ /* GPIOB Peripheral clock enable */
+ __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_HIBRIGHT_LED
+ /* COMP4 output config: PB1 for debug */
+ GPIO_InitStructure.Pin = GPIO_PIN_1;
+ GPIO_InitStructure.Mode = GPIO_MODE_AF_PP;
+ GPIO_InitStructure.Speed = GPIO_SPEED_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("HAL_COMP_DeInit failed");
+ }
+
+ /* 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_DISABLED;
+ CompHandle.Init.TriggerMode = COMP_TRIGGERMODE_NONE;
+ if(HAL_COMP_Init(&CompHandle) != HAL_OK)
+ {
+ error("HAL_COMP_Init failed");
+ }
+
+ /* Enable COMP4 */
+ if(HAL_COMP_Start(&CompHandle) != HAL_OK)
+ {
+ error("HAL_COMP_Start failed");
+ }
+}
+
+
+void HiBrightLED::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_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);
+ __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("HAL_HRTIM_DLLCalibrationStart failed");
+ }
+
+ if(HAL_HRTIM_PollForDLLCalibration(&HrtimHandle, HAL_MAX_DELAY) != HAL_OK)
+ {
+ error("HAL_HRTIM_PollForDLLCalibration failed");
+ }
+
+ /* 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("HAL_HRTIM_WaveformOutputConfig failed");
+ }
+
+ /* 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_TIMDELAYEDPROTECTION_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("HAL_HRTIM_WaveformTimerConfig failed");
+ }
+
+ 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("HAL_HRTIM_WaveformCompareConfig failed");
+ }
+
+ 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("HAL_HRTIM_WaveformCompareConfig failed");
+ }
+
+ 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("HAL_HRTIM_WaveformCompareConfig failed");
+ }
+
+ 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("HAL_HRTIM_WaveformCompareConfig failed");
+ }
+
+ HRTIM_TimeBaseStructure.Period = 18432; /* 1 period = 4 µ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("HAL_HRTIM_TimeBaseConfig failed");
+ }
+
+ /* 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("HAL_HRTIM_EventConfig failed");
+ }
+
+ /* 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("HAL_HRTIM_BurstModeConfig failed");
+ }
+
+ /* Enable the TC1 output */
+ if(HAL_HRTIM_WaveformOutputStart(&HrtimHandle, HRTIM_OUTPUT_TC1) != HAL_OK)
+ {
+ error("HAL_HRTIM_WaveformOutputStart failed");
+ }
+
+ if(HAL_HRTIM_BurstModeCtl(&HrtimHandle, HRTIM_BURSTMODECTL_ENABLED) != HAL_OK)
+ {
+ error("HAL_HRTIM_BurstModeCtl failed");
+ }
+
+ /* Start slave*/
+ if(HAL_HRTIM_WaveformCounterStart_DMA(&HrtimHandle, HRTIM_TIMERID_TIMER_C) != HAL_OK)
+ {
+ error("HAL_HRTIM_WaveformCounterStart_DMA failed");
+ }
+
+ /* 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("HAL_HRTIM_BurstModeSoftwareTrigger failed");
+ }
+}
+
+
+void HiBrightLED::HRTIM_SetBurstCompare(uint16_t BurstCompare)
+{
+ /* Set Burst Compare value */
+ HrtimHandle.Instance->sCommonRegs.BMCMPR = BurstCompare;
+}
+