STM32超詳細(xì)的講解_第1頁(yè)
STM32超詳細(xì)的講解_第2頁(yè)
STM32超詳細(xì)的講解_第3頁(yè)
STM32超詳細(xì)的講解_第4頁(yè)
STM32超詳細(xì)的講解_第5頁(yè)
全文預(yù)覽已結(jié)束

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

第三章AD轉(zhuǎn)換本章的內(nèi)容分兩部分,第一是AD的單通道轉(zhuǎn)換,第二是AD的多通道轉(zhuǎn)換。首先先將單通道轉(zhuǎn)換。STM32中自帶的AD最大的轉(zhuǎn)換頻率是14MHZ,共有16個(gè)轉(zhuǎn)換通道,每個(gè)轉(zhuǎn)換通道對(duì)應(yīng)的管腳如下表所示。管腳名默認(rèn)復(fù)用功能PF6ADC3_IN4PF7ADC3_IN5PF8ADC3_IN6PF9ADC3_IN7PF10ADC3_IN8PC0ADC123_IN10PC1ADC123_IN11PC2ADC123_IN12PC3ADC123_IN13PA3ADC123_IN3PA6ADC12_IN6PA7ADC12_IN7PC4ADC12_IN14PC5ADC12_IN15PB0ADC12_IN8PB1ADC12_IN9注:ADC123_IN10表明PC0管腳可以作為AD1,AD2,AD3的第10通道。下面我們將PC0配置成AD1的通道10為例進(jìn)行講解。3.1首先我們應(yīng)將PC0設(shè)置成模擬輸入:#include"adc?h"/*為何定義ADC1_DR_Address為((u32)0x40012400+0x4c),因?yàn)榇娣臕D轉(zhuǎn)換結(jié)果的寄存器的地址就是0x4001244c*/#defineADC1_DR_Address((u32)0x40012400+0x4c)/*定義變量ADC_ConvertedValue,放AD1通道10轉(zhuǎn)換的數(shù)據(jù)*/__IOuint16_tADC_ConvertedValue;staticvoidADC1_GPIO_Config(void)(--GPIO_InitTypeDefGPIO_InitStructure;/*EnableADC1andGPIOCclock*/RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1|RCC_APB2Periph_GPIOC,ENABLE);GPIO_InitStructure.GPIO_Pin=GPIO_Pin_0;GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AIN;GPIO_Init(GPIOC,&GPIO_InitStructure);}

