void SOUNDInitDAC(uint32_t sampleRate) { GPIO_InitTypeDef GPIO_InitStructure; DAC_InitTypeDef DAC_InitStructure; // CS43L22Init(); RCC_APB1PeriphClockCmd(RCC_APB1Periph_DAC | RCC_APB1Periph_TIM6, ENABLE); RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_DMA1 | RCC_AHB1Periph_GPIOA | RCC_AHB1Periph_GPIOC, ENABLE); // PC5 MAX4410 Audio Amp Shutdown GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5; GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz; GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; GPIO_Init(GPIOC, &GPIO_InitStructure); // 初期化関数を読み出します。 AUDIO_OUT_SHUTDOWN; // PA4 PA5 DAC_OUT1 DAC_OUT2 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4 | GPIO_Pin_5; GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz; GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; GPIO_Init(GPIOA, &GPIO_InitStructure); // 初期化関数を読み出します。 DAC_DeInit(); DAC_InitStructure.DAC_Trigger = DAC_Trigger_T6_TRGO; DAC_InitStructure.DAC_WaveGeneration = DAC_WaveGeneration_None; DAC_InitStructure.DAC_LFSRUnmask_TriangleAmplitude = DAC_LFSRUnmask_Bit0; DAC_InitStructure.DAC_OutputBuffer = DAC_OutputBuffer_Enable; DAC_Init(DAC_Channel_1, &DAC_InitStructure); DAC_Init(DAC_Channel_2, &DAC_InitStructure); DAC_DMACmd(DAC_Channel_1, ENABLE); DAC_DMACmd(DAC_Channel_2, ENABLE); DAC_Cmd(DAC_Channel_1, ENABLE); DAC_Cmd(DAC_Channel_2, ENABLE); TIM6->ARR = ((SystemCoreClock / 4) * 2) / sampleRate - 1; TIM6->PSC = 0; TIM6->CR1 |= _BV(7); TIM6->CR2 |= TIM_TRGOSource_Update; TIM6->DIER |= TIM_DMA_Update | _BV(0); // Interrupt Enable; TIM6->CR1 |= _BV(0); }
/** * @brief Configures DAC channel 1 * @param None * @retval None */ void DAC_Config(void) { /* Enable GPIOA Periph clock --------------------------------------*/ RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA, ENABLE); /* Configure PA.04 DAC_OUT as analog */ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4 ; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AN; GPIO_Init(GPIOA, &GPIO_InitStructure); /* DAC Periph clock enable */ RCC_APB1PeriphClockCmd(RCC_APB1Periph_DAC, ENABLE); /* Fill DAC InitStructure */ DAC_InitStructure.DAC_Trigger = DAC_Trigger_T2_TRGO; DAC_InitStructure.DAC_OutputBuffer = DAC_OutputBuffer_Disable; /* DAC channel1 Configuration */ DAC_Init(DAC_Channel_1, &DAC_InitStructure); /* Enable DAC Channel1: Once the DAC channel1 is enabled, PA.04 is automatically connected to the DAC converter. */ DAC_Cmd(DAC_Channel_1, ENABLE); /* Enable DMA for DAC Channel1 */ DAC_DMACmd(DAC_Channel_1, ENABLE); }
/** * @brief Configures DAC channel 1 and channel 2 * @param None * @retval None */ void DAC_Config(void) { /* Enable GPIOA Periph clock --------------------------------------*/ RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA, ENABLE); /* Configure PA.04 (DAC_OUT1), PA.05 (DAC_OUT2) as analog */ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4 | GPIO_Pin_5; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AN; GPIO_Init(GPIOA, &GPIO_InitStructure); /* DAC Periph clock enable */ RCC_APB1PeriphClockCmd(RCC_APB1Periph_DAC, ENABLE); /* DAC init struct configuration */ DAC_InitStructure.DAC_Trigger = DAC_Trigger_T2_TRGO; DAC_InitStructure.DAC_WaveGeneration = DAC_WaveGeneration_None; DAC_InitStructure.DAC_OutputBuffer = DAC_OutputBuffer_Enable; /* DAC channel1 Configuration */ DAC_Init(DAC_Channel_1, &DAC_InitStructure); /* DAC channel2 Configuration */ DAC_Init(DAC_Channel_2, &DAC_InitStructure); /* Enable DAC Channel1: Once the DAC channel1 is enabled, PA.04 is automatically connected to the DAC converter. */ DAC_Cmd(DAC_Channel_1, ENABLE); /* Enable DAC Channel2: Once the DAC channel2 is enabled, PA.05 is automatically connected to the DAC converter. */ DAC_Cmd(DAC_Channel_2, ENABLE); /* Enable DMA for DAC Channel2 */ DAC_DMACmd(DAC_Channel_2, ENABLE); }
static void StartAudioDMAAndRequestBuffers() { // Configure DMA stream. DMA1_Stream5 ->CR = /*(0 * DMA_SxCR_CHSEL_0 )*/0x0E000000 | // Channel 7 (1 * DMA_SxCR_PL_0 ) | // Priority 1 (1 * DMA_SxCR_PSIZE_0 ) | // PSIZE = 16 bit (1 * DMA_SxCR_MSIZE ) | // MSIZE = 16 bit DMA_SxCR_MINC | // Increase memory address (1 * DMA_SxCR_DIR_0 ) | // Memory to peripheral DMA_SxCR_TCIE; // Transfer complete interrupt DMA1_Stream5 ->NDTR = NextBufferLength >> 1; DMA1_Stream5 ->PAR = (uint32_t) &DAC->DHR12R1; DMA1_Stream5 ->M0AR = (uint32_t) NextBufferSamples; DMA1_Stream5 ->FCR = DMA_SxFCR_DMDIS; DMA1_Stream5 ->CR |= DMA_SxCR_EN; //TIM_Cmd(TIM6, DISABLE); DAC_Cmd(DAC_Channel_1, ENABLE); DAC_DMACmd(DAC_Channel_1, ENABLE); //DMAEN1 TIM_Cmd(TIM6, ENABLE); // Update state. NextBufferSamples = NULL; BufferNumber ^= 1; DMARunning = true; // Invoke callback if it exists to queue up another buffer. if (CallbackFunction) CallbackFunction(CallbackContext, BufferNumber); }
void DAC_DMA_init(void){ NVIC_InitTypeDef NVIC_InitStructure; GPIO_InitTypeDef GPIO_InitStruct; DAC_InitTypeDef DAC_INIT; DMA_InitTypeDef DMA_INIT; __HAL_RCC_DMA1_CLK_ENABLE(); __HAL_RCC_DAC_CLK_ENABLE(); /* DAC output pin */ GPIO_InitStruct.Pin = GPIO_PIN_4; GPIO_InitStruct.Mode = GPIO_MODE_ANALOG; GPIO_InitStruct.Pull = GPIO_NOPULL; //GPIO_InitStruct.Speed = GPIO_SPEED_FAST; /* 50MHz */ HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); DAC_INIT.DAC_Trigger = DAC_Trigger_T6_TRGO; DAC_INIT.DAC_WaveGeneration = DAC_WaveGeneration_None; DAC_INIT.DAC_LFSRUnmask_TriangleAmplitude = DAC_LFSRUnmask_Bit0; DAC_INIT.DAC_OutputBuffer = DAC_OutputBuffer_Enable; DAC_Init(DAC_Channel_1, &DAC_INIT); DMA_DeInit(DMA1_Stream5); DMA_INIT.DMA_Channel = DMA_Channel_7; DMA_INIT.DMA_PeripheralBaseAddr = (uint32_t)DAC_DHR12R1_ADDR; DMA_INIT.DMA_Memory0BaseAddr = (uint32_t) &PINGBUF; //DMA_INIT.DMA_Memory0BaseAddr = (uint32_t) &function; DMA_INIT.DMA_DIR = DMA_DIR_MemoryToPeripheral; DMA_INIT.DMA_BufferSize = SINE_RES; DMA_INIT.DMA_PeripheralInc = DMA_PeripheralInc_Disable; DMA_INIT.DMA_MemoryInc = DMA_MemoryInc_Enable; DMA_INIT.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord; DMA_INIT.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord; DMA_INIT.DMA_Mode = DMA_Mode_Circular; DMA_INIT.DMA_Priority = DMA_Priority_High; DMA_INIT.DMA_FIFOMode = DMA_FIFOMode_Disable; DMA_INIT.DMA_FIFOThreshold = DMA_FIFOThreshold_HalfFull; DMA_INIT.DMA_MemoryBurst = DMA_MemoryBurst_Single; DMA_INIT.DMA_PeripheralBurst = DMA_PeripheralBurst_Single; DMA_Init(DMA1_Stream5, &DMA_INIT); DMA_DoubleBufferModeConfig(DMA1_Stream5, &PONGBUF,DMA_Memory_0); DMA_DoubleBufferModeCmd(DMA1_Stream5, ENABLE); DMA_ITConfig(DMA1_Stream5, DMA_IT_HT | DMA_IT_TC | DMA_IT_TE, ENABLE); DMA_Cmd(DMA1_Stream5, ENABLE); DAC_Cmd(DAC_Channel_1, ENABLE); DAC_DMACmd(DAC_Channel_1,ENABLE); NVIC_InitStructure.NVIC_IRQChannel = DMA1_Stream5_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure); }
void SINE_4_EMS(void) { TIM_TimeBaseInitTypeDef TIM_TimeBaseStructur; /* TIM6 Configuration */ /* Time base configuration */ // 8kHz TIM_TimeBaseStructInit(&TIM_TimeBaseStructur); ///Таймер для генерации синуса 4 KHz TIM_TimeBaseStructur.TIM_Period = 200; TIM_TimeBaseStructur.TIM_Prescaler = 0x0; TIM_TimeBaseStructur.TIM_ClockDivision = 0; TIM_TimeBaseStructur.TIM_CounterMode = TIM_CounterMode_Up; TIM_TimeBaseInit(TIM6, &TIM_TimeBaseStructur); /* TIM7 TRGO selection */ TIM_SelectOutputTrigger(TIM6, TIM_TRGOSource_Update); /* DAC channel1 Configuration */ DAC_InitStructur.DAC_Trigger = DAC_Trigger_T6_TRGO; DAC_InitStructur.DAC_WaveGeneration = DAC_WaveGeneration_None; DAC_InitStructur.DAC_OutputBuffer = DAC_OutputBuffer_Enable; DAC_Init(DAC_Channel_1, &DAC_InitStructur); /* DMA2 channel3 configuration */ DMA_DeInit(DMA2_Channel3); DMA_InitStructur.DMA_PeripheralBaseAddr = DAC_DHR8R1_Address; DMA_InitStructur.DMA_MemoryBaseAddr = (uint32_t)&Sine12bit; DMA_InitStructur.DMA_DIR = DMA_DIR_PeripheralDST; DMA_InitStructur.DMA_BufferSize = 90; DMA_InitStructur.DMA_PeripheralInc = DMA_PeripheralInc_Disable; DMA_InitStructur.DMA_MemoryInc = DMA_MemoryInc_Enable; DMA_InitStructur.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord; DMA_InitStructur.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord; DMA_InitStructur.DMA_Mode = DMA_Mode_Circular; DMA_InitStructur.DMA_Priority = DMA_Priority_High; DMA_InitStructur.DMA_M2M = DMA_M2M_Disable; DMA_Init(DMA2_Channel3, &DMA_InitStructur); DMA_Cmd(DMA2_Channel3, ENABLE); DAC_Cmd(DAC_Channel_1, ENABLE); // включить синус DAC_DMACmd(DAC_Channel_1, ENABLE); TIM_Cmd(TIM6, ENABLE); }
static void dac2_config(void) { DAC_InitTypeDef DAC_InitStructure; DMA_InitTypeDef DMA_InitStructure; NVIC_InitTypeDef NVIC_InitStructure; /* DAC channel 2 Configuration (see notes in dac1_config() above) */ DAC_StructInit(&DAC_InitStructure); DAC_InitStructure.DAC_Trigger = DAC_Trigger_T6_TRGO; DAC_InitStructure.DAC_WaveGeneration = DAC_WaveGeneration_None; DAC_InitStructure.DAC_OutputBuffer = DAC_OutputBuffer_Enable; DAC_Init(DAC_Channel_2, &DAC_InitStructure); /* DMA1_Stream6 channel7 configuration **************************************/ DMA_DeInit(DMA1_Stream6); DMA_InitStructure.DMA_Channel = DMA_Channel_7; DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)DAC_DHR12R2_ADDRESS; DMA_InitStructure.DMA_Memory0BaseAddr = (uint32_t)dac2_buf; DMA_InitStructure.DMA_DIR = DMA_DIR_MemoryToPeripheral; DMA_InitStructure.DMA_BufferSize = DAC_BUF_SZ; DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable; DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable; DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord; DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord; DMA_InitStructure.DMA_Mode = DMA_Mode_Circular; DMA_InitStructure.DMA_Priority = DMA_Priority_High; DMA_InitStructure.DMA_FIFOMode = DMA_FIFOMode_Disable; DMA_InitStructure.DMA_FIFOThreshold = DMA_FIFOThreshold_HalfFull; DMA_InitStructure.DMA_MemoryBurst = DMA_MemoryBurst_Single; DMA_InitStructure.DMA_PeripheralBurst = DMA_PeripheralBurst_Single; DMA_Init(DMA1_Stream6, &DMA_InitStructure); /* Enable DMA Half & Complete interrupts */ DMA_ITConfig(DMA1_Stream6, DMA_IT_TC | DMA_IT_HT, ENABLE); /* Enable the DMA Stream IRQ Channel */ NVIC_InitStructure.NVIC_IRQChannel = DMA1_Stream6_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure); /* Enable DMA1_Stream6 */ DMA_Cmd(DMA1_Stream6, ENABLE); /* Enable DAC Channel 2 */ DAC_Cmd(DAC_Channel_2, ENABLE); /* Enable DMA for DAC Channel 2 */ DAC_DMACmd(DAC_Channel_2, ENABLE); }
void Offset_Measurement_Off(void) { /*Restoration of the system configuration*/ DAC_DMACmd(DAC_Channel_1, ENABLE); SetSamplFreq(old_sampl_freq); //ADC_Cmd(ADC3, DISABLE); ADC_DMACmd(ADC3, DISABLE); offset_meas = 0; }
/** * @brief Zastavi generovani pomoci DMA * @param None * @retval None */ void DAC_DMA_stop() { /* Enable DMA2 Channel3 */ DMA_Cmd(DMA2_Channel3, DISABLE); /* Enable DMA for DAC Channel2 */ DAC_DMACmd(DAC_Channel_1, DISABLE); dacState = DAC_IDLE; }
/** * @brief Odstartuje generovani pomoci DMA * @param None * @retval None */ void DAC_DMA_start() { /* Enable DMA2 Channel3 */ DMA_Cmd(DMA2_Channel3, ENABLE); /* Enable DMA for DAC Channel2 */ DAC_DMACmd(DAC_Channel_1, ENABLE); dacState = DAC_DMA_RUN; }
void DAC_Config(void) { DAC_RCC_Configuration(); /* Once the DAC channel is enabled, the corresponding GPIO pin is automatically connected to the DAC converter. In order to avoid parasitic consumption, the GPIO pin should be configured in analog */ DAC_GPIO_Configuration(); /* TIM6 Configuration */ TIM_PrescalerConfig(TIM6, 0x3, TIM_PSCReloadMode_Update); TIM_SetAutoreload(TIM6, 0xF); /* TIM6 TRGO selection */ TIM_SelectOutputTrigger(TIM6, TIM_TRGOSource_Update); /* DAC channel1 Configuration */ DAC_InitStructure.DAC_Trigger = DAC_Trigger_T6_TRGO; DAC_InitStructure.DAC_WaveGeneration = DAC_WaveGeneration_None; DAC_InitStructure.DAC_OutputBuffer = DAC_OutputBuffer_Disable; DAC_Init(DAC_Channel_1, &DAC_InitStructure); for (int i = 0; i < 128; i++) { ModSine12bit[i] = Sine12bit[i] / 2 + 1023; } DMA_DeInit(DMA2_Channel3); DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t) &DAC->DHR12R1; DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t) &ModSine12bit; DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralDST; DMA_InitStructure.DMA_BufferSize = 128; DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable; DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable; DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord; DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord; DMA_InitStructure.DMA_Mode = DMA_Mode_Circular; DMA_InitStructure.DMA_Priority = DMA_Priority_High; DMA_InitStructure.DMA_M2M = DMA_M2M_Disable; DMA_Init(DMA2_Channel3, &DMA_InitStructure); /* Enable DMA2 Channel3 */ DMA_Cmd(DMA2_Channel3, ENABLE); /* Enable DAC Channel1: Once the DAC channel1 is enabled, PA.04 is automatically connected to the DAC converter. */ DAC_Cmd(DAC_Channel_1, ENABLE); /* Enable DMA for DAC Channel1 */ DAC_DMACmd(DAC_Channel_1, ENABLE); /* TIM6 enable counter */ TIM_Cmd(TIM6, ENABLE); }
void init_DAC(void) { RCC_APB1PeriphClockCmd(RCC_APB1Periph_DAC, ENABLE); //DAC2 //channel 2 config DAC_InitStructure.DAC_Trigger = DAC_Trigger_T6_TRGO; DAC_InitStructure.DAC_WaveGeneration = DAC_WaveGeneration_None; DAC_InitStructure.DAC_OutputBuffer = DAC_OutputBuffer_Enable; DAC_Init(DAC_Channel_2, &DAC_InitStructure); DAC_Cmd(DAC_Channel_2, ENABLE); DAC_DMACmd(DAC_Channel_2, ENABLE); //DAC1 //channel 1 config DAC_InitStructure.DAC_Trigger = DAC_Trigger_T6_TRGO; DAC_InitStructure.DAC_WaveGeneration = DAC_WaveGeneration_None; DAC_InitStructure.DAC_OutputBuffer = DAC_OutputBuffer_Enable; DAC_Init(DAC_Channel_1, &DAC_InitStructure); DAC_Cmd(DAC_Channel_1, ENABLE); DAC_DMACmd(DAC_Channel_1, ENABLE); }
/** * @brief Main program. * @param None * @retval : None */ int main(void) { /* System Clocks Configuration */ RCC_Configuration(); /* Once the DAC channel is enabled, the corresponding GPIO pin is automatically connected to the DAC converter. In order to avoid parasitic consumption, the GPIO pin should be configured in analog */ GPIO_Configuration(); /* TIM6 Configuration */ TIM_PrescalerConfig(TIM6, 0xF, TIM_PSCReloadMode_Update); TIM_SetAutoreload(TIM6, 0xFF); /* TIM6 TRGO selection */ TIM_SelectOutputTrigger(TIM6, TIM_TRGOSource_Update); /* DAC channel1 Configuration */ DAC_InitStructure.DAC_Trigger = DAC_Trigger_T6_TRGO; DAC_InitStructure.DAC_WaveGeneration = DAC_WaveGeneration_None; DAC_InitStructure.DAC_OutputBuffer = DAC_OutputBuffer_Disable; DAC_Init(DAC_Channel_1, &DAC_InitStructure); /* DMA2 channel3 configuration */ DMA_DeInit(DMA2_Channel3); DMA_InitStructure.DMA_PeripheralBaseAddr = DAC_DHR8R1_Address; DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)&Escalator8bit; DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralDST; DMA_InitStructure.DMA_BufferSize = 6; DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable; DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable; DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte; DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte; DMA_InitStructure.DMA_Mode = DMA_Mode_Circular; DMA_InitStructure.DMA_Priority = DMA_Priority_High; DMA_InitStructure.DMA_M2M = DMA_M2M_Disable; DMA_Init(DMA2_Channel3, &DMA_InitStructure); /* Enable DMA2 Channel3 */ DMA_Cmd(DMA2_Channel3, ENABLE); /* Enable DAC Channel1: Once the DAC channel1 is enabled, PA.04 is automatically connected to the DAC converter. */ DAC_Cmd(DAC_Channel_1, ENABLE); /* Enable DMA for DAC Channel1 */ DAC_DMACmd(DAC_Channel_1, ENABLE); /* TIM6 enable counter */ TIM_Cmd(TIM6, ENABLE); while (1) { } }
/** * @brief Nastavi vzorek na vystup * @param uint16_t - hodnota, ktera se ma nastavit (v bitech) * @retval None */ void DAC_set_sample(uint16_t sample) { /* Enable DMA2 Channel3 */ DMA_Cmd(DMA2_Channel3, DISABLE); /* Enable DMA for DAC Channel2 */ DAC_DMACmd(DAC_Channel_1, DISABLE); DAC_SetChannel1Data(DAC_Align_12b_R, sample); dacState = DAC_RUN; }
void sineOff() { TIM_Cmd(TIM6, DISABLE); /* Enable DMA1_Stream6 */ DMA_Cmd(DMA1_Stream6, DISABLE); /* Enable DAC Channel2 */ DAC_Cmd(DAC_Channel_2, DISABLE); /* Enable DMA for DAC Channel2 */ DAC_DMACmd(DAC_Channel_2, DISABLE); }
/* * Main function. Called when startup code is done with * copying memory and setting up clocks. */ int audioToMp3(void) { GPIO_InitTypeDef GPIO_InitStructure; // SysTick interrupt each 1ms RCC_GetClocksFreq(&RCC_Clocks); SysTick_Config(RCC_Clocks.HCLK_Frequency / 1000); // GPIOD Peripheral clock enable RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOD, ENABLE); // Configure PD12, PD13, PD14 and PD15 in output pushpull mode GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12 | GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT; GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz; GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; GPIO_Init(GPIOD, &GPIO_InitStructure); // Initialize USB Host Library USBH_Init(&USB_OTG_Core, USB_OTG_FS_CORE_ID, &USB_Host, &USBH_MSC_cb, &USR_Callbacks); for(;;) { if(0==exitMp3) { USBH_Process(&USB_OTG_Core, &USB_Host); if (enum_done >= 2) { enum_done = 0; play_directory("", 0); } } //exit and disable peripherals else { //RTC_AlarmCmd(RTC_Alarm_A,DISABLE); DAC_Cmd(DAC_Channel_1, DISABLE); DAC_DMACmd(DAC_Channel_1, DISABLE); //DMAEN1 DMA_Cmd(DMA1_Stream5, DISABLE); TIM_Cmd(TIM6, DISABLE); exitMp3 = 0; mp3PlayingFlag = 0; break; } } }
/*================================================================================== * 函 数 名: dac1_init * 参 数: None * 功能描述: 初始化dac1 * 返 回 值: None * 备 注: * 作 者: gaodb * 创建时间: 2012.10 ==================================================================================*/ static void dac1_init(void) { DAC_InitTypeDef DAC_InitStructure; DMA_InitTypeDef DMA_InitStructure; TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; TIM_TimeBaseStructure.TIM_Period = 0xf; //0.910222222ms * (1089 + 1) = 1s TIM_TimeBaseStructure.TIM_Prescaler = 0xff; TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; TIM_TimeBaseInit(TIM6, &TIM_TimeBaseStructure); /* TIM6 TRGO selection */ TIM_SelectOutputTrigger(TIM6, TIM_TRGOSource_Update); TIM_ARRPreloadConfig(TIM6, ENABLE); /* DAC channel1 Configuration */ DAC_InitStructure.DAC_Trigger = DAC_Trigger_T6_TRGO; DAC_InitStructure.DAC_WaveGeneration = DAC_WaveGeneration_None; DAC_InitStructure.DAC_OutputBuffer = DAC_OutputBuffer_Disable; DAC_Init(DAC_Channel_1, &DAC_InitStructure); DMA_DeInit(DMA2_Channel3); DMA_InitStructure.DMA_PeripheralBaseAddr = DAC_DHR8R1_Address; DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)&Escalator8bit; DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralDST; DMA_InitStructure.DMA_BufferSize = 6; DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable; DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable; DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte; DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte; DMA_InitStructure.DMA_Mode = DMA_Mode_Circular; DMA_InitStructure.DMA_Priority = DMA_Priority_High; DMA_InitStructure.DMA_M2M = DMA_M2M_Disable; DMA_Init(DMA2_Channel3, &DMA_InitStructure); /* Enable DMA2 Channel3 */ DMA_Cmd(DMA2_Channel3, ENABLE); /* Enable DAC Channel1: Once the DAC channel1 is enabled, PA.04 is automatically connected to the DAC converter. */ DAC_Cmd(DAC_Channel_1, ENABLE); /* Enable DMA for DAC Channel1 */ DAC_DMACmd(DAC_Channel_1, ENABLE); /* TIM6 enable counter */ TIM_Cmd(TIM6, ENABLE); }
/* ********************************************************************************************************* * 函 数 名: DAC_Ch1_WaveConfig * 功能说明: DAC通道1方波输出 * 上面函数TIM6_Config已将将TIM6的输出配置成1.5MHz,下面DMA的缓存大小是64,那么方波的输出频率就是 * 方波周期 = TIM6更新周期/64 = 1.5MHz / 64 = 23437.5Hz * 形 参: 无 * 返 回 值: 无 ********************************************************************************************************* */ void DAC_Ch1_WaveConfig(void) { DAC_InitTypeDef DAC_InitStructure; DMA_InitTypeDef DMA_InitStructure; /* DAC 外设时钟使能 */ RCC_APB1PeriphClockCmd(RCC_APB1Periph_DAC, ENABLE); /* DMA1 时钟使能 */ RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_DMA1, ENABLE); /* DAC通道1配置 */ DAC_InitStructure.DAC_Trigger = DAC_Trigger_T6_TRGO; DAC_InitStructure.DAC_WaveGeneration = DAC_WaveGeneration_None; DAC_InitStructure.DAC_OutputBuffer = DAC_OutputBuffer_Disable; DAC_Init(DAC_Channel_1, &DAC_InitStructure); /* DMA1_Stream5 通道7配置 **************************************/ DMA_DeInit(DMA1_Stream5); DMA_InitStructure.DMA_Channel = DMA_Channel_7; DMA_InitStructure.DMA_PeripheralBaseAddr = DAC_DHR12R1_ADDRESS; DMA_InitStructure.DMA_Memory0BaseAddr = (uint32_t)&g_usWaveBuff; DMA_InitStructure.DMA_BufferSize = 64; DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord; DMA_InitStructure.DMA_MemoryDataSize = DMA_PeripheralDataSize_HalfWord; DMA_InitStructure.DMA_DIR = DMA_DIR_MemoryToPeripheral; DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable; DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable; DMA_InitStructure.DMA_Mode = DMA_Mode_Circular; DMA_InitStructure.DMA_Priority = DMA_Priority_High; DMA_InitStructure.DMA_FIFOMode = DMA_FIFOMode_Disable; DMA_InitStructure.DMA_FIFOThreshold = DMA_FIFOThreshold_HalfFull; DMA_InitStructure.DMA_MemoryBurst = DMA_MemoryBurst_Single; DMA_InitStructure.DMA_PeripheralBurst = DMA_PeripheralBurst_Single; DMA_Init(DMA1_Stream5, &DMA_InitStructure); /* 使能 DMA1_Stream5 */ DMA_Cmd(DMA1_Stream5, ENABLE); /* 使能DAC通道 */ DAC_Cmd(DAC_Channel_1, ENABLE); /* 使能DAC的DMA通道 */ DAC_DMACmd(DAC_Channel_1, ENABLE); }
void Offset_Measurement_On(void) { /*DAC DMA request disable to measure the dark detector output*/ DAC_DMACmd(DAC_Channel_1, DISABLE); /*MHP Off*/ DAC_SetChannel1Data(DAC_Align_12b_R, 0); /*DMA2 interrupt will not disable ADC3 because triggering is not needed for offset measurement*/ offset_meas = 1; /*ADC3 is ENABLED because triggering from the DAC output is not needed*/ //ADC_Cmd(ADC3, ENABLE); ADC_DMACmd(ADC3, ENABLE); old_sampl_freq = GetSamplFreq(); /*4000 samples per second: we need to wait 0.25 seconds to fill the 1000 elements buffer*/ SetSamplFreq(4000); }
static void DacInitDmaAndTimer() { uint32_t prescaler; uint32_t period; prescaler = 1; period = (3500)/2; DMA_InitTypeDef DMA_InitStructure; DMA_InitStructure.DMA_Channel = DMA_Channel_7; DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)&DAC->DHR12R1; DMA_InitStructure.DMA_Memory0BaseAddr = (uint32_t)&g_sinusBuffer; DMA_InitStructure.DMA_DIR = DMA_DIR_MemoryToPeripheral; DMA_InitStructure.DMA_BufferSize = SinusBufferSize; DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable; DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable; DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord; DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord; DMA_InitStructure.DMA_Mode = DMA_Mode_Circular; DMA_InitStructure.DMA_Priority = DMA_Priority_High; DMA_InitStructure.DMA_FIFOMode = DMA_FIFOMode_Disable; DMA_InitStructure.DMA_FIFOThreshold = DMA_FIFOThreshold_HalfFull; DMA_InitStructure.DMA_MemoryBurst = DMA_MemoryBurst_Single; DMA_InitStructure.DMA_PeripheralBurst = DMA_PeripheralBurst_Single; DMA_Init(DMA1_Stream5, &DMA_InitStructure); DMA_Cmd(DMA1_Stream5, ENABLE); DAC_Cmd(DAC_Channel_1, ENABLE); DAC_DMACmd(DAC_Channel_1, ENABLE); //168 MHz / TIM_Prescaler / TIM_Period TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; TIM_TimeBaseStructInit(&TIM_TimeBaseStructure); TIM_TimeBaseStructure.TIM_Period = period-1; TIM_TimeBaseStructure.TIM_Prescaler = prescaler-1; TIM_TimeBaseStructure.TIM_ClockDivision = 0; TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure); //TIM_SetCounter(TIM2, 0); TIM_SelectOutputTrigger(TIM2, TIM_TRGOSource_Update); g_dac_period = period * prescaler * SinusBufferSize; }
void DAC_Ch2_SineWaveConfig(void) { float32_t xfactor = 2.0 * PI / SIN_TABLE_SIZE; for (int i = 0; i < SIN_TABLE_SIZE; i++) { uint16_t ival = arm_sin_f32(i * xfactor) * 2046.0 + 2046.0; sin_table[i] = ival; //display_bar(0, 4096, (int) sin_table[i]); } DMA_InitTypeDef DMA_InitStructure; DAC_InitTypeDef DAC_InitStructure; /* DAC channel1 Configuration */ DAC_InitStructure.DAC_Trigger = DAC_Trigger_T6_TRGO; DAC_InitStructure.DAC_WaveGeneration = DAC_WaveGeneration_None; DAC_InitStructure.DAC_OutputBuffer = DAC_OutputBuffer_Enable; DAC_Init(DAC_Channel_1, &DAC_InitStructure); /* DMA1_Stream5 channel1 configuration **************************************/ DMA_DeInit(DMA1_Stream5 ); DMA_InitStructure.DMA_Channel = DMA_Channel_7; DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t) DAC_DHR12R1_ADDRESS; DMA_InitStructure.DMA_Memory0BaseAddr = (uint32_t) &sin_table; DMA_InitStructure.DMA_DIR = DMA_DIR_MemoryToPeripheral; DMA_InitStructure.DMA_BufferSize = SIN_TABLE_SIZE; DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable; DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable; DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord; DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord; DMA_InitStructure.DMA_Mode = DMA_Mode_Circular; DMA_InitStructure.DMA_Priority = DMA_Priority_High; DMA_InitStructure.DMA_FIFOMode = DMA_FIFOMode_Disable; DMA_InitStructure.DMA_FIFOThreshold = DMA_FIFOThreshold_HalfFull; DMA_InitStructure.DMA_MemoryBurst = DMA_MemoryBurst_Single; DMA_InitStructure.DMA_PeripheralBurst = DMA_PeripheralBurst_Single; DMA_Init(DMA1_Stream5, &DMA_InitStructure); DMA_Cmd(DMA1_Stream5, ENABLE); DAC_Cmd(DAC_Channel_1, ENABLE); DAC_DMACmd(DAC_Channel_1, ENABLE); }
/** * @brief DAC Channel1 Escalator Configuration * @param None * @retval None */ void DAC_Ch1_EscalatorConfig(void) { DMA_InitTypeDef DMA_InitStructure; /* DAC channel1 Configuration */ DAC_InitStructure.DAC_Trigger = DAC_Trigger_T6_TRGO; DAC_InitStructure.DAC_WaveGeneration = DAC_WaveGeneration_None; DAC_InitStructure.DAC_OutputBuffer = DAC_OutputBuffer_Enable; DAC_Init(DAC_Channel_1, &DAC_InitStructure); /* DMA1_Stream5 channel7 configuration **************************************/ DMA_DeInit(DMA1_Stream5); DMA_InitStructure.DMA_Channel = DMA_Channel_7; DMA_InitStructure.DMA_PeripheralBaseAddr = DAC_DHR8R1_ADDRESS; DMA_InitStructure.DMA_Memory0BaseAddr = (uint32_t)&Escalator8bit; DMA_InitStructure.DMA_BufferSize = 6; DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte; DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte; DMA_InitStructure.DMA_DIR = DMA_DIR_MemoryToPeripheral; DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable; DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable; DMA_InitStructure.DMA_Mode = DMA_Mode_Circular; DMA_InitStructure.DMA_Priority = DMA_Priority_High; DMA_InitStructure.DMA_FIFOMode = DMA_FIFOMode_Disable; DMA_InitStructure.DMA_FIFOThreshold = DMA_FIFOThreshold_HalfFull; DMA_InitStructure.DMA_MemoryBurst = DMA_MemoryBurst_Single; DMA_InitStructure.DMA_PeripheralBurst = DMA_PeripheralBurst_Single; DMA_Init(DMA1_Stream5, &DMA_InitStructure); /* Enable DMA1_Stream5 */ DMA_Cmd(DMA1_Stream5, ENABLE); /* Enable DAC Channel1 */ DAC_Cmd(DAC_Channel_1, ENABLE); /* Enable DMA for DAC Channel1 */ DAC_DMACmd(DAC_Channel_1, ENABLE); }
/** * @brief DAC Channel2 SineWave Configuration * @param None * @retval None */ void DAC_Ch2_SineWaveConfig(void) { DMA_InitTypeDef DMA_InitStructure; /* DAC channel2 Configuration */ DAC_InitStructure.DAC_Trigger = DAC_Trigger_T6_TRGO; DAC_InitStructure.DAC_WaveGeneration = DAC_WaveGeneration_None; DAC_InitStructure.DAC_OutputBuffer = DAC_OutputBuffer_Enable; DAC_Init(DAC_Channel_2, &DAC_InitStructure); /* DMA1_Stream6 channel7 configuration **************************************/ DMA_DeInit(DMA1_Stream6); DMA_InitStructure.DMA_Channel = DMA_Channel_7; DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)DAC_DHR12R2_ADDRESS; DMA_InitStructure.DMA_Memory0BaseAddr = (uint32_t)&Sine12bit; DMA_InitStructure.DMA_DIR = DMA_DIR_MemoryToPeripheral; DMA_InitStructure.DMA_BufferSize = 32; DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable; DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable; DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord; DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord; DMA_InitStructure.DMA_Mode = DMA_Mode_Circular; DMA_InitStructure.DMA_Priority = DMA_Priority_High; DMA_InitStructure.DMA_FIFOMode = DMA_FIFOMode_Disable; DMA_InitStructure.DMA_FIFOThreshold = DMA_FIFOThreshold_HalfFull; DMA_InitStructure.DMA_MemoryBurst = DMA_MemoryBurst_Single; DMA_InitStructure.DMA_PeripheralBurst = DMA_PeripheralBurst_Single; DMA_Init(DMA1_Stream6, &DMA_InitStructure); /* Enable DMA1_Stream6 */ DMA_Cmd(DMA1_Stream6, ENABLE); /* Enable DAC Channel2 */ DAC_Cmd(DAC_Channel_2, ENABLE); /* Enable DMA for DAC Channel2 */ DAC_DMACmd(DAC_Channel_2, ENABLE); }
/** * @brief Main program. * @param None * @retval None */ int main(void) { /*!< At this stage the microcontroller clock setting is already configured, this is done through SystemInit() function which is called from startup file (startup_stm32f10x_xx.s) before to branch to application main. To reconfigure the default setting of SystemInit() function, refer to system_stm32f10x.c file */ /* System Clocks Configuration */ RCC_Configuration(); /* Once the DAC channel is enabled, the corresponding GPIO pin is automatically connected to the DAC converter. In order to avoid parasitic consumption, the GPIO pin should be configured in analog */ GPIO_Configuration(); /* TIM6 Configuration */ TIM_PrescalerConfig(TIM6, 0xF, TIM_PSCReloadMode_Update); TIM_SetAutoreload(TIM6, 0xFF); /* TIM6 TRGO selection */ TIM_SelectOutputTrigger(TIM6, TIM_TRGOSource_Update); /* DAC channel1 Configuration */ DAC_InitStructure.DAC_Trigger = DAC_Trigger_T6_TRGO; DAC_InitStructure.DAC_WaveGeneration = DAC_WaveGeneration_None; DAC_InitStructure.DAC_OutputBuffer = DAC_OutputBuffer_Disable; DAC_Init(DAC_Channel_1, &DAC_InitStructure); #if !defined STM32F10X_LD_VL && !defined STM32F10X_MD_VL /* DMA2 channel3 configuration */ DMA_DeInit(DMA2_Channel3); #else /* DMA1 channel3 configuration */ DMA_DeInit(DMA1_Channel3); #endif DMA_InitStructure.DMA_PeripheralBaseAddr = DAC_DHR8R1_Address; DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)&Escalator8bit; DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralDST; DMA_InitStructure.DMA_BufferSize = 6; DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable; DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable; DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte; DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte; DMA_InitStructure.DMA_Mode = DMA_Mode_Circular; DMA_InitStructure.DMA_Priority = DMA_Priority_High; DMA_InitStructure.DMA_M2M = DMA_M2M_Disable; #if !defined STM32F10X_LD_VL && !defined STM32F10X_MD_VL DMA_Init(DMA2_Channel3, &DMA_InitStructure); /* Enable DMA2 Channel3 */ DMA_Cmd(DMA2_Channel3, ENABLE); #else DMA_Init(DMA1_Channel3, &DMA_InitStructure); /* Enable DMA1 Channel3 */ DMA_Cmd(DMA1_Channel3, ENABLE); #endif /* Enable DAC Channel1: Once the DAC channel1 is enabled, PA.04 is automatically connected to the DAC converter. */ DAC_Cmd(DAC_Channel_1, ENABLE); /* Enable DMA for DAC Channel1 */ DAC_DMACmd(DAC_Channel_1, ENABLE); /* TIM6 enable counter */ TIM_Cmd(TIM6, ENABLE); while (1) { } }
static void dac1_config(void) { DAC_InitTypeDef DAC_InitStructure; DMA_InitTypeDef DMA_InitStructure; NVIC_InitTypeDef NVIC_InitStructure; /* DAC channel 1 Configuration */ /* This line fixed a bug that cost me 5 days, bad wave amplitude value, and some STM32F4 periph library bugs caused triangle wave geneartion to be enable resulting in a low level tone on the SM1000, that we thought was caused by analog issues like layour or power supply biasing */ DAC_StructInit(&DAC_InitStructure); DAC_InitStructure.DAC_Trigger = DAC_Trigger_T7_TRGO; DAC_InitStructure.DAC_WaveGeneration = DAC_WaveGeneration_None; /*External buffering is needed to get nice square samples at Fs=2Mhz. See DM00129215.pdf */ DAC_InitStructure.DAC_OutputBuffer = DAC_OutputBuffer_Disable; DAC_Init(DAC_Channel_1, &DAC_InitStructure); /* DMA1_Stream5 channel7 configuration **************************************/ /* Table 35 page 219 of the monster data sheet */ DMA_DeInit(DMA1_Stream5); DMA_InitStructure.DMA_Channel = DMA_Channel_7; DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)DAC_DHR12R1_ADDRESS; DMA_InitStructure.DMA_Memory0BaseAddr = (uint32_t)dac1_buf; DMA_InitStructure.DMA_DIR = DMA_DIR_MemoryToPeripheral; DMA_InitStructure.DMA_BufferSize = DAC_DUC_BUF_SZ; DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable; DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable; DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord; DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord; DMA_InitStructure.DMA_Mode = DMA_Mode_Circular; DMA_InitStructure.DMA_Priority = DMA_Priority_High; DMA_InitStructure.DMA_FIFOMode = DMA_FIFOMode_Disable; DMA_InitStructure.DMA_FIFOThreshold = DMA_FIFOThreshold_HalfFull; DMA_InitStructure.DMA_MemoryBurst = DMA_MemoryBurst_Single; DMA_InitStructure.DMA_PeripheralBurst = DMA_PeripheralBurst_Single; DMA_Init(DMA1_Stream5, &DMA_InitStructure); /* Enable DMA Half & Complete interrupts */ DMA_ITConfig(DMA1_Stream5, DMA_IT_TC | DMA_IT_HT, ENABLE); /* Enable the DMA Stream IRQ Channel */ NVIC_InitStructure.NVIC_IRQChannel = DMA1_Stream5_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure); /* Enable DMA1_Stream5 */ DMA_Cmd(DMA1_Stream5, ENABLE); /* Enable DAC Channel 1 */ DAC_Cmd(DAC_Channel_1, ENABLE); /* Enable DMA for DAC Channel 1 */ DAC_DMACmd(DAC_Channel_1, ENABLE); }
DAC_TIM6Class::DAC_TIM6Class(){ waveBuffer = malloc(sizeof(uint16_t) * WAVE_MEMORY_LENGTH); if(waveBuffer==NULL){ while(1){} } for(int i=0;i<WAVE_MEMORY_LENGTH;i++){ waveBuffer[i] = 2048+1024*sinf(2*M_PI*i/WAVE_MEMORY_LENGTH); } RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA,ENABLE); ///////////////////////////////////// //GPIO ///////////////////////////////////// GPIO_InitTypeDef gpioa4_5; GPIO_StructInit(&gpioa4_5); gpioa4_5.GPIO_Pin = GPIO_Pin_4 | GPIO_Pin_5; gpioa4_5.GPIO_Mode = GPIO_Mode_AN; gpioa4_5.GPIO_PuPd = GPIO_PuPd_NOPULL; GPIO_Init(GPIOA,&gpioa4_5); RCC_APB1PeriphClockCmd(RCC_APB1Periph_DAC,ENABLE); ///////////////////////////////////// //DAC ///////////////////////////////////// DAC_InitTypeDef dac1; DAC_StructInit(&dac1); dac1.DAC_LFSRUnmask_TriangleAmplitude =DAC_LFSRUnmask_Bits11_0; dac1.DAC_OutputBuffer = DAC_OutputBuffer_Enable; dac1.DAC_Trigger = DAC_Trigger_T6_TRGO; dac1.DAC_WaveGeneration = DAC_WaveGeneration_None; DAC_Init(DAC_Channel_1,&dac1); DAC_SetDualChannelData(DAC_Align_12b_R,0,0); DAC_Cmd(DAC_Channel_1,ENABLE); DAC_DMACmd(DAC_Channel_1,ENABLE); RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM6,ENABLE); TIM_TimeBaseInitTypeDef timebase; timebase.TIM_ClockDivision = TIM_CKD_DIV1; timebase.TIM_CounterMode = TIM_CounterMode_Up; timebase.TIM_Prescaler = 168-1; timebase.TIM_Period = 1; TIM_TimeBaseInit(TIM6,&timebase); TIM6->CR2 = 0x20; //MasterModeSelection TIM_ITConfig(TIM6,TIM_IT_Update,ENABLE); RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_DMA1,ENABLE); DMA_InitTypeDef dma1_5; DMA_StructInit(&dma1_5); dma1_5.DMA_PeripheralBaseAddr = (uint32_t)&(DAC->DHR12R1); dma1_5.DMA_Memory0BaseAddr = (uint32_t)waveBuffer; dma1_5.DMA_DIR = DMA_DIR_MemoryToPeripheral; dma1_5.DMA_BufferSize = WAVE_MEMORY_LENGTH; dma1_5.DMA_PeripheralInc = DMA_PeripheralInc_Disable; dma1_5.DMA_MemoryInc = DMA_MemoryInc_Enable; dma1_5.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord; dma1_5.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord; dma1_5.DMA_Mode = DMA_Mode_Circular; dma1_5.DMA_Priority = DMA_Priority_VeryHigh; dma1_5.DMA_Channel = DMA_Channel_7; DMA_Init(DMA1_Stream5,&dma1_5); DMA_Cmd(DMA1_Stream5,ENABLE); TIM_Cmd(TIM6,ENABLE); }
/** * @brief DAC Channel1 Escalator and Cannel2 Sine Configuration * @param None * @retval None */ static void DAC_Sine_EscalatorConfig(void) { DMA_InitTypeDef DMA_InitStructure; /* DAC channel1 Configuration */ DAC_DeInit(); DAC_InitStructure.DAC_Trigger = DAC_Trigger_T2_TRGO; DAC_InitStructure.DAC_WaveGeneration = DAC_WaveGeneration_None; DAC_InitStructure.DAC_OutputBuffer = DAC_OutputBuffer_Enable; /* DAC Channel1 Init */ DAC_Init(DAC_Channel_1, &DAC_InitStructure); /* Enable DAC Channel1 */ DAC_Cmd(DAC_Channel_1, ENABLE); /* DMA1 channel3 configuration */ DMA_DeInit(DMA1_Channel3); DMA_InitStructure.DMA_PeripheralBaseAddr = DAC_DHR12R1_ADDRESS; DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)&Sine12bit; DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralDST; DMA_InitStructure.DMA_BufferSize = 32; DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable; DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable; DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord; DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord; DMA_InitStructure.DMA_Mode = DMA_Mode_Circular; DMA_InitStructure.DMA_Priority = DMA_Priority_High; DMA_InitStructure.DMA_M2M = DMA_M2M_Disable; DMA_Init(DMA1_Channel3, &DMA_InitStructure); /* Enable DMA1 Channel3 */ DMA_Cmd(DMA1_Channel3, ENABLE); /* Enable DMA for DAC Channel2 */ DAC_DMACmd(DAC_Channel_1, ENABLE); /* Escalator Wave generator ----------------------------------------*/ /* DAC channel2 Configuration */ DAC_InitStructure.DAC_OutputBuffer = DAC_OutputBuffer_Enable; DAC_Init(DAC_Channel_2, &DAC_InitStructure); /* DMA1 channel4 configuration */ DMA_DeInit(DMA1_Channel4); DMA_InitStructure.DMA_PeripheralBaseAddr = DAC_DHR8R2_ADDRESS; DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)&Escalator8bit; DMA_InitStructure.DMA_BufferSize = 6; DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte; DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte; DMA_Init(DMA1_Channel4, &DMA_InitStructure); /* Enable DMA1 Channel4 */ DMA_Cmd(DMA1_Channel4, ENABLE); /* Enable DAC1 Channel1: Once the DAC1 channel2 is enabled, PA.05 is automatically connected to the DAC converter. */ DAC_Cmd(DAC_Channel_2, ENABLE); /* Enable DMA for DAC Channel1 */ DAC_DMACmd(DAC_Channel_2, ENABLE); }
int init_DAC() { GPIO_InitTypeDef gpinit[1] = {{0}}; gpinit->GPIO_Pin = GPIO_Pin_4; gpinit->GPIO_Mode = GPIO_Mode_AIN; gpinit->GPIO_Speed = GPIO_Speed_50MHz; gpinit->GPIO_PuPd = GPIO_PuPd_NOPULL; GPIO_Init(GPIOA, gpinit); RCC_APB1PeriphClockCmd(RCC_APB1Periph_DAC, ENABLE); RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM6, ENABLE); RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_DMA1, ENABLE); DAC_DeInit(); DAC_InitTypeDef dac[1]; dac->DAC_Trigger = DAC_Trigger_T6_TRGO; dac->DAC_WaveGeneration = DAC_WaveGeneration_None; dac->DAC_LFSRUnmask_TriangleAmplitude = DAC_LFSRUnmask_Bits11_0; dac->DAC_OutputBuffer = DAC_OutputBuffer_Enable; DAC_Init(DAC_Channel_1, dac); DAC_Cmd(DAC_Channel_1, ENABLE); DMA_DeInit(DMA1_Stream5); DMA_InitTypeDef dma[1]; dma->DMA_Channel = DMA_Channel_7; dma->DMA_PeripheralBaseAddr = (uint32_t) &DAC->DHR12L1; dma->DMA_Memory0BaseAddr = (uint32_t) buffer; dma->DMA_DIR = DMA_DIR_MemoryToPeripheral; dma->DMA_BufferSize = NUMEL(buffer); dma->DMA_PeripheralInc = DMA_PeripheralInc_Disable; dma->DMA_MemoryInc = DMA_MemoryInc_Enable; dma->DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord; dma->DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord; dma->DMA_Mode = DMA_Mode_Circular; dma->DMA_Priority = DMA_Priority_High; dma->DMA_FIFOMode = DMA_FIFOMode_Disable; dma->DMA_FIFOThreshold = DMA_FIFOThreshold_HalfFull; dma->DMA_MemoryBurst = DMA_MemoryBurst_Single; dma->DMA_PeripheralBurst = DMA_PeripheralBurst_Single; DMA_Init(DMA1_Stream5, dma); DMA_ITConfig(DMA1_Stream5, DMA_IT_TC, ENABLE); DMA_ITConfig(DMA1_Stream5, DMA_IT_HT, ENABLE); NVIC_InitTypeDef nvic[1]; nvic->NVIC_IRQChannel = DMA1_Stream5_IRQn; nvic->NVIC_IRQChannelPreemptionPriority = 7; nvic->NVIC_IRQChannelSubPriority = 7; nvic->NVIC_IRQChannelCmd = ENABLE; NVIC_Init(nvic); DMA_Cmd(DMA1_Stream5, ENABLE); DAC_DMACmd(DAC_Channel_1, ENABLE); TIM_DeInit(TIM6); TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; TIM_TimeBaseStructInit(&TIM_TimeBaseStructure); TIM_TimeBaseStructure.TIM_Period = 1749; TIM_TimeBaseStructure.TIM_Prescaler = 0; TIM_TimeBaseStructure.TIM_ClockDivision = 0; TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; TIM_TimeBaseInit(TIM6, &TIM_TimeBaseStructure); TIM_SelectOutputTrigger(TIM6, TIM_TRGOSource_Update); TIM_Cmd(TIM6, ENABLE); return 0; }
/** * @brief Main program. * @param None * @retval None */ int main(void) { /* System Clocks Configuration */ RCC_Configuration(); /* Once the DAC channel is enabled, the corresponding GPIO pin is automatically connected to the DAC converter. In order to avoid parasitic consumption, the GPIO pin should be configured in analog */ GPIO_Configuration(); /* TIM2 Configuration */ /* Time base configuration */ TIM_TimeBaseStructInit(&TIM_TimeBaseStructure); TIM_TimeBaseStructure.TIM_Period = 0x19; TIM_TimeBaseStructure.TIM_Prescaler = 0x0; TIM_TimeBaseStructure.TIM_ClockDivision = 0x0; TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure); /* TIM2 TRGO selection */ TIM_SelectOutputTrigger(TIM2, TIM_TRGOSource_Update); /* DAC channel1 Configuration */ DAC_InitStructure.DAC_Trigger = DAC_Trigger_T2_TRGO; DAC_InitStructure.DAC_WaveGeneration = DAC_WaveGeneration_None; DAC_InitStructure.DAC_OutputBuffer = DAC_OutputBuffer_Disable; DAC_Init(DAC_Channel_1, &DAC_InitStructure); /* DAC channel2 Configuration */ DAC_Init(DAC_Channel_2, &DAC_InitStructure); /* Fill Sine32bit table */ for (Idx = 0; Idx < 32; Idx++) { DualSine12bit[Idx] = (Sine12bit[Idx] << 16) + (Sine12bit[Idx]); } /* DMA2 channel4 configuration */ DMA_DeInit(DMA2_Channel4); DMA_InitStructure.DMA_PeripheralBaseAddr = DAC_DHR12RD_Address; DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)&DualSine12bit; DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralDST; DMA_InitStructure.DMA_BufferSize = 32; DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable; DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable; DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Word; DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Word; DMA_InitStructure.DMA_Mode = DMA_Mode_Circular; DMA_InitStructure.DMA_Priority = DMA_Priority_High; DMA_InitStructure.DMA_M2M = DMA_M2M_Disable; DMA_Init(DMA2_Channel4, &DMA_InitStructure); /* Enable DMA2 Channel4 */ DMA_Cmd(DMA2_Channel4, ENABLE); /* Enable DAC Channel1: Once the DAC channel1 is enabled, PA.04 is automatically connected to the DAC converter. */ DAC_Cmd(DAC_Channel_1, ENABLE); /* Enable DAC Channel2: Once the DAC channel2 is enabled, PA.05 is automatically connected to the DAC converter. */ DAC_Cmd(DAC_Channel_2, ENABLE); /* Enable DMA for DAC Channel2 */ DAC_DMACmd(DAC_Channel_2, ENABLE); /* TIM2 enable counter */ TIM_Cmd(TIM2, ENABLE); while (1) { } }
/** * @brief Main program. * @param None * @retval None */ int main(void) { /*!< At this stage the microcontroller clock setting is already configured, this is done through SystemInit() function which is called from startup file (startup_stm32f0xx.s) before to branch to application main. To reconfigure the default setting of SystemInit() function, refer to system_stm32f0xx.c file */ /* Preconfiguration before using DAC----------------------------------------*/ DAC_Config(); /* TIM2 Periph clock enable */ RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE); /* Time base configuration */ TIM_TimeBaseStructInit(&TIM_TimeBaseStructure); TIM_TimeBaseStructure.TIM_Period = 0xFF; TIM_TimeBaseStructure.TIM_Prescaler = 0x0; TIM_TimeBaseStructure.TIM_ClockDivision = 0x0; TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure); /* TIM2 TRGO selection */ TIM_SelectOutputTrigger(TIM2, TIM_TRGOSource_Update); /* TIM2 enable counter */ TIM_Cmd(TIM2, ENABLE); /* Configures Button GPIO and EXTI Line */ STM_EVAL_PBInit(BUTTON_USER, BUTTON_MODE_EXTI); /* Infinite loop */ while (1) { /* If the wave form is changed */ if (WaveChange == 1) { /* Switch the selected waves forms according the Button status */ if (SelectedWavesForm == 1) { /* The sine wave has been selected */ /* Sine Wave generator ---------------------------------------------*/ DAC_DeInit(); /* DAC channel1 Configuration */ DAC_InitStructure.DAC_Trigger = DAC_Trigger_T2_TRGO; DAC_InitStructure.DAC_OutputBuffer = DAC_OutputBuffer_Enable; /* DMA channel3 Configuration */ DMA_DeInit(DMA1_Channel3); DMA_InitStructure.DMA_PeripheralBaseAddr = DAC_DHR12R1_ADDRESS; DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)&Sine12bit; DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralDST; DMA_InitStructure.DMA_BufferSize = 32; DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable; DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable; DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord; DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord; DMA_InitStructure.DMA_Mode = DMA_Mode_Circular; DMA_InitStructure.DMA_Priority = DMA_Priority_High; DMA_InitStructure.DMA_M2M = DMA_M2M_Disable; DMA_Init(DMA1_Channel3, &DMA_InitStructure); /* Enable DMA1 Channel3 */ DMA_Cmd(DMA1_Channel3, ENABLE); /* DAC Channel1 Init */ DAC_Init(DAC_Channel_1, &DAC_InitStructure); /* Enable DAC Channel1: Once the DAC channel1 is enabled, PA.04 is automatically connected to the DAC converter. */ DAC_Cmd(DAC_Channel_1, ENABLE); /* Enable DMA for DAC Channel1 */ DAC_DMACmd(DAC_Channel_1, ENABLE); } /* The Escalator wave has been selected */ else { /* Escalator Wave generator -----------------------------------------*/ DAC_DeInit(); /* DAC channel1 Configuration */ DAC_InitStructure.DAC_Trigger = DAC_Trigger_T2_TRGO; DAC_InitStructure.DAC_OutputBuffer = DAC_OutputBuffer_Enable; /* DMA1 channel2 configuration */ DMA_DeInit(DMA1_Channel3); DMA_InitStructure.DMA_PeripheralBaseAddr = DAC_DHR8R1_ADDRESS; DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)&Escalator8bit; DMA_InitStructure.DMA_BufferSize = 6; DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte; DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte; DMA_Init(DMA1_Channel3, &DMA_InitStructure); /* Enable DMA1 Channel2 */ DMA_Cmd(DMA1_Channel3, ENABLE); /* DAC channel1 Configuration */ DAC_Init(DAC_Channel_1, &DAC_InitStructure); /* Enable DAC Channel1: Once the DAC channel1 is enabled, PA.04 is automatically connected to the DAC converter. */ DAC_Cmd(DAC_Channel_1, ENABLE); /* Enable DMA for DAC Channel1 */ DAC_DMACmd(DAC_Channel_1, ENABLE); } WaveChange = !WaveChange; } } }