STM32L1xx——ADC(中斷/DMA)樣例代碼


此代碼欲實現的功能是:使用中斷或者DMA的方式采集滑動變阻器采集到的電壓值,使用單ADC單通道采樣!

(由於不是直接需要電壓,所以轉換函數我就沒列出來,可根據自身需要去網上查到轉換的函數。)

 

代碼結構樹為:


                             |————ADC_GPIO_Config(void)
   ADC_Config(void)|————ADC_Mode_Config(void)
                             |_______ADC_NVIC_Config(void) / ADC_DMA_Config(void)

 

ADC_GPIO_Config:

void ADC_GPIO_Config(void)
{
    //初始化PA2引腳
  GPIO_InitTypeDef GPIO_InitStruct;
    RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA,ENABLE);
    GPIO_InitStruct.GPIO_Pin = ADC_GPIO_PIN;
  GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AN;
  GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_NOPULL;
  GPIO_Init(ADC_GPIO_PORT,&GPIO_InitStruct);
    
}

ADC_Mode_Config:

void ADC_Mode_Config(void)
{
    ADC_InitTypeDef ADC_InitStruct;
    RCC_HSICmd(ENABLE);                    //開啟HSI時鍾,非常重要,stm32l151的時鍾由HSI提供
    while(RCC_GetFlagStatus(RCC_FLAG_HSIRDY) == RESET); 
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1,ENABLE);//開啟ADC時鍾
    ADC_DeInit(ADC1);
    ADC_InitStruct.ADC_Resolution = ADC_Resolution_12b;
    ADC_InitStruct.ADC_ScanConvMode = DISABLE;//不使用掃描模式
    ADC_InitStruct.ADC_ContinuousConvMode = ENABLE;//使能連續轉換
    ADC_InitStruct.ADC_ExternalTrigConvEdge = ADC_ExternalTrigConvEdge_None;//不使用外部觸發,無需設置
    ADC_InitStruct.ADC_DataAlign = ADC_DataAlign_Right;//右對齊
    ADC_InitStruct.ADC_NbrOfConversion = ADC_Channel_1;//使用的通道數=1
    ADC_Init(ADC1,&ADC_InitStruct);
    ADC_RegularChannelConfig(ADC1,ADC_Channel_2,1,ADC_SampleTime_4Cycles);//配置ADC的通道轉換順序和采樣時間
#if ADC_DMA_ENABLE
    ADC_DMARequestAfterLastTransferCmd(ADC1,ENABLE);    //開啟ADC_CR2的DDS位,使DMA完成后可以自動開始
    ADC_DMACmd(ADC1,ENABLE);                            //開啟DMA
#else
    ADC_ITConfig(ADC1,ADC_IT_EOC,ENABLE);               //使能規則通道轉換完成中斷
#endif
    ADC_Cmd(ADC1,ENABLE);
    while(ADC_GetFlagStatus(ADC1, ADC_FLAG_ADONS) == RESET); //等待ADC啟動完成
    ADC_SoftwareStartConv(ADC1);
}

ADC_NVIC_Config:

void ADC_NVIC_Config(void)
{
  NVIC_InitTypeDef NVIC_InitStruct;
    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);                            //配置組優先級
    NVIC_InitStruct.NVIC_IRQChannel = ADC1_IRQn;                                //選擇中斷源
    NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 1;            //搶占優先級
    NVIC_InitStruct.NVIC_IRQChannelSubPriority = 1;                            //子優先級
    NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE;                                //開總中斷
    NVIC_Init(&NVIC_InitStruct);                                                                //初始化結構體
}

ADC_DMA_Config:

void ADC_DMA_Config(void)
{
    DMA_InitTypeDef DMA_InitStruct;
    RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1,ENABLE);
    DMA_DeInit(DMA1_Channel1);                                    //DMA復位
    
    DMA_InitStruct.DMA_PeripheralBaseAddr = ADC_DR_ADDRESS;              //外設地址
    DMA_InitStruct.DMA_MemoryBaseAddr =  ((uint32_t) &ADC_Data);                                //存儲器地址
    DMA_InitStruct.DMA_DIR = DMA_DIR_PeripheralSRC;                                 //ADC發出數據
    DMA_InitStruct.DMA_BufferSize = 1;                                            //傳輸數據數量
    DMA_InitStruct.DMA_PeripheralInc = DMA_PeripheralInc_Disable;    //串口數據寄存器只有一個,不自增
    DMA_InitStruct.DMA_MemoryInc = DMA_MemoryInc_Disable;                    //存儲器地址不自增
    DMA_InitStruct.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;    //外設數據寬度:半字d
    DMA_InitStruct.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;                    //存儲器數據傳輸寬度
    DMA_InitStruct.DMA_Mode = DMA_Mode_Circular;                                        //循環發送
    DMA_InitStruct.DMA_Priority = DMA_Priority_High;                            //優先級為高
    DMA_InitStruct.DMA_M2M = DMA_M2M_Disable;
    
    DMA_Init(ADC_DMA_CHANNEL,&DMA_InitStruct);                                        //ADC的DMA使用通道ADC1通道1
    DMA_Cmd(ADC_DMA_CHANNEL, ENABLE);
    
}

 

Note:中斷和DMA的代碼我都給出來了,根據自身需要選擇。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM