stm32l476 ADC 没有准备好
stm32l476 ADC not ready
我正在尝试调出 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 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] 中设置。
这是小事...