c - DMA 内存到内存模式在 STM32F103C8 中不起作用

标签 c embed stm32 dma

我正在尝试在 STM32F103C8 中使用 DMA MEM2MEM 模式复制数组

但是当我运行下面的代码时,dest 数组仍然为空,没有触发中断事件

请给我解决方案,或者如果我错过任何配置请通知我,非常感谢

我的代码:

uint32_t source[MEMSIZE];
uint32_t dest[MEMSIZE];

for (i = 0; i < MEMSIZE; i++) {
    source[i] = i;
}

//Reset CCR and CNDTR register 
DMA1_Channel1->CCR &= ~0x7FFF;
DMA1_Channel1->CNDTR &= ~0xFFFF;
/*
* DMA configure:
* MEM 2 MEM: Enabled
* Priority: Medium
* Memory size: 32 bit
* Peripheral size: 32bit
* Memory increment: ON
* Peripheral Increment: ON
* Circular: OFF
* Direction: Copy from peripheral
* Transfer error IR: OFF
* Haft Transferred IR: OFF
* Transfer complete IR: ON
* Channel Enable: OFF
*/
DMA1_Channel1->CCR |= 0x00005AC2;
// Setting number of data
DMA1_Channel1->CNDTR |= MEMSIZE;
// Setting Peripheral address
DMA1_Channel1->CPAR = (uint32_t)source;
// Setting memory address
DMA1_Channel1->CMAR = (uint32_t)dest;
// NVIC setup
NVIC_SetPriority(DMA1_Channel1_IRQn, 0);
NVIC_EnableIRQ(DMA1_Channel1_IRQn);
// Enable DMA channel
DMA1_Channel1->CCR |= 0x00000001;

更新:我尝试使用 GPIO ODR 而不是内存的数组地址,效果非常好

最佳答案

我无法检测到您代码中的问题,但我在Blue Pill板上创建了一个最小的示例。我在调试 session 中检查了 dest 数组中的值。该代码似乎按预期工作。

#include "stm32f1xx.h"

#define MEMSIZE 32

uint32_t source[MEMSIZE];
uint32_t dest[MEMSIZE];

int main(void) {

    RCC->AHBENR |= RCC_AHBENR_DMA1EN; // Enable DMA clock

    // Initialize the test data
    for (int i = 0; i < MEMSIZE; ++i) {
        source[i] = i;
    }

    DMA1_Channel1->CCR |= DMA_CCR_MEM2MEM // Memory to memory mode
            | (0b01 << DMA_CCR_PL_Pos) // Medium priority
            | (0b10 << DMA_CCR_MSIZE_Pos) // Memory size: 32-bits
            | (0b10 << DMA_CCR_PSIZE_Pos) // Peripheral size: 32-bits
            | DMA_CCR_MINC // Memory increment is enabled
            | DMA_CCR_PINC; // Peripheral increment is enabled
    DMA1_Channel1->CPAR = (uint32_t) source;
    DMA1_Channel1->CMAR = (uint32_t) dest;
    DMA1_Channel1->CNDTR = MEMSIZE;

    DMA1_Channel1->CCR |= DMA_CCR_EN; // Start DMA transfer

    while (1) {

    }
}

关于c - DMA 内存到内存模式在 STM32F103C8 中不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60082323/

相关文章:

javascript - Manifest_version = 2 且无内联 javascript 的 NaCl 中的模块加载进度事件

iPhone SDK - 嵌入 YouTube 视频的 UIWebView

embed - 更改播放视频

java - 在智能手机上播放通过蓝牙从 SensorTile 接收的音频 (STEVAL-STLKT01V1)

c - STM32 NUCLEO F401RE无法写入GPIO BSRR中的某些位

c - 多进程服务器还是多线程服务器?

c - 线程安全唯一事务ID

java - 将 Java 套接字文件描述符传递给 C 二进制文件的最有效方法

c - 开关盒不打印 c

c - 从微 Controller STM32F401RET6将数据写入micro SD卡