历史上的今天
返回首页

历史上的今天

今天是:2025年04月12日(星期六)

2019年04月12日 | stm32中ADC初始化程序

2019-04-12 来源:eefocus

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));


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


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


推荐阅读

史海拾趣

Coleman Cable Inc公司的发展小趣事

在电子行业的早期,Coleman Cable Inc以其创新性的电缆设计和技术突破,在市场中崭露头角。公司研发出一款具有高效传输和稳定性能的电缆产品,迅速赢得了消费者的青睐。随着技术的不断完善和市场需求的扩大,Coleman Cable逐渐扩大了生产规模,并开始向国际市场拓展,其产品在全球范围内得到了广泛应用。

GREEGOO公司的发展小趣事
时钟信号线应避免靠近输出端口,以防止高频时钟信号耦合到输出端口。
ATOP_Technologies公司的发展小趣事

在追求技术创新的同时,ATOP Technologies也始终注重品质管理和品牌建设。公司通过了ISO-9001认证,从产品的研发设计到生产,所有的流程都严格遵循最佳品质原则。此外,ATOP Technologies还注重品牌形象的塑造和推广,通过参加行业活动、举办技术研讨会等方式,不断提升品牌知名度和影响力。

Ethertronics公司的发展小趣事

随着技术的不断进步,ATOP Technologies意识到要想在激烈的市场竞争中保持领先地位,必须不断进行技术创新和产品升级。因此,公司加大了在研发方面的投入,积极引进高端人才,加强与高校和研究机构的合作。经过多年的努力,ATOP Technologies成功开发出了一系列具有自主知识产权的工业自动化产品,并在市场上取得了良好的口碑。

AMOTECH(阿莫泰克)公司的发展小趣事

进入21世纪,AMOTECH继续深耕电子领域,特别是在压敏电阻技术上取得了重大突破。2003年,公司的压敏电阻产品被产业资源部评为世界一流产品,这一成就不仅提升了AMOTECH在全球电子行业中的地位,也为其后续发展奠定了坚实基础。同年,公司还成功在韩国安全商协会自动报价首次公开募股,为公司的进一步扩张提供了资金支持。

GAPTEC Electronic GmbH & Co. KG公司的发展小趣事

背景:随着全球对环保和可持续发展的重视,Galaxy Microelectronics也开始关注其生产过程中的环保问题。

发展:公司投入巨资建设绿色工厂,采用先进的环保技术和设备,减少生产过程中的能源消耗和废弃物排放。同时,Galaxy Microelectronics还积极推广环保理念,与供应商和客户共同构建绿色供应链。这些举措不仅提升了公司的社会形象,还为其在竞争激烈的市场中赢得了更多客户的青睐。

问答坊 | AI 解惑

VxWorks5.4->6.5移植--ifLib

目前在做VxWorks的应用程序代码移植,从5.4到6.5,在5.4的代码使用了ifLib库里的函数,如ifunit()、ifAddrGet()等;而在VxWorks6.5中,ifLib库已经没用,请问是用别的库来代替?若是,可否有针对性的对ifunit()做个移植的解释?谢谢!…

查看全部问答>

WINCE字体的问题!

请问:修改WINCE的字体变使它变小后,窗口上文字又显示不清晰!有什么好办法解决呀!谢谢了!…

查看全部问答>

求单片机控制程序源代码

各位大侠帮忙啊~ 求单片机控制程序源代码,单片机控制状态的转移  就是实现标签和阅读器的控制 希望做过有经验的 帮帮忙啊  感谢感谢…

查看全部问答>

自动控制原理

有没有对自动控制原理感兴趣的大师啊,交流下.…

查看全部问答>

测试设备,寻求合作!

水位、温度测试,用单片机实现,体积要小,数据传送800米,最好用mcs1200,熟悉者联系:437175689,诚求合作…

查看全部问答>

请问谁有 MST710 芯片驱动

请问谁有MSG710芯片驱动(最好是linux下面的)的,现在正在做模拟屏的驱动,第一次做芯片驱动又比较急,不知道该怎么下手,想要一份参考一下。谢谢。 luogk@magliving.com …

查看全部问答>

EE_FPGA基础教程系列 --NO.3-- 玩转LED

Table of Contents 1.        剧情回放        4 2.        玩转LED        4   2.1        硬件连接        4 ...…

查看全部问答>

用PADS logic做原理图封装时出现如下问题,请赐教

Error: Signal pin number invalid - Pin number 1 already exists on Gate A, Logical pin 1.Error: Signal pin number invalid - Pin number 2 already exists on Gate A, Logical pin 2.Error: Signal pin number invalid - Pin number 3 alread ...…

查看全部问答>

用MSP430 内置传感器测试温度时为什么在串口上显示的数据不对

我想用430内置传感器测试环境温度的变化,但是为什么在串口上现实的数据不变化呢 ?哪位高人给指点下,下面的程序有什么错误啊?     #include <msp430x14x.h>#define CPU_F ((double)8000000) #define delay_us(x) __delay_cycle ...…

查看全部问答>

STM32的RTC问题 难搞啊

被STM32的RTC搞晕的过来看看本来打算放弃内置的RTC而采用DS1302了,无奈1302的通信太慢,屡次不成功,就把扔在一边的老板子拿来又试了试,这次没用自己原来的程序,在网上又新找了一个,结果程序都不用动的居然就行了··· 芯片是VCT6,晶振是那 ...…

查看全部问答>