STM32+ADC+DMA+DAM正常模式

任务目标:ADC设置成循环采样,DMA设置成正常模式,开启DAM传输完成中断,需要采样的时候使能一次DMA
任务核心点:在使能DAM传输的时候要先失能,之后在初始化DMA 缓存大小。
其他:软件KEIL5 ,编译器GCC

这里写代码片
#include "bsp_adc.h"

__IO uint16_t ADC_ConvertedValue;

extern uint16_t IbufFIN[10240];//10240*4//
/**
  * @brief  ADC GPIO 配置
  * @param  ÎÞ
  * @retval ÎÞ
  */
static void ADCx_GPIO_Config(void)
{
    GPIO_InitTypeDef GPIO_InitStructure;

    // 开启ADC GPIO 时钟
    ADC_GPIO_APBxClock_FUN ( ADC_GPIO_CLK, ENABLE );

    // 初始化引脚
    GPIO_InitStructure.GPIO_Pin = ADC_PIN;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;

    // 
    GPIO_Init(ADC_PORT, &GPIO_InitStructure);               
}

/**
  * @brief  模式配置
  * @param  ÎÞ
  * @retval ÎÞ
  */
static void ADCx_Mode_Config(void)
{
    DMA_InitTypeDef DMA_InitStructure;
    ADC_InitTypeDef ADC_InitStructure;
     NVIC_InitTypeDef NVIC_InitStructure;       
    // 配置NVIC
    NVIC_InitStructure.NVIC_IRQChannel = DMA1_Channel1_IRQn;    
    // 
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;    
    // 
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2;  
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
    NVIC_Init(&NVIC_InitStructure);

    // 开启DMA 时钟
    RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);
    // ´开启ADC 时钟
    ADC_APBxClock_FUN ( ADC_CLK, ENABLE );

    // 
    DMA_DeInit(ADC_DMA_CHANNEL);


    // DMA 源地址
    DMA_InitStructure.DMA_PeripheralBaseAddr = ( uint32_t ) ( & ( ADC1->DR ) );

    // 目的地址
    DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)IbufFIN;

    // 方向
    DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;

    // 缓存大小
    DMA_InitStructure.DMA_BufferSize = 10240;

    // 外设地址不增加
    DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;

    // 内存地址增加
    DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable; 

    //外设每字大小
    DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;

    // 内存每字大小
    DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;

    // DMA mode 正常模式
    DMA_InitStructure.DMA_Mode = DMA_Mode_Normal;   

    // 仲裁优先级
    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);
    //使能DMA 中断
  DMA_ITConfig(DMA1_Channel1, DMA_IT_TC, ENABLE);
    // 
    //独立模式:只有一个ADC
    ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;

    //只有一个通道 扫描关闭
    ADC_InitStructure.ADC_ScanConvMode = DISABLE ; 

    //开启连续转换
    ADC_InitStructure.ADC_ContinuousConvMode = ENABLE;

    // 
    ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;

    // 
    ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;

    // 
    ADC_InitStructure.ADC_NbrOfChannel = 1; 

    // 初始化ADC
    ADC_Init(ADCx, &ADC_InitStructure);

    //时钟8分频
    RCC_ADCCLKConfig(RCC_PCLK2_Div8); 

    // 
    ADC_RegularChannelConfig(ADCx, ADC_CHANNEL, 1, ADC_SampleTime_239Cycles5);

    // 
    ADC_DMACmd(ADCx, ENABLE);

    //
    ADC_Cmd(ADCx, ENABLE);

    //  复位
    ADC_ResetCalibration(ADCx);
    //
    while(ADC_GetResetCalibrationStatus(ADCx));

    // 开始校准
    ADC_StartCalibration(ADCx);
    // 
    while(ADC_GetCalibrationStatus(ADCx));

    //软件开启转换
    ADC_SoftwareStartConvCmd(ADCx, ENABLE);

}

void start_one_sameple(void)
{
    DMA_InitTypeDef DMA_InitStructure;
        // ÅäÖà DMA ³õʼ»¯½á¹¹Ìå
    DMA_Cmd(ADC_DMA_CHANNEL , DISABLE);
    // ÍâÉè»ùַΪ£ºADC Êý¾Ý¼Ä´æÆ÷µØÖ·
    DMA_InitStructure.DMA_PeripheralBaseAddr = ( uint32_t ) ( & ( ADC1->DR ) );

    // ´æ´¢Æ÷µØÖ·£¬Êµ¼ÊÉϾÍÊÇÒ»¸öÄÚ²¿SRAMµÄ±äÁ¿
    DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)IbufFIN;

    // Êý¾ÝÔ´À´×ÔÍâÉè
    DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;

    // »º³åÇø´óСΪ1£¬»º³åÇøµÄ´óСӦ¸ÃµÈÓÚ´æ´¢Æ÷µÄ´óС
    DMA_InitStructure.DMA_BufferSize = 10240;

    // ÍâÉè¼Ä´æÆ÷Ö»ÓÐÒ»¸ö£¬µØÖ·²»ÓõÝÔö
    DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;

    // ´æ´¢Æ÷µØÖ·¹Ì¶¨
    DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable; 

    // ÍâÉèÊý¾Ý´óСΪ°ë×Ö£¬¼´Á½¸ö×Ö½Ú
    DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;

    // ´æ´¢Æ÷Êý¾Ý´óСҲΪ°ë×Ö£¬¸úÍâÉèÊý¾Ý´óСÏàͬ
    DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;

    // Ñ­»·´«Êäģʽ
    DMA_InitStructure.DMA_Mode = DMA_Mode_Normal;   

    // DMA ´«ÊäͨµÀÓÅÏȼ¶Îª¸ß£¬µ±Ê¹ÓÃÒ»¸öDMAͨµÀʱ£¬ÓÅÏȼ¶ÉèÖò»Ó°Ïì
    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);

}


void DMA1_Channel1_IRQHandler(void) 
{
    if(DMA_GetITStatus(DMA_IT_TC)!=RESET)
     DMA_ClearITPendingBit(DMA1_IT_TC1); 

}

/**
  * @brief  ADC³õʼ»¯
  * @param  ÎÞ
  * @retval ÎÞ
  */
void ADCx_Init(void)
{
    ADCx_GPIO_Config();
    ADCx_Mode_Config();
}
//主函数调用
int main (void)
{
    ADCx_Init();
    while(1)
    {
        start_one_sameple();
        while(DMA_GetFlagStatus(DMA1_FLAG_TC1)!=RESET);
        DMA_ClearFlag(DMA1_FLAG_TC1);
    }
}
/*********************************************END OF FILE**********************/

你可能感兴趣的:(STM32,stm32,ADC+DAM)