我正在尝试在 STM32F031K6 上使用 ADC,而不使用 HAL(设置中除外),使用 cubeIDE。我在不连续模式下使用 ADC - 据我所知,事件的顺序应该是
- ADC 已设置,然后使用 ADEN 启用
- ADC 通过设置 ADSTART 开始转换
- 检查 EOC 标志以查看转换何时完成
- 当从 DR 寄存器读取数据时,EOC 标志清零
这就是我感到困惑的地方 - 然后我必须再次设置 ADSTART 吗?在连续模式下,参考手册似乎表明下一次转换将自动发生,但在不连续模式下,下一次转换需要手动启动 - 我假设这是由 ADSTART 完成的?在模拟中,这似乎不起作用。数据表上说ADSTART是软件设置的,是不是不能直接写?
我的代码如下,如果我一步一步点击它似乎无法正常工作,如果我将其设置为运行,我可以看到 ADC1_data 变量在我更换板上的锅时发生变化,但它间歇性地工作,在0 和正确的值
HAL 设置是
static void MX_ADC_Init(void)
{
ADC_ChannelConfTypeDef sConfig = {0};
hadc.Instance = ADC1;
hadc.Init.ClockPrescaler = ADC_CLOCK_ASYNC_DIV1;
hadc.Init.Resolution = ADC_RESOLUTION_12B;
hadc.Init.DataAlign = ADC_DATAALIGN_RIGHT;
hadc.Init.ScanConvMode = ADC_SCAN_DIRECTION_FORWARD;
hadc.Init.EOCSelection = ADC_EOC_SINGLE_CONV;
hadc.Init.LowPowerAutoWait = DISABLE;
hadc.Init.LowPowerAutoPowerOff = DISABLE;
hadc.Init.ContinuousConvMode = DISABLE;
hadc.Init.DiscontinuousConvMode = DISABLE;
hadc.Init.ExternalTrigConv = ADC_SOFTWARE_START;
hadc.Init.ExternalTrigConvEdge = ADC_EXTERNALTRIGCONVEDGE_NONE;
hadc.Init.DMAContinuousRequests = DISABLE;
hadc.Init.Overrun = ADC_OVR_DATA_PRESERVED;
if (HAL_ADC_Init(&hadc) != HAL_OK)
{
Error_Handler();
}
/** Configure for the selected ADC regular channel to be converted. */
sConfig.Channel = ADC_CHANNEL_0;
sConfig.Rank = ADC_RANK_CHANNEL_NUMBER;
sConfig.SamplingTime = ADC_SAMPLETIME_1CYCLE_5;
if (HAL_ADC_ConfigChannel(&hadc, &sConfig) != HAL_OK)
{
Error_Handler();
}
/** Configure for the selected ADC regular channel to be converted. */
sConfig.Channel = ADC_CHANNEL_1;
if (HAL_ADC_ConfigChannel(&hadc, &sConfig) != HAL_OK)
{
Error_Handler();
}
}
程序中的代码读取
ADC1->CR |= ADC_CR_ADEN; // enable ADC
ADC1 ->SMPR = 0b11;// speed divider select
ADC1 ->CHSELR |= 1<<0 | 1<<1; // set sequence to adc0, adc1
ADC1 ->CFGR1 |= ADC_CFGR1_DISCEN; //discontinuous mode
ADC1 ->CR |= 1<<2; // start conversion
while (1)
{
if((ADC1->ISR) & 0b00000100) //if EOC flag is on
{
ADC1_data = ADC1->DR;
ADC1 ->CR |= 1<<2; // start conversion
}
}
谁能确认我是否犯了错误?非常感谢任何帮助