久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2732|回復(fù): 0
打印 上一主題 下一主題
收起左側(cè)

STM32 ADC多通道連續(xù)采集 +DMA 寄存器版本程序問題

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:788840 發(fā)表于 2020-6-29 14:04 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
2黑幣
//這是部分代碼,剛剛帖子不全,這是下面的代碼部分,
//ADC多通道連續(xù)采集,采用DMA模式,寄存器版本寫的程序。但是結(jié)果卻是只能初始化時候傳遞一個數(shù)據(jù),本來應(yīng)該采集50次的,只采集一次,用串口顯示結(jié)果是0.38,這是一次采集的電壓除以50的結(jié)果,也就是說DMA只傳遞了一個數(shù)據(jù),找了很久無果,請教大家!!!

  1. #include "sys.h"
  2. #include "delay.h"
  3. #include "LED.h"
  4. #include "usart.h"

  5. #define N  50
  6. #define M  3

  7. void filter(void);
  8. void ADC_Init(void);                                 //ADC通道初始化
  9. void DMA_Init(DMA_Channel_TypeDef*DMA_CHx);//配置DMA1_CHx

  10. vu16 ADC_Value[N][M];//用來存放ADC轉(zhuǎn)換結(jié)果,也是DMA的目標地址 define a N line and M row
  11. u16 filterADC[M];//用來存放平均值
  12. int main(void)
  13. {
  14.     float V1;
  15.         float V2;
  16.         float V3;
  17.         
  18.          Stm32_Clock_Init(9);        //系統(tǒng)時鐘設(shè)置
  19.         delay_init(72);                            //延時初始化
  20.     uart_init(72,115200);
  21.         LED_Init();                                  //初始化與LED連接的硬件接口

  22.         ADC_Init();
  23.     DMA_Init(DMA1_Channel1);
  24.                
  25.         while(1)
  26.         {               
  27.                
  28.                 delay_ms(10);
  29.                         filter();
  30.                                        
  31.                 V1=filterADC[0]*3.3/4095;printf("V1=%f\r\n",V1);
  32.                                 V2=filterADC[1]*3.3/4095;printf("V2=%f\r\n",V2);
  33.                                 V3=filterADC[2]*3.3/4095;printf("V3=%f\r\n\r\n\r\n",V3);

  34.                            delay_ms(500);
  35.                            LED0=!LED0;               
  36.         
  37.         }                                                                                                                                                                                                                                                                                                                                                            
  38. }
  39. void filter(void)
  40. {
  41.         vu32 sum=0;                //必須初始化為0,否則初值將保持上次調(diào)用值。
  42.         vu8 i=0,j=0;
  43.         for(i=0;i<M;i++)                //M row
  44.         {
  45.                 for(j=0;j<N;j++)        //N line
  46.                 {
  47.                         sum+=ADC_Value[j][i];
  48.                 }
  49.                 filterADC[i]=sum/N;
  50.                 sum=0;
  51.         }        
  52. }

  53.            
  54. //初始化ADC1
  55. //以規(guī)則通道為例
  56. //開啟ADC1通道1 ADC1通道2 ADC1通道3        開啟連續(xù)掃描模式         使能DMA                                                                                                                           

  57. void  ADC_Init(void)
  58. {   
  59.         //先初始化IO口

  60.          RCC->APB2ENR|=1<<2;    //使能PORTA口時鐘
  61.     RCC->APB2ENR|=1<<9;    //ADC1時鐘使能

  62.         RCC->CFGR&=~(3<<14);   //分頻因子清零        
  63.         //SYSCLK/DIV2=12M ADC時鐘設(shè)置為12M,ADC最大時鐘不能超過14M!
  64.         //否則將導致ADC準確度下降!
  65.         RCC->CFGR|=2<<14;   //ADC 分頻系數(shù)為6 adcclock為12M         
  66.         GPIOA->CRL&=0XFFFF000F;//PA1 PA2 PA3 anolog輸入

  67.         RCC->APB2RSTR|=1<<9;   //ADC1復(fù)位
  68.         RCC->APB2RSTR&=~(1<<9);//復(fù)位結(jié)束
  69.                   
  70.         ADC1->CR1&=0XF0FFFF;   //工作模式清零
  71.         ADC1->CR1|=0<<16;      //獨立工作模式
  72.         ADC1->CR1&=1<<8;    //掃描模式        
  73.         ADC1->CR2&=1<<1;    //連續(xù)轉(zhuǎn)換模式
  74.         ADC1->CR2&=~(7<<17);           
  75.         ADC1->CR2|=7<<17;           //不使用外部觸發(fā)模式  
  76.         ADC1->CR2&=~(1<<11);   //右對齊        
  77.     ADC1->SQR1&=0xFF0FFFFF;
  78.         ADC1->SQR1|=2<<20;     //3個轉(zhuǎn)換在規(guī)則序列中 也就是只轉(zhuǎn)換規(guī)則序列1~3

  79.     ADC1->SMPR2&=~(7<<(3*1));   //通道1采樣時間清空         
  80.          ADC1->SMPR2|=7<<(3*1); //通道1  239.5周期,提高采樣時間可以提高精確度
  81.     ADC1->SQR3&=~(0X0000001F<<(5*0));//規(guī)則序列1 ADC1通道1
  82.         ADC1->SQR3|=1<<(5*0);        

  83.     ADC1->SMPR2&=~(7<<(3*2));   //通道2采樣時間清空         
  84.          ADC1->SMPR2|=7<<(3*2); //通道2  239.5周期,提高采樣時間可以提高精確度
  85.     ADC1->SQR3&=~(0X0000001F<<(5*1));//規(guī)則序列1 ADC1通道1
  86.         ADC1->SQR3|=2<<(5*1);        

  87.     ADC1->SMPR2&=~(7<<(3*3));   //通道3采樣時間清空         
  88.          ADC1->SMPR2|=7<<(3*3); //通道3  239.5周期,提高采樣時間可以提高精確度
  89.     ADC1->SQR3&=~(0X0000001F<<(5*2));//規(guī)則序列1 ADC1通道1
  90.         ADC1->SQR3|=3<<(5*2);

  91.     ADC1->CR2|=1<<8;        //使能DMA
  92.     ADC1->CR2|=1<<0;           //開啟AD轉(zhuǎn)換器         

  93.     ADC1->CR2|=1<<3;       //使能復(fù)位校準  
  94.         while(ADC1->CR2&1<<3); //等待復(fù)位結(jié)束                          
  95.     //該位由軟件設(shè)置并由硬件清除。在校準寄存器被初始化后該位將被清除。                  
  96.         ADC1->CR2|=1<<2;        //開啟AD校準           
  97.         while(ADC1->CR2&1<<2);  //等待校準結(jié)束
  98.         //該位由軟件設(shè)置以開始校準,并在校準結(jié)束時由硬件清除        

  99.         ADC1->CR2|=1<<20;      //使用SWSTART觸發(fā)         必須使用一個事件來觸發(fā)
  100.         ADC1->CR2|=1<<22;       //啟動規(guī)則轉(zhuǎn)換通道         
  101. }                                 
  102.                     
  103. //DMA1的各通道配置
  104. //這里的傳輸形式是固定的,這點要根據(jù)不同的情況來修改
  105. //從存儲器->外設(shè)模式/16位數(shù)據(jù)寬度/存儲器增量模式
  106. //DMA_CHx:DMA通道CHx
  107. //cpar:外設(shè)地址
  108. //cmar:存儲器地址
  109. //cndtr:數(shù)據(jù)傳輸量  
  110. void DMA_Init(DMA_Channel_TypeDef*DMA_CHx)
  111. {
  112.         RCC->AHBENR|=1<<0;                        //開啟DMA1時鐘
  113.         delay_ms(5);                                //等待DMA時鐘穩(wěn)定
  114.     DMA_CHx->CCR&=~0x0001;
  115.     DMA_CHx->CCR=0;
  116.         DMA_CHx->CPAR=0;                  
  117.         DMA_CHx->CMAR=0;         
  118.         DMA_CHx->CNDTR=0;                    
  119.         DMA1->IFCR=0x0000000F;
  120.         
  121.         DMA_CHx->CPAR=(u32)&ADC1->DR; //DMA1 外設(shè)地址
  122.         DMA_CHx->CMAR=(u32)&ADC_Value; //DMA1,存儲器地址
  123.         DMA_CHx->CNDTR=N*M;                //DMA1,傳輸數(shù)據(jù)量

  124.         DMA_CHx->CCR|=0<<4;                  //從外設(shè)讀 DIR數(shù)據(jù)傳輸方向
  125.         DMA_CHx->CCR|=1<<5;                  //循環(huán)模式 CIRC=1
  126.         DMA_CHx->CCR|=0<<6;                 //外設(shè)地址非增量模式
  127.         DMA_CHx->CCR|=1<<7;                  //存儲器增量模式
  128.         DMA_CHx->CCR|=1<<8;                  //外設(shè)數(shù)據(jù)寬度為16位
  129.         DMA_CHx->CCR|=1<<10;                 //存儲器數(shù)據(jù)寬度16位
  130.         DMA_CHx->CCR|=3<<12;                 //高優(yōu)先級
  131.         DMA_CHx->CCR|=0<<14;            //非存儲器到存儲器模式                          

  132.     DMA_CHx->CCR|=1<<0;          //開啟DMA傳輸

  133. }
