stm32中ADC初始化程序

发布者:脑力激荡最新更新时间:2019-10-09 来源: eefocus关键字:stm32  ADC  初始化程序 手机看文章 扫描二维码
随时随地手机看文章

void  Adc_Init(void)

uint32_t tmpreg1 = 0;

ADC_InitTypeDef ADC_InitStructure; 

GPIO_InitTypeDef GPIO_InitStructure;


RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC |RCC_APB2Periph_ADC1 , ENABLE );  //使能ADC1通道时钟



RCC_ADCCLKConfig(RCC_PCLK2_Div6);   //设置ADC分频因子6 72M/6=12,ADC最大时钟不能超过14M


/* PC0 作为模拟通道输入引脚 ->ADC_IN10 */                       

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN; //模拟输入引脚

GPIO_Init(GPIOC, &GPIO_InitStructure); 


/* ADC初始化*/ 

//CR1寄存器设置

tmpreg1 = ADC1->CR1;

tmpreg1 &= 0xfff0feff; //adc的DUALMOD和SCAN位清零

tmpreg1 |= ((uint32_t)0x00000000); //位19:16 0000:独立模式

tmpreg1 |= ((uint32_t)0x00000000); //扫描模式设置 

ADC1->CR1 = tmpreg1; 


//CR2寄存器设置

tmpreg1 = ADC1->CR2;

tmpreg1 &= 0xfff1f7fd; //CONT、EXTSEL[2:0]清零

tmpreg1 |= (1<<20); //使用外部事件启动转换

tmpreg1 |= ((uint32_t)0x000E0000); //外部事件设置为软件触发

tmpreg1 |= ((uint32_t)0x00000000); //数据右对齐

tmpreg1 &= ~(1<<1);     //单次转换模式

ADC1->CR2 = tmpreg1;


//规则通道数量设置 1个

tmpreg1 = ADC1->SQR1;

tmpreg1 &= 0xff0fffff; 

tmpreg1 |= 0x00000000; //位19~位23 0000 代表规则转换组中只有一个通道

ADC1->SQR1 = tmpreg1;


//规则通道转换顺序   转换AD通道10

tmpreg1 = ADC1->SQR3;

tmpreg1 &= 0xffffffe0;  

tmpreg1 |= 0x0000000a;

ADC1->SQR3 = tmpreg1;


//采样时间设置

ADC1->SMPR1 &= ~(7<<0); //通道10采样时间设置,239.5周期,提高采样时间可以提高精确度  

  ADC1->SMPR1 |= 7<<0;     


//开启AD


ADC1->CR2 |= (1<<0); //开AD转换器


//AD校准


    ADC1->CR2 |= (1<<3); //复位校准

while( ADC1->CR2 & (1<<3) );

ADC1->CR2 |= (1<<2); //AD校准

while( ADC1->CR2 & (1<<2) );


}




自己以前都是库函数操作,没有独立对着参考手册在寄存器层面上编写代码。所以自己写的很艰难,中间还是参考了封装的库函数的定义。现在还只能写的代码还只是一个通道可以转换,多开了几个通道设置还是有问题。明日再继续。


自己独立写代码和做代码搬运工区别真的很大,虽然过程艰难,但是只要能做好,还是能学到很多东西。对概念的理解也会更深。




比如自己对  ! 和 ~的理解不到位。就想当然的写出了下面的程序




//等待AD转换结束


while( !(ADC1->SR) & (1<<1) );


而这种显然更合理 while(!(ADC1->SR&1<<1));


若自己只是做代码搬运工,不独立写,就不会发现概念上的误区,看书的时候也不会有那么深的体会。


所以我希望自己能够在学习的时候能够更独立。

关键字:stm32  ADC  初始化程序 引用地址:stm32中ADC初始化程序

上一篇:STM32F0 ADC学习
下一篇:4*4键盘程序代码 基于STM32

推荐阅读最新更新时间:2024-11-08 17:12

电能计量芯片Sigma-Delta ADC降采样滤波器设计(一)
智能电表(smart meter)作为智能电网的终端计量仪器,不仅需要能够精确计量用户的用电信息,而且还需各种通信功能,如RS485.红外.电力线载波等,以实现自动化远程管理.因此,智能电表在整个智能电网的建设中起着关键性作用.而对于智能电表的核心---电能计量专用芯片(Electrical Measurement Unit,EMU)也提出了更高的要求.目前计量芯片的模数转换电路基本上都采用Sigma-Delta 型,而降采样滤波器是Sigma-Delta ADC 的核心组成部分,因此,对降采样滤波器的研究具有十分重要的意义. 在Sigma-Delta ADC 中,功耗主要集中在降采样滤波器 .而滤波器的功耗主要由乘法器决定,因此
[电源管理]
电能计量芯片Sigma-Delta <font color='red'>ADC</font>降采样滤波器设计(一)
STM32 PA15 设置成下拉输入却总是高电平
原因:STM32上电时默认打开JTAG调试功能。 解决办法: 打开复用时钟,禁止JTAG功能。 RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE); GPIO_PinRemapConfig(GPIO_Remap_SWJ_Disable, ENABLE); 改变指定管脚的映射完全禁用(JTAG+SW-DP) GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable , ENABLE);改变指定管脚的映射,JTAG-DP 禁用 + SW-DP 使能 这之后PA15就是普通IO口了。
[单片机]
STM32—DMA使用
DMA简介   DMA:Direct memory access controller,直接存储器存储。DMA可以实现数据在外设与存储器、存储器与存储器之间的快速转换,且不需要CPU的干预,这样就可以释放CPU的资源,让CPU干其他的事情,提高效率。有的STM32芯片有两个DMA,有的就只有一个DMA,这个要查具体的芯片手册。 DMA 的主要特性 DMA的功能框图 DMA参数与函数解析 上一篇文章(链接)中利用USART DMA 实现接收任意长度数据,下面分析下DMA里面的参数和函数。首先查看DMA的结构体定义。 DMA_HandleTypeDef hdma_usart1_rx; * @bri
[单片机]
<font color='red'>STM32</font>—DMA使用
Stm32_调试出现 Error:Flash Download Failed-"Cortex-M3"
rror:Flash Download Failed- Cortex-M3 出现一般有两种情况: 1.SWD模式下,Debug菜单中,Reset菜单选项(Autodetect/HWreset/sysresetReq/Vectreset)默认是AutoDetect,改成SysResetReq即可。 2.Jtag模式下,主要是芯片大小选错。Flash- Configure Falsh Tools配置窗口,切换到“Utilities 页,按“Setting 按钮进入“Flash download setup 配置窗口,在“Flash download setup 配置窗口点击“Add”按钮,在“Add Flash Program
[单片机]
Stm32_调试出现 Error:Flash Download Failed-
stm32常用printf函数支持接口(标准库与hal库)
stm32常用printf函数支持接口(标准库与hal库) /hal库***************/ int fputc(int ch,FILE *f) { HAL_UART_Transmit(&huart1,(uint8_t *)&ch,1,0xFFFF);//hurat1为串口号,根据自己情况进行选择 return ch; } /标准库*******/ int fputc(int ch, FILE *f) { USART_SendData(USART1, (u8) ch); while(!(USART_GetFlagStatus(USART1, USART_FLAG_TXE) == SET))
[单片机]
STM32 ST-LINK Utility解决错误
使用ST-LINK V2下载程序时,出现以下错误,并且连接线无出错 解决方法: Target --- Settings--- Mode更改为Connect Under Reset
[单片机]
<font color='red'>STM32</font> ST-LINK Utility解决错误
串行12位ADC与计算机之间的接口电路设计
近几年来,IC制造商设计了实现接口的各种方法,并且特别重视减少IC接口I/O引脚的数量。MAX187就是这样一个器件,它是一个12位模/数转换器(ADC)。你可以利用串行数据通信技术产生与该ADC的一个接口。MAX187的模/数转换和数据传输仅需三条数字I/O线。你可以利用PC的Centronics打印机端口在MAX187和PC之间产生一个简易接口(图1)。只要将引脚分别设置为高电平或低电平,你就能启用或禁用MAX187(引脚 3)。如果使该引脚开路,则内部参考电压(4.096V) 就被禁用,你必须将一个外部参考电压加到引脚REF(引脚4)上。在其他情况下,该引脚 与4.7μF旁路电容C1连接。通过使用SCLK引脚(引脚8)上
[工业控制]
串行12位<font color='red'>ADC</font>与计算机之间的接口电路设计
STM32串口多机通信
从设备采用漏极开路方式级联,从设备的串口TX必须配置为漏极开路,不能是推挽方式,如果配置成推挽方式,会导致灌电流过大,低电平低不下去问题 STM32 的UART数据寄存器是9位,数据传输先传低位(LSB) --实际应用发现9位数据大时候有丢包错包问题?? 利用USART可以进行多机处理器通信,其原理就是使从机处于静默模式,由主机在需要的时候发送指令唤醒从机,并传输数据。STM32静默模式特点:1、所有接收状态位都不会被设置;2、所有的接收中断都被禁止;3、USART_CR1寄存器中的RWU位被置1,RUW可以硬件自动控制或者在某些条件下由软件写。 连接方法很简单,主机的TX输出与从机的RX端口直接相连,从机TX端口要经过与
[单片机]
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved