STM32如何配置ADC?

发布者:rockstar6最新更新时间:2024-01-26 来源: elecfans关键字:STM32  系统时钟 手机看文章 扫描二维码
随时随地手机看文章

1、 系统时钟定义:

RCC_Configuration();

包涵:

RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMAx, ENABLE); // Enable DMA clock

RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADCx , ENABLE); // Enable ADC1 and GPIOC clock


2、 中断源配置:

NVIC_Configuration();

举例:

{

NVIC_InitTypeDef NVIC_InitStructure;

NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);

NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn; //设置串口1中断

NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1; //子优先级为0

NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //使能

NVIC_Init(&NVIC_InitStructure);

}

注:如需要外部中断启动ADC,则需要配置,自动转换不需要配置

3、 端口初始化:

GPIO_Configuration();

端口初始化不但包括要用IO,也包括ADC的IO口初始化;

RCC_APB1PeriphClockCmd(XX, ENABLE); //使能APB1低速总线

RCC_APB2PeriphClockCmd(XX,ENABLE); //使能APB2高速总线

普通IO配置:

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_x; //定义GPIOX中的x脚,输出需要规定速度

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;

GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

GPIO_Init(GPIOX, &GPIO_InitStructure);

注:模式包涵:

GPIO_Mode_AIN、GPIO_Mode_IN_FLOATING、GPIO_Mode_IPD、GPIO_Mode_IPU、GPIO_Mode_Out_OD、GPIO_Mode_Out_PP、GPIO_Mode_AF_OD、GPIO_Mode_AF_PP

ADC的IO配置:

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1;

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;

GPIO_Init(GPIOC, &GPIO_InitStructure); //设置AD模拟输入端口为输入一共2路AD规则通道

4、ADC初始化:

ADC_Configuration();

如果使用多路采集的话,在ADC初始化中需要进行DMA的初始化。

a、DMA初始化例子如下所示:

/* DMA channel1 configuration ----------------------------------------------*/

DMA_DeInit(DMA1_Channel1); //使能DMA

DMA_InitStructure.DMA_PeripheralBaseAddr =ADC1_DR_Address; //DMA通道1的地址

//需要定义ADC1_DR_Address,范围0x4001 2400 - 0x4001 27FF

如:#define ADC1_DR_Address ((u32)0x4001244C)

DMA_InitStructure.DMA_MemoryBaseAddr = (u32)&ADC_ConvertedValue;//DMA传送地址

//需要定义ADC_ConvertedValue,

如volatile unsigned short int ADC_ConvertedValue[2];

DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC; //传送方向

DMA_InitStructure.DMA_BufferSize = 2; //传送内存大小,2个16位

DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;//当前外设寄存器地址不变

DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable; //传送内存地址递增

DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord; //ADC1转换的数据是16位

DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;

//传送的目的地址是16位宽度

DMA_InitStructure.DMA_Mode = DMA_Mode_Circular; //循环模式

DMA_InitStructure.DMA_Priority = DMA_Priority_High;

DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;

DMA_Init(DMA1_Channel1, &DMA_InitStructure);

/*允许DMA1通道1传输结束中断*/

//DMA_ITConfig(DMA1_Channel1,DMA_IT_TC, ENABLE);

//使能DMA通道1

DMA_Cmd(DMA1_Channel1, ENABLE);

b、ADC初始化如下:

//ADC配置

ADC_InitStructure.ADC_Mode = ADC_Mode_Independent; //ADC1工作在独立模式

ADC_InitStructure.ADC_ScanConvMode = ENABLE; //模数转换工作在扫描模式(多通道)还是单次(单通道)模式

ADC_InitStructure.ADC_ContinuousConvMode = ENABLE; //ADC转换工作在自动连续模式

ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;//转换由软件而不是外部触发启动

ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;//ADC数据右对齐

ADC_InitStructure.ADC_NbrOfChannel = 2;//规定了顺序进行规则转换的ADC通道的数目。这个数目的取值范围是1到16

ADC_Init(ADC1, &ADC_InitStructure);

/* ADC1 regular channels configuration [规则模式通道配置]*/

//ADC1规则通道配置

ADC_RegularChannelConfig(ADC1, ADC_Channel_10, 1, ADC_SampleTime_55Cycles5); //通道10采样时间55.5周期

ADC_RegularChannelConfig(ADC1, ADC_Channel_11, 2, ADC_SampleTime_55Cycles5); //通道11采样时间55.5周期

//使能ADC1 DMA

ADC_DMACmd(ADC1, ENABLE);

//使能ADC1

ADC_Cmd(ADC1, ENABLE);

//初始化ADC1校准寄存器

ADC_ResetCalibration(ADC1);

//检测ADC1校准寄存器初始化是否完成

while(ADC_GetResetCalibrationStatus(ADC1));

//开始校准ADC1

ADC_StartCalibration(ADC1);

//检测是否完成校准

while(ADC_GetCalibrationStatus(ADC1));

通过 ADC_SoftwareStartConvCmd(ADC1, ENABLE);进行软启动

如上初始化所示,ADC转化结果将存入ADC_ConvertedValue数组中去,到时只需读取其值即可。


关键字:STM32  系统时钟 引用地址:STM32如何配置ADC?

上一篇:STM32 HAL库 I2C 学习
下一篇:STM32 IAP的使用关键点

推荐阅读最新更新时间:2024-11-12 21:15

