STM32超詳細的講解_第1頁
STM32超詳細的講解_第2頁
STM32超詳細的講解_第3頁
STM32超詳細的講解_第4頁
STM32超詳細的講解_第5頁
全文預覽已結束

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

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

溫馨提示

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

評論

0/150

提交評論