122 lines
3.5 KiB
C
122 lines
3.5 KiB
C
#include "bsp_adc.h"
|
||
|
||
__IO uint16_t ADC_ConvertedValue;
|
||
|
||
static void ADCx_GPIO_Config(void)
|
||
{
|
||
GPIO_InitTypeDef GPIO_InitStructure;
|
||
|
||
// 打开 ADC IO端口时钟
|
||
ADC_GPIO_APBxClock_FUN ( ADC_GPIO_CLK, ENABLE );
|
||
|
||
// 配置 ADC IO 引脚模式
|
||
// 必须为模拟输入
|
||
GPIO_InitStructure.GPIO_Pin = ADC_PIN;
|
||
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
|
||
|
||
// 初始化 ADC IO
|
||
GPIO_Init(ADC_PORT, &GPIO_InitStructure);
|
||
}
|
||
|
||
// ANSI C标准,C89 标准
|
||
// C99
|
||
// C11 2011
|
||
|
||
static void ADCx_Mode_Config(void)
|
||
{
|
||
DMA_InitTypeDef DMA_InitStructure;
|
||
//开启ADC_DMA时钟
|
||
RCC_AHBPeriphClockCmd(ADC_DMA_CLK, ENABLE);
|
||
//初始化ADC_DMA通道
|
||
DMA_DeInit(ADC_DMA_CHANNEL);
|
||
// 源数据地址 (ADC寄存器)
|
||
DMA_InitStructure.DMA_PeripheralBaseAddr = ( uint32_t ) ( & ( ADC_x->DR ) );
|
||
// 目标地址 (内存中)
|
||
DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)&ADC_ConvertedValue;
|
||
// 方向:外设到存储器
|
||
DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;
|
||
// 传输大小
|
||
DMA_InitStructure.DMA_BufferSize = 1;
|
||
// 外设(内部的FLASH)地址递增
|
||
DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
|
||
// 内存地址递增
|
||
DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Disable;
|
||
// 外设数据单位
|
||
DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;
|
||
// 内存数据单位
|
||
DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;
|
||
// DMA模式,一次或者循环模式
|
||
DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;
|
||
//DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;
|
||
// 优先级:高
|
||
DMA_InitStructure.DMA_Priority = DMA_Priority_High;
|
||
// 使能内存到内存的传输 (否)
|
||
DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;
|
||
// 配置DMA通道
|
||
DMA_Init(ADC_DMA_CHANNEL, &DMA_InitStructure);
|
||
// 使能DMA
|
||
DMA_Cmd(ADC_DMA_CHANNEL , ENABLE);
|
||
/*----------------------------------------------------------------------*/
|
||
|
||
ADC_InitTypeDef ADC_InitStruct;
|
||
// 打开ADC时钟
|
||
ADC_APBxClock_FUN ( ADC_CLK, ENABLE );
|
||
// ADC 模式配置
|
||
// 只使用一个ADC,属于独立模式
|
||
ADC_InitStruct.ADC_Mode = ADC_Mode_Independent;
|
||
// 禁止扫描模式,多通道才要,单通道不需要
|
||
ADC_InitStruct.ADC_ScanConvMode = DISABLE;
|
||
// 连续转换模式
|
||
ADC_InitStruct.ADC_ContinuousConvMode = ENABLE;
|
||
// 不用外部触发转换,软件开启即可
|
||
ADC_InitStruct.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;
|
||
// 转换结果右对齐
|
||
ADC_InitStruct.ADC_DataAlign = ADC_DataAlign_Right;
|
||
// 转换通道1个
|
||
ADC_InitStruct.ADC_NbrOfChannel = 1;
|
||
// 初始化ADC
|
||
ADC_Init(ADC_x, &ADC_InitStruct);
|
||
// 配置ADC时钟为PCLK2的8分频,即9MHz
|
||
RCC_ADCCLKConfig(RCC_PCLK2_Div8);
|
||
// 配置 ADC 通道转换顺序和采样时间
|
||
ADC_RegularChannelConfig(ADC_x, ADC_CHANNEL, 1, ADC_SampleTime_55Cycles5);
|
||
|
||
// 使能ADC DMA 请求
|
||
ADC_DMACmd(ADC_x, ENABLE);
|
||
// 开启ADC ,并开始转换
|
||
ADC_Cmd(ADC_x, ENABLE);
|
||
// ADC开始校准
|
||
ADC_StartCalibration(ADC_x);
|
||
// 等待校准完成
|
||
while(ADC_GetCalibrationStatus(ADC_x));
|
||
// 由于没有采用外部触发,所以使用软件触发ADC转换
|
||
ADC_SoftwareStartConvCmd(ADC_x, ENABLE);
|
||
}
|
||
|
||
void ADCx_Init(void)
|
||
{
|
||
ADCx_GPIO_Config();
|
||
ADCx_Mode_Config();
|
||
}
|
||
|
||
//typedef struct
|
||
//{
|
||
// uint32_t DMA_PeripheralBaseAddr; // 外设地址
|
||
// uint32_t DMA_MemoryBaseAddr; // 存储器地址
|
||
// uint32_t DMA_DIR; // 传输方向
|
||
// uint32_t DMA_BufferSize; // 传输数目
|
||
// uint32_t DMA_PeripheralInc; // 外设地址增量模式
|
||
// uint32_t DMA_MemoryInc; // 存储器地址增量模式
|
||
// uint32_t DMA_PeripheralDataSize; // 外设数据宽度
|
||
// uint32_t DMA_MemoryDataSize; // 存储器数据宽度
|
||
// uint32_t DMA_Mode; // 模式选择
|
||
// uint32_t DMA_Priority; // 通道优先级
|
||
// uint32_t DMA_M2M; // 存储器到存储器模式
|
||
//}DMA_InitTypeDef;
|
||
|
||
|
||
|
||
|
||
|
||
|