在线看毛片网站电影-亚洲国产欧美日韩精品一区二区三区,国产欧美乱夫不卡无乱码,国产精品欧美久久久天天影视,精品一区二区三区视频在线观看,亚洲国产精品人成乱码天天看,日韩久久久一区,91精品国产91免费

<menu id="6qfwx"><li id="6qfwx"></li></menu>
    1. <menu id="6qfwx"><dl id="6qfwx"></dl></menu>

      <label id="6qfwx"><ol id="6qfwx"></ol></label><menu id="6qfwx"></menu><object id="6qfwx"><strike id="6qfwx"><noscript id="6qfwx"></noscript></strike></object>
        1. <center id="6qfwx"><dl id="6qfwx"></dl></center>

            新聞中心

            EEPW首頁(yè) > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > STM32 八路AD轉(zhuǎn)換用DMA傳輸調(diào)試成功,DMA傳輸不錯(cuò)位

            STM32 八路AD轉(zhuǎn)換用DMA傳輸調(diào)試成功,DMA傳輸不錯(cuò)位

            作者: 時(shí)間:2016-11-23 來(lái)源:網(wǎng)絡(luò) 收藏
            //


            //
            #include"stm32f10x_conf.h" //把DMA.h和ADC.h 的注釋去掉
            #include "stm32f10x.h"
            #include "stm32_eval.h"

            本文引用地址:http://www.biyoush.com/article/201611/320088.htm

            #include

            #define N 50 //每通道采50次
            #define M 8 //為8個(gè)通道


            #define ADC1_DR_Address ((u32)0x4001244C)

            vu16 After_filter[M]; //用來(lái)存放求平均值之后的結(jié)果
            vu16 AD_Value[N][M]; //用來(lái)存放ADC轉(zhuǎn)換結(jié)果,也是DMA的目標(biāo)地址
            //這個(gè)變量存放ADC轉(zhuǎn)換后的值,在后面DMA設(shè)置的時(shí)候取了這個(gè)變了的地址,將轉(zhuǎn)

            //換結(jié)果直接傳輸?shù)竭@個(gè)地址。當(dāng)需要多路AD轉(zhuǎn)換時(shí),定義此為一個(gè)數(shù)組后面

            //DMA設(shè)置時(shí)取數(shù)組的基地址,依次傳輸

            void IO_cfg(void);
            void EXTI_cfg(void);
            void NVIC_cfg(void);
            void USART_cfg(void);
            void ADC_cfg(void);
            void DMA_cfg(void);

            u16 GetVolt(u16 advalue);
            void filter(void);

            void SerialPutChar(uint8_t c);
            void SerialReceivechar(uint8_t c);

            void Delay(vu32 nCount)
            {
            for(; nCount != 0; nCount--);
            }


            void RCC_cfg()
            {
            //打開(kāi)PA端口時(shí)鐘,并且打開(kāi)復(fù)用時(shí)鐘
            RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB | RCC_APB2Periph_GPIOC | RCC_APB2Periph_AFIO, ENABLE);

            RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE); //使能DMA時(shí)鐘
            RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE); //使能ADC

            }


            ////////////////////////////幾乎沒(méi)用,為了系統(tǒng)兼容/////////////////////////////////////
            #ifdef __GNUC__

            #define PUTCHAR_PROTOTYPE int __io_putchar(int ch)
            #else
            #define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)
            #endif
            //////////////////////////////////////////////////////////////////////////////////////////////////

            int main()
            {
            int i; //用于串口輸出

            u16 value[M]; //存放求完平均值之后再將結(jié)果擴(kuò)大100倍

            RCC_cfg();
            EXTI_cfg();
            IO_cfg();
            NVIC_cfg();
            USART_cfg();

            DMA_cfg();
            ADC_cfg();

            while(1)
            {
            while(USART_GetFlagStatus(USART1,USART_FLAG_TXE)==RESET);//等待傳輸完成否則第一位數(shù)據(jù)容易失
            filter();
            for(i=0;i
            {
            value[i]= GetVolt(After_filter[i]);

            printf("value[%d]:t%d.%dvn",i,value[i]/100,value[i]0) ;
            Delay(0x80000);
            }

            }

            }

            //
            void IO_cfg()
            {
            //八路AD輸入

            GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
            GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
            GPIO_Init(GPIOB, &GPIO_InitStructure);


            GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;
            GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
            GPIO_Init(GPIOB, &GPIO_InitStructure);


            GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
            GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
            GPIO_Init(GPIOC, &GPIO_InitStructure);


            GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;
            GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
            GPIO_Init(GPIOC, &GPIO_InitStructure);


            GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;
            GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
            GPIO_Init(GPIOC, &GPIO_InitStructure);


            GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;
            GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
            GPIO_Init(GPIOC, &GPIO_InitStructure);


            GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4;
            GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
            GPIO_Init(GPIOC, &GPIO_InitStructure);


            GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;
            GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
            GPIO_Init(GPIOC, &GPIO_InitStructure);

            }

            // 配置串口參數(shù)

            void USART_cfg()
            {
            USART_InitTypeDef USART_InitStructure;

            USART_InitStructure.USART_BaudRate = 115200;
            USART_InitStructure.USART_WordLength = USART_WordLength_8b;
            USART_InitStructure.USART_StopBits = USART_StopBits_1;
            USART_InitStructure.USART_Parity = USART_Parity_No;
            USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
            USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;

            STM_EVAL_COMInit(COM1, &USART_InitStructure);

            }


            void SerialPutChar(uint8_t c)
            {
            USART_SendData(EVAL_COM1, c);
            while (USART_GetFlagStatus(EVAL_COM1, USART_FLAG_TXE) == RESET)
            {
            }
            }

            void SerialReceivechar(uint8_t c)
            {

            USART_ReceiveData(EVAL_COM1);

            while( USART_GetFlagStatus(EVAL_COM1, USART_FLAG_RXNE) != RESET)
            {
            }
            }

            void ADC_cfg(void)
            {
            ADC_InitTypeDef ADC_InitStructure;

            ADC_InitStructure.ADC_Mode = ADC_Mode_Independent; // ADC1和ADC2工作在獨(dú)立模式 ;
            ADC_InitStructure.ADC_ScanConvMode = ENABLE; // 模數(shù)轉(zhuǎn)換工作在掃描模式(多通道)模式 ;
            ADC_InitStructure.ADC_ContinuousConvMode = ENABLE; // 模數(shù)轉(zhuǎn)換工作在連續(xù)模式 ;
            ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;// 轉(zhuǎn)換由軟件而不是外部觸發(fā)

            //啟動(dòng) ;
            ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right; // ADC數(shù)據(jù)右對(duì)齊 ;
            //八個(gè)通道轉(zhuǎn)換時(shí)下面賦值為8(相當(dāng)于開(kāi)啟通道的數(shù)目)
            ADC_InitStructure.ADC_NbrOfChannel = M; // 順序進(jìn)行規(guī)則轉(zhuǎn)換的ADC通道的數(shù)目 8 ;
            ADC_Init(ADC1, &ADC_InitStructure);

            //下面設(shè)置指定的ADC規(guī)則通道,一共需要設(shè)置8個(gè)

            // 設(shè)置指定ADC的規(guī)則組通道8-15,設(shè)置它們的轉(zhuǎn)化順序和采樣時(shí)間為55.5周期;
            ADC_RegularChannelConfig(ADC1, ADC_Channel_8, 1, ADC_SampleTime_55Cycles5);
            ADC_RegularChannelConfig(ADC1, ADC_Channel_9, 2, ADC_SampleTime_55Cycles5);
            ADC_RegularChannelConfig(ADC1, ADC_Channel_10, 3, ADC_SampleTime_55Cycles5);
            ADC_RegularChannelConfig(ADC1, ADC_Channel_11, 4, ADC_SampleTime_55Cycles5);
            ADC_RegularChannelConfig(ADC1, ADC_Channel_12, 5, ADC_SampleTime_55Cycles5);
            ADC_RegularChannelConfig(ADC1, ADC_Channel_13, 6, ADC_SampleTime_55Cycles5);
            ADC_RegularChannelConfig(ADC1, ADC_Channel_14, 7, ADC_SampleTime_55Cycles5);
            ADC_RegularChannelConfig(ADC1, ADC_Channel_15, 8, ADC_SampleTime_55Cycles5);

            ADC_DMACmd(ADC1, ENABLE); // 使能指定的ADC的DMA請(qǐng)求 ;
            ADC_Cmd(ADC1, ENABLE); // 使能指定的ADC ;

            ADC_ResetCalibration(ADC1);// 重置指定的ADC的校準(zhǔn)寄存器 ;
            while(ADC_GetResetCalibrationStatus(ADC1)); // 獲取ADC重置校準(zhǔn)寄存器的狀態(tài) ;

            ADC_StartCalibration(ADC1); // 開(kāi)始指定ADC的校準(zhǔn)程序 ;
            while(ADC_GetCalibrationStatus(ADC1)); // 獲取指定ADC的校準(zhǔn)狀態(tài) ;
            ADC_SoftwareStartConvCmd(ADC1, ENABLE);// 使能指定的ADC的軟件轉(zhuǎn)換啟動(dòng)功能 ;
            }

            void DMA_cfg(void)
            {
            DMA_InitTypeDef DMA_InitStructure;

            DMA_DeInit(DMA1_Channel1);
            DMA_InitStructure.DMA_PeripheralBaseAddr = ADC1_DR_Address;


            DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)&AD_Value; //上面這句很顯然是DMA要連接在Memory

            //中變量的地址,
            //AD_Value是我自己在memory中定義的一個(gè)變量數(shù)組;

            DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC; //這里設(shè)置的是單向傳輸,如果需要雙向傳輸:
            //把DMA_DIR_PeripheralSRC改成

            //DMA_DIR_PeripheralDST即可。

            //轉(zhuǎn)換通道為M,每組轉(zhuǎn)換N次
            DMA_InitStructure.DMA_BufferSize = M*N;//上面的這句是設(shè)置DMA在傳輸時(shí)緩沖區(qū)的長(zhǎng)度,前面有定義過(guò)了

            //buffer的起始地址:ADC1_DR_Address ,為了安全性和可靠性,一

            //般需要給buffer定義
            //一個(gè)儲(chǔ)存片區(qū),這個(gè)參數(shù)的單位有三種類(lèi)型:Byte、HalfWord、word,
            //我設(shè)置的2個(gè)half-word(見(jiàn)下面的設(shè)置);32位的MCU中1個(gè)half-word占16 bits。

            DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;

            //上面的這句是設(shè)置DMA的外設(shè)遞增模式,如果DMA
            //選用的通道(CHx)有多個(gè)外設(shè)連接,需要使用外設(shè)遞增模式:
            //DMA_PeripheralInc_Enable;我的例子里DMA只與ADC1建立了聯(lián)系,
            //所以選用DMA_PeripheralInc_Disable
            DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;//上面的這句是設(shè)置DMA的內(nèi)存遞增模式,DMA訪(fǎng)

            //問(wèn)多個(gè)內(nèi)存參數(shù)時(shí),
            //需要使用DMA_MemoryInc_Enable,當(dāng)DMA只訪(fǎng)問(wèn)一個(gè)內(nèi)存參數(shù)時(shí),
            //可設(shè)置成:DMA_MemoryInc_Disable。

            DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;

            //定義外設(shè)數(shù)據(jù)寬度為16位

            //上面的這句是設(shè)置DMA在訪(fǎng)問(wèn)時(shí)每次操作的數(shù)據(jù)長(zhǎng)度。

            //有三種數(shù)據(jù)長(zhǎng)度類(lèi)型,前面已經(jīng)講過(guò)了,這里不在敘述。
            DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;//與上面雷同。在此不再說(shuō)明。

            DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;

            //上面的這句是設(shè)置DMA的傳輸模式:連續(xù)不斷的循環(huán)式,
            //若只想訪(fǎng)問(wèn)一次后就不要訪(fǎng)問(wèn)了(或按指令操作來(lái)反問(wèn),也就是想要它訪(fǎng)問(wèn)
            //的時(shí)候就訪(fǎng)問(wèn),不要它訪(fǎng)問(wèn)的時(shí)候就停止),可以設(shè)置成通用模式:DMA_Mode_Normal

            DMA_InitStructure.DMA_Priority = DMA_Priority_High;//上面的這句是設(shè)置DMA的優(yōu)先級(jí)別:可以分為4級(jí):

            //VeryHigh,High,Medium,Low.

            DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;//上面的這句是設(shè)置DMA的2個(gè)memory中的變量互相訪(fǎng)問(wèn)的

            DMA_Init(DMA1_Channel1,&DMA_InitStructure);//前面那些都是對(duì)DMA結(jié)構(gòu)體成員的設(shè)置,在次再統(tǒng)一對(duì)DMA整

            //個(gè)模塊做一次初始化,
            //使得DMA各成員與上面的參數(shù)一致。

            DMA_Cmd(DMA1_Channel1,ENABLE);

            }

            ///////////////////////////////////
            u16 GetVolt(u16 advalue)
            {
            return (u16)(advalue * 330 / 4096); //求的結(jié)果擴(kuò)大了100倍,方便下面求出小數(shù)
            }

            //求AD轉(zhuǎn)換結(jié)果的平均值函數(shù)
            void filter(void)
            {
            int i;
            int sum = 0;
            u8 count;
            for(i=0;i<12;i++)
            {
            for ( count=0;count
            {
            sum += AD_Value[count][i];
            }
            After_filter[i]=sum/N;
            sum=0;
            }
            }


            PUTCHAR_PROTOTYPE
            {


            USART_SendData(EVAL_COM1, (uint8_t) ch);


            while (USART_GetFlagStatus(EVAL_COM1, USART_FLAG_TC) == RESET)
            {
            }

            return ch;
            }

            #ifdef USE_FULL_ASSERT


            void assert_failed(uint8_t* file, uint32_t line)
            {


            while (1)
            {
            }
            }

            #endif



            評(píng)論


            技術(shù)專(zhuān)區(qū)

            關(guān)閉