日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

STM32F030 ADC1的DMA采样问题

發(fā)布時間:2025/3/21 编程问答 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 STM32F030 ADC1的DMA采样问题 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
搞了1天一直ADC沒有出來,發(fā)現(xiàn)采處理的值一直是固定值..

去21IC求助貼.[STM32F0] STM32F030 ADC1采樣問題請教

等了好久都沒有人回復(fù),但有人提醒我說需要等待DMA的數(shù)據(jù)完成.

后面對比了別人的代碼,

/* ADC DMA request in circular mode */
ADC_DMARequestModeConfig(ADC1, ADC_DMAMode_Circular);

別人有這句代碼,于是我加上這個話,則能夠正常采樣到數(shù)據(jù)了,

所以,必須得添加,否則無法獲取到采樣值.


接著又發(fā)現(xiàn)DMA傳輸?shù)街付ǖ臄?shù)組數(shù)據(jù)順序錯亂了.....

類似別人的求助貼:[STM32F0] STM32F030 多通道ADC DMA讀取問題

后面解決方式,按照最后帖子的方式解決的

? ? ? ? " F0的ADC在使用之前需要校準。這個7位的校準值也是放在ADC_DR中的,它也會觸發(fā)DMA請求。可以參照F0的ADC-DMA例程,先做ADC校準、然后再設(shè)置DMA,再使能ADC的DMA。"


直接插入代碼,正確的初始化代碼:

