STM32 ADC调试
使用火牛开发板自带的程序验证ADC的功能,怎么调试打印出来的ADC的值都是0,查看了ADC和DMA寄存器的设置也没什么问题,
修改了ADC的采用速率也不行后来从网上下到一个例子,down进去跑,竟然是正常的,比较了下代码关于ADC的设置都是一样的,
真奇怪的问题,到网站论坛上求助也没什么回复,我用正常的程序一段段替代运行不正常的程序,看看到底什么原因,最终问题发现了,
贴出来以免以后再次遇到:
不正常程序的代码的RCC_Configuration函数:
void RCC_Configuration(void) {
/* 使能外设时钟 */
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1 | RCC_APB2Periph_AFIO | RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB | RCC_APB2Periph_GPIOC | RCC_APB2Periph_GPIOD | RCC_APB2Periph_GPIOE , ENABLE); RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2 | RCC_APB2Periph_ADC1, ENABLE);
}
正常程序的代码的RCC_Configuration函数:
void RCC_Configuration(void) {
/* 使能外设时钟 */
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE); RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1 | RCC_APB2Periph_AFIO | RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB | RCC_APB2Periph_GPIOC | RCC_APB2Periph_GPIOD | RCC_APB2Periph_GPIOE | RCC_APB2Periph_ADC1, ENABLE);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2, ENABLE);
}
原来不是同一个时钟源出来的时钟是不能使用相同函数初始化的,可能这是一个很低级的错误,对于不太熟悉STM32 的人来说不见得那么
好发现,我也是初学者,只能说认识还太肤浅吧,也请没有注意过这方面问题的朋友以后可以从这方面入手查问题。 还有一个之前遇到的
问题,就是关于GPIO使用的问题,不知道是不是我哪里出了问题还是STM32就是这个样子就是一个按键例程,大概是这样的,我在设置GPIO的函数GPIO_Configuration里
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8 | GPIO_Pin_9 | GPIO_Pin_10 | GPIO_Pin_11; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOD, &GPIO_InitStructure);
就是LED连接的几个GPIO脚,我想控LED的亮和熄程序烧进去跑,是完全没有问题的,但是一旦我单步执行,跑到
GPIO_SetBits(GPIOD, GPIO_Pin_8);或者
GPIO_ResetBits(GPIOD, GPIO_Pin_9);
灯并没有反应,量GPIO脚,也一直是低,使用realview MDK4.11看GPIOD的寄存器,IDR和ODR寄存器都相应的置位了,
BSRR并没有反应,不知道是不是STM32就是这个样子还是我没正确使用。
果然是犯了愚蠢的错误,原来是realview MDK环境的设置有问题,把调试模式设置成软件仿真了,是工程打开时默认的。
设置好之后,单步执行就对了,汗颜啊。。。