STM32的ADC(DMA)读取电位器外设的电压值
来源:互联网 发布:哈尔滨数据开放平台 编辑:程序博客网 时间:2024/05/01 12:16
STM32的集成ADC模块很好很强大,上手容易。AD的理论不用懂得很多很深,只有了解个大概都可上手。
首先是对ADC的管脚进行初始化,此次所用电位器与PC3相连,故将PC3口初始化。
void ADC_GPIO_Configuration(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOC , ENABLE); //使能GPIOC时钟
//PC3 作为模拟通道13输入引脚
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3; //管脚PC3 为嘛我改成PC0他也能正常使用???????????
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;//输入模式
GPIO_Init(GPIOC, &GPIO_InitStructure); //GPIO组
}
问题来了,我将Pin0初始化也照常能使用,这是为嘛啊啊啊啊啊啊啊啊???求高人解答思密达~~
再是对ADC设置。所有说明在注释中都有。
void ADC_Configuration(void)
{
ADC_InitTypeDef ADC_InitStructure;
/* Enable ADC1 and GPIOC clock */
RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE); //使能ADC时钟
/* ADC1 configuration ------------------------------------------------------*/
ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;//独立的转换模式
ADC_InitStructure.ADC_ScanConvMode = ENABLE; //开启扫描模式
ADC_InitStructure.ADC_ContinuousConvMode = ENABLE; //开启连续转换模式
ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;//ADC外部开关,关闭状态
ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right; //对齐方式,ADC为12位中,右对齐方式
ADC_InitStructure.ADC_NbrOfChannel = 1; //开启通道数,1个
ADC_Init(ADC1, &ADC_InitStructure);
/* ADC1 regular channel13 configuration */
ADC_RegularChannelConfig(ADC1, ADC_Channel_13, 1, ADC_SampleTime_55Cycles5);
//ADC通道组, 第13个通道 采样顺序1(就是说第一个被采样的通道就是它了),转换时间
/* Enable ADC1 DMA */
ADC_DMACmd(ADC1, ENABLE); //ADC命令,使能
/* Enable ADC1 */
ADC_Cmd(ADC1, ENABLE); //开启ADC1
/* Enable ADC1 reset calibaration register */
ADC_ResetCalibration(ADC1); //重新校准
/* Check the end of ADC1 reset calibration register */
while(ADC_GetResetCalibrationStatus(ADC1)); //等待重新校准完成
/* Start ADC1 calibaration */
ADC_StartCalibration(ADC1); //开始校准
/* Check the end of ADC1 calibration */
while(ADC_GetCalibrationStatus(ADC1)); //等待校准完成
/* Start ADC1 Software Conversion */
ADC_SoftwareStartConvCmd(ADC1, ENABLE); //连续转换开始,ADC通过DMA方式不断的更新RAM区。
}
记得校准就行。
ADC设置完了就是DMA的设置了。所用的ADC1对应的DMA1通道为通道1。
void DMA_Configuration(void)
{
DMA_InitTypeDef DMA_InitStructure;
/* Enable DMA1 clock */
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);//使能DMA时钟
/* DMA1 channel1 configuration ----------------------------------------------*/
DMA_DeInit(DMA1_Channel1); //开启DMA1的第一通道
DMA_InitStructure.DMA_PeripheralBaseAddr = DR_ADDRESS; //DMA对应的外设基地址
DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)&ADCConvertedValue; //内存存储基地址
DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;//DMA的转换模式为SRC模式,由外设搬移到内存
DMA_InitStructure.DMA_BufferSize = 1; //DMA缓存大小,1个
DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;//接收一次数据后,设备地址禁止后移
DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Disable;//关闭接收一次数据后,目标内存地址后移
DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord; //定义外设数据宽度为16位
DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord; //DMA搬移数据尺寸,HalfWord就是为16位
DMA_InitStructure.DMA_Mode = DMA_Mode_Circular; //转换模式,循环缓存模式。
DMA_InitStructure.DMA_Priority = DMA_Priority_High;//DMA优先级高
DMA_InitStructure.DMA_M2M = DMA_M2M_Disable; //M2M模式禁用
DMA_Init(DMA1_Channel1, &DMA_InitStructure);
/* Enable DMA1 channel1 */
DMA_Cmd(DMA1_Channel1, ENABLE);
}
然后就是注意ADCConvertedValue用volatile修饰一下,作用就是每次读取ADCConvertedValue的时候都从这个内存地址里读数据,而不是在CPU的缓存寄存器里读,能够实时更新数据,避免某些编译器的误解。
- STM32的ADC(DMA)读取电位器外设的电压值
- STM32使用ADC+电位器测电压
- STM32 DMA外设地址的计算问题
- STM32--ADC(DMA)
- STM32的ADC的DMA方式
- STM32笔记(三)ADC、DMA、USART的综合练习
- 战舰板stm32的adc dma实验
- stm32之adc双通道的实现dma
- STM32芯片ADC内部的CH17参考电压的用途
- STM32芯片ADC内部的CH17参考电压的用途(转)
- STM32学习笔记:adc采样得到的电压值用485发送给pc
- STM32学习笔记:adc采样得到的电压值用485发送给pc
- stm32的多通道ADC和DMA的设置问题
- stm32 adc dma多通道采样 数据错位 的解决方法
- 关于Stm32定时器+ADC+DMA进行AD采样的实现
- 关于Stm32定时器+ADC+DMA进行AD采样的实现
- STM32采集多路ADC到DMA的方法
- stm32-10ADC实验(DMA方式)
- iOS: NSDictionary的方法descriptionWithLocale:
- basepath的作用
- iOS: NSDictionary的方法descriptionWithLocale:indent:
- UVA 401 (13.08.01)
- 208 - Firetruck
- STM32的ADC(DMA)读取电位器外设的电压值
- A + B Problem II
- 整理java中各种数据库连接语句
- for语句双重循环
- 软件专业毕业生之一个月攻略
- 写过的代码---------------------个人记录
- 108 - Maximum Sum
- [Math] 排列组合 笔记 [大三四八九月实习]
- [New Portal]Windows Azure Virtual Machine (18) Azure Virtual Machine内部IP和外部IP