老 姚
/
DACTest
generate sin wave
main.cpp@0:5b36be91a9be, 2018-06-22 (annotated)
- Committer:
- yao6116601
- Date:
- Fri Jun 22 22:59:30 2018 +0000
- Revision:
- 0:5b36be91a9be
modular-2 demo program
Who changed what in which revision?
User | Revision | Line number | New 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 | } |