|
/*
*********************************************************************************************************
*
* 模块名称 : ADC驱动模块
* 文件名称 : bsp_adc.c
* 版 本 : V1.0
* 说 明 : ADC多通道扫描
* 修改记录 :
* 版本号 日期 作者 说明
* V1.0 2020-12-30 杨帆 正式发布
*
* 来源与 Copyright (C), 2013-2014, 安富莱电子 www.armfly.com
*
*********************************************************************************************************
*/
#include "bsp.h"
/* define ---------------------------------------------------------------------*/
#define ADC1_DR_ADDRESS ((uint32_t)0x4001204C)//定义寄存器的地址
/* 变量 ----------------------------------------------------------------------*/
//__IO uint16_t uhADCConvertedValue[4];
//__IO uint16_t uhADCConvertedValue[1];
volatile uint16_t uhADCConvertedValue[1];//内存地址
/*
*********************************************************************************************************
* 函 数 名: bsp_InitADC
* 功能说明: ADC初始化
* 形 参: 无
* 返 回 值: 无
*********************************************************************************************************
*/
void bsp_InitADC(void)
{
//初始化设置
ADC_InitTypeDef ADC_InitStructure; //定义一个ADC结构体
ADC_CommonInitTypeDef ADC_CommonInitStructure; //ADC_CommonInitTypeDef 主要提供ADC初始化配置包括模式,时钟分频,采样周期等
DMA_InitTypeDef DMA_InitStructure; //定义一个 DMA 结构体
GPIO_InitTypeDef GPIO_InitStructure; //定义一个 GPIO 结构体
/* 使能外设时钟 */
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_DMA2|RCC_AHB1Periph_GPIOB, ENABLE); //使能DMA2、GPIOB时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);//使能ADC1相关时钟
/*配置GPIO_0管脚配置*/
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0; //配置GPIO_0管脚配置
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AN; //配置GPIO工作模式 模拟输入
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL ;//配置无上下拉(浮空)
GPIO_Init(GPIOB, &GPIO_InitStructure); //对B区GPIO的初始化配置
/* DMA2 Stream0 channel_0 配置-------------------------------------------------- */
DMA_InitStructure.DMA_Channel = DMA_Channel_0;//
DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)ADC1_DR_ADDRESS;//
DMA_InitStructure.DMA_Memory0BaseAddr = (uint32_t)&uhADCConvertedValue;//DMA连接Memory中变量地址
DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralToMemory;//确定DMA的传输方向,这里是单向传输,如果要双向传输,改为DMA_DIR_PeripheraIDST
//DMA_InitStructure.DMA_BufferSize = 4;
DMA_InitStructure.DMA_BufferSize = 1;//设置DMA缓冲区大小为1
DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;//DMA当前外设寄存器地址不变
DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;//DMA存储器地址递增,(用于多通道采集),Disable不变,Enable改变
DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;//定义DMA外设数据宽度为16位
DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;//定义储存器数据宽度16位
DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;//DMA通道操作模式位环形缓冲模式
DMA_InitStructure.DMA_Priority = DMA_Priority_High;//DMA通道优先级为高
DMA_InitStructure.DMA_FIFOMode = DMA_FIFOMode_Disable;// 关闭DMA先进先出设置功能
DMA_InitStructure.DMA_FIFOThreshold = DMA_FIFOThreshold_HalfFull;//使用半全FIFO,full全
DMA_InitStructure.DMA_MemoryBurst = DMA_MemoryBurst_Single;//DMA外设突发单次传输
DMA_InitStructure.DMA_PeripheralBurst = DMA_PeripheralBurst_Single;//DMA存储器突发单次传输
DMA_Init(DMA2_Stream0, &DMA_InitStructure);//初始DMA2_STream0
/* DMA2_Stream0 enable */
DMA_Cmd(DMA2_Stream0, ENABLE);//使能DMA2_STream0
/****************************************************************************
PCLK2 = HCLK / 2
下面选择的是2分频
ADCCLK = PCLK2 /8 = HCLK / 8 = 168 / 8 = 21M
ADC采样频率: Sampling Time + Conversion Time = 480 + 12 cycles = 492cyc
Conversion Time = 21MHz / 492cyc = 42.6ksps.
*****************************************************************************/
/* ADC Common 配置 ----------------------------------------------------------*/
ADC_CommonInitStructure.ADC_Mode = ADC_Mode_Independent;//独立模式
ADC_CommonInitStructure.ADC_Prescaler = ADC_Prescaler_Div2;//ADC最大时钟模式,分频84/2
ADC_CommonInitStructure.ADC_DMAAccessMode = ADC_DMAAccessMode_Disabled;//只有在双重模式或者三重模式时才会设置
ADC_CommonInitStructure.ADC_TwoSamplingDelay = ADC_TwoSamplingDelay_5Cycles;//两个采样阶段之间的延迟,仅适用于双重模式
ADC_CommonInit(&ADC_CommonInitStructure);
/* ADC1 regular channel 12 configuration ************************************/
ADC_InitStructure.ADC_Resolution = ADC_Resolution_12b;//分辨率12位
ADC_InitStructure.ADC_ScanConvMode = ENABLE;//失能扫描模式开启,多通道采集,
ADC_InitStructure.ADC_ContinuousConvMode = ENABLE;//使能连续转换
ADC_InitStructure.ADC_ExternalTrigConvEdge = ADC_ExternalTrigConvEdge_None;
ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;//数据右对齐
ADC_InitStructure.ADC_NbrOfConversion = 1;//4;转换通道
ADC_Init(ADC1, &ADC_InitStructure);//初始化ADC1,根据ADC_InitStruct中相应的参数初始化ADC
/* Enable ADC1 DMA */
ADC_DMACmd(ADC1, ENABLE);/* 使能DMA ADC1*/
ADC_RegularChannelConfig(ADC1, ADC_Channel_8, 1, ADC_SampleTime_480Cycles);//配置规则通道组特性(配置ADCx规则通道的转换需求和采样时间)
/*使能DMA请求(多DMA模式)*/
ADC_MultiModeDMARequestAfterLastTransferCmd(ENABLE);/* 最后传输时使能DMA请求 (多ADC模式) */
/* Enable VBAT channel */
/* Enable DMA request after last transfer (Single-ADC mode) */
/*使能DMA请求(单DMA模式)*/
ADC_DMARequestAfterLastTransferCmd(ADC1, ENABLE);//最后传输时使能DAM请求(单ADC模式)
/* Enable ADC1 **************************************************************/
ADC_Cmd(ADC1, ENABLE);/* 使能 ADC1,使能或者禁止ADC外设*/
/* Start ADC1 Software Conversion */
ADC_SoftwareStartConv(ADC1);/* 软件启动ADC转换 */
}
写自 武汉天纵鹏元科技
联系方式 18771072451 杨帆
|
|