硬汉嵌入式论坛

 找回密码
 立即注册
查看: 5260|回复: 8
收起左侧

[例程下载] 对安富莱单ADC多通道扫描模式驱动的部分修改简化与注释

[复制链接]

2

主题

0

回帖

6

积分

新手上路

个体开发

积分
6
发表于 2020-12-30 17:15:47 | 显示全部楼层 |阅读模式
/*
*********************************************************************************************************
*
*    模块名称 : 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 杨帆


回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106685
QQ
发表于 2020-12-31 09:55:34 | 显示全部楼层
谢谢楼主分享。
回复

使用道具 举报

0

主题

8

回帖

8

积分

新手上路

积分
8
发表于 2021-4-7 10:03:53 | 显示全部楼层
请教下,这个代码F103可以用吗? 看代码好像只用了一路,通道8
回复

使用道具 举报

0

主题

8

回帖

8

积分

新手上路

积分
8
发表于 2021-4-7 10:05:33 | 显示全部楼层
我刚接触多通道采样。请教一下,F103可以使用吗? 看代码好像只用了一路,通道8
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106685
QQ
发表于 2021-4-7 10:13:20 | 显示全部楼层
youngyyzz 发表于 2021-4-7 10:05
我刚接触多通道采样。请教一下,F103可以使用吗? 看代码好像只用了一路,通道8

不可以直接用,略有区别。
回复

使用道具 举报

0

主题

8

回帖

8

积分

新手上路

积分
8
发表于 2021-4-7 10:57:37 | 显示全部楼层
请教下,这个代码V4板子可用吗
回复

使用道具 举报

0

主题

8

回帖

8

积分

新手上路

积分
8
发表于 2021-4-7 11:01:49 | 显示全部楼层
有没有V4板子可参考的单ADC多通道例子。
回复

使用道具 举报

0

主题

8

回帖

8

积分

新手上路

积分
8
发表于 2021-4-7 14:25:09 | 显示全部楼层
eric2013 发表于 2021-4-7 10:13
不可以直接用,略有区别。

F103多通道,是参考4.3寸屏示波器 裸机例子吗
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106685
QQ
发表于 2021-4-8 08:29:25 | 显示全部楼层
youngyyzz 发表于 2021-4-7 14:25
F103多通道,是参考4.3寸屏示波器 裸机例子吗

可以的参考,不过那个不是单ADC多通道,而是双ADC,双通道。

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-4-30 01:07 , Processed in 0.182997 second(s), 29 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表