比神乐 发表于 2023-3-11 14:45

AD一启动采样就出错

我用STM32CUBEMX生成ADC和串口初始化代码,AD是软件启动。
AD初始化代码如下:
static void MX_ADC1_Init(void)
{

/* USER CODE BEGIN ADC1_Init 0 */

/* USER CODE END ADC1_Init 0 */

ADC_ChannelConfTypeDef sConfig = {0};

/* USER CODE BEGIN ADC1_Init 1 */

/* USER CODE END ADC1_Init 1 */

/** Common config
*/
hadc1.Instance = ADC1;
hadc1.Init.ClockPrescaler = ADC_CLOCK_ASYNC_DIV1;
hadc1.Init.Resolution = ADC_RESOLUTION_14B;
hadc1.Init.GainCompensation = 0;
hadc1.Init.ScanConvMode = ADC_SCAN_DISABLE;
hadc1.Init.EOCSelection = ADC_EOC_SINGLE_CONV;
hadc1.Init.LowPowerAutoWait = DISABLE;
hadc1.Init.ContinuousConvMode = DISABLE;
hadc1.Init.NbrOfConversion = 1;
hadc1.Init.DiscontinuousConvMode = DISABLE;
hadc1.Init.ExternalTrigConv = ADC_SOFTWARE_START;
hadc1.Init.ExternalTrigConvEdge = ADC_EXTERNALTRIGCONVEDGE_NONE;
hadc1.Init.DMAContinuousRequests = DISABLE;
hadc1.Init.TriggerFrequencyMode = ADC_TRIGGER_FREQ_HIGH;
hadc1.Init.Overrun = ADC_OVR_DATA_OVERWRITTEN;
hadc1.Init.LeftBitShift = ADC_LEFTBITSHIFT_NONE;
hadc1.Init.ConversionDataManagement = ADC_CONVERSIONDATA_DR;
hadc1.Init.OversamplingMode = DISABLE;
if (HAL_ADC_Init(&hadc1) != HAL_OK)
{
    Error_Handler();
}

/** Configure Regular Channel
*/
sConfig.Channel = ADC_CHANNEL_9;
sConfig.Rank = ADC_REGULAR_RANK_1;
sConfig.SamplingTime = ADC_SAMPLETIME_5CYCLE;
sConfig.SingleDiff = ADC_SINGLE_ENDED;
sConfig.OffsetNumber = ADC_OFFSET_NONE;
sConfig.Offset = 0;
if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK)
{
    Error_Handler();
}
/* USER CODE BEGIN ADC1_Init 2 */

/* USER CODE END ADC1_Init 2 */

}不启动ADC转换的时候,串口打印正常。
我一启动AD采样:
if (HAL_ADC_Start(&hadc1) != HAL_OK)
        {
                /* Error: ADC conversion start could not be performed */
                HAL_UART_Transmit(&huart2, (uint8_t *)aTxBuffer1, TXBUFFERSIZE, 5000);
                Error_Handler();
        }就进入Error_Handler();
这是怎么回事呀?谢谢!

天意无罪 发表于 2023-3-11 16:03

你把Error_Handler()函数写到ADC转换函数中,这是必然要执行这条语句啊。

比神乐 发表于 2023-3-11 20:04

天意无罪 发表于 2023-3-11 16:03
你把Error_Handler()函数写到ADC转换函数中,这是必然要执行这条语句啊。

你没仔细看,失败了才执行那一条语句。

kaventang 发表于 2023-3-11 22:27

高手如云,学习了

地瓜patch 发表于 2023-3-11 23:00

仿真,看看进入error前是跑哪个函数,能快速定位

比神乐 发表于 2023-3-12 08:22

地瓜patch 发表于 2023-3-11 23:00
仿真,看看进入error前是跑哪个函数,能快速定位

没有仿真工具。

香水城 发表于 2023-3-12 21:20

从现象看,启动ADC时出错了。换言之,没法正常启动ADC.
检查下ADC的配置、供电等是否有问题。

专注于嵌入式 发表于 2023-3-13 10:52

ADC与串口初始化调一下顺序就好了

GlenX 发表于 2023-3-13 15:33

改成这样试试!
if (HAL_ADC_Start(&hadc1) != HAL_OK)
      {
            HAL_Delay(10);
      }

比神乐 发表于 2023-3-13 18:50

专注于嵌入式 发表于 2023-3-13 10:52
ADC与串口初始化调一下顺序就好了

试过了,不好使

zhenykun 发表于 2023-7-12 22:09

调整顺序不管用

wyjie 发表于 2023-7-12 22:11

把外设初始化顺序调整一下,会有惊喜

jlyuan 发表于 2023-7-12 22:12

有没有中断?

yszong 发表于 2023-7-12 22:13

没有累加溢出。没用中断。

jiahy 发表于 2023-7-12 22:15

看看有没有变量累加益处

lizye 发表于 2023-7-12 22:16

调整一下中断优先级

shimx 发表于 2023-7-12 22:18

调整外设初始化顺序

jiaxw 发表于 2023-7-12 22:19

你把Error_Handler()函数写到ADC转换函数中,这是必然要执行这条语句啊。

spark周 发表于 2023-7-12 22:20

你没仔细看,失败了才执行那一条语句。

liliang9554 发表于 2023-7-12 22:23

高手如云,学习了
页: [1] 2
查看完整版本: AD一启动采样就出错