幸福人壽保險(xiǎn)公司官方網(wǎng)站百度seo怎么做網(wǎng)站內(nèi)容優(yōu)化
DMA(硬件加速方法)一般用于幫運(yùn)比較大的數(shù)據(jù)(如:攝像頭數(shù)據(jù)圖像傳輸),寄存器-》DMA-》RAM 或者?RAM-》DMA-》寄存器提高CPU的工作效率
源碼--
#include "myhead.h"
#include "adc.h"#include "delay.h"#include "usart.h"
extern u16 ADC1_Value;u16 ADC1_Value;void DMA_init(void)
{GPIO_InitTypeDef GPIO_InitStructure;ADC_InitTypeDef ADC_InitStructure;ADC_CommonInitTypeDef ADC_CommonInitStructure;DMA_InitTypeDef DMA_InitStructure;//1.時(shí)鐘使能ADC1 GPIOARCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);//1分頻RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);//2分頻RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_DMA2, ENABLE);//1分頻//DMA2初始化DMA_InitStructure.DMA_Channel = DMA_Channel_0; //通道0DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)&(ADC1->DR); //搬運(yùn)的起始地址DMA_InitStructure.DMA_Memory0BaseAddr = (uint32_t)&ADC1_Value; //搬運(yùn)的目的地址DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralToMemory; //DMA搬運(yùn)的方向DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord; //設(shè)置搬運(yùn)起始點(diǎn)到目的地發(fā)數(shù)據(jù)寬度DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord; //字節(jié)大小 半個(gè)字節(jié)DMA_InitStructure.DMA_BufferSize = 1; //設(shè)置緩存塊數(shù)DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable; //設(shè)置地址自動(dòng)遞增 DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Disable; DMA_InitStructure.DMA_Mode = DMA_Mode_Circular; //DMA搬運(yùn)模式 Nomal Circular循環(huán)DMA_InitStructure.DMA_Priority = DMA_Priority_High; //觸發(fā)優(yōu)先級(jí)DMA_InitStructure.DMA_FIFOMode = DMA_FIFOMode_Disable; DMA_InitStructure.DMA_FIFOThreshold = DMA_FIFOThreshold_HalfFull;DMA_InitStructure.DMA_MemoryBurst = DMA_MemoryBurst_Single;DMA_InitStructure.DMA_PeripheralBurst = DMA_PeripheralBurst_Single;DMA_Init(DMA2_Stream0, &DMA_InitStructure);DMA_Cmd(DMA2_Stream0, ENABLE); //使能DMAGPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AN;GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL ;//不需要上下拉電阻GPIO_Init(GPIOA, &GPIO_InitStructure);//3.ADC的公共部分配置ADC_CommonInitStructure.ADC_Mode = ADC_Mode_Independent;//獨(dú)立模式,雙重模式,三重模式ADC_CommonInitStructure.ADC_Prescaler = ADC_Prescaler_Div4; //84MHZ---/4 給到具體ADC 21MHZ<=36MHZADC_CommonInitStructure.ADC_DMAAccessMode = ADC_DMAAccessMode_Disabled; //多重ADC模式有關(guān),一般獨(dú)立ADC都不需要開(kāi)啟ADC_CommonInitStructure.ADC_TwoSamplingDelay = ADC_TwoSamplingDelay_5Cycles;//多重ADC模式的采樣間隔ADC_CommonInit(&ADC_CommonInitStructure);//4.指定ADC配置ADC_InitStructure.ADC_Resolution = ADC_Resolution_12b; //精度選擇ADC_InitStructure.ADC_ScanConvMode = DISABLE; //掃描模式選擇 開(kāi)掃描/關(guān)掃描 單個(gè)ADC開(kāi)了多個(gè)通道才要掃描模式ADC_InitStructure.ADC_ContinuousConvMode = ENABLE; //連續(xù)轉(zhuǎn)換模式 開(kāi)/關(guān)ADC_InitStructure.ADC_ExternalTrigConvEdge = ADC_ExternalTrigConvEdge_None; //ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_T1_CC1;ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;ADC_InitStructure.ADC_NbrOfConversion = 1; //待轉(zhuǎn)換的通道數(shù)量 如果adc通道開(kāi)多個(gè)(adc1,adc3),通道數(shù)量跟數(shù)量一樣多,上面掃描模式就得開(kāi)ADC_Init(ADC1, &ADC_InitStructure);/* Enable DMA request after last transfer (Single-ADC mode) */ //ADC1->CR2 第9bit DDS位 中文手冊(cè)276頁(yè)ADC_DMARequestAfterLastTransferCmd(ADC1, ENABLE);/* Enable ADC3 DMA *///ADC1->CR2 第8bit DMA位 中文手冊(cè)276頁(yè)ADC_DMACmd(ADC1, ENABLE);//5.通道規(guī)則設(shè)置--設(shè)置adc通道的轉(zhuǎn)換順序ADC_RegularChannelConfig(ADC1, ADC_Channel_5, 1, ADC_SampleTime_3Cycles);//ADC_SampleTime_3Cycles通道轉(zhuǎn)換速度,等級(jí)越高轉(zhuǎn)換速度越快//6.使能ADC模塊ADC_Cmd(ADC1,ENABLE);
}int main(void)
{adc_init();usart1_init(9600);DMA_init();ADC_SoftwareStartConv(ADC1); //ADC通道配置必須放DMA_init/adc_init()后面while(1){//3.3v/4096 =xV/ADC1->DRprintf("%.2fv\r\n",ADC1_Value*3.3/4095); //不斷讀取ADC1的轉(zhuǎn)換結(jié)果 轉(zhuǎn)換成電壓值 (.2f表示double類型小數(shù)點(diǎn)后兩位打印結(jié)果)delay_ms(1000);}}
DMA2支持搬運(yùn)的外設(shè)有如圖