[cpp] view plaincopy
  • typedef?enum??
  • {??
  • ????ADC_PORTA0?=?ADC_Channel_0,??????
  • ????ADC_PORTA1?=?ADC_Channel_1,??
  • ????ADC_PORTA2?=?ADC_Channel_2,??
  • ????ADC_PORTA3?=?ADC_Channel_3,??
  • ????ADC_PORTA4?=?ADC_Channel_4,??
  • ????ADC_PORTA5?=?ADC_Channel_5,??
  • ????ADC_PORTA6?=?ADC_Channel_6,??
  • ????ADC_PORTA7?=?ADC_Channel_7,??
  • ????ADC_PORTA8?=?ADC_Channel_8,??
  • ????ADC_PORTA9?=?ADC_Channel_9,??
  • ????ADC_PORTA10?=?ADC_Channel_10,??
  • ????ADC_PORTA11?=?ADC_Channel_11,??
  • ????ADC_PORTA12?=?ADC_Channel_12,??
  • ????ADC_PORTA13?=?ADC_Channel_13,??
  • ????ADC_PORTA14?=?ADC_Channel_14,??
  • ????ADC_PORTA15?=?ADC_Channel_15,??
  • }AD_PORT;??
  • ??
  • typedef?enum???
  • {??
  • ????KEY_LINE_1,??
  • ????KEY_LINE_2,??
  • ????ADC_KEY_LINE_MAX?=?KEY_LINE_2,??
  • ????BATTERY_AD,??
  • ????ADC_NUM_CNT,????//ADC的總數(shù)??
  • }ADC_NUM;??
  • ??
  • ??
  • volatile?u16?g_uADC_ConVal[ADC_NUM_CNT]?=?{0};??????//?ADC轉(zhuǎn)換值??
  • ??
  • ??
  • u32?const??g_uADNum[]=??
  • {?????
  • ????//KEYPORTA1,???
  • ????ADC_PORTA9,????
  • ????ADC_PORTA8,????
  • ????ADC_PORTA2,??
  • ????//KEYPORTA0,??
  • };??
  • ??
  • ??
  • void?Adc_Init(void)??
  • {??
  • ????ADC_DeInit(ADC1);?????
  • ??????
  • ????RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA,?ENABLE);??
  • ??
  • ????RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOB,?ENABLE);??
  • ??
  • ????//打開DMA1的時鐘??
  • ????RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1,?ENABLE);??
  • ????//打開ADC1的時鐘??
  • ????RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1,ENABLE);??
  • ??
  • ????RCC_ADCCLKConfig(RCC_ADCCLK_PCLK_Div4);??
  • ??
  • ????//初始化IO口??
  • ????GPIO_InitTypeDef????GPIO_InitStruct;??
  • ????GPIO_StructInit(&GPIO_InitStruct);??
  • ????GPIO_InitStruct.GPIO_Mode?=?GPIO_Mode_AN;??
  • ????GPIO_InitStruct.GPIO_Pin?=??AD_KEY1_PIN;??
  • ????GPIO_Init(AD_KEY1_PORT,&GPIO_InitStruct);???????????????//?KEY1??
  • ????GPIO_InitStruct.GPIO_Pin?=??AD_KEY2_PIN;??
  • ????GPIO_Init(AD_KEY2_PORT,&GPIO_InitStruct);???????????????//?KEY2??
  • ????GPIO_InitStruct.GPIO_Pin?=??BATTERY_AD_PIN;??
  • ????GPIO_Init(BATTERY_AD_PORT,&GPIO_InitStruct);;???????????//?電池電源采樣??
  • ??
  • ????//配置ADC1的DMA模式??
  • ????ADC_InitTypeDef?ADC_InitStructure;??
  • ????DMA_InitTypeDef?DMA_InitStructure;??
  • ????DMA_DeInit(DMA1_Channel1);??
  • ????DMA_InitStructure.DMA_PeripheralBaseAddr?=?(u32)&(ADC1->DR);?????????????//定義DMA外設(shè)基地址,即為存放轉(zhuǎn)換結(jié)果的寄存器??
  • ????DMA_InitStructure.DMA_MemoryBaseAddr?=?(u32)g_uADC_ConVal;??????//定義內(nèi)存基地址??
  • ????DMA_InitStructure.DMA_DIR?=?DMA_DIR_PeripheralSRC;??????????//定義AD外設(shè)作為數(shù)據(jù)傳輸?shù)膩碓?/span>??
  • ????DMA_InitStructure.DMA_BufferSize?=?ADC_NUM_CNT;?????//指定DMA通道的DMA緩存的大小,即需要開辟幾個內(nèi)存空間,本實驗有兩個轉(zhuǎn)換通道,所以開辟兩個??
  • ????DMA_InitStructure.DMA_PeripheralInc?=?DMA_PeripheralInc_Disable;????//設(shè)定寄存器地址固定??
  • ????DMA_InitStructure.DMA_MemoryInc?=?DMA_MemoryInc_Enable;?????????//設(shè)定內(nèi)存地址遞加,即每次DMA都是將該外設(shè)寄存器中的值傳到三個內(nèi)存空間中??
  • ????DMA_InitStructure.DMA_PeripheralDataSize?=?DMA_PeripheralDataSize_HalfWord;?????//設(shè)定外設(shè)數(shù)據(jù)寬度??
  • ????DMA_InitStructure.DMA_MemoryDataSize?=?DMA_MemoryDataSize_HalfWord;?????????//設(shè)定內(nèi)存的的寬度??
  • ????DMA_InitStructure.DMA_Mode?=?DMA_Mode_Circular;?????????????????????//設(shè)定DMA工作再循環(huán)緩存模式??
  • ????DMA_InitStructure.DMA_Priority?=?DMA_Priority_High;?????????????????//設(shè)定DMA選定的通道軟件優(yōu)先級??
  • ????DMA_InitStructure.DMA_M2M?=?DMA_M2M_Disable;??
  • ????DMA_Init(DMA1_Channel1,&DMA_InitStructure);??
  • ??
  • ????/*?ADC?DMA?request?in?circular?mode?*/??
  • ????ADC_DMARequestModeConfig(ADC1,?ADC_DMAMode_Circular);???????????????????//必須得添加,否則無法獲取到采樣值??
  • ??
  • ????ADC_StructInit(&ADC_InitStructure);??
  • ????ADC_InitStructure.ADC_Resolution?=?ADC_Resolution_12b;??
  • ????ADC_InitStructure.ADC_ContinuousConvMode?=?ENABLE;??????????????????//設(shè)定AD轉(zhuǎn)化在連續(xù)模式??
  • ????ADC_InitStructure.ADC_ExternalTrigConv?=?ADC_ExternalTrigConvEdge_None;?????????//不使用外部促發(fā)轉(zhuǎn)換??
  • ????ADC_InitStructure.ADC_DataAlign?=?ADC_DataAlign_Left;???????????????????//采集的數(shù)據(jù)在寄存器中以左對齊的方式存放??
  • ????ADC_InitStructure.ADC_ScanDirection?=?ADC_ScanDirection_Backward;??
  • ????ADC_Init(ADC1,?&ADC_InitStructure);???
  • ??
  • ????for(u8?uCnt?=?0;uCnt?<?ADC_NUM_CNT;uCnt++)??
  • ????{??
  • ????????/*?Convert?the?ADC1??with?55.5?Cycles?as?sampling?time?*/???
  • ????????ADC_ChannelConfig(ADC1,?g_uADNum[uCnt]?,?ADC_SampleTime_55_5Cycles);????//設(shè)置指定ADC的規(guī)則組通道,設(shè)置它們的轉(zhuǎn)化順序和采樣時間??
  • ????}??
  • ??????
  • ????//ADC_ChannelConfig(ADC1,?ADC_Channel_2?,?ADC_SampleTime_55_5Cycles);???//設(shè)置指定ADC的規(guī)則組通道,設(shè)置它們的轉(zhuǎn)化順序和采樣時間??
  • ????//ADC_ChannelConfig(ADC1,?ADC_Channel_8?,?ADC_SampleTime_55_5Cycles);???//設(shè)置指定ADC的規(guī)則組通道,設(shè)置它們的轉(zhuǎn)化順序和采樣時間??
  • ????//ADC_ChannelConfig(ADC1,?ADC_Channel_9?,?ADC_SampleTime_55_5Cycles);???//設(shè)置指定ADC的規(guī)則組通道,設(shè)置它們的轉(zhuǎn)化順序和采樣時間??
  • ????//ADC_DMARequestModeConfig(ADC1,?ADC_DMAMode_Circular);???
  • ??
  • ??????
  • ????/*?ADC?Calibration?*/??
  • ????ADC_GetCalibrationFactor(ADC1);?????????????????????//校準ADC??
  • ??
  • ??????
  • ????DMA_Cmd(DMA1_Channel1,ENABLE);??
  • ??????
  • ????/*?Enable?ADC_DMA?*/??
  • ????ADC_DMACmd(ADC1,?ENABLE);????
  • ??
  • ????ADC_Cmd(ADC1,ENABLE);???????????????????????????????????????????????????????????????????//使能指定的ADC1??
  • ????while(!ADC_GetFlagStatus(ADC1,?ADC_FLAG_ADEN));?????????<span?style="white-space:pre">????</span>//等待ADC準備好??
  • ??
  • ??
  • ????ADC_StartOfConversion(ADC1);????????????????????????//啟動轉(zhuǎn)換??
  • }??


  • 另外補充,ADC_ScanDirection_Upward及ADC_ScanDirection_Backward的簡要說明。假設(shè)ADC1有18個通道,1,2....18

    ADC_ScanDirection_Upward表示從1~18開始掃描

    ADC_ScanDirection_Backward表示從18~1方向掃描

    這樣就決定了,用戶指定的內(nèi)存數(shù)組里面存值的順序.

    像上面的代碼,則對應(yīng)關(guān)系為g_uADC_ConVal[0]--->AIN9 ?g_uADC_ConVal[1]--->AIN8?g_uADC_ConVal[2]-->AIN2

    《新程序員》:云原生和全面數(shù)字化實踐50位技術(shù)專家共同創(chuàng)作,文字、視頻、音頻交互閱讀

    總結(jié)

    以上是生活随笔為你收集整理的STM32F030 ADC1的DMA采样问题的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。