Есть задача: выводить на ЦАП массив из 32-х значений данных в произвольное время (скажем в цикле или по нажатию кнопки). ЦАП настраивается на Normal mode, т.е. по задумке он должен один раз отработать массив данных и выключиться. Проблема в том, что данные выводятся только один (первый) раз при инициализации. Делаю так:
Код
//======================================================================
__HAL_RCC_DMA1_CLK_ENABLE();
__HAL_RCC_TIM4_CLK_ENABLE();
__HAL_RCC_DAC_CLK_ENABLE();
TIM4->PSC = 0; //Предделитель
TIM4->ARR = 83; //Максимальное значение счетного регистра
TIM4->CR2 = 0x0020; //MMS = Update
TIM4->CR1 |= TIM_CR1_CEN; //Включаем таймер
GPIO_InitStruct.Pin = GPIO_PIN_4;
GPIO_InitStruct.Mode = GPIO_MODE_ANALOG;
GPIO_InitStruct.Pull = GPIO_NOPULL;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
DAC->CR |= DAC_CR_DMAEN1; //разрешить прием данных канала №1 от ДМА
DAC->CR |= DAC_CR_TSEL1_0|DAC_CR_TSEL1_2; //Timer 4 TRGO event
DAC->CR |= DAC_CR_TEN1;
DAC->CR |= DAC_CR_EN1; //включить канал 1
DMA1_Stream5->PAR = (uint32_t)&DAC1->DHR12R1;
DMA1_Stream5->M0AR = (uint32_t)&Wave1[0];
DMA1_Stream5->NDTR = 32;
DMA1_Stream5->CR|= DMA_SxCR_CHSEL_0|DMA_SxCR_CHSEL_1|DMA_SxCR_CHSEL_2; //DMA chanel 7 (согласно таблице "DMA1 request mapping" RM)
DMA1_Stream5->CR|= DMA_SxCR_MSIZE_0; //Memory data size = Half-word (16 bit)
DMA1_Stream5->CR|= DMA_SxCR_PSIZE_0; //Peripheral data size = Half-word (16 bit)
DMA1_Stream5->CR|= DMA_SxCR_MINC; //Memory address pointer is incremented after each data transfer
//DMA1_Stream5->CR|= DMA_SxCR_CIRC; //Circular mode
DMA1_Stream5->CR|= DMA_SxCR_DIR_0; //Направление 01: Memory-to-peripheral
DMA1_Stream5->CR|= DMA_SxCR_EN; //Enable DMA
//======================================================================
__HAL_RCC_DMA1_CLK_ENABLE();
__HAL_RCC_TIM4_CLK_ENABLE();
__HAL_RCC_DAC_CLK_ENABLE();
TIM4->PSC = 0; //Предделитель
TIM4->ARR = 83; //Максимальное значение счетного регистра
TIM4->CR2 = 0x0020; //MMS = Update
TIM4->CR1 |= TIM_CR1_CEN; //Включаем таймер
GPIO_InitStruct.Pin = GPIO_PIN_4;
GPIO_InitStruct.Mode = GPIO_MODE_ANALOG;
GPIO_InitStruct.Pull = GPIO_NOPULL;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
DAC->CR |= DAC_CR_DMAEN1; //разрешить прием данных канала №1 от ДМА
DAC->CR |= DAC_CR_TSEL1_0|DAC_CR_TSEL1_2; //Timer 4 TRGO event
DAC->CR |= DAC_CR_TEN1;
DAC->CR |= DAC_CR_EN1; //включить канал 1
DMA1_Stream5->PAR = (uint32_t)&DAC1->DHR12R1;
DMA1_Stream5->M0AR = (uint32_t)&Wave1[0];
DMA1_Stream5->NDTR = 32;
DMA1_Stream5->CR|= DMA_SxCR_CHSEL_0|DMA_SxCR_CHSEL_1|DMA_SxCR_CHSEL_2; //DMA chanel 7 (согласно таблице "DMA1 request mapping" RM)
DMA1_Stream5->CR|= DMA_SxCR_MSIZE_0; //Memory data size = Half-word (16 bit)
DMA1_Stream5->CR|= DMA_SxCR_PSIZE_0; //Peripheral data size = Half-word (16 bit)
DMA1_Stream5->CR|= DMA_SxCR_MINC; //Memory address pointer is incremented after each data transfer
//DMA1_Stream5->CR|= DMA_SxCR_CIRC; //Circular mode
DMA1_Stream5->CR|= DMA_SxCR_DIR_0; //Направление 01: Memory-to-peripheral
DMA1_Stream5->CR|= DMA_SxCR_EN; //Enable DMA
//======================================================================
И далее в программе так:
Код
while (1)
{
HAL_Delay(1000);
DMA1_Stream5->CR&= ~DMA_SxCR_EN; //Disable DMA
DMA1_Stream5->NDTR = 32;
DMA1_Stream5->CR|= DMA_SxCR_EN; //Enable DMA
}
{
HAL_Delay(1000);
DMA1_Stream5->CR&= ~DMA_SxCR_EN; //Disable DMA
DMA1_Stream5->NDTR = 32;
DMA1_Stream5->CR|= DMA_SxCR_EN; //Enable DMA
}
После первой инициализации данные выводятся, в цикле - не работает( Подозреваю, что не сбрасываю какой-то флаг.
Заранее спасибо!