wallelin 发表于 2013-9-30 19:17:27

STM32F103 DMA问题

请问一个很奇怪的问题,我用的是STM32F103的板,在初始化DMA的,怎么弄都不能用,我调试的时候发现DMA的寄存器的怎么设置都是0,都没有设置成功这个是什么原因呢?有没有什么别的初始化没弄。大家帮帮忙,看一下。下面是代码
 
DMA_InitTypeDef     tDMAProperty;
    NVIC_InitTypeDef    tNVICProperty;

    RCC_APB2PeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);
    DMA_Cmd(DMA1_Channel4, DISABLE);
   
    /* 配置DMA通道 */
    DMA_DeInit(DMA1_Channel4);

    /* 初始化中断 */

    memset(&tNVICProperty, 0x00, sizeof(NVIC_InitTypeDef));

    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
   
    tNVICProperty.NVIC_IRQChannel                   = 0;
    tNVICProperty.NVIC_IRQChannelPreemptionPriority = 0;
    tNVICProperty.NVIC_IRQChannelSubPriority        = 1;
    tNVICProperty.NVIC_IRQChannelCmd                = ENABLE;

    NVIC_Init(&tNVICProperty);

    memset(&tDMAProperty, 0x00, sizeof(DMA_InitTypeDef));

    tDMAProperty.DMA_PeripheralBaseAddr     = (INT32U)(&USART1->DR);                // 外设地址
    tDMAProperty.DMA_MemoryBaseAddr         = (INT32U)gs_aucUsart1SndDMABuf;       // 内存地址
    tDMAProperty.DMA_DIR                    = DMA_DIR_PeripheralDST;                // dma传输方向单向
    tDMAProperty.DMA_BufferSize             = USART_SEND_DMA_SIZE;                  // 设置DMA在传输时缓冲区的长度
    tDMAProperty.DMA_PeripheralInc          = DMA_PeripheralInc_Disable;            // 设置DMA的外设递增模式,一个外设
    tDMAProperty.DMA_MemoryInc              = DMA_MemoryInc_Enable;                 // 设置DMA的内存递增模式
    tDMAProperty.DMA_PeripheralDataSize     = DMA_PeripheralDataSize_Byte;          // 外设数据字长
    tDMAProperty.DMA_MemoryDataSize         = DMA_MemoryDataSize_Byte;              // 内存数据字长
    tDMAProperty.DMA_Mode                   = DMA_Mode_Circular;                      // 设置DMA的传输模式
    tDMAProperty.DMA_Priority               = DMA_Priority_High;                    // 设置DMA的优先级别
    tDMAProperty.DMA_M2M                    = DMA_M2M_Disable;                      // DMA_M2M_Disable

    DMA_Init(DMA1_Channel4, &tDMAProperty);
               
    DMA_ITConfig(DMA1_Channel4, DMA_IT_TC, ENABLE);
    DMA_ITConfig(DMA1_Channel4, DMA_IT_TE, ENABLE);

//    DMA_Cmd(DMA1_Channel4, ENABLE);
//    DMA_Cmd(DMA1_Channel4, DISABLE);
   
    USART_DMACmd(USART1, USART_DMAReq_Tx, ENABLE);

发表于 2013-10-8 21:24:04

RE:STM32F103 DMA问题

参考如下DMA配置代码:
void DMA_Configuration()
{
        DMA_InitTypeDefDMA_InitStructure;
       
        DMA_DeInit(DMA1_Channel1);
        DMA_InitStructure.DMA_PeripheralBaseAddr = 0x4001244C; //ADC1的DR地址
        DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)&ADC_ConvertedValue; 不加&应该也可以 数组名 代表地址
        DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;//外设向内存传数据
        DMA_InitStructure.DMA_BufferSize = N; //DMA缓存大小
        DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
        DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable; //目标内存地址自动后移
        DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;
        DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;//DMA传送数据尺寸16位
        DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;//常用循环缓存模式
        DMA_InitStructure.DMA_Priority = DMA_Priority_High;
        DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;//禁止内存到内存模式
        DMA_Init(DMA1_Channel1, &DMA_InitStructure);
        /* Enable DMA1 channel 1 */
        DMA_Cmd(DMA1_Channel1, ENABLE);
}

在路上。 发表于 2014-9-11 22:21:16

RE:STM32F103 DMA问题

你的DMA应该用的是AHB时钟源吧??
RCC_APB2PeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);
应该是RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);:P
页: [1]
查看完整版本: STM32F103 DMA问题