zoukankan      html  css  js  c++  java
  • 14-STM ADC多通道连续采集(DMA)

    STM ADC多通道连续采集

     1 uint16_t ADC_ConvertedValue[5]={0};
     2 
     3 void ADC_init(void)
     4 {
     5     GPIO_InitTypeDef GPIO_InitStructure;
     6     ADC_InitTypeDef   ADC_InitStructure;
     7     DMA_InitTypeDef DMA_InitStructure;
     8     NVIC_InitTypeDef NVIC_InitStructure;
     9     
    10      //GPIO的时钟,两者都在APB2总线上挂载着
    11     RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1|RCC_APB2Periph_GPIOC, ENABLE);     
    12     RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);//开DMA时钟
    13     
    14   GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_5;
    15   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;         //模拟输入
    16   GPIO_Init(GPIOC, &GPIO_InitStructure);
    17     
    18 
    19     DMA_DeInit(DMA1_Channel1);// ADC1对应着通道1, ADC3对应着通道5,ADC2没有DMA功能
    20     DMA_InitStructure.DMA_PeripheralBaseAddr = (uint16_t)(&(ADC1->DR));//外设基址为:ADC数据寄存器
    21     DMA_InitStructure.DMA_MemoryBaseAddr = (uint16_t)ADC_ConvertedValue;//存储器地址
    22     DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC; //外设 -> 内存
    23     DMA_InitStructure.DMA_BufferSize = 5; //缓冲区大小,应该等于数据目的地的大小--5路
    24     DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable; //外设寄存器只有一个,地址不用递增
    25     DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable; //存储器地址递增
    26     DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;//外设数据大小为半字,即两个字节
    27     DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;//内存数据大小也为半字
    28     DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;//循环传输的方式,这里必须为循环传输方式,否则会导致DMA只能传输一次
    29     DMA_InitStructure.DMA_Priority = DMA_Priority_High;//DMA传输通道优先级为高,当使用一个DMA通道时,优先级设置不影响
    30     DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;//禁止存储器到存储器模式,因为是从外设到存储器
    31 
    32     DMA_Init(DMA1_Channel1, &DMA_InitStructure);//初始化DMA
    33     DMA_ITConfig(DMA1_Channel1, DMA_IT_TC, ENABLE); //DMA通道1传输完成中断,如果有这句话,则当传输完成的时候会产生中断
    34     DMA_Cmd(DMA1_Channel1, ENABLE);//使能DMA
    35     
    36     
    37     NVIC_InitStructure.NVIC_IRQChannel = DMA1_Channel1_IRQn;
    38     NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
    39     NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
    40     NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;
    41     NVIC_Init(&NVIC_InitStructure);
    42     
    43   //配置ADC相关寄存器
    44     //*****************************************************************************//
    45     ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;     //独立模式
    46     ADC_InitStructure.ADC_ScanConvMode = ENABLE;     //多通道扫描模式(需开启DMA)
    47     ADC_InitStructure.ADC_ContinuousConvMode = ENABLE; //DISABLE--单次转换模式  ENABLE--连续转换模式
    48     ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;//不受外界决定,软件触发模式
    49     ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right; //数据右对齐
    50     ADC_InitStructure.ADC_NbrOfChannel = 5;     //扫描通道数--5
    51     RCC_ADCCLKConfig(RCC_PCLK2_Div8);//配置ADC采样参考时钟的预分频值 72M÷8=9M <14M  
    52     ADC_Init(ADC1,&ADC_InitStructure);
    53     
    54     
    55   //规则通道配置(ADC1 通道 采样次序 采样时间)    
    56     ADC_RegularChannelConfig(ADC1, ADC_Channel_10, 1, ADC_SampleTime_55Cycles5);
    57     ADC_RegularChannelConfig(ADC1, ADC_Channel_11, 2, ADC_SampleTime_55Cycles5);
    58     ADC_RegularChannelConfig(ADC1, ADC_Channel_13, 3, ADC_SampleTime_55Cycles5);
    59     ADC_RegularChannelConfig(ADC1, ADC_Channel_14, 4, ADC_SampleTime_55Cycles5);
    60     ADC_RegularChannelConfig(ADC1, ADC_Channel_15, 5, ADC_SampleTime_55Cycles5);
    61     
    62     ADC_DMACmd(ADC1, ENABLE);//使能ADC,DMA请求
    63     ADC_Cmd(ADC1,ENABLE);//使能ADC1
    64     
    65 
    66     //采样校准
    67     ADC_ResetCalibration(ADC1); //初始化ADC采样校准器
    68   while(ADC_GetResetCalibrationStatus(ADC1));//等待初始化完成
    69   ADC_StartCalibration(ADC1);  //开始校准
    70   while(ADC_GetCalibrationStatus(ADC1));//等待校准完成
    71     
    72     //启动软件转换(没有采用外部触发)
    73     ADC_SoftwareStartConvCmd(ADC1,ENABLE);
    74 }
    75 
    76 
    77 //DMA1通道1中断通道处理函数,触发此中断时,说明已经将数据从ADC转移到内存数组中,可以触发数据发送了
    78 void DMA1_Channel1_IRQHandler(void){
    79     if(DMA_GetITStatus(DMA1_IT_TC1)==SET){
    80         
    81         //printf("%d    %d    %d    %d
    ",ADC_ConvertedValue[0],ADC_ConvertedValue[1],ADC_ConvertedValue[2],ADC_ConvertedValue[3]);
    82         DMA_ClearITPendingBit(DMA1_IT_TC1);                        //清除DMA1通道1传输完成中断
    83     }
    84 }
  • 相关阅读:
    阿里巴巴2015年校招笔试附加题
    hadoop eclipse插件生成
    DevExpress控件的安装及画图控件的使用
    计算二进制数的0的个数
    Docker初探
    AppStore App申请审核加速
    _DataStructure_C_Impl:LinkListBasedSort
    rman数据库恢复;关键/非重要文件、影像副本、控制文件、还原点、非归档、增量、新数据库、灾难性回复
    RenderScript on LLVM笔记
    Oracle数据库备份恢复,巡检须要关注的对象设置以及相关恢复概述
  • 原文地址:https://www.cnblogs.com/darren-pty/p/14094206.html
Copyright © 2011-2022 走看看