復(fù)制代碼


多通道ADC檢測+DMA(寄存器版本正在調(diào)試).7z

88.92 KB, 下載次數(shù): 14

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏2 分享淘帖 頂 踩
回復(fù)

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機教程網(wǎng)

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 日韩一级电影免费观看 | 欧美三级三级三级爽爽爽 | 玖玖国产 | 国产成人精品在线 | 一级毛片观看 | 国产乱码精品一区二区三区忘忧草 | 亚洲在线 | 亚洲成人在线视频播放 | 浮生影院免费观看中文版 | 日韩av手机在线观看 | 国产精品一区二区欧美黑人喷潮水 | 1级黄色大片 | 国产区精品 | 成人水多啪啪片 | 在线播放国产视频 | 亚洲综合视频 | 午夜精品三区 | 玖玖视频国产 | 欧美亚洲国产一区二区三区 | 日本黄色免费大片 | 亚洲欧美激情精品一区二区 | 欧美精品99 | 国产一区二区在线播放 | 国产精品视频中文字幕 | 日韩一级在线 | 91精品国产麻豆 | 亚洲国产精品成人 | 国产农村妇女精品一二区 | 亚洲精品一区二区三区 | 91在线免费视频 | 久久性色 | 人人澡视频 | 国产精品二区三区在线观看 | 精品中文在线 | 免费视频一区二区 | 欧美日韩国产在线观看 | 色欧美综合 | 精品久久久久久 | 国产va| 国产资源网 | 一区二区三区精品视频 |