generate sin wave

Dependencies:   mbed

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers main.cpp Source File

main.cpp

00001 #include "mbed.h"
00002 #include "stm32f4xx_hal.h"
00003 //#include "stm32f4xx_hal_dma.h"
00004 DigitalOut myled(PF_14);
00005 DAC_HandleTypeDef hdac;
00006 DMA_HandleTypeDef hdma_dac;
00007 const double pi = 3.141592653589793238462;
00008 const double amplitude = 0.5f;
00009 const double offset = 65535/2;
00010 const int waveformLength=120;
00011 const int sineWave[waveformLength] {
00012     0x7ff, 0x86a, 0x8d5, 0x93f, 0x9a9, 0xa11, 0xa78, 0xadd, 0xb40, 0xba1,
00013     0xbff, 0xc5a, 0xcb2, 0xd08, 0xd59, 0xda7, 0xdf1, 0xe36, 0xe77, 0xeb4,
00014     0xeec, 0xf1f, 0xf4d, 0xf77, 0xf9a, 0xfb9, 0xfd2, 0xfe5, 0xff3, 0xffc,
00015     0xfff, 0xffc, 0xff3, 0xfe5, 0xfd2, 0xfb9, 0xf9a, 0xf77, 0xf4d, 0xf1f,
00016     0xeec, 0xeb4, 0xe77, 0xe36, 0xdf1, 0xda7, 0xd59, 0xd08, 0xcb2, 0xc5a,
00017     0xbff, 0xba1, 0xb40, 0xadd, 0xa78, 0xa11, 0x9a9, 0x93f, 0x8d5, 0x86a,
00018     0x7ff, 0x794, 0x729, 0x6bf, 0x655, 0x5ed, 0x586, 0x521, 0x4be, 0x45d,
00019     0x3ff, 0x3a4, 0x34c, 0x2f6, 0x2a5, 0x257, 0x20d, 0x1c8, 0x187, 0x14a,
00020     0x112, 0x0df, 0x0b1, 0x087, 0x064, 0x045, 0x02c, 0x019, 0x00b, 0x002,
00021     0x000, 0x002, 0x00b, 0x019, 0x02c, 0x045, 0x064, 0x087, 0x0b1, 0x0df,
00022     0x112, 0x14a, 0x187, 0x1c8, 0x20d, 0x257, 0x2a5, 0x2f6, 0x34c, 0x3a4,
00023     0x3ff, 0x45d, 0x4be, 0x521, 0x586, 0x5ed, 0x655, 0x6bf, 0x729, 0x794
00024 };
00025 
00026 /* DAC init function */
00027  TIM_HandleTypeDef htim2;
00028 static void TIM2_Init(void)
00029 {
00030     TIM_MasterConfigTypeDef sMasterConfig;
00031     TIM_ClockConfigTypeDef sClockSourceConfig;
00032     
00033      __TIM2_CLK_ENABLE();
00034     htim2.Instance = TIM2;
00035     htim2.Init.Prescaler =0;// 88K sineWave HAL_RCC_GetSysClockFreq() / (sampleRate * 2) - 1;
00036     htim2.Init.CounterMode = TIM_COUNTERMODE_UP;
00037     htim2.Init.Period = 1;
00038     htim2.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
00039     htim2.Init.RepetitionCounter = 0;
00040     HAL_TIM_Base_Init(&htim2);
00041  sClockSourceConfig.ClockSource = TIM_CLOCKSOURCE_INTERNAL;
00042   if (HAL_TIM_ConfigClockSource(&htim2, &sClockSourceConfig) != HAL_OK)
00043   {
00044    // _Error_Handler(__FILE__, __LINE__);
00045   }
00046     sMasterConfig.MasterOutputTrigger = TIM_TRGO_UPDATE;
00047     sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;
00048     HAL_TIMEx_MasterConfigSynchronization(&htim2, &sMasterConfig);
00049    HAL_TIM_Base_Init(&htim2);
00050     HAL_TIM_Base_Start(&htim2);
00051    // HAL_TIM_Base_Start_IT(&htim2);
00052    //  HAL_NVIC_SetPriority(TIM2_IRQn, 0, 0);
00053    //  HAL_NVIC_EnableIRQ(TIM2_IRQn);
00054     }
00055 static void MX_DAC_Init(void)
00056 {
00057 
00058   DAC_ChannelConfTypeDef sConfig;
00059 
00060     /**DAC Initialization 
00061     */
00062   hdac.Instance = DAC;
00063   if (HAL_DAC_Init(&hdac) != HAL_OK)
00064   {
00065      //_Error_Handler(__FILE__, __LINE__);
00066   }
00067 
00068     /**DAC channel OUT1 config 
00069     */
00070    sConfig.DAC_Trigger = DAC_TRIGGER_T2_TRGO;
00071    sConfig.DAC_OutputBuffer = DAC_OUTPUTBUFFER_ENABLE;
00072    if (HAL_DAC_ConfigChannel(&hdac, &sConfig, DAC_CHANNEL_1) != HAL_OK)
00073     {
00074     //_Error_Handler(__FILE__, __LINE__);
00075    }
00076  }
00077 
00078 void HAL_DAC_MspInit(DAC_HandleTypeDef* hdac)
00079 {
00080 
00081   GPIO_InitTypeDef GPIO_InitStruct;
00082   if(hdac->Instance==DAC)
00083   {
00084   /* USER CODE BEGIN DAC_MspInit 0 */
00085 __HAL_RCC_GPIOA_CLK_ENABLE();
00086   /* USER CODE END DAC_MspInit 0 */
00087     /* Peripheral clock enable */
00088     __HAL_RCC_DAC_CLK_ENABLE();
00089     /**DAC GPIO Configuration    
00090     PA4     ------> DAC_OUT1 
00091     */
00092     GPIO_InitStruct.Pin = GPIO_PIN_4;
00093     GPIO_InitStruct.Mode = GPIO_MODE_ANALOG;
00094     GPIO_InitStruct.Pull = GPIO_NOPULL;
00095     HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
00096   
00097   }
00098 }
00099 void HAL_DAC_MspDeInit(ADC_HandleTypeDef* hdac)
00100 {
00101     HAL_DMA_DeInit(hdac->DMA_Handle);
00102      }
00103 static void MX_DMA_Init(void) 
00104 {
00105   /* DMA controller clock enable */
00106   __HAL_RCC_DMA1_CLK_ENABLE();  
00107    hdma_dac.Instance =DMA1_Stream5;
00108    hdma_dac.Init.Channel = DMA_CHANNEL_7;
00109    hdma_dac.Init.Direction = DMA_MEMORY_TO_PERIPH;
00110    hdma_dac.Init.PeriphInc = DMA_PINC_DISABLE;
00111    hdma_dac.Init.MemInc = DMA_MINC_ENABLE;
00112    hdma_dac.Init.PeriphDataAlignment = DMA_PDATAALIGN_WORD;
00113    hdma_dac.Init.MemDataAlignment = DMA_PDATAALIGN_WORD;
00114    hdma_dac.Init.Mode = DMA_CIRCULAR;
00115    hdma_dac.Init.Priority = DMA_PRIORITY_VERY_HIGH;
00116    hdma_dac.Init.FIFOMode = DMA_FIFOMODE_DISABLE;
00117   
00118    HAL_DMA_Init(&hdma_dac);
00119    __HAL_LINKDMA(&hdac,DMA_Handle1,hdma_dac);
00120   /* DMA interrupt init */
00121   /* DMA1_Channel1_IRQn interrupt configuration */
00122   HAL_NVIC_SetPriority(DMA1_Stream5_IRQn, 0, 0);
00123   HAL_NVIC_EnableIRQ(DMA1_Stream5_IRQn);
00124 
00125 }
00126 extern "C" void DMA1_Stream5_IRQHandler(void)
00127 {
00128     //HAL_DMA_IRQHandler(&hdma_dac);
00129      //myled=!myled;
00130    HAL_DMA_IRQHandler(&hdma_dac);
00131 }
00132 
00133 void HAL_DAC_ConvCpltCallbackCh1(DMA_HandleTypeDef *hdma)
00134 {
00135     
00136   HAL_DAC_Start_DMA(&hdac, DAC_CHANNEL_1, (uint32_t*)sineWave, waveformLength, DAC_ALIGN_12B_R);
00137    myled=!myled;
00138  
00139 } 
00140 extern "C" void TIM2_IRQHandler()
00141 {
00142     HAL_TIM_IRQHandler(&htim2);
00143 }
00144     double rads = 0.0;
00145   uint16_t sample = 0;
00146   int i=0;
00147 void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
00148 {
00149   // for (int i = 0; i < 360; i++) {
00150   /*        rads = (pi * i) / 180.0f;
00151           i++;if(i==360) i=0;
00152          sample = (uint16_t)(amplitude * (offset * (cos(rads + pi))) + offset);
00153       HAL_DAC_SetValue(&hdac, DAC_CHANNEL_1, DAC_ALIGN_12B_L, sample);
00154       HAL_DAC_Start(&hdac,DAC_CHANNEL_1);
00155    myled=!myled;*/
00156 }    
00157 int main() {
00158    
00159 MX_DAC_Init();
00160 //HAL_DAC_MspInit(&hdac);
00161  MX_DMA_Init() ;
00162 TIM2_Init();
00163 //HAL_DAC_Start(&hdac,DAC_CHANNEL_1);
00164  HAL_DAC_Start_DMA(&hdac, DAC_CHANNEL_1, (uint32_t*)sineWave, waveformLength, DAC_ALIGN_12B_R);
00165 printf("DAC DMA demo\n");
00166 myled=1;
00167  //HAL_TIM_Base_Start(&htim2);
00168     while(1) {
00169     //  wait(0.1);
00170       //myled=!myled;
00171      
00172       wait_us(100);
00173         // }
00174     }
00175 }