generate sin wave

Dependencies:   mbed

Committer:
yao6116601
Date:
Fri Jun 22 22:59:30 2018 +0000
Revision:
0:5b36be91a9be
modular-2 demo program

Who changed what in which revision?

UserRevisionLine numberNew contents of line
yao6116601 0:5b36be91a9be 1 #include "mbed.h"
yao6116601 0:5b36be91a9be 2 #include "stm32f4xx_hal.h"
yao6116601 0:5b36be91a9be 3 //#include "stm32f4xx_hal_dma.h"
yao6116601 0:5b36be91a9be 4 DigitalOut myled(PF_14);
yao6116601 0:5b36be91a9be 5 DAC_HandleTypeDef hdac;
yao6116601 0:5b36be91a9be 6 DMA_HandleTypeDef hdma_dac;
yao6116601 0:5b36be91a9be 7 const double pi = 3.141592653589793238462;
yao6116601 0:5b36be91a9be 8 const double amplitude = 0.5f;
yao6116601 0:5b36be91a9be 9 const double offset = 65535/2;
yao6116601 0:5b36be91a9be 10 const int waveformLength=120;
yao6116601 0:5b36be91a9be 11 const int sineWave[waveformLength] {
yao6116601 0:5b36be91a9be 12 0x7ff, 0x86a, 0x8d5, 0x93f, 0x9a9, 0xa11, 0xa78, 0xadd, 0xb40, 0xba1,
yao6116601 0:5b36be91a9be 13 0xbff, 0xc5a, 0xcb2, 0xd08, 0xd59, 0xda7, 0xdf1, 0xe36, 0xe77, 0xeb4,
yao6116601 0:5b36be91a9be 14 0xeec, 0xf1f, 0xf4d, 0xf77, 0xf9a, 0xfb9, 0xfd2, 0xfe5, 0xff3, 0xffc,
yao6116601 0:5b36be91a9be 15 0xfff, 0xffc, 0xff3, 0xfe5, 0xfd2, 0xfb9, 0xf9a, 0xf77, 0xf4d, 0xf1f,
yao6116601 0:5b36be91a9be 16 0xeec, 0xeb4, 0xe77, 0xe36, 0xdf1, 0xda7, 0xd59, 0xd08, 0xcb2, 0xc5a,
yao6116601 0:5b36be91a9be 17 0xbff, 0xba1, 0xb40, 0xadd, 0xa78, 0xa11, 0x9a9, 0x93f, 0x8d5, 0x86a,
yao6116601 0:5b36be91a9be 18 0x7ff, 0x794, 0x729, 0x6bf, 0x655, 0x5ed, 0x586, 0x521, 0x4be, 0x45d,
yao6116601 0:5b36be91a9be 19 0x3ff, 0x3a4, 0x34c, 0x2f6, 0x2a5, 0x257, 0x20d, 0x1c8, 0x187, 0x14a,
yao6116601 0:5b36be91a9be 20 0x112, 0x0df, 0x0b1, 0x087, 0x064, 0x045, 0x02c, 0x019, 0x00b, 0x002,
yao6116601 0:5b36be91a9be 21 0x000, 0x002, 0x00b, 0x019, 0x02c, 0x045, 0x064, 0x087, 0x0b1, 0x0df,
yao6116601 0:5b36be91a9be 22 0x112, 0x14a, 0x187, 0x1c8, 0x20d, 0x257, 0x2a5, 0x2f6, 0x34c, 0x3a4,
yao6116601 0:5b36be91a9be 23 0x3ff, 0x45d, 0x4be, 0x521, 0x586, 0x5ed, 0x655, 0x6bf, 0x729, 0x794
yao6116601 0:5b36be91a9be 24 };
yao6116601 0:5b36be91a9be 25
yao6116601 0:5b36be91a9be 26 /* DAC init function */
yao6116601 0:5b36be91a9be 27 TIM_HandleTypeDef htim2;
yao6116601 0:5b36be91a9be 28 static void TIM2_Init(void)
yao6116601 0:5b36be91a9be 29 {
yao6116601 0:5b36be91a9be 30 TIM_MasterConfigTypeDef sMasterConfig;
yao6116601 0:5b36be91a9be 31 TIM_ClockConfigTypeDef sClockSourceConfig;
yao6116601 0:5b36be91a9be 32
yao6116601 0:5b36be91a9be 33 __TIM2_CLK_ENABLE();
yao6116601 0:5b36be91a9be 34 htim2.Instance = TIM2;
yao6116601 0:5b36be91a9be 35 htim2.Init.Prescaler =0;// 88K sineWave HAL_RCC_GetSysClockFreq() / (sampleRate * 2) - 1;
yao6116601 0:5b36be91a9be 36 htim2.Init.CounterMode = TIM_COUNTERMODE_UP;
yao6116601 0:5b36be91a9be 37 htim2.Init.Period = 1;
yao6116601 0:5b36be91a9be 38 htim2.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
yao6116601 0:5b36be91a9be 39 htim2.Init.RepetitionCounter = 0;
yao6116601 0:5b36be91a9be 40 HAL_TIM_Base_Init(&htim2);
yao6116601 0:5b36be91a9be 41 sClockSourceConfig.ClockSource = TIM_CLOCKSOURCE_INTERNAL;
yao6116601 0:5b36be91a9be 42 if (HAL_TIM_ConfigClockSource(&htim2, &sClockSourceConfig) != HAL_OK)
yao6116601 0:5b36be91a9be 43 {
yao6116601 0:5b36be91a9be 44 // _Error_Handler(__FILE__, __LINE__);
yao6116601 0:5b36be91a9be 45 }
yao6116601 0:5b36be91a9be 46 sMasterConfig.MasterOutputTrigger = TIM_TRGO_UPDATE;
yao6116601 0:5b36be91a9be 47 sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;
yao6116601 0:5b36be91a9be 48 HAL_TIMEx_MasterConfigSynchronization(&htim2, &sMasterConfig);
yao6116601 0:5b36be91a9be 49 HAL_TIM_Base_Init(&htim2);
yao6116601 0:5b36be91a9be 50 HAL_TIM_Base_Start(&htim2);
yao6116601 0:5b36be91a9be 51 // HAL_TIM_Base_Start_IT(&htim2);
yao6116601 0:5b36be91a9be 52 // HAL_NVIC_SetPriority(TIM2_IRQn, 0, 0);
yao6116601 0:5b36be91a9be 53 // HAL_NVIC_EnableIRQ(TIM2_IRQn);
yao6116601 0:5b36be91a9be 54 }
yao6116601 0:5b36be91a9be 55 static void MX_DAC_Init(void)
yao6116601 0:5b36be91a9be 56 {
yao6116601 0:5b36be91a9be 57
yao6116601 0:5b36be91a9be 58 DAC_ChannelConfTypeDef sConfig;
yao6116601 0:5b36be91a9be 59
yao6116601 0:5b36be91a9be 60 /**DAC Initialization
yao6116601 0:5b36be91a9be 61 */
yao6116601 0:5b36be91a9be 62 hdac.Instance = DAC;
yao6116601 0:5b36be91a9be 63 if (HAL_DAC_Init(&hdac) != HAL_OK)
yao6116601 0:5b36be91a9be 64 {
yao6116601 0:5b36be91a9be 65 //_Error_Handler(__FILE__, __LINE__);
yao6116601 0:5b36be91a9be 66 }
yao6116601 0:5b36be91a9be 67
yao6116601 0:5b36be91a9be 68 /**DAC channel OUT1 config
yao6116601 0:5b36be91a9be 69 */
yao6116601 0:5b36be91a9be 70 sConfig.DAC_Trigger = DAC_TRIGGER_T2_TRGO;
yao6116601 0:5b36be91a9be 71 sConfig.DAC_OutputBuffer = DAC_OUTPUTBUFFER_ENABLE;
yao6116601 0:5b36be91a9be 72 if (HAL_DAC_ConfigChannel(&hdac, &sConfig, DAC_CHANNEL_1) != HAL_OK)
yao6116601 0:5b36be91a9be 73 {
yao6116601 0:5b36be91a9be 74 //_Error_Handler(__FILE__, __LINE__);
yao6116601 0:5b36be91a9be 75 }
yao6116601 0:5b36be91a9be 76 }
yao6116601 0:5b36be91a9be 77
yao6116601 0:5b36be91a9be 78 void HAL_DAC_MspInit(DAC_HandleTypeDef* hdac)
yao6116601 0:5b36be91a9be 79 {
yao6116601 0:5b36be91a9be 80
yao6116601 0:5b36be91a9be 81 GPIO_InitTypeDef GPIO_InitStruct;
yao6116601 0:5b36be91a9be 82 if(hdac->Instance==DAC)
yao6116601 0:5b36be91a9be 83 {
yao6116601 0:5b36be91a9be 84 /* USER CODE BEGIN DAC_MspInit 0 */
yao6116601 0:5b36be91a9be 85 __HAL_RCC_GPIOA_CLK_ENABLE();
yao6116601 0:5b36be91a9be 86 /* USER CODE END DAC_MspInit 0 */
yao6116601 0:5b36be91a9be 87 /* Peripheral clock enable */
yao6116601 0:5b36be91a9be 88 __HAL_RCC_DAC_CLK_ENABLE();
yao6116601 0:5b36be91a9be 89 /**DAC GPIO Configuration
yao6116601 0:5b36be91a9be 90 PA4 ------> DAC_OUT1
yao6116601 0:5b36be91a9be 91 */
yao6116601 0:5b36be91a9be 92 GPIO_InitStruct.Pin = GPIO_PIN_4;
yao6116601 0:5b36be91a9be 93 GPIO_InitStruct.Mode = GPIO_MODE_ANALOG;
yao6116601 0:5b36be91a9be 94 GPIO_InitStruct.Pull = GPIO_NOPULL;
yao6116601 0:5b36be91a9be 95 HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
yao6116601 0:5b36be91a9be 96
yao6116601 0:5b36be91a9be 97 }
yao6116601 0:5b36be91a9be 98 }
yao6116601 0:5b36be91a9be 99 void HAL_DAC_MspDeInit(ADC_HandleTypeDef* hdac)
yao6116601 0:5b36be91a9be 100 {
yao6116601 0:5b36be91a9be 101 HAL_DMA_DeInit(hdac->DMA_Handle);
yao6116601 0:5b36be91a9be 102 }
yao6116601 0:5b36be91a9be 103 static void MX_DMA_Init(void)
yao6116601 0:5b36be91a9be 104 {
yao6116601 0:5b36be91a9be 105 /* DMA controller clock enable */
yao6116601 0:5b36be91a9be 106 __HAL_RCC_DMA1_CLK_ENABLE();
yao6116601 0:5b36be91a9be 107 hdma_dac.Instance =DMA1_Stream5;
yao6116601 0:5b36be91a9be 108 hdma_dac.Init.Channel = DMA_CHANNEL_7;
yao6116601 0:5b36be91a9be 109 hdma_dac.Init.Direction = DMA_MEMORY_TO_PERIPH;
yao6116601 0:5b36be91a9be 110 hdma_dac.Init.PeriphInc = DMA_PINC_DISABLE;
yao6116601 0:5b36be91a9be 111 hdma_dac.Init.MemInc = DMA_MINC_ENABLE;
yao6116601 0:5b36be91a9be 112 hdma_dac.Init.PeriphDataAlignment = DMA_PDATAALIGN_WORD;
yao6116601 0:5b36be91a9be 113 hdma_dac.Init.MemDataAlignment = DMA_PDATAALIGN_WORD;
yao6116601 0:5b36be91a9be 114 hdma_dac.Init.Mode = DMA_CIRCULAR;
yao6116601 0:5b36be91a9be 115 hdma_dac.Init.Priority = DMA_PRIORITY_VERY_HIGH;
yao6116601 0:5b36be91a9be 116 hdma_dac.Init.FIFOMode = DMA_FIFOMODE_DISABLE;
yao6116601 0:5b36be91a9be 117
yao6116601 0:5b36be91a9be 118 HAL_DMA_Init(&hdma_dac);
yao6116601 0:5b36be91a9be 119 __HAL_LINKDMA(&hdac,DMA_Handle1,hdma_dac);
yao6116601 0:5b36be91a9be 120 /* DMA interrupt init */
yao6116601 0:5b36be91a9be 121 /* DMA1_Channel1_IRQn interrupt configuration */
yao6116601 0:5b36be91a9be 122 HAL_NVIC_SetPriority(DMA1_Stream5_IRQn, 0, 0);
yao6116601 0:5b36be91a9be 123 HAL_NVIC_EnableIRQ(DMA1_Stream5_IRQn);
yao6116601 0:5b36be91a9be 124
yao6116601 0:5b36be91a9be 125 }
yao6116601 0:5b36be91a9be 126 extern "C" void DMA1_Stream5_IRQHandler(void)
yao6116601 0:5b36be91a9be 127 {
yao6116601 0:5b36be91a9be 128 //HAL_DMA_IRQHandler(&hdma_dac);
yao6116601 0:5b36be91a9be 129 //myled=!myled;
yao6116601 0:5b36be91a9be 130 HAL_DMA_IRQHandler(&hdma_dac);
yao6116601 0:5b36be91a9be 131 }
yao6116601 0:5b36be91a9be 132
yao6116601 0:5b36be91a9be 133 void HAL_DAC_ConvCpltCallbackCh1(DMA_HandleTypeDef *hdma)
yao6116601 0:5b36be91a9be 134 {
yao6116601 0:5b36be91a9be 135
yao6116601 0:5b36be91a9be 136 HAL_DAC_Start_DMA(&hdac, DAC_CHANNEL_1, (uint32_t*)sineWave, waveformLength, DAC_ALIGN_12B_R);
yao6116601 0:5b36be91a9be 137 myled=!myled;
yao6116601 0:5b36be91a9be 138
yao6116601 0:5b36be91a9be 139 }
yao6116601 0:5b36be91a9be 140 extern "C" void TIM2_IRQHandler()
yao6116601 0:5b36be91a9be 141 {
yao6116601 0:5b36be91a9be 142 HAL_TIM_IRQHandler(&htim2);
yao6116601 0:5b36be91a9be 143 }
yao6116601 0:5b36be91a9be 144 double rads = 0.0;
yao6116601 0:5b36be91a9be 145 uint16_t sample = 0;
yao6116601 0:5b36be91a9be 146 int i=0;
yao6116601 0:5b36be91a9be 147 void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
yao6116601 0:5b36be91a9be 148 {
yao6116601 0:5b36be91a9be 149 // for (int i = 0; i < 360; i++) {
yao6116601 0:5b36be91a9be 150 /* rads = (pi * i) / 180.0f;
yao6116601 0:5b36be91a9be 151 i++;if(i==360) i=0;
yao6116601 0:5b36be91a9be 152 sample = (uint16_t)(amplitude * (offset * (cos(rads + pi))) + offset);
yao6116601 0:5b36be91a9be 153 HAL_DAC_SetValue(&hdac, DAC_CHANNEL_1, DAC_ALIGN_12B_L, sample);
yao6116601 0:5b36be91a9be 154 HAL_DAC_Start(&hdac,DAC_CHANNEL_1);
yao6116601 0:5b36be91a9be 155 myled=!myled;*/
yao6116601 0:5b36be91a9be 156 }
yao6116601 0:5b36be91a9be 157 int main() {
yao6116601 0:5b36be91a9be 158
yao6116601 0:5b36be91a9be 159 MX_DAC_Init();
yao6116601 0:5b36be91a9be 160 //HAL_DAC_MspInit(&hdac);
yao6116601 0:5b36be91a9be 161 MX_DMA_Init() ;
yao6116601 0:5b36be91a9be 162 TIM2_Init();
yao6116601 0:5b36be91a9be 163 //HAL_DAC_Start(&hdac,DAC_CHANNEL_1);
yao6116601 0:5b36be91a9be 164 HAL_DAC_Start_DMA(&hdac, DAC_CHANNEL_1, (uint32_t*)sineWave, waveformLength, DAC_ALIGN_12B_R);
yao6116601 0:5b36be91a9be 165 printf("DAC DMA demo\n");
yao6116601 0:5b36be91a9be 166 myled=1;
yao6116601 0:5b36be91a9be 167 //HAL_TIM_Base_Start(&htim2);
yao6116601 0:5b36be91a9be 168 while(1) {
yao6116601 0:5b36be91a9be 169 // wait(0.1);
yao6116601 0:5b36be91a9be 170 //myled=!myled;
yao6116601 0:5b36be91a9be 171
yao6116601 0:5b36be91a9be 172 wait_us(100);
yao6116601 0:5b36be91a9be 173 // }
yao6116601 0:5b36be91a9be 174 }
yao6116601 0:5b36be91a9be 175 }