基于STM32单片机的电源设计
1. STM32 数据手册电源部分研读 RTC电源管脚为V BAT, 电源范围为1.8~3.6V,主要用于RTC时钟的供电, RTC在大部分场合用于保存一些重要的参数,比如在电脑主板上用于保存boss的信息, 如果这个电源丢了将导致无法重启,在单片机中低功耗设备常常也会使用这个RTC进行定时的唤醒功能,在普通的MCU中常用于做实时时钟。 VDD为数字电源,电源范围也是1.8~3.6V,在芯片内部集成了电压转化器,一般芯片内核供电为1.2V,图示的Regulator为转换器,将VDD电源稳压至1.2V。数据手册建议加入11个100nF和4.7uF的电容,不过实际应用中,只需要每个VDD加入一个100nF的去耦电容。 下图为模
[单片机]
基于<font color='red'>STM32</font>单片机的电源设计
STM32系列芯片串口烧写工具
官方的FlashLoader使用着太过麻烦,一步一步下去,而且还不是每次都能顺利通过, 最近自己写了一个STM32系列芯片的串口烧写工具, 只需点一次烧写按钮,剩下的自动完成, 运行环境:.NET4.0 1.可以烧写最多5个程序+1个自定义的hex数据; 2.可以读取芯片信息; 3.可以读取芯片内容; 4.烧写选项可选读写校验, 整片擦除, 使能读保护, 循环烧写(烧写完会继续进行下一次的烧写, 方便生产); 应用截图 : 目前主流的STM32系列芯片都支持, 在MAP目录下可自定义扩展芯片配置文件; 版本更新 1.0.6 1.修复F0芯片获取资料不准确的BUG; 2.烧写过程中读取校验失败再多读取校验
[单片机]
<font color='red'>STM32</font>系列芯片串口烧写工具
stm32 Bootloader设计(YModem协议)
相信很多人都希望,不开盖就可以对固件进行升级吧,就像手机那些。下文中的bootload就来实现这样的功能。 前段时间有项目关于Bootload设计。所以就仔细的去了研究了一翻。以前都是用的stm32官方的,没有去深入了解。这次做完了过后,发现官方的版本存在一些问题。比如说YModem传送过程中,完全没有对数据区进行效验,只是核对了下编号,就进行烧写。整个程序完全为阻塞式,浪费了大量的cpu做无用功。当然这在升级程序方面也用不了多少时间。有一个重要的问题,官方代码只可以用超级终端进行传输。这样如果你用的是64位的win7,那就没有办法升级。因为只有xp或32位的win7才可以使用 超级终端。64位的win7下超级终端没办法使
[单片机]
<font color='red'>stm32</font> Bootloader设计(YModem协议)
关于在stm32中使用printf函数的问题
想在mdk 中用printf,需要同时重定义fputc函数和避免使用semihosting(半主机模式)。 标准库函数的默认输出设备是显示器,要实现在串口或LCD输出,必须重定义标准库函数里调用的与输出设备相关的函数. 例如:printf输出到串口,需要将fputc里面的输出指向串口(重定向),方法如下: #ifdef __GNUC__ /* With GCC/RAISONANCE, small printf (option LD Linker- Libraries- Small printf set to 'Yes') calls __io_putchar() */ #define PUTCHAR
[单片机]
stm32驱动TB6600控制42/57步进电机的案例(TIM中断和PWM实验)
步进电机的简单使用 接线: TB6600驱动盒的详细说明: 程序设计: 工程文件: 做毕业设计要用到57步进电机,所以花了两天时间做了一下电机函数 从淘宝查的资料: 接线如图: 接线: DIR- && PUL- 接 单片机GND DIR+ 接 PA1 PUL+ 接 PA0 驱动盒TB6600 VCC 24V 驱动盒TB6600 GND 24V的GND 我测出来的 A组(绿+蓝- ) B组(黄+红-) 如何确定AB两组看这个: 关于42步进电机驱动——基于STM32 HAL库实现 接线方法 TB6600驱动盒的详细说明: 先冲英说明: Microstep Driver 微步驱动程序 Microstep 微步
[单片机]
<font color='red'>stm32</font>驱动TB6600控制42/57步进电机的案例(TIM中断和PWM实验)
ch32单片机怎么样?ch32好用吗?ch32和stm32的区别
Ch32单片机是龙芯微电子推出的一种高性能、低功耗的32位嵌入式处理器。它集成了ARM Cortex-M4内核,配备了丰富的接口和外设,可满足不同领域、不同应用场景的需求。在性能、功耗和功能方面,Ch32单片机比部分同级别的单片机还会优秀。 Ch32和其他单片机相比,其最大的优势在于其先进的处理器核心。在安全性、性能、低功耗等方面有着极高的表现。Ch32单片机采用了ARM Cortex-M4核心,而该核心是具有全面DSP功能的ARM Cortex-M系列中的一种。ARM Cortex-M4核心集成了DSP指令集和浮点计算,可满足高性能、高精度的数字信号处理的需求。同时,该核心还支持多线程,方便开发人员实现复杂应用程的并行执行,提高
[单片机]
STM32基础2--SMT32CubeMX的 code目录
1.0:Code的目录结构 在上一篇文章生成代码后,通过MDK打开项目,可以看到如下的项目结构。对于GPIO来说,我们只需要关注两个文件 main.h , main.c , gpio.h , gpio.c 。 2.0:main.h main.h 可以看到引入头文件#include stm32f4xx_hal.h ,以及对GPIO进行了宏定义。 GPIO宏定义是由于在配置GPIO引脚时使用User Label /* USER CODE BEGIN Header */ /** ************************************************************************
[单片机]
<font color='red'>STM32</font>基础2--SMT32CubeMX的 code目录
STM32的中断(优先级,开关总中断)
一:综述 STM32 目前支持的中断共为 84 个(16 个内核+68 个外部), 16 级可编程中断优先级的设置(仅使用中断优先级设置 8bit 中的高 4 位)和16个抢占优先级(因为抢占优先级最多可以有四位数)。 二:优先级判断 (一)中断优先级概念 STM32(Cortex-M3)中有两个优先级的概念——抢占式优先级和响应优先级,有人把响应优先级称作'亚优先级'或'副优先级',每个中断源都需要被指定这两种优先级。 (二)中断响应次序 (1)具有高抢占式优先级的中断可以在具有低抢占式优先级的中断处理过程中被响应,即中断嵌套,或者说高抢占式优先级的中断可以嵌套低抢占式优先
[单片机]
小广播
设计资源 培训 开发板 精华推荐

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

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

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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