3.2設(shè)置完端口后下一步當(dāng)然是對(duì)AD進(jìn)行初始化:3.2這里需要補(bǔ)充一個(gè)知識(shí)點(diǎn)DMA,DMA就相當(dāng)與CPU的一個(gè)秘書(shū),他的作用就是幫CPU減輕負(fù)擔(dān)的。說(shuō)的再具體點(diǎn)就是幫CPU來(lái)轉(zhuǎn)移數(shù)據(jù)的。我們都知道,AD每次轉(zhuǎn)換結(jié)束后會(huì)將轉(zhuǎn)換的結(jié)果放到一個(gè)固定的寄存器里,以往我們?nèi)绻雽⒃摷拇嫫髦械闹蒂x給某一變量時(shí)會(huì)用到賦值語(yǔ)句,如果不用DMA,則賦值語(yǔ)句便要CPU來(lái)完成,CPU本來(lái)就要忙著處理其他事情,現(xiàn)在還要來(lái)解決賦值語(yǔ)句這么簡(jiǎn)單的問(wèn)題,肯到會(huì)蛋疼。所以需要DMA這個(gè)秘書(shū)來(lái)幫他解決這個(gè)問(wèn)題。由于DMA只是個(gè)秘書(shū),所以比較笨,你只有把任務(wù)交代清楚了她才能很好的完成任務(wù)。那么怎樣來(lái)給DMA吩咐任務(wù)呢,聰明的人肯定想到了,那當(dāng)然是“DMA_Init(DMA1_Channel1,&DMA_InitStructure)”這個(gè)函數(shù)啦。下面就來(lái)一步步的來(lái)給DMA交代任務(wù)。/*函數(shù)名:ADC1_Mode_Config*描述:配置ADC1的工作模式為MDA模式*輸入:無(wú)*輸出:無(wú)*調(diào)用:內(nèi)部調(diào)用*/staticvoidADC1_Mode_Config(void){--DMA_InitTypeDefDMA_InitStructure;ADC_InitTypeDefADC_InitStructure;/*將與DMA有關(guān)的寄存器設(shè)我初始值*/DMA_DeInit(DMA1_Channel1);/*定義DMA外設(shè)基地址,這里的ADC1_DR_Address是用戶(hù)自己定義的,即為存放轉(zhuǎn)換結(jié)果的寄存器,他的作用就是告訴DMA取數(shù)就到ADC1_DR_Address這里來(lái)取。*/DMA_InitStructure.DMA_PeripheralBaseAddr=ADC1_DR_Address;/*定義內(nèi)存基地址,即告訴DMA要將從AD中取來(lái)的數(shù)放到ADC_ConvertedValue中*/DMA_InitStructure.DMA_MemoryBaseAddr=(u32)&ADC_ConvertedValue;/*定義AD外設(shè)作為數(shù)據(jù)傳輸?shù)膩?lái)源,即告訴DMA是將AD中的數(shù)據(jù)取出放到內(nèi)存中,不能反過(guò)來(lái)*/DMA_InitStructure.DMA_DIR=DMA_DIR_PeripheralSRC;/*指定DMA通道的DMA緩存的大小,即告訴DMA開(kāi)辟幾個(gè)內(nèi)存空間,由于我們只取通道10的AD數(shù)據(jù)所以只需開(kāi)辟一個(gè)內(nèi)存空間*/DMA_InitStructure.DMA_BufferSize=1;/*設(shè)定寄存器地址固定,即告訴DMA,只從固定的一個(gè)地方取數(shù)*/DMA_InitStructure.DMA_PeripheralInc=DMA_PeripheralInc_Disable;/*設(shè)定內(nèi)存地址固定,即每次DMA,,只將數(shù)搬到固定的內(nèi)存中*/DMA_InitStructure.DMA_MemoryInc=DMA_MemoryInc_Enable;/*設(shè)定外設(shè)數(shù)據(jù)寬度,即告訴DMA要取的數(shù)的大小*/DMA_InitStructure.DMA_PeripheralDataSize=DMA_PeripheralDataSize_HalfWord;/*設(shè)定內(nèi)存的的寬度*/DMA_InitStructure.DMA_MemoryDataSize=DMA_MemoryDataSize_HalfWord;/*設(shè)定DMA工作再循環(huán)緩存模式,即告訴DMA要不停的搬運(yùn),不能偷懶*/DMA_InitStructure.DMA_Mode=DMA_Mode_Circular;/*設(shè)定DMA選定的通道軟件優(yōu)先級(jí)*/DMA_InitStructure.DMA_Priority=DMA_Priority_High;DMAInitStructure.DMAM2M=DMAM2MDisable;DMA_Init(DMA1_Channel1,&DMA_InitStructure);/*EnableDMAchannelsCPU有好幾個(gè)DMA秘書(shū),現(xiàn)在只用DMA1_Channel1這個(gè)秘書(shū)*/DMA_Cmd(DMA1_Channel1,ENABLE);/*設(shè)置ADC工作在獨(dú)立模式*/ADC_InitStructure.ADC_Mode=ADC_Mode_Independent;/*規(guī)定AD轉(zhuǎn)換工作在單次模式,即對(duì)一個(gè)通道采樣*/ADC_InitStructure.ADC_ScanConvMode=DISABLE;/*設(shè)定AD轉(zhuǎn)化在連續(xù)模式*/ADC_InitStructure.ADC_ContinuousConvMode=ENABLE;/*不使用外部促發(fā)轉(zhuǎn)換*/ADC_InitStructure.ADC_ExternalTrigConv=ADC_ExternalTrigConv_None;/*采集的數(shù)據(jù)在寄存器中以右對(duì)齊的方式存放*/ADC_InitStructure.ADC_DataAlign=ADC_DataAlign_Right;/*設(shè)定要轉(zhuǎn)換的AD通道數(shù)目?/ADC_InitStructure.ADC_NbrOfChannel=1;ADC_Init(ADC1,&ADC_InitStructure);/*配置ADC時(shí)鐘,為PCLK2的8分頻,即9MHz*/RCC_ADCCLKConfig(RCC_PCLK2_Div8);/*配置ADC1的通道11為55.5個(gè)采樣周期*/ADC_RegularChannelConfig(ADC1,ADC_Channel_10,1,ADC_SampleTime_55Cycles5);/*EnableADC1DMA*/ADC_DMACmd(ADC1,ENABLE);/*EnableADC1*/ADC_Cmd(ADC1,ENABLE);/*復(fù)位校準(zhǔn)寄存器*/ADC_ResetCalibration(ADC1);/*等待校準(zhǔn)寄存器復(fù)位完成*/while(ADC_GetResetCalibrationStatus(ADC1));/*ADC校準(zhǔn)*/ADC_StartCalibration(ADC1);/*等待校準(zhǔn)完成*/while(ADC_GetCalibrationStatus(ADC1));/*由于沒(méi)有采用外部觸發(fā),所以使用軟件觸發(fā)ADC轉(zhuǎn)換*/ADC_SoftwareStartConvCmd(ADC1,ENABLE);}配置完以上的程序,那么AD每轉(zhuǎn)換一次,DMA都會(huì)將轉(zhuǎn)換結(jié)果搬到變量ADC_ConvertedValue中,而不需用每次都用賦值語(yǔ)句來(lái)取值A(chǔ)D轉(zhuǎn)換的值。第二部分:AD多路采樣#include"adc?h"#defineADC1_DR_Address((u32)0x40012400+0x4c)/*定義數(shù)組變量ADC_ConvertedValue[2],分別放AD1通道10和11轉(zhuǎn)換的數(shù)據(jù)*/__IOuint16_tADC_ConvertedValue[2];/*函數(shù)名:ADC1_GPIO_Config*描述:使能ADC1和DMA1的時(shí)鐘,設(shè)置PC0,PC1為模擬輸入*輸入:無(wú)*輸出:無(wú)*調(diào)用:內(nèi)部調(diào)用*/staticvoidADC1_GPIO_Config(void)(--GPIO_InitTypeDefGPIO_InitStructure;/*EnableDMAclock*/RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1,ENABLE);/*EnableADC1andGPIOCclock*/RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1|RCC_APB2Periph_GPIOC,ENABLE);GPIO_InitStructure.GPIO_Pin=GPIO_Pin_0|GPIO_Pin_1;GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AIN;GPIO_Init(GPIOC,&GPIO_InitStructure);}/*函數(shù)名:ADC1_Mode_Config*描述:配置ADC1的工作模式為MDA模式輸入:無(wú)輸出:無(wú)調(diào)用:內(nèi)部調(diào)用*/staticvoidADC1_Mode_Config(void)(--DMA_InitTypeDefDMA_InitStructure;ADC_InitTypeDefADC_InitStructure;/*DMAchannellconfiguration*/DMA_DeInit(DMA1_Channel1);/*定義DMA外設(shè)基地址,即為存放轉(zhuǎn)換結(jié)果的寄存器*/DMA_InitStructure.DMA_PeripheralBaseAddr=ADC1_DR_Address;/*定義內(nèi)存基地址*/DMA_InitStructure.DMA_MemoryBaseAddr=(u32)&ADC_ConvertedValue;/*定義AD外設(shè)作為數(shù)據(jù)傳輸?shù)膩?lái)源*/DMA_InitStructure.DMA_DIR=DMA_DIR_PeripheralSRC;/*指定DMA通道的DMA緩存的大小,即需要開(kāi)辟幾個(gè)內(nèi)存空間,本實(shí)驗(yàn)有兩個(gè)轉(zhuǎn)換通道,所以開(kāi)辟兩個(gè)*/DMA_InitStructure.DMA_BufferSize=2;/*設(shè)定寄存器地址固定*/DMA_InitStructure.DMA_PeripheralInc=DMA_PeripheralInc_Disable;/*設(shè)定內(nèi)存地址遞加,即每次DMA都是將該外設(shè)寄存器中的值傳到兩個(gè)內(nèi)存空間中*/DMA_InitStructure.DMA_MemoryInc=DMA_MemoryInc_Enable;TOC\o"1-5"\h\z/*設(shè)定外設(shè)數(shù)據(jù)寬度*/---DMA_InitStructure.DMA_PeripheralDataSize=DMA_PeripheralDataSize_HalfWord;/*設(shè)定內(nèi)存的的寬度*/DMA_InitStructure.DMA_MemoryDataSize=DMA_MemoryDataSize_HalfWord;/*設(shè)定DMA工作再循環(huán)緩存模式*/DMA_InitStructure.DMA_Mode=DMA_Mode_Circular;/*設(shè)定DMA選定的通道軟件優(yōu)先級(jí)*/DMA_InitStructure.DMA_Priority=DMA_Priority_High;DMAInitStructure.DMAM2M=DMAM2MDisable;DMA_Init(DMA1_Channel1,&DMA_InitStructure);/*EnableDMAchannel1*/DMA_Cmd(DMA1_Channel1,ENABLE);/*設(shè)置ADC工作在獨(dú)立模式*/ADC_InitStructure.ADC_Mode=ADC_Mode_Independent;/*規(guī)定AD轉(zhuǎn)換工作在掃描模式,即對(duì)多個(gè)通道采樣*/ADC_InitStructure.ADC_ScanConvMode=ENABLE;/*設(shè)定AD轉(zhuǎn)化在連續(xù)模式*/ADC_InitStructure.ADC_ContinuousConvMode=ENABLE;/*不使用外部促發(fā)轉(zhuǎn)換*/ADC_InitStructure.ADC_ExternalTrigConv=ADC_ExternalTrigConv_None;/*采集的數(shù)據(jù)在寄存器中以右對(duì)齊的方式存放*/ADC_InitStructure.ADC_DataAlign=ADC_DataAlign_Right;/*設(shè)定要轉(zhuǎn)換的AD通道數(shù)目*/ADC_InitStructure.ADC_NbrOfChannel=2;ADC_Init(ADC1,&ADC_InitStructure);/*配置ADC時(shí)鐘,為PCLK2的8分頻,即9MHz*/RCC_ADCCLKConf

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論