STM32 ADC 同步規則模式(兩通道)

来源:http://www.cnblogs.com/VerilogHDL/archive/2016/10/14/5959486.html
-Advertisement-
Play Games

感覺直接貼代碼會好點。。。。。。 有些註釋直接從Keil5裡面粘出來到這裡就不支持了。。。。。。。好尷尬。。。。下次碼代碼註釋還是全英算了、、、 哈哈。。有什麼問題可以一起來探討、、、不知道為啥分類不到嵌入式那裡只好點Linux那裡了。。 ...


  感覺直接貼代碼會好點。。。。。。

  

  1 #include "adc.h"
  2 
  3 float AD1_Value[N];
  4 float AD2_Value[N];
  5 volatile u32 ADCConvertedValue[N];//ADת»»»º³åÇø,Õ¼ÓÃRAM 0.8KB
  6 
  7 
  8 void  Adc_Init(void)
  9 {     
 10     TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
 11     ADC_InitTypeDef ADC_InitStructure; 
 12     GPIO_InitTypeDef GPIO_InitStructure;
 13     DMA_InitTypeDef DMA_InitStructure;
 14     NVIC_InitTypeDef NVIC_InitStructure;
 15     ////////////////////////////////////  Enable Clock   ///////////////////////////////////////////////////////////////////////
 16     RCC_ADCCLKConfig(RCC_PCLK2_Div6); //72M/6=12,ADC the Max Time Is Lager Than 14M
 17     RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE); 
 18     RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA |RCC_APB2Periph_ADC1    , ENABLE );      //ʹÄÜADC1ͨµÀʱÖÓ
 19     RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA |RCC_APB2Periph_ADC2    , ENABLE );      //ʹÄÜADC2ͨµÀʱÖÓ
 20 //    RCC_ADCCLKConfig(RCC_PCLK2_Div6); //72M/6=12,ADC the Max Time Is Lager Than 14M        
 21     
 22     //PA0.PA1.PA4.PA5 ×÷ΪģÄâͨµÀÊäÈëÒý½Å                         
 23     GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2 | GPIO_Pin_1;
 24     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;        //Ä£ÄâÊäÈëÒý½Å
 25     GPIO_Init(GPIOA, &GPIO_InitStructure);    
 26     
 27 ////////////////////////////////////////Initialize DMA /////////////////////////////////////////////////////////////////////    
 28     DMA_DeInit(DMA1_Channel1); //Reset DMA_Channel_1's Register To Default Value
 29     DMA_InitStructure.DMA_PeripheralBaseAddr = (u32)&ADC1->DR; //DMA Device to ADC's Base Address
 30     DMA_InitStructure.DMA_MemoryBaseAddr = (u32)&ADCConvertedValue; //DMA Memory Base Address    
 31 //    DMA_InitStructure.DMA_MemoryBaseAddr = (u32)&ADCConvertedValue; //DMA Memory Base Address
 32     DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC; //Memory be use to Data Chansminsion's Destination
 33     DMA_InitStructure.DMA_BufferSize = N; //DMA Channel's DMA Buffer Size
 34     DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable; //Outside Address's Register Is not Change 
 35     DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable; //Buffer Address's Register Is Increasing
 36     DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Word; //Data size is 16 Bit
 37     DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Word; //Data Size Is 16 Bit 
 38     DMA_InitStructure.DMA_Mode = DMA_Mode_Circular; //Work in Cycle Cache Mode
 39 
 40     DMA_InitStructure.DMA_Priority = DMA_Priority_High; //DMA Channel X Have The Higest Priority
 41     DMA_InitStructure.DMA_M2M = DMA_M2M_Disable; //DMA Channel X do not set up to Chansmission in Memory to Memory
 42     DMA_Init(DMA1_Channel1, &DMA_InitStructure); //According to DMA_InitStruct to Initialize the DMA Channel    
 43     DMA_Cmd(DMA1_Channel1,ENABLE);                               //ʹÄÜDMA1ͨµÀ1
 44 
 45 
 46 ////////////////////////////////////////Initialize NVIC /////////////////////////////////////////////////////////////////////    
 47     NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
 48     NVIC_InitStructure.NVIC_IRQChannel = DMA1_Channel1_IRQn;
 49     NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
 50     NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
 51     NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
 52     NVIC_Init(&NVIC_InitStructure);
 53     DMA_ITConfig(DMA1_Channel1,DMA_IT_TC,ENABLE);            //ʹÄÜDMA CH1ÖÐ¶Ï  
 64 ////////////////////////////////////////Initialize ADC /////////////////////////////////////////////////////////////////////    
 65 
 66     ADC_DeInit(ADC1);  //¸´Î»ADC1,½«ÍâÉè ADC1 µÄÈ«²¿¼Ä´æÆ÷ÖØÉèΪȱʡֵ
 67     ADC_DeInit(ADC2);  //¸´Î» ADC1,½«ÍâÉè ADC1 µÄÈ«²¿¼Ä´æÆ÷ÖØÉèΪȱʡֵ
 68     
 69     ADC_InitStructure.ADC_Mode = ADC_Mode_RegSimult;    //ADC¹¤×÷ģʽ:ADC1ºÍADC2¹¤×÷ÔÚ¶ÀÁ¢Ä£Ê½
 70     ADC_InitStructure.ADC_ScanConvMode = ENABLE;    //ADC Works in Scan Model
 71     ADC_InitStructure.ADC_ContinuousConvMode = ENABLE;    //ADC works in Continious Changing Model
 72     ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;    //ADC is triggered by sofeware instead of Outside
 73     ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;    //ADC Data Right Align
 74     ADC_InitStructure.ADC_NbrOfChannel = 1;    //˳Ðò½øÐйæÔòת»»µÄADCͨµÀµÄÊýÄ¿
 75     ADC_Init(ADC1, &ADC_InitStructure);    //¸ù¾ÝADC_InitStructÖÐÖ¸¶¨µÄ²ÎÊý³õʼ»¯ÍâÉèADCxµÄ¼Ä´æÆ÷   
 76     ADC_RegularChannelConfig(ADC1, ADC_Channel_1,  1, ADC_SampleTime_1Cycles5 );
 77     ADC_DMACmd(ADC1,ENABLE);                         //ʹÄÜADC1 DMA
84 ADC_InitStructure.ADC_Mode = ADC_Mode_RegSimult; //ADC¹¤×÷ģʽ:ADC2¹¤×÷ÔÚ¶ÀÁ¢Ä£Ê½ 85 ADC_InitStructure.ADC_ScanConvMode = ENABLE; //ADC Works in Scan Model 86 ADC_InitStructure.ADC_ContinuousConvMode = ENABLE; //ADC works in Continious Changing Model 87 ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None; //ADC is triggered by sofeware instead of Outside 88 ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right; //ADC Data Right Align 89 ADC_InitStructure.ADC_NbrOfChannel = 1; //˳Ðò½øÐйæÔòת»»µÄADCͨµÀµÄÊýÄ¿ 90 ADC_RegularChannelConfig(ADC2, ADC_Channel_2, 1, ADC_SampleTime_1Cycles5 ); 91 ADC_Init(ADC2, &ADC_InitStructure); //¸ù¾ÝADC_InitStructÖÐÖ¸¶¨µÄ²ÎÊý³õʼ»¯ÍâÉèADCxµÄ¼Ä´æÆ÷ 92 ADC_ExternalTrigConvCmd(ADC2, ENABLE); 93 94 95 ADC_DMACmd(ADC1, ENABLE); 96 ADC_Cmd(ADC1, ENABLE); //ʹÄÜÖ¸¶¨µÄADC1 98 99 ADC_ResetCalibration(ADC1); //ʹÄܸ´Î»Ð£×¼ 100 while(ADC_GetResetCalibrationStatus(ADC1)); //µÈ´ý¸´Î»Ð£×¼½áÊø 101 ADC_StartCalibration(ADC1); //¿ªÆôADУ׼ 102 while(ADC_GetCalibrationStatus(ADC1)); //µÈ´ýУ׼½áÊø 103 104 ADC_Cmd(ADC2, ENABLE); 105 ADC_ResetCalibration(ADC2); //ʹÄܸ´Î»Ð£×¼ 106 while(ADC_GetResetCalibrationStatus(ADC2)); //µÈ´ý¸´Î»Ð£×¼½áÊø 107 ADC_StartCalibration(ADC2); //¿ªÆôADУ׼ 108 while(ADC_GetCalibrationStatus(ADC2)); //µÈ´ýУ׼½áÊø 109 110 // delay_ms(10); 111 ADC_SoftwareStartConvCmd(ADC1, ENABLE); //ʹÄÜÖ¸¶¨µÄADC1µÄÈí¼þת»»Æô¶¯¹¦ÄÜ 112 } 113 114 115 void DMA1_Channel1_IRQHandler() 116 { 117 u16 i; 118 u16 temp1,temp2; 119 DMA_ClearFlag(DMA1_FLAG_TC1); //清除DMA傳輸完成中斷 120 DMA_Cmd(DMA1_Channel1,DISABLE); 121 for(i = 0; i < N ; i++) 122 { 123 temp1 = (ADCConvertedValue[i]<<16)>>16; 124 temp2 = ADCConvertedValue[i] >> 16; 125 AD1_Value[i] =((float)temp1)*(3.3/4096); 126 AD2_Value[i] =((float)temp2)*(3.3/4096); 127 Get_tem_buf(i); 128 } 129 DMA_Cmd(DMA1_Channel1,ENABLE); 131 LED0 = ~LED0; 132 }

有些註釋直接從Keil5裡面粘出來到這裡就不支持了。。。。。。。好尷尬。。。。下次碼代碼註釋還是全英算了、、、

哈哈。。有什麼問題可以一起來探討、、、不知道為啥分類不到嵌入式那裡只好點Linux那裡了。。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 本文出處: http://www.cnblogs.com/wy123/p/5958047.html 最近發現還有不少做開發的小伙伴,在寫存儲過程的時候,在參考已有的不同的寫法時,往往很迷茫,不知道各種寫法孰優孰劣,該選用那種寫法,以及各種寫法優缺點,本文以一個簡單的查詢存儲過程為例,簡單說一下各種寫 ...
  • 搜索大量的網頁,確沒有一個實用的設置教程,也正是speechless. 直接做個教程,方便大家的使用 1、安裝 boom 2 到app store 上搜索boom 我安裝的是正版的,需要128元。 你可以百度上搜索破解版的,沒有親測過好不好用 2、安裝好後,進入軟體,會讓你安裝boom 的擴展插件, ...
  • 除了使用 "expr" 進行簡單的加減乘處,shell還提供了更多的算術運算符。 shell的的算術運算符必須使用 結構,且不用另加轉義運算符,絕不能使用 肯定是報錯。 |運算符|含義| |: |: | |++, |自增,自減運算符| |+, ,!,~|正負,非,按位取反| | , /, %|乘法, ...
  • 在bind邦定時,通常會出現bind:Address alreasy is use錯誤。 此錯誤可以用setsockopt函數避免 int setsockopt(int sockfd,int level,int optname,const void *optval,socklen_t optlen) ...
  • 簡介 ROS 提供的 gmaping 包是用來生成地圖的,它是對著名的開源 OpenSlam 包在 ROS 框架下的一個實現。這個包提供了對激光設備的 Slam,根據激光設備的輸入和姿態數據從而建立一個基於網格的的2D地圖。它需要從 ROS 系統監聽許多 Topic,並輸出一個 Topic——map ...
  • 小計:Linux 7有很多操作與命令與之前版本不一樣,比如之一修改運行級別。 RHEL 6 +6版本修改運行級別:vim /etc/inittab 將末行 id:3:initdefault: 中的3修改為5即可實現由預設命令行啟動模式轉為圖形化啟動模式。 RHEL 7 +7版本採用 來定義運行級別, ...
  • 借鑒鏈接:http://www.cr173.com/html/67361_1.html Win10提示沒有許可權使用網路資源解決方法 1、打開控制面板; 2、在所有控制面板項中找到憑據管理器; 3、添加windows憑據; 4、在地址欄填對方電腦名,用戶名guest,密碼空; 5、在對方電腦的用戶設 ...
  • 在FFT處理線面呢,很多人就說要加窗,加窗的好處了就是防止能量泄露和高頻濾波啊,不過精度呢就會相應的降低。(聽說是這樣的。本人小白) 窗的種類也很多啦,然後聽說啥都不懂的就可以了選擇漢寧窗。。。 在MATLAB裡面呢直接調用hann(); 然後呢在stm32裡面呢就直接一個for。。。。。。感覺用了 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...