簡體   English   中英

帶有 DMA 7 通道常規組的 STM32F4 ADC 不工作

[英]STM32F4 ADC with DMA 7 Channel regular group isn't working

我正在嘗試設置我的 STM32F407-Discovery 板以使用 DMA controller 從 ADC1 讀取多個 ADC 通道。 可以在不使用 DMA 的情況下讀取一個值。 啟用 DMA 時,僅轉換通道 1。 其他數組元素用 0 填充。

不幸的是,我找不到我的錯誤,因為我不太確定從哪里開始。 也許你可以在這里幫助我。

我的完整代碼如下所示:

#include "stm32f4xx.h"
#include "system_stm32f4xx.h"

/*****************************
MAIN function
*****************************/
void ADC_IRQHandler(void);

uint32_t n=0;                                               // defines global variable n for number of convertions
uint32_t value[2];
float show[2];
int i=0;

int main()
{
    RCC->AHB1ENR |= RCC_AHB1ENR_GPIOAEN;                    // activate clock for port A
    RCC->AHB1ENR |= RCC_AHB1ENR_DMA2EN;                     // activate clock for DMA2
    RCC->APB2ENR |= RCC_APB2ENR_ADC1EN;                     // activate clock for ADC1
    
  DMA2_Stream0->PAR = (uint32_t) &ADC1->DR;                 // Regular Data Register to load ADC1 as DMA-Sourceadress
    DMA2_Stream0->M0AR = (uint32_t) &value;                 // Regular Data Register to store ADC1 DMA data     
    DMA2_Stream0->NDTR = 2;                                 // number of data to be transferred (here 1)    
    DMA2_Stream0->CR |= 0x00022901;                         // DMA Stream Konfiguration for the incoming ADC1 data (prio: Medium / MSIZE: Half-word / PSIZE: half-word / circular/ enable)
    
    GPIOA->MODER |= 0x0000FFFC;                                     // Pin 1-7 Port a as analog
    ADC1->SQR1 = 0x00100000;                                            // two conversions
    ADC1->SQR2 = 0; 
    ADC1->SQR3 = 0x00000041;                                            // conversion ADC in1 and in2
    ADC1->SMPR2 |= 0xFFFFFFFF;                                      // sampletime 
    ADC1->CR2 |= ADC_CR2_CONT;                                      // choose continiouse Mode for ADC3
    ADC1->CR2 |= ADC_CR1_SCAN;                                      // scan mode active
    ADC1->CR2 |= ADC_CR2_DDS;                                           // DMA via DDS-Bit
    ADC1->CR2 |= ADC_CR2_DMA;                                           // activate DMA module
    ADC1->CR2 |= ADC_CR2_ADON;                                      // Activate the AD converter
    ADC1->CR2 |= ADC_CR2_SWSTART;                                   // start convertion
    
    while(1)
    {
        show[0] = (float) value[0]*(float) 3.3 / (float)0xFFF;
        show[1] = (float) value[1]*(float) 3.3 / (float)0xFFF;
    }
}

因此 DMA Stream 設置為:

  • 4 位保留
  • 3 位通道 Select:我正在使用通道 0 訪問 ADC1
  • 2位Memory突發傳輸配置:單次傳輸
  • 2位外設突發傳輸配置:單次傳輸
  • 1 位保留
  • 1 位當前目標 0(DMA_SxM0AR 指針)
  • 1 Bit 雙緩沖模式:無緩沖切換
  • 2 位優先級:中:01
  • 1 位 外設增量偏移大小禁用 0
  • 2 位 Memory 數據大小:半字 01
  • 2位外設數據大小:半字01
  • 1 Bit Memory 增量模式:禁用 0
  • 1 Bit 外設增量模式:禁用 0
  • 1 位循環模式:啟用 1
  • 1 位數據傳輸方向:外設到內存 00
  • 1 位外設流量 controller 0
  • 1 位傳輸完成中斷使能 0
  • 1 Bit 半傳輸中斷使能 0
  • 1 位傳輸錯誤中斷使能 0
  • 1 Bit 直接模式錯誤中斷使能 0
  • 1 位啟用 1 匯總:10 0010 1001 0000 0001

GPIOA 引腳 1 到 7 配置為模擬模式: 11 個用於七個通道

GPIOA->MODER |= 0x0000FFFC;

ADC 1 是常規序列寄存器 1 配置為 2 次轉換ADC1->SQR1 = 0x00100000;

常規序列寄存器 1 配置為第 1 位的引腳 A1 轉換和第 2 位的引腳 A2。 ADC1->SQR3 = 0x00000041;

為了測試采樣時間寄存器設置為 480 個周期,通道 0 到 9 ADC1->SMPR2 |= 0xFFFFFFFF;

發現我的錯誤,需要啟用 memory 增量模式。 另一個錯誤是錯誤的 memory 數據大小。 將我的數據類型從值更改為 16 位。 現在工作正常。

謝謝你們。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM