stm32l476 ADC 没有准备好

标签 stm32 keil

我正在尝试在 STM32L476 Nucleo 板上调出一个 ADC。我想我已经配置好了,但我一定是漏掉了一步。我知道这可以使用 HAL API 和 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);
    }
}

最佳答案

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

这些小事...

关于stm32l476 ADC 没有准备好,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54856078/

相关文章:

gcc - gcc 的 -flto 丢弃了什么?

embedded - 执行硬件重置后,使用 SPI 初始化 SanDisk SD 卡失败

c - stm32f103中多 channel 转换中adc的转换顺序

c - 函数声明的宏不起作用

c++ - 重定向和调用 fopen() 后没有串行输出

c - 在 UART 通信中接收额外的字节

c - 如何提高 CMWX1ZZABZ-091 RTC(实时时钟)的精度

c - 替代一大组 if 语句?

c - 嵌入式 C 数组索引文字与变量问题

c++ - armcc中.arm.extab条目的结构是什么?