新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > STM32 之 ADC_DMA

        STM32 之 ADC_DMA

        作者: 時間:2016-12-03 來源:網絡 收藏
        這里僅僅是一個測量趨勢,并不是很精確的測量。

        再次重申STM32ADC不同的通道對應著不同的管腳,本代碼中PA1對應著通道1。

        本文引用地址:http://www.104case.com/article/201612/325138.htm

        包含文件:

        由于百度字數限制這里只貼出關鍵代碼:

        (1)Main

        C語言:Codee#14684
        /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
        + 實驗平臺 : ST 官方三合一套件
        + 硬件 : STM32F103C8T6
        + 開發平臺 : IAR For ARM 5.40
        + 仿真器 : J-Link
        + 日期 : 2010-10-28
        + 頻率 :HSE = 8MHz ,主頻 = 72MHz
        ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/

        #include "includes.h"
        #include "stdio.h"
        /*******************************************************************************
        == 變量聲明 ==
        *******************************************************************************/
        floatADC_Value,Tem;
        unsignedchara=0;
        unsignedcharb=0;
        unsignedcharc=0;
        unsignedchard=0;

        /*******************************************************************************
        == Main 函數 ==
        *******************************************************************************/
        voidmain(void)
        {
        //---- 初始化 ------------------------------------------------------
        RCC_Configuration();//配置系統時鐘
        NVIC_Configuration();//配置 NVIC 和 Vector Table
        SysTick_Config();//配置SysTick的精確延時

        GPIO_Configuration();
        UART1_Configuration();
        AD_Configration();
        DMA_Configration();


        //---- 任務開始 ----------------------------------------------------
        LED1_HIGH;LED2_HIGH;LED3_HIGH;LED4_HIGH;// 初始化讓燈全滅

        Uart1_PutString("===== 豆子 STM32例程之ADC_DMA =====rn",39);

        while(1)
        {
        ADC_Value=(float)(sys_analog[5])*330/409600;// 計算公式datasheet上可以找到,但是我沒找到。
        // Tem = (1.42 - ADC_Value)*1000/4.35 + 25;

        ADC_Value=ADC_Value*1000;// ADC是12位的,這里數據類型轉換有問題
        a=ADC_Value/1000;
        b=(ADC_Value-a*1000)/100;
        c=(ADC_Value-a*1000-b*100)/10;
        d=ADC_Value-a*1000-b*100-c*10;

        Uart1_PutChar(a+0);
        Uart1_PutString(".",1);
        Uart1_PutChar(b+0);
        Uart1_PutChar(c+0);
        Uart1_PutChar(d+0);
        Uart1_PutString(" Vn",3);

        Delay_Ms(1000);
        }
        }

        (2)ADC初始化

        C語言:Codee#14685
        /*******************************************************************************
        * Function Name : AD_Configration
        * Description : Configures the ADC1
        * Input : None
        * Output : None
        * Return : None
        *******************************************************************************/
        voidAD_Configration(void)
        {
        ADC_InitTypeDefADC_InitStructure_ADC1;

        /* Resets ADC1 */
        ADC_DeInit(ADC1);

        ADC_InitStructure_ADC1.ADC_Mode=ADC_Mode_Independent;// 配置ADC1 工作在獨立模式
        ADC_InitStructure_ADC1.ADC_ScanConvMode=ENABLE;// 配置ADC1 模數轉換工作在掃描模式(多通道模式)
        ADC_InitStructure_ADC1.ADC_ContinuousConvMode=ENABLE;// 配置ADC1 模數轉換工作在連續模式
        ADC_InitStructure_ADC1.ADC_ExternalTrigConv=ADC_ExternalTrigConv_None;// 配置ADC1 模數轉換有軟件方式啟動而非中斷方式
        ADC_InitStructure_ADC1.ADC_DataAlign=ADC_DataAlign_Right;// 配置ADC1 模數轉換數據對齊方式為右對齊
        ADC_InitStructure_ADC1.ADC_NbrOfChannel=1;// 配置ADC1 模數轉換的通道數目 為 1個通道
        ADC_Init(ADC1,&ADC_InitStructure_ADC1);// 配置ADC1 初始化
        //常規轉換序列1:通道10
        ADC_RegularChannelConfig(ADC1,ADC_Channel_1,1,ADC_SampleTime_239Cycles5);// 配置為 ADC1,通道1,1個通道,采樣時間為239.5個周期,周期越長采集的信號越準越穩
        // 對應的管教所對應的ADC通道時對應的,一定不要搞錯!
        /* Enable the temperature sensor and vref internal channel */
        //ADC_TempSensorVrefintCmd(ENABLE); // 使能溫度傳感器內部參考電壓通道

        ADC_DMACmd(ADC1,ENABLE);// 使能ADC1的DMA請求

        ADC_Cmd(ADC1,ENABLE);// 使能ADC1

        /* Enable ADC1 reset calibaration register */
        ADC_ResetCalibration(ADC1);// 重置ADC1的校準寄存器
        /* Check the end of ADC1 reset calibration register */
        while(ADC_GetResetCalibrationStatus(ADC1));// 檢測是否重置完畢

        /* Start ADC1 calibaration */
        ADC_StartCalibration(ADC1);// 開始校準 ADC1
        /* Check the end of ADC1 calibration */
        while(ADC_GetCalibrationStatus(ADC1));// 檢測是否校準完畢

        /* Start ADC1 Software Conversion */
        ADC_SoftwareStartConvCmd(ADC1,ENABLE);// 軟件使能ADC1的轉換
        }

        (3)DMA初始化

        C語言:Codee#14686

        /*******************************************************************************
        * Function Name : DMA_Config
        * Description : Configures SysTick
        * Input : None
        * Output : None
        * Return : None
        *******************************************************************************/
        voidDMA_Configration(void)
        {
        DMA_InitTypeDefDMA_InitStructure_DMA1;

        DMA_DeInit(DMA1_Channel1);// 配置DMA1 的通道1寄存器為缺省值

        DMA_InitStructure_DMA1.DMA_PeripheralBaseAddr=0x4001244C;// 配置DMA1 外設基地址為 0x4001244C , 在datasheet上可以查到
        DMA_InitStructure_DMA1.DMA_MemoryBaseAddr=(unsignedint)(&sys_analog);// 配置DMA1 內存基地址
        DMA_InitStructure_DMA1.DMA_DIR=DMA_DIR_PeripheralSRC;// 配置DMA1 外設作為數據傳輸的來源 ,就是外設向內存中搬運數據
        DMA_InitStructure_DMA1.DMA_BufferSize=10;// 配置DMA1 數據緩存大小為 10個數據單位
        DMA_InitStructure_DMA1.DMA_PeripheralInc=DMA_PeripheralInc_Disable;// 配置DMA1 外設地址寄存器不變
        DMA_InitStructure_DMA1.DMA_MemoryInc=DMA_MemoryInc_Enable;// 配置DMA1 內存地址寄存器遞增
        DMA_InitStructure_DMA1.DMA_PeripheralDataSize=DMA_PeripheralDataSize_HalfWord;// 配置DMA1 外設數據寬度為 16位 ,這里注意ADC是12位的
        DMA_InitStructure_DMA1.DMA_MemoryDataSize=DMA_MemoryDataSize_HalfWord;// 配置DMA1 內存數據寬度為 16位
        DMA_InitStructure_DMA1.DMA_Mode=DMA_Mode_Circular;// 配置DMA1 工作在循環緩存模式
        DMA_InitStructure_DMA1.DMA_Priority=DMA_Priority_Medium;// 配置DMA1 的相應通道(channel x)的優先級為 中優先級
        DMA_InitStructure_DMA1.DMA_M2M=DMA_M2M_Disable;// 配置DMA1 的相應通道(channel x)內存到內存傳輸為 使能狀態

        DMA_Init(DMA1_Channel1,&DMA_InitStructure_DMA1);// 初始化 DMA1_Channel1 的相關寄存器

        DMA_Cmd(DMA1_Channel1,ENABLE);// 使能 DMA1_Channel1

        }



        關鍵詞: STM32ADCDM

        評論


        技術專區

        關閉
        主站蜘蛛池模板: 拜泉县| 邻水| 宽甸| 浦东新区| 鞍山市| 南开区| 方城县| 丹东市| 萨嘎县| 招远市| 怀安县| 洛阳市| 全州县| 汕尾市| 关岭| 三河市| 体育| 开远市| 江口县| 大荔县| 班玛县| 广南县| 汝南县| 博兴县| 泗洪县| 靖远县| 山阳县| 宜都市| 翁牛特旗| 秦皇岛市| 隆德县| 光山县| 盐池县| 石台县| 通江县| 阜宁县| 资中县| 中阳县| 大庆市| 岑溪市| 黔江区|