Damien
11 years ago
7 changed files with 1127 additions and 0 deletions
@ -0,0 +1,98 @@ |
|||||
|
#include <stdint.h> |
||||
|
|
||||
|
#include "stm32f4xx_rcc.h" |
||||
|
#include "stm32f4xx_gpio.h" |
||||
|
#include "stm32f4xx_dac.h" |
||||
|
|
||||
|
#include "nlr.h" |
||||
|
#include "misc.h" |
||||
|
//#include "lexer.h"
|
||||
|
//#include "lexerstm.h"
|
||||
|
#include "mpyconfig.h" |
||||
|
#include "parse.h" |
||||
|
#include "compile.h" |
||||
|
#include "runtime.h" |
||||
|
|
||||
|
#define SAMPLE_BUF_SIZE (32) |
||||
|
|
||||
|
// sample_buf_in is always the same or ahead of sample_buf_out
|
||||
|
// when they are the same, there are no more samples left to process
|
||||
|
// in this scheme, there is always 1 unusable byte in the buffer, just before sample_buf_out
|
||||
|
int sample_buf_in; |
||||
|
int sample_buf_out; |
||||
|
byte sample_buf[SAMPLE_BUF_SIZE]; |
||||
|
|
||||
|
bool audio_is_full(void) { |
||||
|
return ((sample_buf_in + 1) % SAMPLE_BUF_SIZE) == sample_buf_out; |
||||
|
} |
||||
|
|
||||
|
void audio_fill(byte sample) { |
||||
|
sample_buf[sample_buf_in] = sample; |
||||
|
sample_buf_in = (sample_buf_in + 1) % SAMPLE_BUF_SIZE; |
||||
|
// enable interrupt
|
||||
|
} |
||||
|
|
||||
|
void audio_drain(void) { |
||||
|
if (sample_buf_in == sample_buf_out) { |
||||
|
// buffer is empty; disable interrupt
|
||||
|
} else { |
||||
|
// buffer has a sample; output it
|
||||
|
byte sample = sample_buf[sample_buf_out]; |
||||
|
DAC_SetChannel2Data(DAC_Align_8b_R, sample); |
||||
|
sample_buf_out = (sample_buf_out + 1) % SAMPLE_BUF_SIZE; |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
// direct access to DAC
|
||||
|
py_obj_t pyb_audio_dac(py_obj_t val) { |
||||
|
DAC_SetChannel2Data(DAC_Align_8b_R, py_obj_get_int(val)); |
||||
|
return py_const_none; |
||||
|
} |
||||
|
|
||||
|
py_obj_t pyb_audio_is_full(void) { |
||||
|
if (audio_is_full()) { |
||||
|
return py_const_true; |
||||
|
} else { |
||||
|
return py_const_false; |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
py_obj_t pyb_audio_fill(py_obj_t val) { |
||||
|
audio_fill(py_obj_get_int(val)); |
||||
|
return py_const_none; |
||||
|
} |
||||
|
|
||||
|
void audio_init(void) { |
||||
|
// DAC peripheral clock
|
||||
|
RCC_APB1PeriphClockCmd(RCC_APB1Periph_DAC, ENABLE); |
||||
|
|
||||
|
// DAC channel 2 (DAC_OUT2 = PA.5) configuration
|
||||
|
GPIO_InitTypeDef GPIO_InitStructure; |
||||
|
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5; |
||||
|
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AN; |
||||
|
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; |
||||
|
GPIO_Init(GPIOA, &GPIO_InitStructure); |
||||
|
|
||||
|
// DAC channel2 Configuration
|
||||
|
DAC_InitTypeDef DAC_InitStructure; |
||||
|
DAC_InitStructure.DAC_Trigger = DAC_Trigger_None; |
||||
|
DAC_InitStructure.DAC_WaveGeneration = DAC_WaveGeneration_None; |
||||
|
DAC_InitStructure.DAC_OutputBuffer = DAC_OutputBuffer_Enable; |
||||
|
DAC_Init(DAC_Channel_2, &DAC_InitStructure); |
||||
|
|
||||
|
// Enable DAC Channel2
|
||||
|
DAC_Cmd(DAC_Channel_2, ENABLE); |
||||
|
|
||||
|
// from now on use DAC_SetChannel2Data to trigger a conversion
|
||||
|
|
||||
|
sample_buf_in = 0; |
||||
|
sample_buf_out = 0; |
||||
|
// enable interrupt
|
||||
|
|
||||
|
// Python interface
|
||||
|
py_obj_t m = py_module_new(); |
||||
|
rt_store_attr(m, qstr_from_str_static("dac"), rt_make_function_1(pyb_audio_dac)); |
||||
|
rt_store_attr(m, qstr_from_str_static("is_full"), rt_make_function_0(pyb_audio_is_full)); |
||||
|
rt_store_attr(m, qstr_from_str_static("fill"), rt_make_function_1(pyb_audio_fill)); |
||||
|
rt_store_name(qstr_from_str_static("audio"), m); |
||||
|
} |
@ -0,0 +1 @@ |
|||||
|
void audio_init(void); |
@ -0,0 +1,715 @@ |
|||||
|
/**
|
||||
|
****************************************************************************** |
||||
|
* @file stm32f4xx_dac.c |
||||
|
* @author MCD Application Team |
||||
|
* @version V1.1.0 |
||||
|
* @date 11-January-2013 |
||||
|
* @brief This file provides firmware functions to manage the following |
||||
|
* functionalities of the Digital-to-Analog Converter (DAC) peripheral: |
||||
|
* + DAC channels configuration: trigger, output buffer, data format |
||||
|
* + DMA management |
||||
|
* + Interrupts and flags management |
||||
|
* |
||||
|
@verbatim |
||||
|
=============================================================================== |
||||
|
##### DAC Peripheral features ##### |
||||
|
=============================================================================== |
||||
|
[..] |
||||
|
*** DAC Channels *** |
||||
|
==================== |
||||
|
[..] |
||||
|
The device integrates two 12-bit Digital Analog Converters that can |
||||
|
be used independently or simultaneously (dual mode): |
||||
|
(#) DAC channel1 with DAC_OUT1 (PA4) as output |
||||
|
(#) DAC channel2 with DAC_OUT2 (PA5) as output |
||||
|
|
||||
|
*** DAC Triggers *** |
||||
|
==================== |
||||
|
[..] |
||||
|
Digital to Analog conversion can be non-triggered using DAC_Trigger_None |
||||
|
and DAC_OUT1/DAC_OUT2 is available once writing to DHRx register |
||||
|
using DAC_SetChannel1Data() / DAC_SetChannel2Data() functions. |
||||
|
[..] |
||||
|
Digital to Analog conversion can be triggered by: |
||||
|
(#) External event: EXTI Line 9 (any GPIOx_Pin9) using DAC_Trigger_Ext_IT9. |
||||
|
The used pin (GPIOx_Pin9) must be configured in input mode. |
||||
|
|
||||
|
(#) Timers TRGO: TIM2, TIM4, TIM5, TIM6, TIM7 and TIM8 |
||||
|
(DAC_Trigger_T2_TRGO, DAC_Trigger_T4_TRGO...) |
||||
|
The timer TRGO event should be selected using TIM_SelectOutputTrigger() |
||||
|
|
||||
|
(#) Software using DAC_Trigger_Software |
||||
|
|
||||
|
*** DAC Buffer mode feature *** |
||||
|
=============================== |
||||
|
[..] |
||||
|
Each DAC channel integrates an output buffer that can be used to |
||||
|
reduce the output impedance, and to drive external loads directly |
||||
|
without having to add an external operational amplifier. |
||||
|
To enable, the output buffer use |
||||
|
DAC_InitStructure.DAC_OutputBuffer = DAC_OutputBuffer_Enable; |
||||
|
[..] |
||||
|
(@) Refer to the device datasheet for more details about output |
||||
|
impedance value with and without output buffer. |
||||
|
|
||||
|
*** DAC wave generation feature *** |
||||
|
=================================== |
||||
|
[..] |
||||
|
Both DAC channels can be used to generate |
||||
|
(#) Noise wave using DAC_WaveGeneration_Noise |
||||
|
(#) Triangle wave using DAC_WaveGeneration_Triangle |
||||
|
|
||||
|
-@- Wave generation can be disabled using DAC_WaveGeneration_None |
||||
|
|
||||
|
*** DAC data format *** |
||||
|
======================= |
||||
|
[..] |
||||
|
The DAC data format can be: |
||||
|
(#) 8-bit right alignment using DAC_Align_8b_R |
||||
|
(#) 12-bit left alignment using DAC_Align_12b_L |
||||
|
(#) 12-bit right alignment using DAC_Align_12b_R |
||||
|
|
||||
|
*** DAC data value to voltage correspondence *** |
||||
|
================================================ |
||||
|
[..] |
||||
|
The analog output voltage on each DAC channel pin is determined |
||||
|
by the following equation: |
||||
|
DAC_OUTx = VREF+ * DOR / 4095 |
||||
|
with DOR is the Data Output Register |
||||
|
VEF+ is the input voltage reference (refer to the device datasheet) |
||||
|
e.g. To set DAC_OUT1 to 0.7V, use |
||||
|
DAC_SetChannel1Data(DAC_Align_12b_R, 868); |
||||
|
Assuming that VREF+ = 3.3V, DAC_OUT1 = (3.3 * 868) / 4095 = 0.7V |
||||
|
|
||||
|
*** DMA requests *** |
||||
|
===================== |
||||
|
[..] |
||||
|
A DMA1 request can be generated when an external trigger (but not |
||||
|
a software trigger) occurs if DMA1 requests are enabled using |
||||
|
DAC_DMACmd() |
||||
|
[..] |
||||
|
DMA1 requests are mapped as following: |
||||
|
(#) DAC channel1 : mapped on DMA1 Stream5 channel7 which must be |
||||
|
already configured |
||||
|
(#) DAC channel2 : mapped on DMA1 Stream6 channel7 which must be |
||||
|
already configured |
||||
|
|
||||
|
|
||||
|
##### How to use this driver ##### |
||||
|
=============================================================================== |
||||
|
[..] |
||||
|
(+) DAC APB clock must be enabled to get write access to DAC |
||||
|
registers using |
||||
|
RCC_APB1PeriphClockCmd(RCC_APB1Periph_DAC, ENABLE) |
||||
|
(+) Configure DAC_OUTx (DAC_OUT1: PA4, DAC_OUT2: PA5) in analog mode. |
||||
|
(+) Configure the DAC channel using DAC_Init() function |
||||
|
(+) Enable the DAC channel using DAC_Cmd() function |
||||
|
|
||||
|
@endverbatim |
||||
|
****************************************************************************** |
||||
|
* @attention |
||||
|
* |
||||
|
* <h2><center>© COPYRIGHT 2013 STMicroelectronics</center></h2> |
||||
|
* |
||||
|
* Licensed under MCD-ST Liberty SW License Agreement V2, (the "License"); |
||||
|
* You may not use this file except in compliance with the License. |
||||
|
* You may obtain a copy of the License at: |
||||
|
* |
||||
|
* http://www.st.com/software_license_agreement_liberty_v2
|
||||
|
* |
||||
|
* Unless required by applicable law or agreed to in writing, software |
||||
|
* distributed under the License is distributed on an "AS IS" BASIS, |
||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
||||
|
* See the License for the specific language governing permissions and |
||||
|
* limitations under the License. |
||||
|
* |
||||
|
****************************************************************************** |
||||
|
*/ |
||||
|
|
||||
|
|
||||
|
/* Includes ------------------------------------------------------------------*/ |
||||
|
#include "stm32f4xx_conf.h" |
||||
|
#include "stm32f4xx_dac.h" |
||||
|
#include "stm32f4xx_rcc.h" |
||||
|
|
||||
|
/** @addtogroup STM32F4xx_StdPeriph_Driver
|
||||
|
* @{ |
||||
|
*/ |
||||
|
|
||||
|
/** @defgroup DAC
|
||||
|
* @brief DAC driver modules |
||||
|
* @{ |
||||
|
*/ |
||||
|
|
||||
|
/* Private typedef -----------------------------------------------------------*/ |
||||
|
/* Private define ------------------------------------------------------------*/ |
||||
|
|
||||
|
/* CR register Mask */ |
||||
|
#define CR_CLEAR_MASK ((uint32_t)0x00000FFE) |
||||
|
|
||||
|
/* DAC Dual Channels SWTRIG masks */ |
||||
|
#define DUAL_SWTRIG_SET ((uint32_t)0x00000003) |
||||
|
#define DUAL_SWTRIG_RESET ((uint32_t)0xFFFFFFFC) |
||||
|
|
||||
|
/* DHR registers offsets */ |
||||
|
#define DHR12R1_OFFSET ((uint32_t)0x00000008) |
||||
|
#define DHR12R2_OFFSET ((uint32_t)0x00000014) |
||||
|
#define DHR12RD_OFFSET ((uint32_t)0x00000020) |
||||
|
|
||||
|
/* DOR register offset */ |
||||
|
#define DOR_OFFSET ((uint32_t)0x0000002C) |
||||
|
|
||||
|
/* Private macro -------------------------------------------------------------*/ |
||||
|
/* Private variables ---------------------------------------------------------*/ |
||||
|
/* Private function prototypes -----------------------------------------------*/ |
||||
|
/* Private functions ---------------------------------------------------------*/ |
||||
|
|
||||
|
/** @defgroup DAC_Private_Functions
|
||||
|
* @{ |
||||
|
*/ |
||||
|
|
||||
|
/** @defgroup DAC_Group1 DAC channels configuration
|
||||
|
* @brief DAC channels configuration: trigger, output buffer, data format |
||||
|
* |
||||
|
@verbatim |
||||
|
=============================================================================== |
||||
|
##### DAC channels configuration: trigger, output buffer, data format ##### |
||||
|
=============================================================================== |
||||
|
|
||||
|
@endverbatim |
||||
|
* @{ |
||||
|
*/ |
||||
|
|
||||
|
/**
|
||||
|
* @brief Deinitializes the DAC peripheral registers to their default reset values. |
||||
|
* @param None |
||||
|
* @retval None |
||||
|
*/ |
||||
|
void DAC_DeInit(void) |
||||
|
{ |
||||
|
/* Enable DAC reset state */ |
||||
|
RCC_APB1PeriphResetCmd(RCC_APB1Periph_DAC, ENABLE); |
||||
|
/* Release DAC from reset state */ |
||||
|
RCC_APB1PeriphResetCmd(RCC_APB1Periph_DAC, DISABLE); |
||||
|
} |
||||
|
|
||||
|
/**
|
||||
|
* @brief Initializes the DAC peripheral according to the specified parameters |
||||
|
* in the DAC_InitStruct. |
||||
|
* @param DAC_Channel: the selected DAC channel. |
||||
|
* This parameter can be one of the following values: |
||||
|
* @arg DAC_Channel_1: DAC Channel1 selected |
||||
|
* @arg DAC_Channel_2: DAC Channel2 selected |
||||
|
* @param DAC_InitStruct: pointer to a DAC_InitTypeDef structure that contains |
||||
|
* the configuration information for the specified DAC channel. |
||||
|
* @retval None |
||||
|
*/ |
||||
|
void DAC_Init(uint32_t DAC_Channel, DAC_InitTypeDef* DAC_InitStruct) |
||||
|
{ |
||||
|
uint32_t tmpreg1 = 0, tmpreg2 = 0; |
||||
|
|
||||
|
/* Check the DAC parameters */ |
||||
|
assert_param(IS_DAC_TRIGGER(DAC_InitStruct->DAC_Trigger)); |
||||
|
assert_param(IS_DAC_GENERATE_WAVE(DAC_InitStruct->DAC_WaveGeneration)); |
||||
|
assert_param(IS_DAC_LFSR_UNMASK_TRIANGLE_AMPLITUDE(DAC_InitStruct->DAC_LFSRUnmask_TriangleAmplitude)); |
||||
|
assert_param(IS_DAC_OUTPUT_BUFFER_STATE(DAC_InitStruct->DAC_OutputBuffer)); |
||||
|
|
||||
|
/*---------------------------- DAC CR Configuration --------------------------*/ |
||||
|
/* Get the DAC CR value */ |
||||
|
tmpreg1 = DAC->CR; |
||||
|
/* Clear BOFFx, TENx, TSELx, WAVEx and MAMPx bits */ |
||||
|
tmpreg1 &= ~(CR_CLEAR_MASK << DAC_Channel); |
||||
|
/* Configure for the selected DAC channel: buffer output, trigger,
|
||||
|
wave generation, mask/amplitude for wave generation */ |
||||
|
/* Set TSELx and TENx bits according to DAC_Trigger value */ |
||||
|
/* Set WAVEx bits according to DAC_WaveGeneration value */ |
||||
|
/* Set MAMPx bits according to DAC_LFSRUnmask_TriangleAmplitude value */ |
||||
|
/* Set BOFFx bit according to DAC_OutputBuffer value */ |
||||
|
tmpreg2 = (DAC_InitStruct->DAC_Trigger | DAC_InitStruct->DAC_WaveGeneration | |
||||
|
DAC_InitStruct->DAC_LFSRUnmask_TriangleAmplitude | \ |
||||
|
DAC_InitStruct->DAC_OutputBuffer); |
||||
|
/* Calculate CR register value depending on DAC_Channel */ |
||||
|
tmpreg1 |= tmpreg2 << DAC_Channel; |
||||
|
/* Write to DAC CR */ |
||||
|
DAC->CR = tmpreg1; |
||||
|
} |
||||
|
|
||||
|
/**
|
||||
|
* @brief Fills each DAC_InitStruct member with its default value. |
||||
|
* @param DAC_InitStruct: pointer to a DAC_InitTypeDef structure which will |
||||
|
* be initialized. |
||||
|
* @retval None |
||||
|
*/ |
||||
|
void DAC_StructInit(DAC_InitTypeDef* DAC_InitStruct) |
||||
|
{ |
||||
|
/*--------------- Reset DAC init structure parameters values -----------------*/ |
||||
|
/* Initialize the DAC_Trigger member */ |
||||
|
DAC_InitStruct->DAC_Trigger = DAC_Trigger_None; |
||||
|
/* Initialize the DAC_WaveGeneration member */ |
||||
|
DAC_InitStruct->DAC_WaveGeneration = DAC_WaveGeneration_None; |
||||
|
/* Initialize the DAC_LFSRUnmask_TriangleAmplitude member */ |
||||
|
DAC_InitStruct->DAC_LFSRUnmask_TriangleAmplitude = DAC_LFSRUnmask_Bit0; |
||||
|
/* Initialize the DAC_OutputBuffer member */ |
||||
|
DAC_InitStruct->DAC_OutputBuffer = DAC_OutputBuffer_Enable; |
||||
|
} |
||||
|
|
||||
|
/**
|
||||
|
* @brief Enables or disables the specified DAC channel. |
||||
|
* @param DAC_Channel: The selected DAC channel. |
||||
|
* This parameter can be one of the following values: |
||||
|
* @arg DAC_Channel_1: DAC Channel1 selected |
||||
|
* @arg DAC_Channel_2: DAC Channel2 selected |
||||
|
* @param NewState: new state of the DAC channel. |
||||
|
* This parameter can be: ENABLE or DISABLE. |
||||
|
* @note When the DAC channel is enabled the trigger source can no more be modified. |
||||
|
* @retval None |
||||
|
*/ |
||||
|
void DAC_Cmd(uint32_t DAC_Channel, FunctionalState NewState) |
||||
|
{ |
||||
|
/* Check the parameters */ |
||||
|
assert_param(IS_DAC_CHANNEL(DAC_Channel)); |
||||
|
assert_param(IS_FUNCTIONAL_STATE(NewState)); |
||||
|
|
||||
|
if (NewState != DISABLE) |
||||
|
{ |
||||
|
/* Enable the selected DAC channel */ |
||||
|
DAC->CR |= (DAC_CR_EN1 << DAC_Channel); |
||||
|
} |
||||
|
else |
||||
|
{ |
||||
|
/* Disable the selected DAC channel */ |
||||
|
DAC->CR &= (~(DAC_CR_EN1 << DAC_Channel)); |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
/**
|
||||
|
* @brief Enables or disables the selected DAC channel software trigger. |
||||
|
* @param DAC_Channel: The selected DAC channel. |
||||
|
* This parameter can be one of the following values: |
||||
|
* @arg DAC_Channel_1: DAC Channel1 selected |
||||
|
* @arg DAC_Channel_2: DAC Channel2 selected |
||||
|
* @param NewState: new state of the selected DAC channel software trigger. |
||||
|
* This parameter can be: ENABLE or DISABLE. |
||||
|
* @retval None |
||||
|
*/ |
||||
|
void DAC_SoftwareTriggerCmd(uint32_t DAC_Channel, FunctionalState NewState) |
||||
|
{ |
||||
|
/* Check the parameters */ |
||||
|
assert_param(IS_DAC_CHANNEL(DAC_Channel)); |
||||
|
assert_param(IS_FUNCTIONAL_STATE(NewState)); |
||||
|
|
||||
|
if (NewState != DISABLE) |
||||
|
{ |
||||
|
/* Enable software trigger for the selected DAC channel */ |
||||
|
DAC->SWTRIGR |= (uint32_t)DAC_SWTRIGR_SWTRIG1 << (DAC_Channel >> 4); |
||||
|
} |
||||
|
else |
||||
|
{ |
||||
|
/* Disable software trigger for the selected DAC channel */ |
||||
|
DAC->SWTRIGR &= ~((uint32_t)DAC_SWTRIGR_SWTRIG1 << (DAC_Channel >> 4)); |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
/**
|
||||
|
* @brief Enables or disables simultaneously the two DAC channels software triggers. |
||||
|
* @param NewState: new state of the DAC channels software triggers. |
||||
|
* This parameter can be: ENABLE or DISABLE. |
||||
|
* @retval None |
||||
|
*/ |
||||
|
void DAC_DualSoftwareTriggerCmd(FunctionalState NewState) |
||||
|
{ |
||||
|
/* Check the parameters */ |
||||
|
assert_param(IS_FUNCTIONAL_STATE(NewState)); |
||||
|
|
||||
|
if (NewState != DISABLE) |
||||
|
{ |
||||
|
/* Enable software trigger for both DAC channels */ |
||||
|
DAC->SWTRIGR |= DUAL_SWTRIG_SET; |
||||
|
} |
||||
|
else |
||||
|
{ |
||||
|
/* Disable software trigger for both DAC channels */ |
||||
|
DAC->SWTRIGR &= DUAL_SWTRIG_RESET; |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
/**
|
||||
|
* @brief Enables or disables the selected DAC channel wave generation. |
||||
|
* @param DAC_Channel: The selected DAC channel. |
||||
|
* This parameter can be one of the following values: |
||||
|
* @arg DAC_Channel_1: DAC Channel1 selected |
||||
|
* @arg DAC_Channel_2: DAC Channel2 selected |
||||
|
* @param DAC_Wave: specifies the wave type to enable or disable. |
||||
|
* This parameter can be one of the following values: |
||||
|
* @arg DAC_Wave_Noise: noise wave generation |
||||
|
* @arg DAC_Wave_Triangle: triangle wave generation |
||||
|
* @param NewState: new state of the selected DAC channel wave generation. |
||||
|
* This parameter can be: ENABLE or DISABLE. |
||||
|
* @retval None |
||||
|
*/ |
||||
|
void DAC_WaveGenerationCmd(uint32_t DAC_Channel, uint32_t DAC_Wave, FunctionalState NewState) |
||||
|
{ |
||||
|
/* Check the parameters */ |
||||
|
assert_param(IS_DAC_CHANNEL(DAC_Channel)); |
||||
|
assert_param(IS_DAC_WAVE(DAC_Wave)); |
||||
|
assert_param(IS_FUNCTIONAL_STATE(NewState)); |
||||
|
|
||||
|
if (NewState != DISABLE) |
||||
|
{ |
||||
|
/* Enable the selected wave generation for the selected DAC channel */ |
||||
|
DAC->CR |= DAC_Wave << DAC_Channel; |
||||
|
} |
||||
|
else |
||||
|
{ |
||||
|
/* Disable the selected wave generation for the selected DAC channel */ |
||||
|
DAC->CR &= ~(DAC_Wave << DAC_Channel); |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
/**
|
||||
|
* @brief Set the specified data holding register value for DAC channel1. |
||||
|
* @param DAC_Align: Specifies the data alignment for DAC channel1. |
||||
|
* This parameter can be one of the following values: |
||||
|
* @arg DAC_Align_8b_R: 8bit right data alignment selected |
||||
|
* @arg DAC_Align_12b_L: 12bit left data alignment selected |
||||
|
* @arg DAC_Align_12b_R: 12bit right data alignment selected |
||||
|
* @param Data: Data to be loaded in the selected data holding register. |
||||
|
* @retval None |
||||
|
*/ |
||||
|
void DAC_SetChannel1Data(uint32_t DAC_Align, uint16_t Data) |
||||
|
{ |
||||
|
__IO uint32_t tmp = 0; |
||||
|
|
||||
|
/* Check the parameters */ |
||||
|
assert_param(IS_DAC_ALIGN(DAC_Align)); |
||||
|
assert_param(IS_DAC_DATA(Data)); |
||||
|
|
||||
|
tmp = (uint32_t)DAC_BASE; |
||||
|
tmp += DHR12R1_OFFSET + DAC_Align; |
||||
|
|
||||
|
/* Set the DAC channel1 selected data holding register */ |
||||
|
*(__IO uint32_t *) tmp = Data; |
||||
|
} |
||||
|
|
||||
|
/**
|
||||
|
* @brief Set the specified data holding register value for DAC channel2. |
||||
|
* @param DAC_Align: Specifies the data alignment for DAC channel2. |
||||
|
* This parameter can be one of the following values: |
||||
|
* @arg DAC_Align_8b_R: 8bit right data alignment selected |
||||
|
* @arg DAC_Align_12b_L: 12bit left data alignment selected |
||||
|
* @arg DAC_Align_12b_R: 12bit right data alignment selected |
||||
|
* @param Data: Data to be loaded in the selected data holding register. |
||||
|
* @retval None |
||||
|
*/ |
||||
|
void DAC_SetChannel2Data(uint32_t DAC_Align, uint16_t Data) |
||||
|
{ |
||||
|
__IO uint32_t tmp = 0; |
||||
|
|
||||
|
/* Check the parameters */ |
||||
|
assert_param(IS_DAC_ALIGN(DAC_Align)); |
||||
|
assert_param(IS_DAC_DATA(Data)); |
||||
|
|
||||
|
tmp = (uint32_t)DAC_BASE; |
||||
|
tmp += DHR12R2_OFFSET + DAC_Align; |
||||
|
|
||||
|
/* Set the DAC channel2 selected data holding register */ |
||||
|
*(__IO uint32_t *)tmp = Data; |
||||
|
} |
||||
|
|
||||
|
/**
|
||||
|
* @brief Set the specified data holding register value for dual channel DAC. |
||||
|
* @param DAC_Align: Specifies the data alignment for dual channel DAC. |
||||
|
* This parameter can be one of the following values: |
||||
|
* @arg DAC_Align_8b_R: 8bit right data alignment selected |
||||
|
* @arg DAC_Align_12b_L: 12bit left data alignment selected |
||||
|
* @arg DAC_Align_12b_R: 12bit right data alignment selected |
||||
|
* @param Data2: Data for DAC Channel2 to be loaded in the selected data holding register. |
||||
|
* @param Data1: Data for DAC Channel1 to be loaded in the selected data holding register. |
||||
|
* @note In dual mode, a unique register access is required to write in both |
||||
|
* DAC channels at the same time. |
||||
|
* @retval None |
||||
|
*/ |
||||
|
void DAC_SetDualChannelData(uint32_t DAC_Align, uint16_t Data2, uint16_t Data1) |
||||
|
{ |
||||
|
uint32_t data = 0, tmp = 0; |
||||
|
|
||||
|
/* Check the parameters */ |
||||
|
assert_param(IS_DAC_ALIGN(DAC_Align)); |
||||
|
assert_param(IS_DAC_DATA(Data1)); |
||||
|
assert_param(IS_DAC_DATA(Data2)); |
||||
|
|
||||
|
/* Calculate and set dual DAC data holding register value */ |
||||
|
if (DAC_Align == DAC_Align_8b_R) |
||||
|
{ |
||||
|
data = ((uint32_t)Data2 << 8) | Data1; |
||||
|
} |
||||
|
else |
||||
|
{ |
||||
|
data = ((uint32_t)Data2 << 16) | Data1; |
||||
|
} |
||||
|
|
||||
|
tmp = (uint32_t)DAC_BASE; |
||||
|
tmp += DHR12RD_OFFSET + DAC_Align; |
||||
|
|
||||
|
/* Set the dual DAC selected data holding register */ |
||||
|
*(__IO uint32_t *)tmp = data; |
||||
|
} |
||||
|
|
||||
|
/**
|
||||
|
* @brief Returns the last data output value of the selected DAC channel. |
||||
|
* @param DAC_Channel: The selected DAC channel. |
||||
|
* This parameter can be one of the following values: |
||||
|
* @arg DAC_Channel_1: DAC Channel1 selected |
||||
|
* @arg DAC_Channel_2: DAC Channel2 selected |
||||
|
* @retval The selected DAC channel data output value. |
||||
|
*/ |
||||
|
uint16_t DAC_GetDataOutputValue(uint32_t DAC_Channel) |
||||
|
{ |
||||
|
__IO uint32_t tmp = 0; |
||||
|
|
||||
|
/* Check the parameters */ |
||||
|
assert_param(IS_DAC_CHANNEL(DAC_Channel)); |
||||
|
|
||||
|
tmp = (uint32_t) DAC_BASE ; |
||||
|
tmp += DOR_OFFSET + ((uint32_t)DAC_Channel >> 2); |
||||
|
|
||||
|
/* Returns the DAC channel data output register value */ |
||||
|
return (uint16_t) (*(__IO uint32_t*) tmp); |
||||
|
} |
||||
|
/**
|
||||
|
* @} |
||||
|
*/ |
||||
|
|
||||
|
/** @defgroup DAC_Group2 DMA management functions
|
||||
|
* @brief DMA management functions |
||||
|
* |
||||
|
@verbatim |
||||
|
=============================================================================== |
||||
|
##### DMA management functions ##### |
||||
|
=============================================================================== |
||||
|
|
||||
|
@endverbatim |
||||
|
* @{ |
||||
|
*/ |
||||
|
|
||||
|
/**
|
||||
|
* @brief Enables or disables the specified DAC channel DMA request. |
||||
|
* @note When enabled DMA1 is generated when an external trigger (EXTI Line9, |
||||
|
* TIM2, TIM4, TIM5, TIM6, TIM7 or TIM8 but not a software trigger) occurs. |
||||
|
* @param DAC_Channel: The selected DAC channel. |
||||
|
* This parameter can be one of the following values: |
||||
|
* @arg DAC_Channel_1: DAC Channel1 selected |
||||
|
* @arg DAC_Channel_2: DAC Channel2 selected |
||||
|
* @param NewState: new state of the selected DAC channel DMA request. |
||||
|
* This parameter can be: ENABLE or DISABLE. |
||||
|
* @note The DAC channel1 is mapped on DMA1 Stream 5 channel7 which must be |
||||
|
* already configured. |
||||
|
* @note The DAC channel2 is mapped on DMA1 Stream 6 channel7 which must be |
||||
|
* already configured. |
||||
|
* @retval None |
||||
|
*/ |
||||
|
void DAC_DMACmd(uint32_t DAC_Channel, FunctionalState NewState) |
||||
|
{ |
||||
|
/* Check the parameters */ |
||||
|
assert_param(IS_DAC_CHANNEL(DAC_Channel)); |
||||
|
assert_param(IS_FUNCTIONAL_STATE(NewState)); |
||||
|
|
||||
|
if (NewState != DISABLE) |
||||
|
{ |
||||
|
/* Enable the selected DAC channel DMA request */ |
||||
|
DAC->CR |= (DAC_CR_DMAEN1 << DAC_Channel); |
||||
|
} |
||||
|
else |
||||
|
{ |
||||
|
/* Disable the selected DAC channel DMA request */ |
||||
|
DAC->CR &= (~(DAC_CR_DMAEN1 << DAC_Channel)); |
||||
|
} |
||||
|
} |
||||
|
/**
|
||||
|
* @} |
||||
|
*/ |
||||
|
|
||||
|
/** @defgroup DAC_Group3 Interrupts and flags management functions
|
||||
|
* @brief Interrupts and flags management functions |
||||
|
* |
||||
|
@verbatim |
||||
|
=============================================================================== |
||||
|
##### Interrupts and flags management functions ##### |
||||
|
=============================================================================== |
||||
|
|
||||
|
@endverbatim |
||||
|
* @{ |
||||
|
*/ |
||||
|
|
||||
|
/**
|
||||
|
* @brief Enables or disables the specified DAC interrupts. |
||||
|
* @param DAC_Channel: The selected DAC channel. |
||||
|
* This parameter can be one of the following values: |
||||
|
* @arg DAC_Channel_1: DAC Channel1 selected |
||||
|
* @arg DAC_Channel_2: DAC Channel2 selected |
||||
|
* @param DAC_IT: specifies the DAC interrupt sources to be enabled or disabled. |
||||
|
* This parameter can be the following values: |
||||
|
* @arg DAC_IT_DMAUDR: DMA underrun interrupt mask |
||||
|
* @note The DMA underrun occurs when a second external trigger arrives before the |
||||
|
* acknowledgement for the first external trigger is received (first request). |
||||
|
* @param NewState: new state of the specified DAC interrupts. |
||||
|
* This parameter can be: ENABLE or DISABLE. |
||||
|
* @retval None |
||||
|
*/ |
||||
|
void DAC_ITConfig(uint32_t DAC_Channel, uint32_t DAC_IT, FunctionalState NewState) |
||||
|
{ |
||||
|
/* Check the parameters */ |
||||
|
assert_param(IS_DAC_CHANNEL(DAC_Channel)); |
||||
|
assert_param(IS_FUNCTIONAL_STATE(NewState)); |
||||
|
assert_param(IS_DAC_IT(DAC_IT)); |
||||
|
|
||||
|
if (NewState != DISABLE) |
||||
|
{ |
||||
|
/* Enable the selected DAC interrupts */ |
||||
|
DAC->CR |= (DAC_IT << DAC_Channel); |
||||
|
} |
||||
|
else |
||||
|
{ |
||||
|
/* Disable the selected DAC interrupts */ |
||||
|
DAC->CR &= (~(uint32_t)(DAC_IT << DAC_Channel)); |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
/**
|
||||
|
* @brief Checks whether the specified DAC flag is set or not. |
||||
|
* @param DAC_Channel: The selected DAC channel. |
||||
|
* This parameter can be one of the following values: |
||||
|
* @arg DAC_Channel_1: DAC Channel1 selected |
||||
|
* @arg DAC_Channel_2: DAC Channel2 selected |
||||
|
* @param DAC_FLAG: specifies the flag to check. |
||||
|
* This parameter can be only of the following value: |
||||
|
* @arg DAC_FLAG_DMAUDR: DMA underrun flag |
||||
|
* @note The DMA underrun occurs when a second external trigger arrives before the |
||||
|
* acknowledgement for the first external trigger is received (first request). |
||||
|
* @retval The new state of DAC_FLAG (SET or RESET). |
||||
|
*/ |
||||
|
FlagStatus DAC_GetFlagStatus(uint32_t DAC_Channel, uint32_t DAC_FLAG) |
||||
|
{ |
||||
|
FlagStatus bitstatus = RESET; |
||||
|
/* Check the parameters */ |
||||
|
assert_param(IS_DAC_CHANNEL(DAC_Channel)); |
||||
|
assert_param(IS_DAC_FLAG(DAC_FLAG)); |
||||
|
|
||||
|
/* Check the status of the specified DAC flag */ |
||||
|
if ((DAC->SR & (DAC_FLAG << DAC_Channel)) != (uint8_t)RESET) |
||||
|
{ |
||||
|
/* DAC_FLAG is set */ |
||||
|
bitstatus = SET; |
||||
|
} |
||||
|
else |
||||
|
{ |
||||
|
/* DAC_FLAG is reset */ |
||||
|
bitstatus = RESET; |
||||
|
} |
||||
|
/* Return the DAC_FLAG status */ |
||||
|
return bitstatus; |
||||
|
} |
||||
|
|
||||
|
/**
|
||||
|
* @brief Clears the DAC channel's pending flags. |
||||
|
* @param DAC_Channel: The selected DAC channel. |
||||
|
* This parameter can be one of the following values: |
||||
|
* @arg DAC_Channel_1: DAC Channel1 selected |
||||
|
* @arg DAC_Channel_2: DAC Channel2 selected |
||||
|
* @param DAC_FLAG: specifies the flag to clear. |
||||
|
* This parameter can be of the following value: |
||||
|
* @arg DAC_FLAG_DMAUDR: DMA underrun flag |
||||
|
* @note The DMA underrun occurs when a second external trigger arrives before the |
||||
|
* acknowledgement for the first external trigger is received (first request). |
||||
|
* @retval None |
||||
|
*/ |
||||
|
void DAC_ClearFlag(uint32_t DAC_Channel, uint32_t DAC_FLAG) |
||||
|
{ |
||||
|
/* Check the parameters */ |
||||
|
assert_param(IS_DAC_CHANNEL(DAC_Channel)); |
||||
|
assert_param(IS_DAC_FLAG(DAC_FLAG)); |
||||
|
|
||||
|
/* Clear the selected DAC flags */ |
||||
|
DAC->SR = (DAC_FLAG << DAC_Channel); |
||||
|
} |
||||
|
|
||||
|
/**
|
||||
|
* @brief Checks whether the specified DAC interrupt has occurred or not. |
||||
|
* @param DAC_Channel: The selected DAC channel. |
||||
|
* This parameter can be one of the following values: |
||||
|
* @arg DAC_Channel_1: DAC Channel1 selected |
||||
|
* @arg DAC_Channel_2: DAC Channel2 selected |
||||
|
* @param DAC_IT: specifies the DAC interrupt source to check. |
||||
|
* This parameter can be the following values: |
||||
|
* @arg DAC_IT_DMAUDR: DMA underrun interrupt mask |
||||
|
* @note The DMA underrun occurs when a second external trigger arrives before the |
||||
|
* acknowledgement for the first external trigger is received (first request). |
||||
|
* @retval The new state of DAC_IT (SET or RESET). |
||||
|
*/ |
||||
|
ITStatus DAC_GetITStatus(uint32_t DAC_Channel, uint32_t DAC_IT) |
||||
|
{ |
||||
|
ITStatus bitstatus = RESET; |
||||
|
uint32_t enablestatus = 0; |
||||
|
|
||||
|
/* Check the parameters */ |
||||
|
assert_param(IS_DAC_CHANNEL(DAC_Channel)); |
||||
|
assert_param(IS_DAC_IT(DAC_IT)); |
||||
|
|
||||
|
/* Get the DAC_IT enable bit status */ |
||||
|
enablestatus = (DAC->CR & (DAC_IT << DAC_Channel)) ; |
||||
|
|
||||
|
/* Check the status of the specified DAC interrupt */ |
||||
|
if (((DAC->SR & (DAC_IT << DAC_Channel)) != (uint32_t)RESET) && enablestatus) |
||||
|
{ |
||||
|
/* DAC_IT is set */ |
||||
|
bitstatus = SET; |
||||
|
} |
||||
|
else |
||||
|
{ |
||||
|
/* DAC_IT is reset */ |
||||
|
bitstatus = RESET; |
||||
|
} |
||||
|
/* Return the DAC_IT status */ |
||||
|
return bitstatus; |
||||
|
} |
||||
|
|
||||
|
/**
|
||||
|
* @brief Clears the DAC channel's interrupt pending bits. |
||||
|
* @param DAC_Channel: The selected DAC channel. |
||||
|
* This parameter can be one of the following values: |
||||
|
* @arg DAC_Channel_1: DAC Channel1 selected |
||||
|
* @arg DAC_Channel_2: DAC Channel2 selected |
||||
|
* @param DAC_IT: specifies the DAC interrupt pending bit to clear. |
||||
|
* This parameter can be the following values: |
||||
|
* @arg DAC_IT_DMAUDR: DMA underrun interrupt mask |
||||
|
* @note The DMA underrun occurs when a second external trigger arrives before the |
||||
|
* acknowledgement for the first external trigger is received (first request). |
||||
|
* @retval None |
||||
|
*/ |
||||
|
void DAC_ClearITPendingBit(uint32_t DAC_Channel, uint32_t DAC_IT) |
||||
|
{ |
||||
|
/* Check the parameters */ |
||||
|
assert_param(IS_DAC_CHANNEL(DAC_Channel)); |
||||
|
assert_param(IS_DAC_IT(DAC_IT)); |
||||
|
|
||||
|
/* Clear the selected DAC interrupt pending bits */ |
||||
|
DAC->SR = (DAC_IT << DAC_Channel); |
||||
|
} |
||||
|
|
||||
|
/**
|
||||
|
* @} |
||||
|
*/ |
||||
|
|
||||
|
/**
|
||||
|
* @} |
||||
|
*/ |
||||
|
|
||||
|
/**
|
||||
|
* @} |
||||
|
*/ |
||||
|
|
||||
|
/**
|
||||
|
* @} |
||||
|
*/ |
||||
|
|
||||
|
/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ |
@ -0,0 +1,304 @@ |
|||||
|
/**
|
||||
|
****************************************************************************** |
||||
|
* @file stm32f4xx_dac.h |
||||
|
* @author MCD Application Team |
||||
|
* @version V1.1.0 |
||||
|
* @date 11-January-2013 |
||||
|
* @brief This file contains all the functions prototypes for the DAC firmware |
||||
|
* library. |
||||
|
****************************************************************************** |
||||
|
* @attention |
||||
|
* |
||||
|
* <h2><center>© COPYRIGHT 2013 STMicroelectronics</center></h2> |
||||
|
* |
||||
|
* Licensed under MCD-ST Liberty SW License Agreement V2, (the "License"); |
||||
|
* You may not use this file except in compliance with the License. |
||||
|
* You may obtain a copy of the License at: |
||||
|
* |
||||
|
* http://www.st.com/software_license_agreement_liberty_v2
|
||||
|
* |
||||
|
* Unless required by applicable law or agreed to in writing, software |
||||
|
* distributed under the License is distributed on an "AS IS" BASIS, |
||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
||||
|
* See the License for the specific language governing permissions and |
||||
|
* limitations under the License. |
||||
|
* |
||||
|
****************************************************************************** |
||||
|
*/ |
||||
|
|
||||
|
/* Define to prevent recursive inclusion -------------------------------------*/ |
||||
|
#ifndef __STM32F4xx_DAC_H |
||||
|
#define __STM32F4xx_DAC_H |
||||
|
|
||||
|
#ifdef __cplusplus |
||||
|
extern "C" { |
||||
|
#endif |
||||
|
|
||||
|
/* Includes ------------------------------------------------------------------*/ |
||||
|
#include "stm32f4xx.h" |
||||
|
|
||||
|
/** @addtogroup STM32F4xx_StdPeriph_Driver
|
||||
|
* @{ |
||||
|
*/ |
||||
|
|
||||
|
/** @addtogroup DAC
|
||||
|
* @{ |
||||
|
*/ |
||||
|
|
||||
|
/* Exported types ------------------------------------------------------------*/ |
||||
|
|
||||
|
/**
|
||||
|
* @brief DAC Init structure definition |
||||
|
*/ |
||||
|
|
||||
|
typedef struct |
||||
|
{ |
||||
|
uint32_t DAC_Trigger; /*!< Specifies the external trigger for the selected DAC channel.
|
||||
|
This parameter can be a value of @ref DAC_trigger_selection */ |
||||
|
|
||||
|
uint32_t DAC_WaveGeneration; /*!< Specifies whether DAC channel noise waves or triangle waves
|
||||
|
are generated, or whether no wave is generated. |
||||
|
This parameter can be a value of @ref DAC_wave_generation */ |
||||
|
|
||||
|
uint32_t DAC_LFSRUnmask_TriangleAmplitude; /*!< Specifies the LFSR mask for noise wave generation or
|
||||
|
the maximum amplitude triangle generation for the DAC channel. |
||||
|
This parameter can be a value of @ref DAC_lfsrunmask_triangleamplitude */ |
||||
|
|
||||
|
uint32_t DAC_OutputBuffer; /*!< Specifies whether the DAC channel output buffer is enabled or disabled.
|
||||
|
This parameter can be a value of @ref DAC_output_buffer */ |
||||
|
}DAC_InitTypeDef; |
||||
|
|
||||
|
/* Exported constants --------------------------------------------------------*/ |
||||
|
|
||||
|
/** @defgroup DAC_Exported_Constants
|
||||
|
* @{ |
||||
|
*/ |
||||
|
|
||||
|
/** @defgroup DAC_trigger_selection
|
||||
|
* @{ |
||||
|
*/ |
||||
|
|
||||
|
#define DAC_Trigger_None ((uint32_t)0x00000000) /*!< Conversion is automatic once the DAC1_DHRxxxx register |
||||
|
has been loaded, and not by external trigger */ |
||||
|
#define DAC_Trigger_T2_TRGO ((uint32_t)0x00000024) /*!< TIM2 TRGO selected as external conversion trigger for DAC channel */ |
||||
|
#define DAC_Trigger_T4_TRGO ((uint32_t)0x0000002C) /*!< TIM4 TRGO selected as external conversion trigger for DAC channel */ |
||||
|
#define DAC_Trigger_T5_TRGO ((uint32_t)0x0000001C) /*!< TIM5 TRGO selected as external conversion trigger for DAC channel */ |
||||
|
#define DAC_Trigger_T6_TRGO ((uint32_t)0x00000004) /*!< TIM6 TRGO selected as external conversion trigger for DAC channel */ |
||||
|
#define DAC_Trigger_T7_TRGO ((uint32_t)0x00000014) /*!< TIM7 TRGO selected as external conversion trigger for DAC channel */ |
||||
|
#define DAC_Trigger_T8_TRGO ((uint32_t)0x0000000C) /*!< TIM8 TRGO selected as external conversion trigger for DAC channel */ |
||||
|
|
||||
|
#define DAC_Trigger_Ext_IT9 ((uint32_t)0x00000034) /*!< EXTI Line9 event selected as external conversion trigger for DAC channel */ |
||||
|
#define DAC_Trigger_Software ((uint32_t)0x0000003C) /*!< Conversion started by software trigger for DAC channel */ |
||||
|
|
||||
|
#define IS_DAC_TRIGGER(TRIGGER) (((TRIGGER) == DAC_Trigger_None) || \ |
||||
|
((TRIGGER) == DAC_Trigger_T6_TRGO) || \ |
||||
|
((TRIGGER) == DAC_Trigger_T8_TRGO) || \ |
||||
|
((TRIGGER) == DAC_Trigger_T7_TRGO) || \ |
||||
|
((TRIGGER) == DAC_Trigger_T5_TRGO) || \ |
||||
|
((TRIGGER) == DAC_Trigger_T2_TRGO) || \ |
||||
|
((TRIGGER) == DAC_Trigger_T4_TRGO) || \ |
||||
|
((TRIGGER) == DAC_Trigger_Ext_IT9) || \ |
||||
|
((TRIGGER) == DAC_Trigger_Software)) |
||||
|
|
||||
|
/**
|
||||
|
* @} |
||||
|
*/ |
||||
|
|
||||
|
/** @defgroup DAC_wave_generation
|
||||
|
* @{ |
||||
|
*/ |
||||
|
|
||||
|
#define DAC_WaveGeneration_None ((uint32_t)0x00000000) |
||||
|
#define DAC_WaveGeneration_Noise ((uint32_t)0x00000040) |
||||
|
#define DAC_WaveGeneration_Triangle ((uint32_t)0x00000080) |
||||
|
#define IS_DAC_GENERATE_WAVE(WAVE) (((WAVE) == DAC_WaveGeneration_None) || \ |
||||
|
((WAVE) == DAC_WaveGeneration_Noise) || \ |
||||
|
((WAVE) == DAC_WaveGeneration_Triangle)) |
||||
|
/**
|
||||
|
* @} |
||||
|
*/ |
||||
|
|
||||
|
/** @defgroup DAC_lfsrunmask_triangleamplitude
|
||||
|
* @{ |
||||
|
*/ |
||||
|
|
||||
|
#define DAC_LFSRUnmask_Bit0 ((uint32_t)0x00000000) /*!< Unmask DAC channel LFSR bit0 for noise wave generation */ |
||||
|
#define DAC_LFSRUnmask_Bits1_0 ((uint32_t)0x00000100) /*!< Unmask DAC channel LFSR bit[1:0] for noise wave generation */ |
||||
|
#define DAC_LFSRUnmask_Bits2_0 ((uint32_t)0x00000200) /*!< Unmask DAC channel LFSR bit[2:0] for noise wave generation */ |
||||
|
#define DAC_LFSRUnmask_Bits3_0 ((uint32_t)0x00000300) /*!< Unmask DAC channel LFSR bit[3:0] for noise wave generation */ |
||||
|
#define DAC_LFSRUnmask_Bits4_0 ((uint32_t)0x00000400) /*!< Unmask DAC channel LFSR bit[4:0] for noise wave generation */ |
||||
|
#define DAC_LFSRUnmask_Bits5_0 ((uint32_t)0x00000500) /*!< Unmask DAC channel LFSR bit[5:0] for noise wave generation */ |
||||
|
#define DAC_LFSRUnmask_Bits6_0 ((uint32_t)0x00000600) /*!< Unmask DAC channel LFSR bit[6:0] for noise wave generation */ |
||||
|
#define DAC_LFSRUnmask_Bits7_0 ((uint32_t)0x00000700) /*!< Unmask DAC channel LFSR bit[7:0] for noise wave generation */ |
||||
|
#define DAC_LFSRUnmask_Bits8_0 ((uint32_t)0x00000800) /*!< Unmask DAC channel LFSR bit[8:0] for noise wave generation */ |
||||
|
#define DAC_LFSRUnmask_Bits9_0 ((uint32_t)0x00000900) /*!< Unmask DAC channel LFSR bit[9:0] for noise wave generation */ |
||||
|
#define DAC_LFSRUnmask_Bits10_0 ((uint32_t)0x00000A00) /*!< Unmask DAC channel LFSR bit[10:0] for noise wave generation */ |
||||
|
#define DAC_LFSRUnmask_Bits11_0 ((uint32_t)0x00000B00) /*!< Unmask DAC channel LFSR bit[11:0] for noise wave generation */ |
||||
|
#define DAC_TriangleAmplitude_1 ((uint32_t)0x00000000) /*!< Select max triangle amplitude of 1 */ |
||||
|
#define DAC_TriangleAmplitude_3 ((uint32_t)0x00000100) /*!< Select max triangle amplitude of 3 */ |
||||
|
#define DAC_TriangleAmplitude_7 ((uint32_t)0x00000200) /*!< Select max triangle amplitude of 7 */ |
||||
|
#define DAC_TriangleAmplitude_15 ((uint32_t)0x00000300) /*!< Select max triangle amplitude of 15 */ |
||||
|
#define DAC_TriangleAmplitude_31 ((uint32_t)0x00000400) /*!< Select max triangle amplitude of 31 */ |
||||
|
#define DAC_TriangleAmplitude_63 ((uint32_t)0x00000500) /*!< Select max triangle amplitude of 63 */ |
||||
|
#define DAC_TriangleAmplitude_127 ((uint32_t)0x00000600) /*!< Select max triangle amplitude of 127 */ |
||||
|
#define DAC_TriangleAmplitude_255 ((uint32_t)0x00000700) /*!< Select max triangle amplitude of 255 */ |
||||
|
#define DAC_TriangleAmplitude_511 ((uint32_t)0x00000800) /*!< Select max triangle amplitude of 511 */ |
||||
|
#define DAC_TriangleAmplitude_1023 ((uint32_t)0x00000900) /*!< Select max triangle amplitude of 1023 */ |
||||
|
#define DAC_TriangleAmplitude_2047 ((uint32_t)0x00000A00) /*!< Select max triangle amplitude of 2047 */ |
||||
|
#define DAC_TriangleAmplitude_4095 ((uint32_t)0x00000B00) /*!< Select max triangle amplitude of 4095 */ |
||||
|
|
||||
|
#define IS_DAC_LFSR_UNMASK_TRIANGLE_AMPLITUDE(VALUE) (((VALUE) == DAC_LFSRUnmask_Bit0) || \ |
||||
|
((VALUE) == DAC_LFSRUnmask_Bits1_0) || \ |
||||
|
((VALUE) == DAC_LFSRUnmask_Bits2_0) || \ |
||||
|
((VALUE) == DAC_LFSRUnmask_Bits3_0) || \ |
||||
|
((VALUE) == DAC_LFSRUnmask_Bits4_0) || \ |
||||
|
((VALUE) == DAC_LFSRUnmask_Bits5_0) || \ |
||||
|
((VALUE) == DAC_LFSRUnmask_Bits6_0) || \ |
||||
|
((VALUE) == DAC_LFSRUnmask_Bits7_0) || \ |
||||
|
((VALUE) == DAC_LFSRUnmask_Bits8_0) || \ |
||||
|
((VALUE) == DAC_LFSRUnmask_Bits9_0) || \ |
||||
|
((VALUE) == DAC_LFSRUnmask_Bits10_0) || \ |
||||
|
((VALUE) == DAC_LFSRUnmask_Bits11_0) || \ |
||||
|
((VALUE) == DAC_TriangleAmplitude_1) || \ |
||||
|
((VALUE) == DAC_TriangleAmplitude_3) || \ |
||||
|
((VALUE) == DAC_TriangleAmplitude_7) || \ |
||||
|
((VALUE) == DAC_TriangleAmplitude_15) || \ |
||||
|
((VALUE) == DAC_TriangleAmplitude_31) || \ |
||||
|
((VALUE) == DAC_TriangleAmplitude_63) || \ |
||||
|
((VALUE) == DAC_TriangleAmplitude_127) || \ |
||||
|
((VALUE) == DAC_TriangleAmplitude_255) || \ |
||||
|
((VALUE) == DAC_TriangleAmplitude_511) || \ |
||||
|
((VALUE) == DAC_TriangleAmplitude_1023) || \ |
||||
|
((VALUE) == DAC_TriangleAmplitude_2047) || \ |
||||
|
((VALUE) == DAC_TriangleAmplitude_4095)) |
||||
|
/**
|
||||
|
* @} |
||||
|
*/ |
||||
|
|
||||
|
/** @defgroup DAC_output_buffer
|
||||
|
* @{ |
||||
|
*/ |
||||
|
|
||||
|
#define DAC_OutputBuffer_Enable ((uint32_t)0x00000000) |
||||
|
#define DAC_OutputBuffer_Disable ((uint32_t)0x00000002) |
||||
|
#define IS_DAC_OUTPUT_BUFFER_STATE(STATE) (((STATE) == DAC_OutputBuffer_Enable) || \ |
||||
|
((STATE) == DAC_OutputBuffer_Disable)) |
||||
|
/**
|
||||
|
* @} |
||||
|
*/ |
||||
|
|
||||
|
/** @defgroup DAC_Channel_selection
|
||||
|
* @{ |
||||
|
*/ |
||||
|
|
||||
|
#define DAC_Channel_1 ((uint32_t)0x00000000) |
||||
|
#define DAC_Channel_2 ((uint32_t)0x00000010) |
||||
|
#define IS_DAC_CHANNEL(CHANNEL) (((CHANNEL) == DAC_Channel_1) || \ |
||||
|
((CHANNEL) == DAC_Channel_2)) |
||||
|
/**
|
||||
|
* @} |
||||
|
*/ |
||||
|
|
||||
|
/** @defgroup DAC_data_alignement
|
||||
|
* @{ |
||||
|
*/ |
||||
|
|
||||
|
#define DAC_Align_12b_R ((uint32_t)0x00000000) |
||||
|
#define DAC_Align_12b_L ((uint32_t)0x00000004) |
||||
|
#define DAC_Align_8b_R ((uint32_t)0x00000008) |
||||
|
#define IS_DAC_ALIGN(ALIGN) (((ALIGN) == DAC_Align_12b_R) || \ |
||||
|
((ALIGN) == DAC_Align_12b_L) || \ |
||||
|
((ALIGN) == DAC_Align_8b_R)) |
||||
|
/**
|
||||
|
* @} |
||||
|
*/ |
||||
|
|
||||
|
/** @defgroup DAC_wave_generation
|
||||
|
* @{ |
||||
|
*/ |
||||
|
|
||||
|
#define DAC_Wave_Noise ((uint32_t)0x00000040) |
||||
|
#define DAC_Wave_Triangle ((uint32_t)0x00000080) |
||||
|
#define IS_DAC_WAVE(WAVE) (((WAVE) == DAC_Wave_Noise) || \ |
||||
|
((WAVE) == DAC_Wave_Triangle)) |
||||
|
/**
|
||||
|
* @} |
||||
|
*/ |
||||
|
|
||||
|
/** @defgroup DAC_data
|
||||
|
* @{ |
||||
|
*/ |
||||
|
|
||||
|
#define IS_DAC_DATA(DATA) ((DATA) <= 0xFFF0) |
||||
|
/**
|
||||
|
* @} |
||||
|
*/ |
||||
|
|
||||
|
/** @defgroup DAC_interrupts_definition
|
||||
|
* @{ |
||||
|
*/ |
||||
|
#define DAC_IT_DMAUDR ((uint32_t)0x00002000) |
||||
|
#define IS_DAC_IT(IT) (((IT) == DAC_IT_DMAUDR)) |
||||
|
|
||||
|
/**
|
||||
|
* @} |
||||
|
*/ |
||||
|
|
||||
|
/** @defgroup DAC_flags_definition
|
||||
|
* @{ |
||||
|
*/ |
||||
|
|
||||
|
#define DAC_FLAG_DMAUDR ((uint32_t)0x00002000) |
||||
|
#define IS_DAC_FLAG(FLAG) (((FLAG) == DAC_FLAG_DMAUDR)) |
||||
|
|
||||
|
/**
|
||||
|
* @} |
||||
|
*/ |
||||
|
|
||||
|
/**
|
||||
|
* @} |
||||
|
*/ |
||||
|
|
||||
|
/* Exported macro ------------------------------------------------------------*/ |
||||
|
/* Exported functions --------------------------------------------------------*/ |
||||
|
|
||||
|
/* Function used to set the DAC configuration to the default reset state *****/ |
||||
|
void DAC_DeInit(void); |
||||
|
|
||||
|
/* DAC channels configuration: trigger, output buffer, data format functions */ |
||||
|
void DAC_Init(uint32_t DAC_Channel, DAC_InitTypeDef* DAC_InitStruct); |
||||
|
void DAC_StructInit(DAC_InitTypeDef* DAC_InitStruct); |
||||
|
void DAC_Cmd(uint32_t DAC_Channel, FunctionalState NewState); |
||||
|
void DAC_SoftwareTriggerCmd(uint32_t DAC_Channel, FunctionalState NewState); |
||||
|
void DAC_DualSoftwareTriggerCmd(FunctionalState NewState); |
||||
|
void DAC_WaveGenerationCmd(uint32_t DAC_Channel, uint32_t DAC_Wave, FunctionalState NewState); |
||||
|
void DAC_SetChannel1Data(uint32_t DAC_Align, uint16_t Data); |
||||
|
void DAC_SetChannel2Data(uint32_t DAC_Align, uint16_t Data); |
||||
|
void DAC_SetDualChannelData(uint32_t DAC_Align, uint16_t Data2, uint16_t Data1); |
||||
|
uint16_t DAC_GetDataOutputValue(uint32_t DAC_Channel); |
||||
|
|
||||
|
/* DMA management functions ***************************************************/ |
||||
|
void DAC_DMACmd(uint32_t DAC_Channel, FunctionalState NewState); |
||||
|
|
||||
|
/* Interrupts and flags management functions **********************************/ |
||||
|
void DAC_ITConfig(uint32_t DAC_Channel, uint32_t DAC_IT, FunctionalState NewState); |
||||
|
FlagStatus DAC_GetFlagStatus(uint32_t DAC_Channel, uint32_t DAC_FLAG); |
||||
|
void DAC_ClearFlag(uint32_t DAC_Channel, uint32_t DAC_FLAG); |
||||
|
ITStatus DAC_GetITStatus(uint32_t DAC_Channel, uint32_t DAC_IT); |
||||
|
void DAC_ClearITPendingBit(uint32_t DAC_Channel, uint32_t DAC_IT); |
||||
|
|
||||
|
#ifdef __cplusplus |
||||
|
} |
||||
|
#endif |
||||
|
|
||||
|
#endif /*__STM32F4xx_DAC_H */ |
||||
|
|
||||
|
/**
|
||||
|
* @} |
||||
|
*/ |
||||
|
|
||||
|
/**
|
||||
|
* @} |
||||
|
*/ |
||||
|
|
||||
|
/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ |
Loading…
Reference in new issue