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
HiBrightLED.cpp@0:c95c484b95a9, 2015-06-17 (annotated)
- Committer:
- bcostm
- Date:
- Wed Jun 17 06:30:59 2015 +0000
- Revision:
- 0:c95c484b95a9
Initial version.
Who changed what in which revision?
| User | Revision | Line number | New contents of line |
|---|---|---|---|
| bcostm | 0:c95c484b95a9 | 1 | /* Copyright (c) 2010-2011 mbed.org, MIT License |
| bcostm | 0:c95c484b95a9 | 2 | * |
| bcostm | 0:c95c484b95a9 | 3 | * Permission is hereby granted, free of charge, to any person obtaining a copy of this software |
| bcostm | 0:c95c484b95a9 | 4 | * and associated documentation files (the "Software"), to deal in the Software without |
| bcostm | 0:c95c484b95a9 | 5 | * restriction, including without limitation the rights to use, copy, modify, merge, publish, |
| bcostm | 0:c95c484b95a9 | 6 | * distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the |
| bcostm | 0:c95c484b95a9 | 7 | * Software is furnished to do so, subject to the following conditions: |
| bcostm | 0:c95c484b95a9 | 8 | * |
| bcostm | 0:c95c484b95a9 | 9 | * The above copyright notice and this permission notice shall be included in all copies or |
| bcostm | 0:c95c484b95a9 | 10 | * substantial portions of the Software. |
| bcostm | 0:c95c484b95a9 | 11 | * |
| bcostm | 0:c95c484b95a9 | 12 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING |
| bcostm | 0:c95c484b95a9 | 13 | * BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND |
| bcostm | 0:c95c484b95a9 | 14 | * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, |
| bcostm | 0:c95c484b95a9 | 15 | * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, |
| bcostm | 0:c95c484b95a9 | 16 | * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. |
| bcostm | 0:c95c484b95a9 | 17 | */ |
| bcostm | 0:c95c484b95a9 | 18 | |
| bcostm | 0:c95c484b95a9 | 19 | #if !defined(TARGET_DISCO_F334C8) |
| bcostm | 0:c95c484b95a9 | 20 | #error "This library must be used on DISCO_F334C8 board only." |
| bcostm | 0:c95c484b95a9 | 21 | #endif |
| bcostm | 0:c95c484b95a9 | 22 | |
| bcostm | 0:c95c484b95a9 | 23 | #include "HiBrightLED.h" |
| bcostm | 0:c95c484b95a9 | 24 | |
| bcostm | 0:c95c484b95a9 | 25 | /** |
| bcostm | 0:c95c484b95a9 | 26 | * @brief LED intensity |
| bcostm | 0:c95c484b95a9 | 27 | */ |
| bcostm | 0:c95c484b95a9 | 28 | #define MIN_INTENSITY (625) |
| bcostm | 0:c95c484b95a9 | 29 | #define MAX_INTENSITY (0) |
| bcostm | 0:c95c484b95a9 | 30 | |
| bcostm | 0:c95c484b95a9 | 31 | |
| bcostm | 0:c95c484b95a9 | 32 | // Constructor |
| bcostm | 0:c95c484b95a9 | 33 | HiBrightLED::HiBrightLED() |
| bcostm | 0:c95c484b95a9 | 34 | { |
| bcostm | 0:c95c484b95a9 | 35 | // Current table centered around ~250mA in the Power LED |
| bcostm | 0:c95c484b95a9 | 36 | CurrentSenseTab[0] = 280; |
| bcostm | 0:c95c484b95a9 | 37 | CurrentSenseTab[1] = 240; |
| bcostm | 0:c95c484b95a9 | 38 | CurrentSenseTab[2] = 200; |
| bcostm | 0:c95c484b95a9 | 39 | CurrentSenseTab[3] = 360; |
| bcostm | 0:c95c484b95a9 | 40 | CurrentSenseTab[4] = 320; |
| bcostm | 0:c95c484b95a9 | 41 | CurrentSenseTabInit(); |
| bcostm | 0:c95c484b95a9 | 42 | |
| bcostm | 0:c95c484b95a9 | 43 | DMA_Config(); |
| bcostm | 0:c95c484b95a9 | 44 | DAC_Config(); |
| bcostm | 0:c95c484b95a9 | 45 | COMP_Config(); |
| bcostm | 0:c95c484b95a9 | 46 | HRTIM_Config(); |
| bcostm | 0:c95c484b95a9 | 47 | } |
| bcostm | 0:c95c484b95a9 | 48 | |
| bcostm | 0:c95c484b95a9 | 49 | |
| bcostm | 0:c95c484b95a9 | 50 | // Destructor |
| bcostm | 0:c95c484b95a9 | 51 | HiBrightLED::~HiBrightLED() |
| bcostm | 0:c95c484b95a9 | 52 | { |
| bcostm | 0:c95c484b95a9 | 53 | // DMA |
| bcostm | 0:c95c484b95a9 | 54 | DmaHandle.Instance = DMA1_Channel5; |
| bcostm | 0:c95c484b95a9 | 55 | HAL_DMA_DeInit(&DmaHandle); |
| bcostm | 0:c95c484b95a9 | 56 | __DMA1_CLK_DISABLE(); |
| bcostm | 0:c95c484b95a9 | 57 | |
| bcostm | 0:c95c484b95a9 | 58 | // DAC |
| bcostm | 0:c95c484b95a9 | 59 | DacHandle.Instance = DAC1; |
| bcostm | 0:c95c484b95a9 | 60 | HAL_DAC_DeInit(&DacHandle); |
| bcostm | 0:c95c484b95a9 | 61 | __DAC1_CLK_DISABLE(); |
| bcostm | 0:c95c484b95a9 | 62 | |
| bcostm | 0:c95c484b95a9 | 63 | // COMP |
| bcostm | 0:c95c484b95a9 | 64 | CompHandle.Instance = COMP4; |
| bcostm | 0:c95c484b95a9 | 65 | HAL_COMP_DeInit(&CompHandle); |
| bcostm | 0:c95c484b95a9 | 66 | |
| bcostm | 0:c95c484b95a9 | 67 | // HRTIM |
| bcostm | 0:c95c484b95a9 | 68 | HrtimHandle.Instance = HRTIM1; |
| bcostm | 0:c95c484b95a9 | 69 | HAL_HRTIM_DeInit(&HrtimHandle); |
| bcostm | 0:c95c484b95a9 | 70 | __HRTIM1_CLK_DISABLE(); |
| bcostm | 0:c95c484b95a9 | 71 | } |
| bcostm | 0:c95c484b95a9 | 72 | |
| bcostm | 0:c95c484b95a9 | 73 | |
| bcostm | 0:c95c484b95a9 | 74 | //================================================================================================================= |
| bcostm | 0:c95c484b95a9 | 75 | // Public methods |
| bcostm | 0:c95c484b95a9 | 76 | //================================================================================================================= |
| bcostm | 0:c95c484b95a9 | 77 | |
| bcostm | 0:c95c484b95a9 | 78 | void HiBrightLED::write(float value) |
| bcostm | 0:c95c484b95a9 | 79 | { |
| bcostm | 0:c95c484b95a9 | 80 | uint16_t val; |
| bcostm | 0:c95c484b95a9 | 81 | _value = value; // Save current value |
| bcostm | 0:c95c484b95a9 | 82 | |
| bcostm | 0:c95c484b95a9 | 83 | if (value < 0.0f) { |
| bcostm | 0:c95c484b95a9 | 84 | val = MIN_INTENSITY; |
| bcostm | 0:c95c484b95a9 | 85 | } else if (value > 1.0f) { |
| bcostm | 0:c95c484b95a9 | 86 | val = MAX_INTENSITY; |
| bcostm | 0:c95c484b95a9 | 87 | } else { |
| bcostm | 0:c95c484b95a9 | 88 | val = (uint16_t)((1.0f - value) * (float)MIN_INTENSITY); |
| bcostm | 0:c95c484b95a9 | 89 | } |
| bcostm | 0:c95c484b95a9 | 90 | |
| bcostm | 0:c95c484b95a9 | 91 | HRTIM_SetBurstCompare(val); |
| bcostm | 0:c95c484b95a9 | 92 | } |
| bcostm | 0:c95c484b95a9 | 93 | |
| bcostm | 0:c95c484b95a9 | 94 | float HiBrightLED::read() |
| bcostm | 0:c95c484b95a9 | 95 | { |
| bcostm | 0:c95c484b95a9 | 96 | return _value; |
| bcostm | 0:c95c484b95a9 | 97 | } |
| bcostm | 0:c95c484b95a9 | 98 | |
| bcostm | 0:c95c484b95a9 | 99 | //================================================================================================================= |
| bcostm | 0:c95c484b95a9 | 100 | // Private methods |
| bcostm | 0:c95c484b95a9 | 101 | //================================================================================================================= |
| bcostm | 0:c95c484b95a9 | 102 | |
| bcostm | 0:c95c484b95a9 | 103 | void HiBrightLED::CurrentSenseTabInit(void) |
| bcostm | 0:c95c484b95a9 | 104 | { |
| bcostm | 0:c95c484b95a9 | 105 | uint8_t index; |
| bcostm | 0:c95c484b95a9 | 106 | for (index =0; index < 5; index++) |
| bcostm | 0:c95c484b95a9 | 107 | { |
| bcostm | 0:c95c484b95a9 | 108 | CurrentSenseTab[index] = (CurrentSenseTab[index] * 4096) / 3300; |
| bcostm | 0:c95c484b95a9 | 109 | } |
| bcostm | 0:c95c484b95a9 | 110 | } |
| bcostm | 0:c95c484b95a9 | 111 | |
| bcostm | 0:c95c484b95a9 | 112 | |
| bcostm | 0:c95c484b95a9 | 113 | void HiBrightLED::DMA_Config(void) |
| bcostm | 0:c95c484b95a9 | 114 | { |
| bcostm | 0:c95c484b95a9 | 115 | /* Enable DMA1 clock -------------------------------------------------------*/ |
| bcostm | 0:c95c484b95a9 | 116 | __DMA1_CLK_ENABLE(); |
| bcostm | 0:c95c484b95a9 | 117 | |
| bcostm | 0:c95c484b95a9 | 118 | /* Configure the DMA1 CH5 IRQ Channel */ |
| bcostm | 0:c95c484b95a9 | 119 | DmaHandle.Init.Direction = DMA_MEMORY_TO_PERIPH; /* M2P transfer mode */ |
| bcostm | 0:c95c484b95a9 | 120 | DmaHandle.Init.PeriphInc = DMA_PINC_DISABLE; /* Peripheral increment mode Disable */ |
| bcostm | 0:c95c484b95a9 | 121 | DmaHandle.Init.MemInc = DMA_MINC_ENABLE; /* Memory increment mode Enable */ |
| bcostm | 0:c95c484b95a9 | 122 | DmaHandle.Init.PeriphDataAlignment = DMA_PDATAALIGN_WORD; /* Peripheral data alignment : Word */ |
| bcostm | 0:c95c484b95a9 | 123 | DmaHandle.Init.MemDataAlignment = DMA_MDATAALIGN_WORD; /* memory data alignment : Word */ |
| bcostm | 0:c95c484b95a9 | 124 | DmaHandle.Init.Mode = DMA_CIRCULAR; /* Circular Normal DMA mode */ |
| bcostm | 0:c95c484b95a9 | 125 | DmaHandle.Init.Priority = DMA_PRIORITY_HIGH; /* priority level : high */ |
| bcostm | 0:c95c484b95a9 | 126 | |
| bcostm | 0:c95c484b95a9 | 127 | DmaHandle.Instance = DMA1_Channel5; |
| bcostm | 0:c95c484b95a9 | 128 | |
| bcostm | 0:c95c484b95a9 | 129 | if (HAL_DMA_Init(&DmaHandle) != HAL_OK) |
| bcostm | 0:c95c484b95a9 | 130 | { |
| bcostm | 0:c95c484b95a9 | 131 | error("HAL_DMA_Init failed"); |
| bcostm | 0:c95c484b95a9 | 132 | } |
| bcostm | 0:c95c484b95a9 | 133 | } |
| bcostm | 0:c95c484b95a9 | 134 | |
| bcostm | 0:c95c484b95a9 | 135 | |
| bcostm | 0:c95c484b95a9 | 136 | void HiBrightLED::DAC_Config(void) |
| bcostm | 0:c95c484b95a9 | 137 | { |
| bcostm | 0:c95c484b95a9 | 138 | DAC_ChannelConfTypeDef DAC_ConfigStructure; |
| bcostm | 0:c95c484b95a9 | 139 | |
| bcostm | 0:c95c484b95a9 | 140 | #ifdef DEBUG_HIBRIGHT_LED |
| bcostm | 0:c95c484b95a9 | 141 | GPIO_InitTypeDef GPIO_InitStructure; |
| bcostm | 0:c95c484b95a9 | 142 | |
| bcostm | 0:c95c484b95a9 | 143 | /* Configure DAC1 OUT1 */ |
| bcostm | 0:c95c484b95a9 | 144 | /* GPIO Periph clock enable */ |
| bcostm | 0:c95c484b95a9 | 145 | __GPIOA_CLK_ENABLE(); |
| bcostm | 0:c95c484b95a9 | 146 | |
| bcostm | 0:c95c484b95a9 | 147 | /* Configure PA4 (DAC1_OUT1) as analog */ |
| bcostm | 0:c95c484b95a9 | 148 | GPIO_InitStructure.Pin = GPIO_PIN_4; |
| bcostm | 0:c95c484b95a9 | 149 | GPIO_InitStructure.Mode = GPIO_MODE_ANALOG; |
| bcostm | 0:c95c484b95a9 | 150 | GPIO_InitStructure.Pull = GPIO_NOPULL; |
| bcostm | 0:c95c484b95a9 | 151 | HAL_GPIO_Init(GPIOA, &GPIO_InitStructure); |
| bcostm | 0:c95c484b95a9 | 152 | #endif |
| bcostm | 0:c95c484b95a9 | 153 | |
| bcostm | 0:c95c484b95a9 | 154 | /* DAC1 Periph clock enable */ |
| bcostm | 0:c95c484b95a9 | 155 | __DAC1_CLK_ENABLE(); |
| bcostm | 0:c95c484b95a9 | 156 | |
| bcostm | 0:c95c484b95a9 | 157 | /* DAC1 deinitialize */ |
| bcostm | 0:c95c484b95a9 | 158 | DacHandle.Instance = DAC1; |
| bcostm | 0:c95c484b95a9 | 159 | if(HAL_DAC_DeInit(&DacHandle) != HAL_OK) |
| bcostm | 0:c95c484b95a9 | 160 | { |
| bcostm | 0:c95c484b95a9 | 161 | error("HAL_DAC_DeInit failed"); |
| bcostm | 0:c95c484b95a9 | 162 | } |
| bcostm | 0:c95c484b95a9 | 163 | |
| bcostm | 0:c95c484b95a9 | 164 | /* DAC Channel1 Init */ |
| bcostm | 0:c95c484b95a9 | 165 | if(HAL_DAC_Init(&DacHandle) != HAL_OK) |
| bcostm | 0:c95c484b95a9 | 166 | { |
| bcostm | 0:c95c484b95a9 | 167 | error("HAL_DAC_Init failed"); |
| bcostm | 0:c95c484b95a9 | 168 | } |
| bcostm | 0:c95c484b95a9 | 169 | |
| bcostm | 0:c95c484b95a9 | 170 | /* Fill DAC ConfigStructure */ |
| bcostm | 0:c95c484b95a9 | 171 | DAC_ConfigStructure.DAC_OutputBuffer = DAC_OUTPUTBUFFER_DISABLE; |
| bcostm | 0:c95c484b95a9 | 172 | DAC_ConfigStructure.DAC_Trigger = DAC_TRIGGER_NONE; |
| bcostm | 0:c95c484b95a9 | 173 | if(HAL_DAC_ConfigChannel(&DacHandle, &DAC_ConfigStructure, DAC1_CHANNEL_1) != HAL_OK) |
| bcostm | 0:c95c484b95a9 | 174 | { |
| bcostm | 0:c95c484b95a9 | 175 | error("HAL_DAC_ConfigChannel failed"); |
| bcostm | 0:c95c484b95a9 | 176 | } |
| bcostm | 0:c95c484b95a9 | 177 | |
| bcostm | 0:c95c484b95a9 | 178 | /* Enable DAC Channel1 */ |
| bcostm | 0:c95c484b95a9 | 179 | if(HAL_DAC_Start(&DacHandle, DAC1_CHANNEL_1) != HAL_OK) |
| bcostm | 0:c95c484b95a9 | 180 | { |
| bcostm | 0:c95c484b95a9 | 181 | error("HAL_DAC_Start failed"); |
| bcostm | 0:c95c484b95a9 | 182 | } |
| bcostm | 0:c95c484b95a9 | 183 | |
| bcostm | 0:c95c484b95a9 | 184 | /* Set DAC Channel1 DHR register: DAC1_OUT */ |
| bcostm | 0:c95c484b95a9 | 185 | if(HAL_DAC_SetValue(&DacHandle, DAC1_CHANNEL_1, DAC_ALIGN_12B_R, CurrentSenseTab[0]) != HAL_OK) |
| bcostm | 0:c95c484b95a9 | 186 | { |
| bcostm | 0:c95c484b95a9 | 187 | error("HAL_DAC_SetValue failed"); |
| bcostm | 0:c95c484b95a9 | 188 | } |
| bcostm | 0:c95c484b95a9 | 189 | } |
| bcostm | 0:c95c484b95a9 | 190 | |
| bcostm | 0:c95c484b95a9 | 191 | |
| bcostm | 0:c95c484b95a9 | 192 | void HiBrightLED::COMP_Config(void) |
| bcostm | 0:c95c484b95a9 | 193 | { |
| bcostm | 0:c95c484b95a9 | 194 | GPIO_InitTypeDef GPIO_InitStructure; |
| bcostm | 0:c95c484b95a9 | 195 | |
| bcostm | 0:c95c484b95a9 | 196 | /* Enable SYSCFG clock */ |
| bcostm | 0:c95c484b95a9 | 197 | //__SYSCFG_CLK_ENABLE(); |
| bcostm | 0:c95c484b95a9 | 198 | |
| bcostm | 0:c95c484b95a9 | 199 | /* GPIOB Peripheral clock enable */ |
| bcostm | 0:c95c484b95a9 | 200 | __GPIOB_CLK_ENABLE(); |
| bcostm | 0:c95c484b95a9 | 201 | |
| bcostm | 0:c95c484b95a9 | 202 | /* Configure PB0 in analog mode: PB0 is connected to COMP4 non inverting input */ |
| bcostm | 0:c95c484b95a9 | 203 | GPIO_InitStructure.Pin = GPIO_PIN_0; |
| bcostm | 0:c95c484b95a9 | 204 | GPIO_InitStructure.Mode = GPIO_MODE_ANALOG; |
| bcostm | 0:c95c484b95a9 | 205 | GPIO_InitStructure.Pull = GPIO_NOPULL; |
| bcostm | 0:c95c484b95a9 | 206 | HAL_GPIO_Init(GPIOB, &GPIO_InitStructure); |
| bcostm | 0:c95c484b95a9 | 207 | |
| bcostm | 0:c95c484b95a9 | 208 | #ifdef DEBUG_HIBRIGHT_LED |
| bcostm | 0:c95c484b95a9 | 209 | /* COMP4 output config: PB1 for debug */ |
| bcostm | 0:c95c484b95a9 | 210 | GPIO_InitStructure.Pin = GPIO_PIN_1; |
| bcostm | 0:c95c484b95a9 | 211 | GPIO_InitStructure.Mode = GPIO_MODE_AF_PP; |
| bcostm | 0:c95c484b95a9 | 212 | GPIO_InitStructure.Speed = GPIO_SPEED_HIGH; |
| bcostm | 0:c95c484b95a9 | 213 | GPIO_InitStructure.Pull = GPIO_NOPULL; |
| bcostm | 0:c95c484b95a9 | 214 | /* Alternate function configuration : Comparator4 Out2 / PB1 */ |
| bcostm | 0:c95c484b95a9 | 215 | GPIO_InitStructure.Alternate = GPIO_AF8_GPCOMP4; |
| bcostm | 0:c95c484b95a9 | 216 | HAL_GPIO_Init(GPIOB, &GPIO_InitStructure); |
| bcostm | 0:c95c484b95a9 | 217 | #endif |
| bcostm | 0:c95c484b95a9 | 218 | |
| bcostm | 0:c95c484b95a9 | 219 | /* COMP4 deinitialize */ |
| bcostm | 0:c95c484b95a9 | 220 | CompHandle.Instance = COMP4; |
| bcostm | 0:c95c484b95a9 | 221 | if(HAL_COMP_DeInit(&CompHandle) != HAL_OK) |
| bcostm | 0:c95c484b95a9 | 222 | { |
| bcostm | 0:c95c484b95a9 | 223 | error("HAL_COMP_DeInit failed"); |
| bcostm | 0:c95c484b95a9 | 224 | } |
| bcostm | 0:c95c484b95a9 | 225 | |
| bcostm | 0:c95c484b95a9 | 226 | /* COMP4 config */ |
| bcostm | 0:c95c484b95a9 | 227 | CompHandle.Init.InvertingInput = COMP_INVERTINGINPUT_DAC1; |
| bcostm | 0:c95c484b95a9 | 228 | CompHandle.Init.NonInvertingInput = 0; |
| bcostm | 0:c95c484b95a9 | 229 | CompHandle.Init.Output = COMP_OUTPUT_NONE; |
| bcostm | 0:c95c484b95a9 | 230 | CompHandle.Init.OutputPol = COMP_OUTPUTPOL_NONINVERTED; |
| bcostm | 0:c95c484b95a9 | 231 | CompHandle.Init.Hysteresis = COMP_HYSTERESIS_NONE; |
| bcostm | 0:c95c484b95a9 | 232 | CompHandle.Init.Mode = 0; |
| bcostm | 0:c95c484b95a9 | 233 | CompHandle.Init.BlankingSrce = COMP_BLANKINGSRCE_NONE; |
| bcostm | 0:c95c484b95a9 | 234 | CompHandle.Init.WindowMode = COMP_WINDOWMODE_DISABLED; |
| bcostm | 0:c95c484b95a9 | 235 | CompHandle.Init.TriggerMode = COMP_TRIGGERMODE_NONE; |
| bcostm | 0:c95c484b95a9 | 236 | if(HAL_COMP_Init(&CompHandle) != HAL_OK) |
| bcostm | 0:c95c484b95a9 | 237 | { |
| bcostm | 0:c95c484b95a9 | 238 | error("HAL_COMP_Init failed"); |
| bcostm | 0:c95c484b95a9 | 239 | } |
| bcostm | 0:c95c484b95a9 | 240 | |
| bcostm | 0:c95c484b95a9 | 241 | /* Enable COMP4 */ |
| bcostm | 0:c95c484b95a9 | 242 | if(HAL_COMP_Start(&CompHandle) != HAL_OK) |
| bcostm | 0:c95c484b95a9 | 243 | { |
| bcostm | 0:c95c484b95a9 | 244 | error("HAL_COMP_Start failed"); |
| bcostm | 0:c95c484b95a9 | 245 | } |
| bcostm | 0:c95c484b95a9 | 246 | } |
| bcostm | 0:c95c484b95a9 | 247 | |
| bcostm | 0:c95c484b95a9 | 248 | |
| bcostm | 0:c95c484b95a9 | 249 | void HiBrightLED::HRTIM_Config(void) |
| bcostm | 0:c95c484b95a9 | 250 | { |
| bcostm | 0:c95c484b95a9 | 251 | GPIO_InitTypeDef GPIO_InitStructure; |
| bcostm | 0:c95c484b95a9 | 252 | HRTIM_BurstModeCfgTypeDef HRTIM_BurstStructure; |
| bcostm | 0:c95c484b95a9 | 253 | HRTIM_CompareCfgTypeDef HRTIM_CompareStructure; |
| bcostm | 0:c95c484b95a9 | 254 | HRTIM_EventCfgTypeDef HRTIM_ExternalEventStructure; |
| bcostm | 0:c95c484b95a9 | 255 | HRTIM_OutputCfgTypeDef HRTIM_OutputStructure; |
| bcostm | 0:c95c484b95a9 | 256 | HRTIM_TimeBaseCfgTypeDef HRTIM_TimeBaseStructure; |
| bcostm | 0:c95c484b95a9 | 257 | HRTIM_TimerCfgTypeDef HRTIM_TimerWaveStructure; |
| bcostm | 0:c95c484b95a9 | 258 | |
| bcostm | 0:c95c484b95a9 | 259 | /* Configure HRTIM TIM C ****************************************************/ |
| bcostm | 0:c95c484b95a9 | 260 | /* HRTIM output channel configuration : HRTIM_CHC1 (Buck drive) / PB12 */ |
| bcostm | 0:c95c484b95a9 | 261 | GPIO_InitStructure.Pin = GPIO_PIN_12; |
| bcostm | 0:c95c484b95a9 | 262 | GPIO_InitStructure.Mode = GPIO_MODE_AF_PP; |
| bcostm | 0:c95c484b95a9 | 263 | GPIO_InitStructure.Speed = GPIO_SPEED_HIGH; |
| bcostm | 0:c95c484b95a9 | 264 | GPIO_InitStructure.Pull = GPIO_NOPULL; |
| bcostm | 0:c95c484b95a9 | 265 | /* Alternate function configuration : HRTIM_CHC1 / PB12 */ |
| bcostm | 0:c95c484b95a9 | 266 | GPIO_InitStructure.Alternate = GPIO_AF13_HRTIM1; |
| bcostm | 0:c95c484b95a9 | 267 | HAL_GPIO_Init(GPIOB, &GPIO_InitStructure); |
| bcostm | 0:c95c484b95a9 | 268 | |
| bcostm | 0:c95c484b95a9 | 269 | /* Use the PLLx2 clock for HRTIM */ |
| bcostm | 0:c95c484b95a9 | 270 | __HAL_RCC_HRTIM1_CONFIG(RCC_HRTIM1CLK_PLLCLK); |
| bcostm | 0:c95c484b95a9 | 271 | __HRTIM1_CLK_ENABLE(); |
| bcostm | 0:c95c484b95a9 | 272 | |
| bcostm | 0:c95c484b95a9 | 273 | HrtimHandle.Instance = HRTIM1; |
| bcostm | 0:c95c484b95a9 | 274 | HAL_HRTIM_Init(&HrtimHandle); |
| bcostm | 0:c95c484b95a9 | 275 | |
| bcostm | 0:c95c484b95a9 | 276 | /* DMA Configuration */ |
| bcostm | 0:c95c484b95a9 | 277 | __HAL_LINKDMA(&HrtimHandle, hdmaTimerC, DmaHandle); |
| bcostm | 0:c95c484b95a9 | 278 | |
| bcostm | 0:c95c484b95a9 | 279 | /* HRTIM initialization startup */ |
| bcostm | 0:c95c484b95a9 | 280 | if(HAL_HRTIM_DLLCalibrationStart(&HrtimHandle, HRTIM_CALIBRATIONRATE_14) != HAL_OK) |
| bcostm | 0:c95c484b95a9 | 281 | { |
| bcostm | 0:c95c484b95a9 | 282 | error("HAL_HRTIM_DLLCalibrationStart failed"); |
| bcostm | 0:c95c484b95a9 | 283 | } |
| bcostm | 0:c95c484b95a9 | 284 | |
| bcostm | 0:c95c484b95a9 | 285 | if(HAL_HRTIM_PollForDLLCalibration(&HrtimHandle, HAL_MAX_DELAY) != HAL_OK) |
| bcostm | 0:c95c484b95a9 | 286 | { |
| bcostm | 0:c95c484b95a9 | 287 | error("HAL_HRTIM_PollForDLLCalibration failed"); |
| bcostm | 0:c95c484b95a9 | 288 | } |
| bcostm | 0:c95c484b95a9 | 289 | |
| bcostm | 0:c95c484b95a9 | 290 | /* Configure the output features */ |
| bcostm | 0:c95c484b95a9 | 291 | HRTIM_OutputStructure.Polarity = HRTIM_OUTPUTPOLARITY_HIGH; |
| bcostm | 0:c95c484b95a9 | 292 | HRTIM_OutputStructure.SetSource = HRTIM_OUTPUTSET_TIMPER; |
| bcostm | 0:c95c484b95a9 | 293 | HRTIM_OutputStructure.ResetSource = HRTIM_OUTPUTRESET_EEV_2; |
| bcostm | 0:c95c484b95a9 | 294 | HRTIM_OutputStructure.IdleMode = HRTIM_OUTPUTIDLEMODE_IDLE; |
| bcostm | 0:c95c484b95a9 | 295 | HRTIM_OutputStructure.IdleLevel = HRTIM_OUTPUTIDLELEVEL_INACTIVE; |
| bcostm | 0:c95c484b95a9 | 296 | HRTIM_OutputStructure.FaultLevel = HRTIM_OUTPUTFAULTLEVEL_NONE; |
| bcostm | 0:c95c484b95a9 | 297 | HRTIM_OutputStructure.ChopperModeEnable = HRTIM_OUTPUTCHOPPERMODE_DISABLED; |
| bcostm | 0:c95c484b95a9 | 298 | HRTIM_OutputStructure.BurstModeEntryDelayed = HRTIM_OUTPUTBURSTMODEENTRY_REGULAR; |
| bcostm | 0:c95c484b95a9 | 299 | |
| bcostm | 0:c95c484b95a9 | 300 | if(HAL_HRTIM_WaveformOutputConfig(&HrtimHandle, HRTIM_TIMERINDEX_TIMER_C, |
| bcostm | 0:c95c484b95a9 | 301 | HRTIM_OUTPUT_TC1, &HRTIM_OutputStructure) != HAL_OK) |
| bcostm | 0:c95c484b95a9 | 302 | { |
| bcostm | 0:c95c484b95a9 | 303 | error("HAL_HRTIM_WaveformOutputConfig failed"); |
| bcostm | 0:c95c484b95a9 | 304 | } |
| bcostm | 0:c95c484b95a9 | 305 | |
| bcostm | 0:c95c484b95a9 | 306 | /* Configure HRTIM1_TIMC Deadtime */ |
| bcostm | 0:c95c484b95a9 | 307 | HRTIM_TimerWaveStructure.InterruptRequests = (HRTIM_MASTER_IT_NONE | HRTIM_TIM_IT_NONE); |
| bcostm | 0:c95c484b95a9 | 308 | HRTIM_TimerWaveStructure.DMARequests = (HRTIM_TIM_DMA_REP | HRTIM_TIM_DMA_CMP1 | HRTIM_TIM_DMA_CMP2 | |
| bcostm | 0:c95c484b95a9 | 309 | HRTIM_TIM_DMA_CMP3 | HRTIM_TIM_DMA_CMP4); |
| bcostm | 0:c95c484b95a9 | 310 | HRTIM_TimerWaveStructure.DMASrcAddress = (uint32_t)CurrentSenseTab; |
| bcostm | 0:c95c484b95a9 | 311 | HRTIM_TimerWaveStructure.DMADstAddress = (uint32_t)(&((&DacHandle)->Instance->DHR12R1)); |
| bcostm | 0:c95c484b95a9 | 312 | HRTIM_TimerWaveStructure.DMASize = 5; |
| bcostm | 0:c95c484b95a9 | 313 | HRTIM_TimerWaveStructure.HalfModeEnable = HRTIM_HALFMODE_DISABLED; |
| bcostm | 0:c95c484b95a9 | 314 | HRTIM_TimerWaveStructure.StartOnSync = HRTIM_SYNCSTART_DISABLED; |
| bcostm | 0:c95c484b95a9 | 315 | HRTIM_TimerWaveStructure.ResetOnSync = HRTIM_SYNCRESET_DISABLED; |
| bcostm | 0:c95c484b95a9 | 316 | HRTIM_TimerWaveStructure.DACSynchro = HRTIM_DACSYNC_NONE; |
| bcostm | 0:c95c484b95a9 | 317 | HRTIM_TimerWaveStructure.PreloadEnable = HRTIM_PRELOAD_DISABLED; |
| bcostm | 0:c95c484b95a9 | 318 | HRTIM_TimerWaveStructure.UpdateGating = HRTIM_UPDATEGATING_INDEPENDENT; |
| bcostm | 0:c95c484b95a9 | 319 | HRTIM_TimerWaveStructure.BurstMode = HRTIM_TIMERBURSTMODE_MAINTAINCLOCK; |
| bcostm | 0:c95c484b95a9 | 320 | HRTIM_TimerWaveStructure.RepetitionUpdate = HRTIM_UPDATEONREPETITION_DISABLED; |
| bcostm | 0:c95c484b95a9 | 321 | HRTIM_TimerWaveStructure.PushPull = HRTIM_TIMPUSHPULLMODE_DISABLED; |
| bcostm | 0:c95c484b95a9 | 322 | HRTIM_TimerWaveStructure.FaultEnable = HRTIM_TIMFAULTENABLE_NONE; |
| bcostm | 0:c95c484b95a9 | 323 | HRTIM_TimerWaveStructure.FaultLock = HRTIM_TIMFAULTLOCK_READWRITE; |
| bcostm | 0:c95c484b95a9 | 324 | HRTIM_TimerWaveStructure.DeadTimeInsertion = HRTIM_TIMDEADTIMEINSERTION_DISABLED; |
| bcostm | 0:c95c484b95a9 | 325 | HRTIM_TimerWaveStructure.DelayedProtectionMode = HRTIM_TIMDELAYEDPROTECTION_DISABLED; |
| bcostm | 0:c95c484b95a9 | 326 | HRTIM_TimerWaveStructure.UpdateTrigger = HRTIM_TIMUPDATETRIGGER_TIMER_C; |
| bcostm | 0:c95c484b95a9 | 327 | HRTIM_TimerWaveStructure.ResetTrigger = HRTIM_TIMRESETTRIGGER_NONE; |
| bcostm | 0:c95c484b95a9 | 328 | HRTIM_TimerWaveStructure.ResetUpdate = HRTIM_TIMUPDATEONRESET_DISABLED; |
| bcostm | 0:c95c484b95a9 | 329 | |
| bcostm | 0:c95c484b95a9 | 330 | if(HAL_HRTIM_WaveformTimerConfig(&HrtimHandle, HRTIM_TIMERINDEX_TIMER_C, &HRTIM_TimerWaveStructure) != HAL_OK) |
| bcostm | 0:c95c484b95a9 | 331 | { |
| bcostm | 0:c95c484b95a9 | 332 | error("HAL_HRTIM_WaveformTimerConfig failed"); |
| bcostm | 0:c95c484b95a9 | 333 | } |
| bcostm | 0:c95c484b95a9 | 334 | |
| bcostm | 0:c95c484b95a9 | 335 | HRTIM_CompareStructure.AutoDelayedMode = HRTIM_AUTODELAYEDMODE_REGULAR; |
| bcostm | 0:c95c484b95a9 | 336 | HRTIM_CompareStructure.AutoDelayedTimeout = 0; |
| bcostm | 0:c95c484b95a9 | 337 | HRTIM_CompareStructure.CompareValue = 3686; /* 20% time */ |
| bcostm | 0:c95c484b95a9 | 338 | |
| bcostm | 0:c95c484b95a9 | 339 | if(HAL_HRTIM_WaveformCompareConfig(&HrtimHandle, HRTIM_TIMERINDEX_TIMER_C, |
| bcostm | 0:c95c484b95a9 | 340 | HRTIM_COMPAREUNIT_1, &HRTIM_CompareStructure) != HAL_OK) |
| bcostm | 0:c95c484b95a9 | 341 | { |
| bcostm | 0:c95c484b95a9 | 342 | error("HAL_HRTIM_WaveformCompareConfig failed"); |
| bcostm | 0:c95c484b95a9 | 343 | } |
| bcostm | 0:c95c484b95a9 | 344 | |
| bcostm | 0:c95c484b95a9 | 345 | HRTIM_CompareStructure.AutoDelayedMode = HRTIM_AUTODELAYEDMODE_REGULAR; |
| bcostm | 0:c95c484b95a9 | 346 | HRTIM_CompareStructure.AutoDelayedTimeout = 0; |
| bcostm | 0:c95c484b95a9 | 347 | HRTIM_CompareStructure.CompareValue = 7373; /* 40% time */ |
| bcostm | 0:c95c484b95a9 | 348 | |
| bcostm | 0:c95c484b95a9 | 349 | if(HAL_HRTIM_WaveformCompareConfig(&HrtimHandle, HRTIM_TIMERINDEX_TIMER_C, |
| bcostm | 0:c95c484b95a9 | 350 | HRTIM_COMPAREUNIT_2, &HRTIM_CompareStructure) != HAL_OK) |
| bcostm | 0:c95c484b95a9 | 351 | { |
| bcostm | 0:c95c484b95a9 | 352 | error("HAL_HRTIM_WaveformCompareConfig failed"); |
| bcostm | 0:c95c484b95a9 | 353 | } |
| bcostm | 0:c95c484b95a9 | 354 | |
| bcostm | 0:c95c484b95a9 | 355 | HRTIM_CompareStructure.AutoDelayedMode = HRTIM_AUTODELAYEDMODE_REGULAR; |
| bcostm | 0:c95c484b95a9 | 356 | HRTIM_CompareStructure.AutoDelayedTimeout = 0; |
| bcostm | 0:c95c484b95a9 | 357 | HRTIM_CompareStructure.CompareValue = 11059; /* 60% time */ |
| bcostm | 0:c95c484b95a9 | 358 | |
| bcostm | 0:c95c484b95a9 | 359 | if(HAL_HRTIM_WaveformCompareConfig(&HrtimHandle, HRTIM_TIMERINDEX_TIMER_C, |
| bcostm | 0:c95c484b95a9 | 360 | HRTIM_COMPAREUNIT_3, &HRTIM_CompareStructure) != HAL_OK) |
| bcostm | 0:c95c484b95a9 | 361 | { |
| bcostm | 0:c95c484b95a9 | 362 | error("HAL_HRTIM_WaveformCompareConfig failed"); |
| bcostm | 0:c95c484b95a9 | 363 | } |
| bcostm | 0:c95c484b95a9 | 364 | |
| bcostm | 0:c95c484b95a9 | 365 | HRTIM_CompareStructure.AutoDelayedMode = HRTIM_AUTODELAYEDMODE_REGULAR; |
| bcostm | 0:c95c484b95a9 | 366 | HRTIM_CompareStructure.AutoDelayedTimeout = 0; |
| bcostm | 0:c95c484b95a9 | 367 | HRTIM_CompareStructure.CompareValue = 14746; /* 80% time */ |
| bcostm | 0:c95c484b95a9 | 368 | |
| bcostm | 0:c95c484b95a9 | 369 | if(HAL_HRTIM_WaveformCompareConfig(&HrtimHandle, HRTIM_TIMERINDEX_TIMER_C, |
| bcostm | 0:c95c484b95a9 | 370 | HRTIM_COMPAREUNIT_4, &HRTIM_CompareStructure) != HAL_OK) |
| bcostm | 0:c95c484b95a9 | 371 | { |
| bcostm | 0:c95c484b95a9 | 372 | error("HAL_HRTIM_WaveformCompareConfig failed"); |
| bcostm | 0:c95c484b95a9 | 373 | } |
| bcostm | 0:c95c484b95a9 | 374 | |
| bcostm | 0:c95c484b95a9 | 375 | HRTIM_TimeBaseStructure.Period = 18432; /* 1 period = 4 µs = 100% time */ |
| bcostm | 0:c95c484b95a9 | 376 | HRTIM_TimeBaseStructure.RepetitionCounter = 0x00; |
| bcostm | 0:c95c484b95a9 | 377 | HRTIM_TimeBaseStructure.PrescalerRatio = HRTIM_PRESCALERRATIO_MUL32; |
| bcostm | 0:c95c484b95a9 | 378 | HRTIM_TimeBaseStructure.Mode = HRTIM_MODE_CONTINUOUS; |
| bcostm | 0:c95c484b95a9 | 379 | |
| bcostm | 0:c95c484b95a9 | 380 | if(HAL_HRTIM_TimeBaseConfig(&HrtimHandle, HRTIM_TIMERINDEX_TIMER_C, &HRTIM_TimeBaseStructure) != HAL_OK) |
| bcostm | 0:c95c484b95a9 | 381 | { |
| bcostm | 0:c95c484b95a9 | 382 | error("HAL_HRTIM_TimeBaseConfig failed"); |
| bcostm | 0:c95c484b95a9 | 383 | } |
| bcostm | 0:c95c484b95a9 | 384 | |
| bcostm | 0:c95c484b95a9 | 385 | /* Configure External Event Source 2 */ |
| bcostm | 0:c95c484b95a9 | 386 | HRTIM_ExternalEventStructure.Source = HRTIM_EVENTSRC_2; |
| bcostm | 0:c95c484b95a9 | 387 | HRTIM_ExternalEventStructure.Polarity = HRTIM_EVENTPOLARITY_HIGH; |
| bcostm | 0:c95c484b95a9 | 388 | HRTIM_ExternalEventStructure.Sensitivity = HRTIM_EVENTSENSITIVITY_LEVEL; |
| bcostm | 0:c95c484b95a9 | 389 | HRTIM_ExternalEventStructure.FastMode = HRTIM_EVENTFASTMODE_ENABLE; |
| bcostm | 0:c95c484b95a9 | 390 | HRTIM_ExternalEventStructure.Filter = HRTIM_EVENTFILTER_NONE; |
| bcostm | 0:c95c484b95a9 | 391 | |
| bcostm | 0:c95c484b95a9 | 392 | if(HAL_HRTIM_EventConfig(&HrtimHandle, HRTIM_EVENT_2, &HRTIM_ExternalEventStructure) != HAL_OK) |
| bcostm | 0:c95c484b95a9 | 393 | { |
| bcostm | 0:c95c484b95a9 | 394 | error("HAL_HRTIM_EventConfig failed"); |
| bcostm | 0:c95c484b95a9 | 395 | } |
| bcostm | 0:c95c484b95a9 | 396 | |
| bcostm | 0:c95c484b95a9 | 397 | /* Burst Mode configuration */ |
| bcostm | 0:c95c484b95a9 | 398 | HRTIM_BurstStructure.Mode = HRTIM_BURSTMODE_CONTINOUS; |
| bcostm | 0:c95c484b95a9 | 399 | HRTIM_BurstStructure.ClockSource = HRTIM_BURSTMODECLOCKSOURCE_TIMER_C; |
| bcostm | 0:c95c484b95a9 | 400 | HRTIM_BurstStructure.Prescaler = HRTIM_BURSTMODEPRESCALER_DIV1; |
| bcostm | 0:c95c484b95a9 | 401 | HRTIM_BurstStructure.PreloadEnable = HRIM_BURSTMODEPRELOAD_ENABLED; |
| bcostm | 0:c95c484b95a9 | 402 | HRTIM_BurstStructure.Trigger = HRTIM_BURSTMODETRIGGER_NONE; |
| bcostm | 0:c95c484b95a9 | 403 | HRTIM_BurstStructure.IdleDuration = MIN_INTENSITY; |
| bcostm | 0:c95c484b95a9 | 404 | HRTIM_BurstStructure.Period = MIN_INTENSITY; |
| bcostm | 0:c95c484b95a9 | 405 | |
| bcostm | 0:c95c484b95a9 | 406 | if(HAL_HRTIM_BurstModeConfig(&HrtimHandle, &HRTIM_BurstStructure) != HAL_OK) |
| bcostm | 0:c95c484b95a9 | 407 | { |
| bcostm | 0:c95c484b95a9 | 408 | error("HAL_HRTIM_BurstModeConfig failed"); |
| bcostm | 0:c95c484b95a9 | 409 | } |
| bcostm | 0:c95c484b95a9 | 410 | |
| bcostm | 0:c95c484b95a9 | 411 | /* Enable the TC1 output */ |
| bcostm | 0:c95c484b95a9 | 412 | if(HAL_HRTIM_WaveformOutputStart(&HrtimHandle, HRTIM_OUTPUT_TC1) != HAL_OK) |
| bcostm | 0:c95c484b95a9 | 413 | { |
| bcostm | 0:c95c484b95a9 | 414 | error("HAL_HRTIM_WaveformOutputStart failed"); |
| bcostm | 0:c95c484b95a9 | 415 | } |
| bcostm | 0:c95c484b95a9 | 416 | |
| bcostm | 0:c95c484b95a9 | 417 | if(HAL_HRTIM_BurstModeCtl(&HrtimHandle, HRTIM_BURSTMODECTL_ENABLED) != HAL_OK) |
| bcostm | 0:c95c484b95a9 | 418 | { |
| bcostm | 0:c95c484b95a9 | 419 | error("HAL_HRTIM_BurstModeCtl failed"); |
| bcostm | 0:c95c484b95a9 | 420 | } |
| bcostm | 0:c95c484b95a9 | 421 | |
| bcostm | 0:c95c484b95a9 | 422 | /* Start slave*/ |
| bcostm | 0:c95c484b95a9 | 423 | if(HAL_HRTIM_WaveformCounterStart_DMA(&HrtimHandle, HRTIM_TIMERID_TIMER_C) != HAL_OK) |
| bcostm | 0:c95c484b95a9 | 424 | { |
| bcostm | 0:c95c484b95a9 | 425 | error("HAL_HRTIM_WaveformCounterStart_DMA failed"); |
| bcostm | 0:c95c484b95a9 | 426 | } |
| bcostm | 0:c95c484b95a9 | 427 | |
| bcostm | 0:c95c484b95a9 | 428 | /* Configure and enable HRTIM interrupt */ |
| bcostm | 0:c95c484b95a9 | 429 | HAL_NVIC_SetPriority(HRTIM1_Master_IRQn, 0, 0); |
| bcostm | 0:c95c484b95a9 | 430 | HAL_NVIC_EnableIRQ(HRTIM1_Master_IRQn); |
| bcostm | 0:c95c484b95a9 | 431 | |
| bcostm | 0:c95c484b95a9 | 432 | /* Enable Burst mode period completed interrupt */ |
| bcostm | 0:c95c484b95a9 | 433 | HrtimHandle.Init.HRTIMInterruptResquests = HRTIM_IT_BMPER; |
| bcostm | 0:c95c484b95a9 | 434 | |
| bcostm | 0:c95c484b95a9 | 435 | /* Select Burst Trigger */ |
| bcostm | 0:c95c484b95a9 | 436 | if(HAL_HRTIM_BurstModeSoftwareTrigger(&HrtimHandle) != HAL_OK) |
| bcostm | 0:c95c484b95a9 | 437 | { |
| bcostm | 0:c95c484b95a9 | 438 | error("HAL_HRTIM_BurstModeSoftwareTrigger failed"); |
| bcostm | 0:c95c484b95a9 | 439 | } |
| bcostm | 0:c95c484b95a9 | 440 | } |
| bcostm | 0:c95c484b95a9 | 441 | |
| bcostm | 0:c95c484b95a9 | 442 | |
| bcostm | 0:c95c484b95a9 | 443 | void HiBrightLED::HRTIM_SetBurstCompare(uint16_t BurstCompare) |
| bcostm | 0:c95c484b95a9 | 444 | { |
| bcostm | 0:c95c484b95a9 | 445 | /* Set Burst Compare value */ |
| bcostm | 0:c95c484b95a9 | 446 | HrtimHandle.Instance->sCommonRegs.BMCMPR = BurstCompare; |
| bcostm | 0:c95c484b95a9 | 447 | } |
| bcostm | 0:c95c484b95a9 | 448 |