STM32的连续转化模式,求解

2019-07-21 00:36发布

我的单通道的单次转化模式可以行得通,但是,我的单通道的连续转化模式行不通,求解.......
在寄存器设置中,其两者的区别是:
<1>将单次转化模式改为了连续转化模式
<2>之前在单通道的每次转化之后,都让其再次开启开始转化规则通道,
现在换成了连续转化模式之后,只在ADC的初始化函数部分初始化一次
开始转化规则通道,但是程序下载进去,没有反应,为何?捣鼓了好久还是没有找出原因

以下是我的单通道的连续转化模式的代码:
adc.c
[mw_shl_code=c,true]#include "sys.h" #include "stm32f4xx.h" /* 本实验的目的是: 通过ADC1的通道6来进行AD转化实验; 通过其采集电压值将其显示在串口上; */ //ADC相关的初始化; void ADC_Init(void){ /**********************单次转化模式的初始化*****************************/ // //第一步 // //开启PA口时钟,并设置PA6为模拟输入 // RCC->AHB1ENR |= 1; // GPIOA->MODER |= 3<<12; // // // //第二步 // //使能ADC1时钟,并设置分频因子 // //ADC的时钟要低于36MHZ,具体见数据手册说明; // RCC->APB2ENR |= 1<<8; // // ADC->CCR |= 3<<16; //4分频,那么ADC1的频率为21MHZ // // // //第三步 // // //设置ADC1的工作模式 // // //见第五步 // // // // //第四步 // // //设置ADC1规则序列的相关信息 // ADC1->SQR3 |= 0X6; //在主函数中已经有了其配置 // // // // //第五步 // // //开启AD转化器 //在这里设置为单次转化模式; // // // ADC1->CR2 &= ~(1<<11); // ADC1->CR2 |= (1<<0); // ADC1->CR2 |= (1<30); /************************单次转化模式的初始化***************************/ /*********************************************************************/ // //先初始化IO口 // RCC->APB2ENR|=1<<8; //使能ADC1时钟 // RCC->AHB1ENR|=1<<0; //使能PORTA时钟 // GPIO_Set(GPIOA,PIN6,GPIO_MODE_AIN,0,0,GPIO_PUPD_PU); //PA5,模拟输入,下拉 // RCC->APB2RSTR|=1<<8; //ADCs复位 // RCC->APB2RSTR&=~(1<<8); //复位结束 // ADC->CCR=3<<16; //ADCCLK=PCLK2/4=84/4=21Mhz,ADC时钟最好不要超过36Mhz // // ADC1->CR1=0; //CR1设置清零 // ADC1->CR2=0; //CR2设置清零 // ADC1->CR1|=0<<24; //12位模式 // ADC1->CR1|=0<<8; //非扫描模式 // ADC1->CR2&=~(1<<1); //单次转换模式,使用默认值即可; // //ADC1->CR2&=~(1<<11); //右对齐 ,使用默认值即可; // ADC1->CR2|=0<<28; //软件触发 // ADC1->SQR1&=~(0XF<<20); // ADC1->SQR1|=0<<20; //1个转换在规则序列中 也就是只转换规则序列1 //设置通道5的采样时间 // ADC1->SMPR2&=~(7<<(3*5));//通道5采样时间清空 // ADC1->SMPR2|=7<<(3*5); //通道5 480个周期,提高采样时间可以提高精确度 // ADC1->CR2|=1<<0; //开启AD转换器 /******************************连续转化模式*******************************/ //连续转化这一部分还有问题,待完成: // //第一步 //开启PA口时钟,并设置PA6为模拟输入 RCC->AHB1ENR |= 1; GPIOA->MODER |= 3<<12; //第二步 //使能ADC1时钟,并设置分频因子 //ADC的时钟要低于36MHZ,具体见数据手册说明; RCC->APB2ENR |= 1<<8; ADC->CCR |= 3<<16; //4分频,那么ADC1的频率为21MHZ // //第三步 // //设置ADC1的工作模式 // //见第五步 // // //第四步 // //设置ADC1规则序列的相关信息 ADC1->SQR3 |= 0X6; // //第五步 // //开启AD转化器 //在这里设置为连续转化模式; // ADC1->CR2 |= (1<<0); ADC1->CR2 |= (1<<1); ADC1->CR2 |= (1<30); //其余没有设置的寄存器位,说明采用的是默认值,并不代表他们真的没有设置; }[/mw_shl_code] test.c
[mw_shl_code=c,true]#include "sys.h" #include "delay.h" #include "led.h" #include "usart.h" #include "lcd.h" #include "adc.h" #include "beep.h" /* 本实验的目的是: 采集电压值,并将其打印在串口上; */ /* 在ADC实验中,出现的问题是: 1. 在单次转化模式中,思考一下两个while的区别 2. 在单次转化模式中,ADC1->CR2 |= (1<30);必须放在主函数中,思考为什么? 难道我执行一次不行么?为何就没有数据输出? 3. 把单次转化模式和连续模式都编写一遍,予以总结; 4. 在ADC的连续转化模式中,是不是一个通道的其中某一个转化结束了,EOC就置1, 还是说一个通道的所有转化序列都结束才产生EOC置1? 5. 在连续转化模式中,它指的连续转化,是指一个通道的所有转化序列转化完一次就结束了, 还是一个通道的所有转化序列结束后,又重新开始转化? */ int main(void){ u32 temp; u32 temp1; u32 temp2; Stm32_Clock_Init(336,8,2,7);//设置时钟,168MHZ delay_init(168); //初始化延时函数 LED_Init(); uart_init(84-1,115200); lcd_init(); ADC_Init(); while(1){ // //方式一:单次转化模式 // ADC1->CR2|=1<<30; //启动规则转换通道 //当转化完后,ADC停止工作, // //此时,只需再次开启开始转化规则通道即可; // while(!(ADC1->SR&1<<1));//等待转换结束 // //while(((ADC1->SR >> 1) & (0X1)) == 1); //while()这里有问题; // temp = ADC1->DR; // temp = temp; //平均值 // temp1 = temp*(3.3/4096); //浮点数的整数部分; // temp2 = (temp*(3.3/4096) - temp1)*1000; // printf("VCC:%d.%d ",temp1,temp2); // delay_ms(1000); //方式二:连续转化模式 while(!(ADC1->SR&(1<<1)));//等待转换结束 //while(((ADC1->SR >> 1) & (0X1)) == 1); //while()这里有问题; temp = ADC1->DR; temp1 = temp*(3.3/4096); //浮点数的整数部分; temp2 = (temp*(3.3/4096) - temp1)*1000; printf("VCC:%d.%d ",temp1,temp2); delay_ms(1000); } } [/mw_shl_code]
0条回答

一周热门 更多>