-
-
Save matthewphilyaw/e4fa418e6ebc43b76414e9d61b6841d2 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#include <stm32f303x8.h> | |
#include "main.h" | |
#define VDDA_APPLI ((uint32_t)3300) | |
#define DIGITAL_SCALE_12BITS (__LL_DAC_DIGITAL_SCALE(LL_DAC_RESOLUTION_12B)) | |
#define WAVEFORM_AMPLITUDE (VDDA_APPLI) | |
#define WAVEFORM_FREQUENCY ((uint32_t)1000) | |
#define WAVEFORM_SAMPLES_SIZE (sizeof (WaveformSine_12bits_32samples) / sizeof (uint16_t)) | |
#define WAVEFORM_TIMER_FREQUENCY (WAVEFORM_FREQUENCY * WAVEFORM_SAMPLES_SIZE) | |
#define WAVEFORM_TIMER_FREQUENCY_RANGE_MIN ((uint32_t) 1) | |
#define WAVEFORM_TIMER_PRESCALER_MAX_VALUE ((uint32_t)0xFFFF-1) | |
#define __WAVEFORM_AMPLITUDE_SCALING(__DATA_12BITS__) \ | |
(__DATA_12BITS__ \ | |
* __LL_DAC_CALC_VOLTAGE_TO_DATA(VDDA_APPLI, WAVEFORM_AMPLITUDE, LL_DAC_RESOLUTION_12B) \ | |
/ __LL_DAC_DIGITAL_SCALE(LL_DAC_RESOLUTION_12B) \ | |
) | |
uint16_t WaveformSine_12bits_32samples[] = | |
{ | |
__WAVEFORM_AMPLITUDE_SCALING(2048), | |
__WAVEFORM_AMPLITUDE_SCALING(2447), | |
__WAVEFORM_AMPLITUDE_SCALING(2831), | |
__WAVEFORM_AMPLITUDE_SCALING(3185), | |
__WAVEFORM_AMPLITUDE_SCALING(3495), | |
__WAVEFORM_AMPLITUDE_SCALING(3750), | |
__WAVEFORM_AMPLITUDE_SCALING(3939), | |
__WAVEFORM_AMPLITUDE_SCALING(4056), | |
__WAVEFORM_AMPLITUDE_SCALING(4095), | |
__WAVEFORM_AMPLITUDE_SCALING(4056), | |
__WAVEFORM_AMPLITUDE_SCALING(3939), | |
__WAVEFORM_AMPLITUDE_SCALING(3750), | |
__WAVEFORM_AMPLITUDE_SCALING(3495), | |
__WAVEFORM_AMPLITUDE_SCALING(3185), | |
__WAVEFORM_AMPLITUDE_SCALING(2831), | |
__WAVEFORM_AMPLITUDE_SCALING(2447), | |
__WAVEFORM_AMPLITUDE_SCALING(2048), | |
__WAVEFORM_AMPLITUDE_SCALING(1649), | |
__WAVEFORM_AMPLITUDE_SCALING(1265), | |
__WAVEFORM_AMPLITUDE_SCALING(911), | |
__WAVEFORM_AMPLITUDE_SCALING(601), | |
__WAVEFORM_AMPLITUDE_SCALING(346), | |
__WAVEFORM_AMPLITUDE_SCALING(157), | |
__WAVEFORM_AMPLITUDE_SCALING(40), | |
__WAVEFORM_AMPLITUDE_SCALING(0), | |
__WAVEFORM_AMPLITUDE_SCALING(40), | |
__WAVEFORM_AMPLITUDE_SCALING(157), | |
__WAVEFORM_AMPLITUDE_SCALING(346), | |
__WAVEFORM_AMPLITUDE_SCALING(601), | |
__WAVEFORM_AMPLITUDE_SCALING(911), | |
__WAVEFORM_AMPLITUDE_SCALING(1265), | |
__WAVEFORM_AMPLITUDE_SCALING(1649) | |
}; | |
void SystemClock_Config(void); | |
void Configure_DMA(void); | |
void Configure_TIM_TimeBase_DAC_trigger(void); | |
void Configure_DAC(void); | |
void Activate_DAC(void); | |
void LED_Init(void); | |
void LED_On(void); | |
void LED_Off(void); | |
static uint32_t tim_led_on = 0; | |
int main(void) | |
{ | |
/* Configure the system clock to 64 MHz */ | |
SystemClock_Config(); | |
/* Initialize LED2 */ | |
LED_Init(); | |
/* Turn-off LED2 */ | |
LED_Off(); | |
/* Configure DMA for data transfer from DAC */ | |
Configure_DMA(); | |
/* Configure timer as a time base used to trig DAC conversion start */ | |
Configure_TIM_TimeBase_DAC_trigger(); | |
/* Configure DAC channel */ | |
Configure_DAC(); | |
/* Activate DAC channel */ | |
Activate_DAC(); | |
/* Turn-on LED2 */ | |
LED_On(); | |
/* Infinite loop */ | |
while (1) | |
{ | |
LL_mDelay(250); | |
} | |
} | |
void Configure_DMA(void) | |
{ | |
/*## Configuration of NVIC #################################################*/ | |
/* Configure NVIC to enable DMA interruptions */ | |
NVIC_SetPriority(DMA1_Channel3_IRQn, 1); /* DMA IRQ lower priority than DAC IRQ */ | |
NVIC_EnableIRQ(DMA1_Channel3_IRQn); | |
/*## Configuration of DMA ##################################################*/ | |
/* Enable the peripheral clock of DMA */ | |
LL_AHB1_GRP1_EnableClock(LL_AHB1_GRP1_PERIPH_DMA1); | |
/* Specificity for this device: Remap DMA for the selected DAC channel */ | |
LL_SYSCFG_SetRemapDMA_DAC(LL_SYSCFG_DAC1_CH1_RMP_DMA1_CH3); | |
/* Configure the DMA transfer */ | |
/* - DMA transfer in circular mode to have an unlimited DAC signal */ | |
/* generation. */ | |
/* - DMA transfer to DAC without address increment. */ | |
/* - DMA transfer from memory with address increment. */ | |
/* - DMA transfer to DAC by half-word to match with DAC resolution 12 bits */ | |
/* - DMA transfer from memory by half-word to match with DAC data */ | |
/* buffer variable type: half-word. */ | |
LL_DMA_ConfigTransfer(DMA1, | |
LL_DMA_CHANNEL_3, | |
LL_DMA_DIRECTION_MEMORY_TO_PERIPH | | |
LL_DMA_MODE_CIRCULAR | | |
LL_DMA_PERIPH_NOINCREMENT | | |
LL_DMA_MEMORY_INCREMENT | | |
LL_DMA_PDATAALIGN_HALFWORD | | |
LL_DMA_MDATAALIGN_HALFWORD | | |
LL_DMA_PRIORITY_HIGH); | |
/* Set DMA transfer addresses of source and destination */ | |
LL_DMA_ConfigAddresses(DMA1, | |
LL_DMA_CHANNEL_3, | |
(uint32_t)&WaveformSine_12bits_32samples, | |
LL_DAC_DMA_GetRegAddr(DAC1, LL_DAC_CHANNEL_1, LL_DAC_DMA_REG_DATA_12BITS_RIGHT_ALIGNED), | |
LL_DMA_DIRECTION_MEMORY_TO_PERIPH); | |
/* Set DMA transfer size */ | |
LL_DMA_SetDataLength(DMA1, | |
LL_DMA_CHANNEL_3, | |
WAVEFORM_SAMPLES_SIZE); | |
/* Enable DMA transfer interruption: transfer error */ | |
LL_DMA_EnableIT_TE(DMA1, | |
LL_DMA_CHANNEL_3); | |
/* Note: In this example, the only DMA interruption activated is */ | |
/* tranfer error. */ | |
/* If needed, DMA interruptions of half of transfer */ | |
/* and transfer complete can be activated. */ | |
/* Refer to DMA examples. */ | |
/*## Activation of DMA #####################################################*/ | |
/* Enable the DMA transfer */ | |
LL_DMA_EnableChannel(DMA1, | |
LL_DMA_CHANNEL_3); | |
} | |
/** | |
* @brief Configure timer as a time base (timer instance: TIM6) | |
* used to trig DAC conversion. | |
* @note In this DC example, timer instance must be on APB1 (clocked by PCLK1) | |
* to be compliant with frequency calculation used in this function. | |
* @param None | |
* @retval None | |
*/ | |
void Configure_TIM_TimeBase_DAC_trigger(void) | |
{ | |
uint32_t timer_clock_frequency = 0; /* Timer clock frequency */ | |
uint32_t timer_prescaler = 0; /* Time base prescaler to have timebase aligned on minimum frequency possible */ | |
uint32_t timer_reload = 0; /* Timer reload value in function of timer prescaler to achieve time base period */ | |
/*## Configuration of NVIC #################################################*/ | |
/* Note: In this example, timer interruptions are not activated. */ | |
/* If needed, timer interruption at each time base period is */ | |
/* possible. */ | |
/* Refer to timer examples. */ | |
/*## Configuration of timer ################################################*/ | |
/* Configuration of timer as time base: */ | |
/* Caution: Computation of frequency is done for a timer instance on APB1 */ | |
/* (clocked by PCLK1) */ | |
/* Timer frequency is configured from the following constants: */ | |
/* - WAVEFORM_TIMER_FREQUENCY: timer frequency (unit: Hz). */ | |
/* - WAVEFORM_TIMER_FREQUENCY_RANGE_MIN: timer minimum frequency possible */ | |
/* (unit: Hz). */ | |
/* Note: Refer to comments at these literals definition for more details. */ | |
/* Retrieve timer clock source frequency */ | |
/* If APB1 prescaler is different of 1, timers have a factor x2 on their */ | |
/* clock source. */ | |
if (LL_RCC_GetAPB1Prescaler() == LL_RCC_APB1_DIV_1) | |
{ | |
timer_clock_frequency = __LL_RCC_CALC_PCLK1_FREQ(SystemCoreClock, LL_RCC_GetAPB1Prescaler()); | |
} | |
else | |
{ | |
timer_clock_frequency = (__LL_RCC_CALC_PCLK1_FREQ(SystemCoreClock, LL_RCC_GetAPB1Prescaler()) * 2); | |
} | |
/* Timer prescaler calculation */ | |
/* (computation for timer 16 bits, additional + 1 to round the prescaler up) */ | |
timer_prescaler = ((timer_clock_frequency / (WAVEFORM_TIMER_PRESCALER_MAX_VALUE * WAVEFORM_TIMER_FREQUENCY_RANGE_MIN)) +1); | |
/* Timer reload calculation */ | |
timer_reload = (timer_clock_frequency / (timer_prescaler * WAVEFORM_TIMER_FREQUENCY)); | |
/* Enable the timer peripheral clock */ | |
LL_APB1_GRP1_EnableClock(LL_APB1_GRP1_PERIPH_TIM6); | |
/* Set timer pre-scaler value */ | |
LL_TIM_SetPrescaler(TIM6, (timer_prescaler - 1)); | |
/* Set timer auto-reload value */ | |
LL_TIM_SetAutoReload(TIM6, (timer_reload - 1)); | |
/* Set counter mode */ | |
LL_TIM_SetCounterMode(TIM6, LL_TIM_COUNTERMODE_UP); | |
/* Note: In this example, timer interruptions are not activated. */ | |
/* If needed, timer interruption at each time base period is */ | |
/* possible. */ | |
/* Refer to timer examples. */ | |
/* Set timer the trigger output (TRGO) */ | |
LL_TIM_SetTriggerOutput(TIM6, LL_TIM_TRGO_UPDATE); | |
/*## Activation of timer ###################################################*/ | |
/* Enable counter */ | |
TIM6->DIER |= 0x1; | |
LL_TIM_EnableCounter(TIM6); | |
} | |
void Configure_DAC(void) | |
{ | |
/*## Configuration of GPIO used by DAC channels ############################*/ | |
/* Enable GPIO Clock */ | |
LL_AHB1_GRP1_EnableClock(LL_AHB1_GRP1_PERIPH_GPIOA); | |
/* Configure GPIO in analog mode to be used as DAC output */ | |
LL_GPIO_SetPinMode(GPIOA, LL_GPIO_PIN_4, LL_GPIO_MODE_ANALOG); | |
/*## Configuration of NVIC #################################################*/ | |
/* Configure NVIC to enable DAC1 interruptions */ | |
NVIC_SetPriority(TIM6_DAC1_IRQn, 0); | |
NVIC_EnableIRQ(TIM6_DAC1_IRQn); | |
/*## Configuration of DAC ##################################################*/ | |
/* Enable DAC clock */ | |
LL_APB1_GRP1_EnableClock(LL_APB1_GRP1_PERIPH_DAC1); | |
/* Select trigger source */ | |
LL_DAC_SetTriggerSource(DAC1, LL_DAC_CHANNEL_1, LL_DAC_TRIG_EXT_TIM6_TRGO); | |
/* Set the output for the selected DAC channel */ | |
//LL_DAC_SetOutputBuffer(DAC1, LL_DAC_CHANNEL_1, LL_DAC_OUTPUT_BUFFER_ENABLE); | |
/* Enable DAC channel DMA request */ | |
LL_DAC_EnableDMAReq(DAC1, LL_DAC_CHANNEL_1); | |
/* Enable interruption DAC channel1 underrun */ | |
LL_DAC_EnableIT_DMAUDR1(DAC1); | |
} | |
void Activate_DAC(void) | |
{ | |
__IO uint32_t wait_loop_index = 0; | |
/* Enable DAC channel */ | |
LL_DAC_Enable(DAC1, LL_DAC_CHANNEL_1); | |
/* Delay for DAC channel voltage settling time from DAC channel startup. */ | |
/* Compute number of CPU cycles to wait for, from delay in us. */ | |
/* Note: Variable divided by 2 to compensate partially */ | |
/* CPU processing cycles (depends on compilation optimization). */ | |
/* Note: If system core clock frequency is below 200kHz, wait time */ | |
/* is only a few CPU processing cycles. */ | |
wait_loop_index = ((LL_DAC_DELAY_STARTUP_VOLTAGE_SETTLING_US * (SystemCoreClock / (100000 * 2))) / 10); | |
while(wait_loop_index != 0) | |
{ | |
wait_loop_index--; | |
} | |
/* Enable DAC channel trigger */ | |
/* Note: DAC channel conversion can start from trigger enable: */ | |
/* - if DAC channel trigger source is set to SW: */ | |
/* DAC channel conversion will start after trig order */ | |
/* using function "LL_DAC_TrigSWConversion()". */ | |
/* - if DAC channel trigger source is set to external trigger */ | |
/* (timer, ...): */ | |
/* DAC channel conversion can start immediately */ | |
/* (after next trig order from external trigger) */ | |
LL_DAC_EnableTrigger(DAC1, LL_DAC_CHANNEL_1); | |
} | |
void LED_Init(void) | |
{ | |
/* Enable the LED2 Clock */ | |
LED2_GPIO_CLK_ENABLE(); | |
/* Configure IO in output push-pull mode to drive external LED2 */ | |
LL_GPIO_SetPinMode(LED2_GPIO_PORT, LED2_PIN, LL_GPIO_MODE_OUTPUT); | |
/* Reset value is LL_GPIO_OUTPUT_PUSHPULL */ | |
//LL_GPIO_SetPinOutputType(LED2_GPIO_PORT, LED2_PIN, LL_GPIO_OUTPUT_PUSHPULL); | |
/* Reset value is LL_GPIO_SPEED_FREQ_LOW */ | |
//LL_GPIO_SetPinSpeed(LED2_GPIO_PORT, LED2_PIN, LL_GPIO_SPEED_FREQ_LOW); | |
/* Reset value is LL_GPIO_PULL_NO */ | |
//LL_GPIO_SetPinPull(LED2_GPIO_PORT, LED2_PIN, LL_GPIO_PULL_NO); | |
LL_AHB1_GRP1_EnableClock(LL_AHB1_GRP1_PERIPH_GPIOA); | |
LL_AHB1_GRP1_EnableClock(LL_AHB1_GRP1_PERIPH_GPIOB); | |
LL_GPIO_SetPinMode(GPIOA, LL_GPIO_PIN_12, LL_GPIO_MODE_OUTPUT); | |
LL_GPIO_SetPinOutputType(GPIOA, LL_GPIO_PIN_12, LL_GPIO_OUTPUT_PUSHPULL); | |
LL_GPIO_SetPinSpeed(GPIOA, LL_GPIO_PIN_12, LL_GPIO_SPEED_FREQ_HIGH); | |
LL_GPIO_SetPinPull(GPIOA, LL_GPIO_PIN_12, LL_GPIO_PULL_NO); | |
LL_GPIO_SetPinMode(GPIOB, LL_GPIO_PIN_0, LL_GPIO_MODE_OUTPUT); | |
LL_GPIO_SetPinOutputType(GPIOB, LL_GPIO_PIN_0, LL_GPIO_OUTPUT_PUSHPULL); | |
LL_GPIO_SetPinSpeed(GPIOB, LL_GPIO_PIN_0, LL_GPIO_SPEED_FREQ_HIGH); | |
LL_GPIO_SetPinPull(GPIOB, LL_GPIO_PIN_0, LL_GPIO_PULL_NO); | |
} | |
void LED_On(void) | |
{ | |
/* Turn LED2 on */ | |
LL_GPIO_SetOutputPin(LED2_GPIO_PORT, LED2_PIN); | |
} | |
void LED_Off(void) | |
{ | |
/* Turn LED2 off */ | |
LL_GPIO_ResetOutputPin(LED2_GPIO_PORT, LED2_PIN); | |
} | |
void LED_Blinking(uint32_t Period) | |
{ | |
/* Turn LED2 on */ | |
LL_GPIO_SetOutputPin(LED2_GPIO_PORT, LED2_PIN); | |
/* Toggle IO in an infinite loop */ | |
while (1) | |
{ | |
LL_GPIO_TogglePin(LED2_GPIO_PORT, LED2_PIN); | |
LL_mDelay(Period); | |
} | |
} | |
void SystemClock_Config(void) | |
{ | |
/* Set FLASH latency */ | |
LL_FLASH_SetLatency(LL_FLASH_LATENCY_2); | |
/* Enable HSI if not already activated*/ | |
if (LL_RCC_HSI_IsReady() == 0) | |
{ | |
/* Enable HSI and wait for activation*/ | |
LL_RCC_HSI_Enable(); | |
while(LL_RCC_HSI_IsReady() != 1) | |
{ | |
}; | |
} | |
/* Main PLL configuration and activation */ | |
LL_RCC_PLL_ConfigDomain_SYS(LL_RCC_PLLSOURCE_HSI_DIV_2, LL_RCC_PLL_MUL_16); | |
LL_RCC_PLL_Enable(); | |
while(LL_RCC_PLL_IsReady() != 1) | |
{ | |
}; | |
/* Sysclk activation on the main PLL */ | |
LL_RCC_SetAHBPrescaler(LL_RCC_SYSCLK_DIV_1); | |
LL_RCC_SetSysClkSource(LL_RCC_SYS_CLKSOURCE_PLL); | |
while(LL_RCC_GetSysClkSource() != LL_RCC_SYS_CLKSOURCE_STATUS_PLL) | |
{ | |
}; | |
/* Set APB1 & APB2 prescaler*/ | |
LL_RCC_SetAPB1Prescaler(LL_RCC_APB1_DIV_2); | |
LL_RCC_SetAPB2Prescaler(LL_RCC_APB2_DIV_1); | |
/* Set systick to 1ms in using frequency set to 64MHz */ | |
/* This frequency can be calculated through LL RCC macro */ | |
/* ex: __LL_RCC_CALC_PLLCLK_FREQ ((HSI_VALUE / 2), LL_RCC_PLL_MUL_16) */ | |
LL_Init1msTick(64000000); | |
/* Update CMSIS variable (which can be updated also through SystemCoreClockUpdate function) */ | |
LL_SetSystemCoreClock(64000000); | |
} | |
/******************************************************************************/ | |
/* USER IRQ HANDLER TREATMENT */ | |
/******************************************************************************/ | |
/** | |
* @brief DMA transfer error callback | |
* @note This function is executed when the transfer error interrupt | |
* is generated during DMA transfer | |
* @retval None | |
*/ | |
void DacDmaTransferError_Callback() | |
{ | |
/* Error detected during DMA transfer */ | |
LED_Blinking(LED_BLINK_ERROR * 2); | |
} | |
/** | |
* @brief DAC underrun interruption callback | |
* @note This function is executed when DAC channel underrun error occurs. | |
* @retval None | |
*/ | |
void DacUnderrunError_Callback(void) | |
{ | |
/* Note: Disable DAC interruption that caused this error before entering in */ | |
/* infinite loop below. */ | |
/* Disable interruption DAC channel1 underrun */ | |
LL_DAC_DisableIT_DMAUDR1(DAC1); | |
/* Error from ADC */ | |
LED_Blinking(LED_BLINK_ERROR / 4); | |
} | |
void TIM6_Update_Handler(void) { | |
if (tim_led_on) { | |
LL_GPIO_SetOutputPin(GPIOA, LL_GPIO_PIN_12); | |
} | |
else { | |
LL_GPIO_ResetOutputPin(GPIOA, LL_GPIO_PIN_12); | |
} | |
tim_led_on = !tim_led_on; | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/** | |
****************************************************************************** | |
* @file Examples_LL/DAC/DAC_GenerateWaveform_TriggerHW/Inc/main.h | |
* @author MCD Application Team | |
* @brief Header for main.c module | |
****************************************************************************** | |
* @attention | |
* | |
* <h2><center>© COPYRIGHT(c) 2016 STMicroelectronics</center></h2> | |
* | |
* Redistribution and use in source and binary forms, with or without modification, | |
* are permitted provided that the following conditions are met: | |
* 1. Redistributions of source code must retain the above copyright notice, | |
* this list of conditions and the following disclaimer. | |
* 2. Redistributions in binary form must reproduce the above copyright notice, | |
* this list of conditions and the following disclaimer in the documentation | |
* and/or other materials provided with the distribution. | |
* 3. Neither the name of STMicroelectronics nor the names of its contributors | |
* may be used to endorse or promote products derived from this software | |
* without specific prior written permission. | |
* | |
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" | |
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE | |
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE | |
* DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE | |
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL | |
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR | |
* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER | |
* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, | |
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE | |
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | |
* | |
****************************************************************************** | |
*/ | |
/* Define to prevent recursive inclusion -------------------------------------*/ | |
#ifndef __MAIN_H | |
#define __MAIN_H | |
/* Includes ------------------------------------------------------------------*/ | |
#include "stm32f3xx_ll_bus.h" | |
#include "stm32f3xx_ll_rcc.h" | |
#include "stm32f3xx_ll_system.h" | |
#include "stm32f3xx_ll_utils.h" | |
#include "stm32f3xx_ll_gpio.h" | |
#include "stm32f3xx_ll_exti.h" | |
#include "stm32f3xx_ll_dma.h" | |
#include "stm32f3xx_ll_tim.h" | |
#include "stm32f3xx_ll_dac.h" | |
#if defined(USE_FULL_ASSERT) | |
#include "stm32_assert.h" | |
#endif /* USE_FULL_ASSERT */ | |
/* Exported types ------------------------------------------------------------*/ | |
/* Exported constants --------------------------------------------------------*/ | |
/** | |
* @brief LED2 | |
*/ | |
#define LED2_PIN LL_GPIO_PIN_3 | |
#define LED2_GPIO_PORT GPIOB | |
#define LED2_GPIO_CLK_ENABLE() LL_AHB1_GRP1_EnableClock(LL_AHB1_GRP1_PERIPH_GPIOB) | |
/** | |
* @brief Toggle periods for various blinking modes | |
*/ | |
#define LED_BLINK_FAST 200 | |
#define LED_BLINK_SLOW 500 | |
#define LED_BLINK_ERROR 1000 | |
/* Exported macro ------------------------------------------------------------*/ | |
/* Exported functions ------------------------------------------------------- */ | |
/* IRQ Handler treatment */ | |
void DacDmaTransferError_Callback(void); | |
void DacUnderrunError_Callback(void); | |
void TIM6_Update_Handler(void); | |
#endif /* __MAIN_H */ | |
/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/** | |
****************************************************************************** | |
* @file Examples_LL/DAC/DAC_GenerateWaveform_TriggerHW/Src/stm32f3xx_it.c | |
* @author MCD Application Team | |
* @brief Main Interrupt Service Routines. | |
* This file provides template for all exceptions handler and | |
* peripherals interrupt service routine. | |
****************************************************************************** | |
* @attention | |
* | |
* <h2><center>© COPYRIGHT(c) 2016 STMicroelectronics</center></h2> | |
* | |
* Redistribution and use in source and binary forms, with or without modification, | |
* are permitted provided that the following conditions are met: | |
* 1. Redistributions of source code must retain the above copyright notice, | |
* this list of conditions and the following disclaimer. | |
* 2. Redistributions in binary form must reproduce the above copyright notice, | |
* this list of conditions and the following disclaimer in the documentation | |
* and/or other materials provided with the distribution. | |
* 3. Neither the name of STMicroelectronics nor the names of its contributors | |
* may be used to endorse or promote products derived from this software | |
* without specific prior written permission. | |
* | |
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" | |
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE | |
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE | |
* DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE | |
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL | |
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR | |
* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER | |
* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, | |
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE | |
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | |
* | |
****************************************************************************** | |
*/ | |
/* Includes ------------------------------------------------------------------*/ | |
#include "stm32f3xx_it.h" | |
/** @addtogroup STM32F3xx_LL_Examples | |
* @{ | |
*/ | |
/** @addtogroup DAC_GenerateWaveform_TriggerHW | |
* @{ | |
*/ | |
/* Private typedef -----------------------------------------------------------*/ | |
/* Private define ------------------------------------------------------------*/ | |
/* Private macro -------------------------------------------------------------*/ | |
/* Private variables ---------------------------------------------------------*/ | |
/* Private function prototypes -----------------------------------------------*/ | |
/* Private functions ---------------------------------------------------------*/ | |
/******************************************************************************/ | |
/* Cortex-M4 Processor Exceptions Handlers */ | |
/******************************************************************************/ | |
/** | |
* @brief This function handles NMI exception. | |
* @param None | |
* @retval None | |
*/ | |
void NMI_Handler(void) | |
{ | |
} | |
/** | |
* @brief This function handles Hard Fault exception. | |
* @param None | |
* @retval None | |
*/ | |
void HardFault_Handler(void) | |
{ | |
/* Go to infinite loop when Hard Fault exception occurs */ | |
while (1) | |
{ | |
} | |
} | |
/** | |
* @brief This function handles Memory Manage exception. | |
* @param None | |
* @retval None | |
*/ | |
void MemManage_Handler(void) | |
{ | |
/* Go to infinite loop when Memory Manage exception occurs */ | |
while (1) | |
{ | |
} | |
} | |
/** | |
* @brief This function handles Bus Fault exception. | |
* @param None | |
* @retval None | |
*/ | |
void BusFault_Handler(void) | |
{ | |
/* Go to infinite loop when Bus Fault exception occurs */ | |
while (1) | |
{ | |
} | |
} | |
/** | |
* @brief This function handles Usage Fault exception. | |
* @param None | |
* @retval None | |
*/ | |
void UsageFault_Handler(void) | |
{ | |
/* Go to infinite loop when Usage Fault exception occurs */ | |
while (1) | |
{ | |
} | |
} | |
/** | |
* @brief This function handles SVCall exception. | |
* @param None | |
* @retval None | |
*/ | |
void SVC_Handler(void) | |
{ | |
} | |
/** | |
* @brief This function handles Debug Monitor exception. | |
* @param None | |
* @retval None | |
*/ | |
void DebugMon_Handler(void) | |
{ | |
} | |
/** | |
* @brief This function handles PendSVC exception. | |
* @param None | |
* @retval None | |
*/ | |
void PendSV_Handler(void) | |
{ | |
} | |
/** | |
* @brief This function handles SysTick Handler. | |
* @param None | |
* @retval None | |
*/ | |
void SysTick_Handler(void) | |
{ | |
} | |
/******************************************************************************/ | |
/* STM32F3xx Peripherals Interrupt Handlers */ | |
/* Add here the Interrupt Handler for the used peripheral(s) (PPP), for the */ | |
/* available peripheral interrupt handler's name please refer to the startup */ | |
/* file (startup_stm32f3xx.s). */ | |
/******************************************************************************/ | |
/** | |
* @brief This function handles DAC1 interrupt. | |
* @param None | |
* @retval None | |
*/ | |
void TIM6_DAC1_IRQHandler(void) | |
{ | |
if (LL_TIM_IsActiveFlag_UPDATE(TIM6)) { | |
LL_TIM_ClearFlag_UPDATE(TIM6); | |
TIM6_Update_Handler(); | |
return; | |
} | |
/* Check whether DAC channel1 underrun caused the DAC interruption */ | |
if(LL_DAC_IsActiveFlag_DMAUDR1(DAC1) != 0) | |
{ | |
/* Clear flag DAC channel1 underrun */ | |
LL_DAC_ClearFlag_DMAUDR1(DAC1); | |
/* Call interruption treatment function */ | |
DacUnderrunError_Callback(); | |
} | |
} | |
/** | |
* @brief This function handles DMA1 interrupt request. | |
* @param None | |
* @retval None | |
*/ | |
void DMA1_Channel3_IRQHandler(void) | |
{ | |
/* Check whether DMA transfer error caused the DMA interruption */ | |
if(LL_DMA_IsActiveFlag_TE3(DMA1) == 1) | |
{ | |
/* Clear flag DMA transfer error */ | |
LL_DMA_ClearFlag_TE3(DMA1); | |
/* Call interruption treatment function */ | |
DacDmaTransferError_Callback(); | |
return; | |
} | |
} | |
/** | |
* @} | |
*/ | |
/** | |
* @} | |
*/ | |
/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/** | |
****************************************************************************** | |
* @file Examples_LL/DAC/DAC_GenerateWaveform_TriggerHW/Inc/stm32f3xx_it.h | |
* @author MCD Application Team | |
* @brief This file contains the headers of the interrupt handlers. | |
****************************************************************************** | |
* @attention | |
* | |
* <h2><center>© COPYRIGHT(c) 2016 STMicroelectronics</center></h2> | |
* | |
* Redistribution and use in source and binary forms, with or without modification, | |
* are permitted provided that the following conditions are met: | |
* 1. Redistributions of source code must retain the above copyright notice, | |
* this list of conditions and the following disclaimer. | |
* 2. Redistributions in binary form must reproduce the above copyright notice, | |
* this list of conditions and the following disclaimer in the documentation | |
* and/or other materials provided with the distribution. | |
* 3. Neither the name of STMicroelectronics nor the names of its contributors | |
* may be used to endorse or promote products derived from this software | |
* without specific prior written permission. | |
* | |
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" | |
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE | |
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE | |
* DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE | |
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL | |
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR | |
* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER | |
* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, | |
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE | |
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | |
* | |
****************************************************************************** | |
*/ | |
/* Define to prevent recursive inclusion -------------------------------------*/ | |
#ifndef __STM32F3xx_IT_H | |
#define __STM32F3xx_IT_H | |
#ifdef __cplusplus | |
extern "C" { | |
#endif | |
/* Includes ------------------------------------------------------------------*/ | |
#include "main.h" | |
/* Exported types ------------------------------------------------------------*/ | |
/* Exported constants --------------------------------------------------------*/ | |
/* Exported macro ------------------------------------------------------------*/ | |
/* Exported functions ------------------------------------------------------- */ | |
void NMI_Handler(void); | |
void HardFault_Handler(void); | |
void MemManage_Handler(void); | |
void BusFault_Handler(void); | |
void UsageFault_Handler(void); | |
void SVC_Handler(void); | |
void DebugMon_Handler(void); | |
void PendSV_Handler(void); | |
void SysTick_Handler(void); | |
void DMA1_Channel3_IRQHandler(void); | |
void TIM6_DAC1_IRQHandler(void); | |
#ifdef __cplusplus | |
} | |
#endif | |
#endif /* __STM32F3xx_IT_H */ | |
/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment