代码由 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;
}
感谢您阅读:)