老 姚
/
DACTest
generate sin wave
Embed:
(wiki syntax)
Show/hide line numbers
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 }
Generated on Sat Jul 16 2022 02:33:32 by 1.7.2