0

代码由 CubeIde(Mx) 生成。

因此,在主循环的第二次运行时,ADC 错误寄存器读取 4 并停止工作(状态寄存器读取 320)。ADC 配置为读取 2 个通道(1.5 个周期)(正向扫描),ADC 时钟是主时钟除以 4 (48/4=12MHz)。DMA 配置为半字和循环。
定时器配置为 40kHz。

我检查了使用的数组的大小是否正确。优化不会改变行为。

HAL_ADCEx_Calibration_Start(&hadc); //ADC SETUP
HAL_ADC_Stop(&hadc);
HAL_TIM_Base_Start(&htim1);

/* USER CODE END 2 */

/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1) {
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
    cc = 0;
    flag = 1; //Start

    HAL_TIM_Base_Start_IT(&htim3);
    HAL_TIM_PWM_Start(&htim1, TIM_CHANNEL_4);

    while (flag != 0) {    // Measurement on going
        //HAL_Delay(1);
        if (flag == 0) {
            HAL_ADC_Stop_DMA(&hadc);
        }
    }

    HAL_ADC_Stop_DMA(&hadc);
    for (uint16_t i = 0; i < 800; ++i) {

        sprintf(asic_buffer, "%d", guffer[i]);
        asic_buffer[4] = 0;
        HAL_UART_Transmit(&huart1, asic_buffer, 5, 20);
        HAL_UART_Transmit(&huart1, new_line, 2, 8);

    }

    HAL_Delay(1);
}

拳头打断

void TIM3_IRQHandler(void) {
/* USER CODE BEGIN TIM3_IRQn 0 */
if (flag == 1) {

    flag_c++;
    if (flag_c >= pulse) {
        flag = 2;  //Listening
        flag_c = 0;

        HAL_TIM_Base_Stop_IT(&htim3);
        HAL_TIM_Base_Stop(&htim1);

        HAL_ADC_Start_DMA(&hadc, (uint32_t*) buffera, 8); //ADC Start

        //pos = 0;
        //datacounter = 0;
    }

}
 /* USER CODE END TIM3_IRQn 0 */
 HAL_TIM_IRQHandler(&htim3);
 /* USER CODE BEGIN TIM3_IRQn 1 */

  /* USER CODE END TIM3_IRQn 1 */
}

第二次中断

void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef *hadc) {

if (cc * 4 >= 800) {

    flag = 0;
 }

 ++cc;
}

感谢您阅读:)

4

1 回答 1

0

错误在于 HAL_ADC_Stop_DMA(&hadc) 女巫应该是 HAL_ADC_Stop(&hadc)。我不知道为什么,但它解决了错误。

于 2020-07-30T14:29:15.903 回答