//adc.h
#ifndef ADC_H_MJL
#define ADC_H_MJL
#include "stm32f10x.h"
void adc_gpio_init(void);
void adc_dma_init(void);
void adc_init(void);
void adc_config(void);
void adc_start(void);
uint16_t get_ChannelVale(uint8_t ADC_Channel);
#endif
2013/8/28
Mei Jilin
ADC1 的配置完成 3 通道的数据采集
1 ----------- adc_config();
2 ----------- adc_start();
3 ----------- get_ChannelValue(ADC_Channel_x);
//配置 adc
//启动 adc,开始转换
//读取相应通道的 adc 值
//adc.c
/** @date
@author
@brief
@attention
**/
#include "stm32f10x.h"
#include "adc.h"
#define CH_NUM 3
//要使用的 ADC 通道数
static uint16_t ad_value[CH_NUM]={0};
/** @para none
* @ret none
* @brief adc 对应的 gpio 初始化
*/
void adc_gpio_init(void)
{
GPIO_InitTypeDef gpio;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
gpio.GPIO_Mode = GPIO_Mode_AIN;
gpio.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2;
gpio.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA,&gpio);
//配置为模拟输入
//ADC1 --channel0,1,2
}
/** @para none
* @ret none
* @brief adc 配置
*/
void adc_init(void)
{
ADC_InitTypeDef adc;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);
RCC_ADCCLKConfig(RCC_PCLK2_Div6);
时钟频率为 14M
ADC_DeInit(ADC1);
adc.ADC_Mode
adc.ADC_ContinuousConvMode = ENABLE;
adc.ADC_DataAlign
= ADC_DataAlign_Right;
= ADC_Mode_Independent;
//设置 ad 时钟为 72/6=12M,ad 最大
//工作在独立模式
//连续转换模式
//数据右对齐
//转换 3 个通道
//连续转换模式
= CH_NUM ;
= ENABLE;
= ADC_ExternalTrigConv_None;//不使用外部触发
adc.ADC_ExternalTrigConv
adc.ADC_NbrOfChannel
adc.ADC_ScanConvMode
ADC_Init(ADC1,&adc);
//设定指定的 ADC 通道组,设置转化顺序和采样时间
ADC_RegularChannelConfig(ADC1, ADC_Channel_0, 1, ADC_SampleTime_55Cycles5);
ADC_RegularChannelConfig(ADC1, ADC_Channel_1, 2, ADC_SampleTime_55Cycles5);
ADC_RegularChannelConfig(ADC1, ADC_Channel_2, 3, ADC_SampleTime_55Cycles5);
//开启 adc 的 DMA
ADC_DMACmd(ADC1,ENABLE);
//使能 ADC1
ADC_Cmd(ADC1, ENABLE);
/* 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));
//等待重新校准完成
//等待校准完成
//开始校准
}
/** @para none
* @ret none
* @brief 配置 dma
*/
void adc_dma_init()
{
DMA_InitTypeDef dma;
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);
DMA_DeInit(DMA1_Channel1);
dma.DMA_PeripheralBaseAddr = (u32)&(ADC1->DR);
= (u32)&ad_value;
dma.DMA_MemoryBaseAddr
dma.DMA_DIR
= DMA_DIR_PeripheralSRC;//DMA 的转换模式为 SRC 模式,由外设
//DMA 对应的外设基地址
//内存存储基地址
搬移到内存
dma.DMA_M2M
dma.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;//定义外设数据宽度为 16 位
dma.DMA_MemoryDataSize
= DMA_MemoryDataSize_HalfWord;
= DMA_M2M_Disable;
//M2M 模式禁用
//DMA 搬 移 数 据 尺 寸 ,
HalfWord 就是为 16 位
dma.DMA_BufferSize
dma.DMA_MemoryInc
= CH_NUM;
= DMA_MemoryInc_Enable;
//DMA 缓存大小 CH_NUM 个
//接收一次数据后,目标内
存地址后移
dma.DMA_PeripheralInc
= DMA_PeripheralInc_Disable;
//接收一次数据后,设备地址禁止
后移
dma.DMA_Mode
dma.DMA_Priority
DMA_Init(DMA1_Channel1,&dma);
= DMA_Mode_Circular;
= DMA_Priority_High;
//转换模式,循环缓存模式。
//DMA 优先级高
/* Start ADC1 Software Conversion */
ADC_SoftwareStartConvCmd(ADC1, ENABLE); //连续转换开始,ADC 通过 DMA 方式不断的更新 RAM
}
/** @para none
* @ret none
* @brief 完成 adc 配置
*/
void adc_config(void)
{
adc_gpio_init();
adc_dma_init();
adc_init();
}
/** @para none
* @ret none
* @brief 启动 adc,开始转换
*/
void adc_start(void)
{
区。
}
DMA_Cmd(DMA1_Channel1,ENABLE);
/** @para ADC_Channel --- (ADC_Channel0 ~ ADC_Channel17)
* @ret ADC_Channel_x 的 ADC 值
*/
uint16_t get_ChannelVale(uint8_t ADC_Channel)
{
uint16_t ret = 0;
switch(ADC_Channel)
{
case ADC_Channel_0:
ret = ad_value[0];
break;
case ADC_Channel_1:
ret = ad_value[1];
break;
case ADC_Channel_2:
ret = ad_value[2];
break;
}
return ret;
}
//main.c
/**
@date
* @author
* @brief
**/
#include "led.h"
#include
#include "delay.h"
#include "adc.h"
uint16_t buffer[3];
int main(void)
{
led_init();
delay_init(72);//72M
adc_config();
adc_start();
while(1)
{
2013/8/28
Mei Jilin
ADC1 数据测试
delay_ms(100);
led_toggle();
buffer[0] = get_ChannelVale(ADC_Channel_0);
buffer[1] = get_ChannelVale(ADC_Channel_1);
buffer[2] = get_ChannelVale(ADC_Channel_2);
}
}
/******************* (C) COPYRIGHT 2012*****END OF FILE****/