使用 CMSIS 配置 STM32F407VET6 ADC

问题描述 投票:0回答:1

我正在尝试配置STM32F407VET6微控制器的ADC。我使用以下代码。

int main(void)
{
    // GPIOF Clock enable
    RCC->AHB1ENR |= RCC_AHB1ENR_GPIOFEN;
    // Analog modes on PF3, PF4, PF5, PF6, PF7, PF8
    GPIOF->MODER = ( 3 << 16 ) | ( 3 << 14 ) | ( 3 << 12 ) | ( 3 << 10 ) | ( 3 << 8 )  | ( 3 << 6 );
    // ADC3 Clock enable
    RCC->APB2ENR |= RCC_APB2ENR_ADC3EN;
    // ADC3 Sequence: ADC3_IN9, ADC3_IN14, ADC3_IN15, ADC3_IN4, ADC3_IN5, ADC3_IN6
    ADC3->SQR3 = ( 9 << 0 ) | ( 14 << 5 ) | ( 15 << 10 ) | ( 4 << 15 ) | ( 5 << 20 ) | ( 6 << 25 );
    // ADC3 Sequence length = 5
    ADC3->SQR1 = ( 5 << 20 );
    // 56 cycles time selection on all of ADC3 channels
    ADC3->SMPR1 = ( 3 << 0 ) | ( 3 << 3 ) | ( 3 << 6 ) | ( 3 << 9 ) | ( 3 << 12 ) | ( 3 << 15 ) | ( 3 << 18 ) | ( 3 << 21 ) | ( 3 << 24 );
    ADC3->SMPR2 = ( 3 << 0 ) | ( 3 << 3 ) | ( 3 << 6 ) | ( 3 << 9 ) | ( 3 << 12 ) | ( 3 << 15 ) | ( 3 << 18 ) | ( 3 << 21 ) | ( 3 << 24 ) | ( 3 << 27 );
    // Continuous conversion
    ADC3->CR2 |= ADC_CR2_CONT;
    // EOC event after each conversion
    ADC3->CR2 |= ADC_CR2_EOCS;
    // Scan sequence
    ADC3->CR1 |= ADC_CR1_SCAN;
    // End-of-conversion interrupt enable
    ADC3->CR1 |= ADC_CR1_EOCIE;
    // Global ADC interrupt enable
    NVIC_EnableIRQ (ADC_IRQn);
    // Start conversion on ADC3
    ADC3->CR2 |= ADC_CR2_SWSTART;
    while(1) {}
}

int adc_data;

void ADC_IRQHandler(void) {
    if(ADC3->SR & ADC_SR_EOC) {
        ADC3->SR &= ~ADC_SR_EOC;
    }
}

编译和固件之后,我在 ADC_IRQHandler 中断处理程序中放置了一个断点,并等待中断处理程序的输入被拦截。在我看来,每个通道的每次转换后,都应该调用一个中断处理程序。但没有进入处理程序,即使一次。 我在互联网上找不到配置我的 ADC 操作场景的示例,我已经重读了一周的手册并更改了代码 - 没有任何更改。可能是什么问题?

c stm32 microcontroller cmsis
1个回答
0
投票
  1. 使能时钟后无延迟(参考RCC外设文档)
  2. ADC 未启用 - 因此它将无法工作(ADCON 位 CR2 寄存器)
  3. 模拟部分时钟必须是 < 30MHz (I do not know what is PCLK clock)
© www.soinside.com 2019 - 2024. All rights reserved.