stm32l476 ADC未就绪

stm32l476 ADC未就绪,stm32,keil,Stm32,Keil,我想在STM32L476核子板上提出一个ADC。我想我已经配置好了,但我肯定错过了一步。我知道这可以通过HALAPI和CubeMX实现,但我更喜欢在启动新板时进行寄存器级访问。这是我的代码-我想它已经被注释得足够好了,所以它可以被理解。为了保持简单,我去掉了代码的其余部分 我不明白的问题是,当代码启动while循环时-ADC未准备好-即ADC1->ISR[0]未设置-并且未设置。我已经确认了位设置在我认为应该使用keil的位置 谁能发现丢失了什么 #include <stm32l4xx.h

我想在STM32L476核子板上提出一个ADC。我想我已经配置好了,但我肯定错过了一步。我知道这可以通过HALAPI和CubeMX实现,但我更喜欢在启动新板时进行寄存器级访问。这是我的代码-我想它已经被注释得足够好了,所以它可以被理解。为了保持简单,我去掉了代码的其余部分

我不明白的问题是,当代码启动while循环时-ADC未准备好-即ADC1->ISR[0]未设置-并且未设置。我已经确认了位设置在我认为应该使用keil的位置

谁能发现丢失了什么

#include <stm32l4xx.h>
#include <stdio.h>

#ifdef __cplusplus
extern "C"
#endif

int main(void)
{

    uint32_t adcResult = 0;

    /* Configure the clocks - using MSI as SYSCLK @16MHz */
    RCC->CR             &=  0xFFFFFF07;     //Clear ~MSIRANGE bits and MSIRGSEL bit
    RCC->CR             |=  0x00000089;     //Set MSI to 16MHz and MSIRGSEL bit
    char *dataPtr = NULL;

    //init ADC1
    ADC1->CR     &= 0xDFFFFFFF;      //Take ADC out of deep power down - i break at this point to allow enough time - doesn't help
    ADC1->CR     |= 0x10000000;    //Enable ADC1 votage regulator
    RCC->AHB2ENR |= 0x00002001;    //Enable the ADC clock, and GPIOA clk
    GPIOA->ASCR  |= 0x00000001;    //Connect analog switch to GPIOA[0]
    GPIOA->MODER |= 0x00000003;    //Set A0 for analog input mode
    ADC1->ISR    |= 0x00000001;    //Clear the ADRDY bit in the ADCx_ISR register by writing ‘1’.
    ADC1->SQR1   |= 0x00000040;    //Set for a sequence of 1 conversion on CH0


    while (1)
    {
            ADC1->CR |= 0x00000004;       //Convst
            while(!(ADC1->ISR & 0x4));
            adcResult = ADC1->DR;
            sprintf(dataPtr, "%d", adcResult);
    }
}
#包括
#包括
#ifdef_uucplusplus
外部“C”
#恩迪夫
内部主(空)
{
uint32_t adcResult=0;
/*配置时钟-使用MSI作为SYSCLK@16MHz*/
RCC->CR&=0xFFFFFF07;//清除~MSIRANGE位和MSIRGSEL位
RCC->CR |=0x00000089;//将MSI设置为16MHz和MSIRGSEL位
char*dataPtr=NULL;
//初始化ADC1
ADC1->CR&=0xDFFFFF;//将ADC从深度断电中取出-我在此时中断以留出足够的时间-没有帮助
ADC1->CR |=0x10000000;//启用ADC1电压调节器
RCC->AHB2ENR |=0x00002001;//启用ADC时钟和GPIOA时钟
GPIOA->ASCR |=0x00000001;//将模拟开关连接到GPIOA[0]
GPIOA->MODER |=0x00000003;//为模拟输入模式设置A0
ADC1->ISR |=0x00000001;//通过写入“1”清除ADCx_ISR寄存器中的ADRDY位。
ADC1->SQR1 |=0x00000040;//为CH0上的1转换序列设置
而(1)
{
ADC1->CR |=0x00000004;//Convst
而(!(ADC1->ISR&0x4));
ADC结果=ADC1->DR;
sprintf(dataPtr,“%d”,adcResult);
}
}

我终于解决了这个问题。如果有人进入同一个地方。我已经将SYSCLK设置为ADC时钟源,但这需要在RCC->CCIPR[29:28]中进行设置


这是一些小事情…

仍然无法与上面的代码一起工作-不知道为什么,我已经使用CubeMX完成了相同的设置-这很有效。我正在努力理解这些区别。