STM32 ADC_DMA_UART передача данных - PullRequest
0 голосов
/ 09 февраля 2020

Я пытаюсь реализовать следующий сценарий на STM32F103C8 Микроконтроллер. На PB11 и PB10 у меня подключены светодиод и кнопка соответственно. Светодиод постоянно мигает 500 мс, но при нажатии кнопки он мигает с задержкой 100 мс 20 раз. Я также подключил UART (PA3-PA2) и потенциометр на AD C (PA0). Моя задача - перевести чтение AD C в UART в режиме DMA. Светодиод и прерывание кнопки работали хорошо, но как только я добавил код для AD C и обработки USART, он перестал работать. Не могли бы вы посоветовать, где моя ошибка в обработке AD C -DMA-UART и как я могу это исправить?

Фрагменты от Main. c

//Buffer for ADC.
uint16_t buffer[5];

huart2.Instance->CR3 |= USART_CR3_DMAT;

//Transfer ADC reading to Buffer in DMA.
HAL_ADC_Start_DMA(&hadc1, (uint32_t*)buffer, 5); 

while (1)
  {
        //LED blinking
    HAL_GPIO_TogglePin(GPIOB, LED_Pin);
    HAL_Delay(500);
  }

//ADC callback function - When buffer is full transfer to UART.
void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef* hadc) {
    HAL_DMA_Start_IT(&hdma_usart2_tx, (uint32_t)buffer, (uint32_t)&huart2.Instance->DR, sizeof(buffer));
}


//Interrupt handler for Button.
void EXTI15_10_IRQHandler(void) {
    HAL_GPIO_EXTI_IRQHandler(BT_Pin);
}

//Callback function for Button.
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin){
    if(GPIO_Pin == BT_Pin){
        for(volatile int i=20; i>0; i--){
            HAL_GPIO_TogglePin(GPIOB, LED_Pin);
            HAL_Delay(100);
    }
}

1 Ответ

0 голосов
/ 03 апреля 2020

Наиболее вероятная причина для меня заключается в том, что обработчик прерываний AD C (включая функции библиотеки ST и представленный вами обратный вызов) запускается слишком часто, так что ISR EXTI, запускаемого кнопкой pu sh, имеет вид подавлено (постоянно или почти постоянно).

Это может произойти еще проще, если вы выбрали минимальное время выборки и режим непрерывного преобразования (потому что выборка и преобразование происходят так часто, как это происходит, и IRQ, который вызывает ваше полный обратный вызов ( HAL_ADC_ConvCmpltCallback () ) может выполняться постоянно.

Для проверки / фальсификации моего предположения, пожалуйста, проверьте

  • ваши приоритеты прерываний для AD C и EXTI (и других, которые вы можете иметь в системе)
  • что произойдет, если вы выберете более длительный период выборки AD C или замедлите тактовый источник AD C (конечно, без замедления тактовой частоты процессора).

Если это не помогло решить проблему, возможно, вы возможность опубликовать еще один уточненный вопрос.

...