新聞中心

        EEPW首頁 > 嵌入式系統(tǒng) > 設計應用 > STM32學習筆記之ADC--DMA方式

        STM32學習筆記之ADC--DMA方式

        作者: 時間:2016-11-28 來源:網(wǎng)絡 收藏
        程序功能是把ADC1模塊里通道14的輸入電壓轉(zhuǎn)換后通過USART2發(fā)送到PC,在PC機上用串口調(diào)試助手觀察接收數(shù)據(jù):

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

        STM32是12位ADC,測量結果基本還可以!程序用了DMA來傳輸ADC轉(zhuǎn)換值,調(diào)高了讀取速度。串口部分用是上一篇串口調(diào)試筆記里的代碼。


        #include
        #include

        #define ADC1_DR_Address((u32)0x4001244C)

        #ifdef __GNUC__

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

        vu16 ADC_ConvertedValue;

        void RCC_Config(void);
        void GPIO_Config(void);
        void USART_Config(void);
        void DMA_Config(void);
        void ADC_Config(void);
        void Put_String(u8 *p);
        void Delay(vu32 nCount);
        int main(void)
        {
        RCC_Config();
        GPIO_Config();
        USART_Config();
        DMA_Config();
        ADC_Config();


        while(1)
        {

        Delay(0x8FFFF);
        printf("ADC = %X Volt = %d mvrn", ADC_ConvertedValue, ADC_ConvertedValue*3300/4096);

        }
        }

        void RCC_Config(void)
        {
        ErrorStatus HSEStartUpStatus;//定義外部高速晶體啟動狀態(tài)枚舉變量
        RCC_DeInit();//復位RCC外部設備寄存器到默認值
        RCC_HSEConfig(RCC_HSE_ON); //打開外部高速晶振
        HSEStartUpStatus = RCC_WaitForHSEStartUp();//等待外部高速時鐘準備好
        if(HSEStartUpStatus == SUCCESS)//外部高速時鐘已經(jīng)準別好
        {

        RCC_HCLKConfig(RCC_SYSCLK_Div1);//配置AHB(HCLK)時鐘=SYSCLK
        RCC_PCLK2Config(RCC_HCLK_Div1); //配置APB2(PCLK2)鐘=AHB時鐘
        RCC_PCLK1Config(RCC_HCLK_Div2);//配置APB1(PCLK1)鐘=AHB 1/2時鐘
        RCC_ADCCLKConfig(RCC_PCLK2_Div4);//配置ADC時鐘=PCLK2 1/4

        RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9);
        //配置PLL時鐘 == 外部高速晶體時鐘*9
        RCC_ADCCLKConfig(RCC_PCLK2_Div4);//配置ADC時鐘= PCLK2/4

        RCC_PLLCmd(ENABLE);//使能PLL時鐘
        while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET) //等待PLL時鐘就緒
        {
        }
        RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);//配置系統(tǒng)時鐘 = PLL時鐘

        while(RCC_GetSYSCLKSource() != 0x08) //檢查PLL時鐘是否作為系統(tǒng)時鐘
        {
        }
        }
        RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA, ENABLE);//使能DMA時鐘
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1 | RCC_APB2Periph_GPIOC, ENABLE);
        //使能ADC1,GPIOC時鐘
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD | RCC_APB2Periph_AFIO, ENABLE);
        //打開GPIOD和AFIO時鐘

        RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2, ENABLE);//使能串口2時鐘
        }

        void GPIO_Config(void)
        {
        //設置RTS(PD.04),Tx(PD.05)為推拉輸出模式
        GPIO_InitTypeDef GPIO_InitStructure; //定義GPIO初始化結構體
        GPIO_PinRemapConfig(GPIO_Remap_USART2, ENABLE);//使能GPIO端口映射USART2
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4 | GPIO_Pin_5;//選擇PIN4 PIN5
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //引腳頻率50M
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;//引腳設置推拉輸出
        GPIO_Init(GPIOD, &GPIO_InitStructure);//初始化GPIOD
        //配置CTS (PD.03),USART2 Rx (PD.06)為浮點輸入模式
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3 | GPIO_Pin_6;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
        GPIO_Init(GPIOD, &GPIO_InitStructure);
        //配置PC4為模擬輸入
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
        GPIO_Init(GPIOC, &GPIO_InitStructure);

        }


        上一頁 1 2 下一頁

        評論


        技術專區(qū)

        關閉
        主站蜘蛛池模板: 登封市| 玉龙| 桃江县| 休宁县| 潜山县| 喀什市| 夏邑县| 麟游县| 北辰区| 临泉县| 孝昌县| 平昌县| 普安县| 营山县| 兴义市| 湄潭县| 双牌县| 鹿邑县| 巧家县| 沾化县| 东乡| 富宁县| 蓬莱市| 化德县| 钦州市| 郑州市| 玛多县| 巴东县| 抚顺县| 荔波县| 灵寿县| 库尔勒市| 郎溪县| 固原市| 北安市| 五莲县| 县级市| 行唐县| 清水河县| 如东县| 宜丰县|