CODE
// Обработка прерываний DMA ......
....
void TIM2_IRQHandler(void) //Собственно прерывание по которому хочется запустить цикл ADC c DMA
{
if (TIM_GetITStatus(TIM2, TIM_IT_Update) != RESET)
{
TIM_ClearITPendingBit(TIM2, TIM_IT_Update);
if (side==0){ //Переставляем банки для результатов ADC
DMA1_Channel1->CMAR = ADMA1;
DMA2_Channel1->CMAR = ADMA2;
side=1;
} else {
DMA1_Channel1->CMAR = BDMA1;
DMA2_Channel1->CMAR = BDMA2;
side=0;
}
bsize1 = 5164;
bsize2 = 5164;
DMA1_Channel1->CNDTR = bsize1;
DMA2_Channel1->CNDTR = bsize2;
DMA1_Channel1->CCR |= DMA_CCR_EN;
ADC1->CR |= ADC_CR_ADSTART; //Если закоментировать эту строку все работает
DMA2_Channel1->CCR |= DMA_CCR_EN;
ADC2->CR |= ADC_CR_ADSTART; //Если закоментировать и эту строку все работает
}
}
while (1) {
}
....
void TIM2_IRQHandler(void) //Собственно прерывание по которому хочется запустить цикл ADC c DMA
{
if (TIM_GetITStatus(TIM2, TIM_IT_Update) != RESET)
{
TIM_ClearITPendingBit(TIM2, TIM_IT_Update);
if (side==0){ //Переставляем банки для результатов ADC
DMA1_Channel1->CMAR = ADMA1;
DMA2_Channel1->CMAR = ADMA2;
side=1;
} else {
DMA1_Channel1->CMAR = BDMA1;
DMA2_Channel1->CMAR = BDMA2;
side=0;
}
bsize1 = 5164;
bsize2 = 5164;
DMA1_Channel1->CNDTR = bsize1;
DMA2_Channel1->CNDTR = bsize2;
DMA1_Channel1->CCR |= DMA_CCR_EN;
ADC1->CR |= ADC_CR_ADSTART; //Если закоментировать эту строку все работает
DMA2_Channel1->CCR |= DMA_CCR_EN;
ADC2->CR |= ADC_CR_ADSTART; //Если закоментировать и эту строку все работает
}
}
while (1) {
}
Вот рабочий вариант
CODE
// Обработка прерываний DMA ......
....
void TIM2_IRQHandler(void)
{
if (TIM_GetITStatus(TIM2, TIM_IT_Update) != RESET)
{
TIM_ClearITPendingBit(TIM2, TIM_IT_Update);
ADC_Start = 1;
}
}
while (1) {
if (ADC_Start==1){
if (side==0){ //Переставляем банки для результатов ADC
DMA1_Channel1->CMAR = ADMA1;
DMA2_Channel1->CMAR = ADMA2;
side=1;
} else {
DMA1_Channel1->CMAR = BDMA1;
DMA2_Channel1->CMAR = BDMA2;
side=0;
}
bsize1 = 5164;
bsize2 = 5164;
DMA1_Channel1->CNDTR = bsize1;
DMA2_Channel1->CNDTR = bsize2;
DMA1_Channel1->CCR |= DMA_CCR_EN;
ADC1->CR |= ADC_CR_ADSTART;
DMA2_Channel1->CCR |= DMA_CCR_EN;
ADC2->CR |= ADC_CR_ADSTART;
ADC_Start = 0;
}
}