你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

STM32F103 DMA问题

[复制链接]
wallelin 提问时间:2013-9-30 19:17 /
请问一个很奇怪的问题,我用的是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);
收藏 评论2 发布时间:2013-9-30 19:17

举报

2个回答
回答时间:2013-10-8 21:24:04

RE:STM32F103 DMA问题

参考如下DMA配置代码:
void DMA_Configuration()
{
        DMA_InitTypeDef  DMA_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);

所属标签

相似问题

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
微信公众号二维码 微信公众号
手机版二维码 手机版