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

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管理
行使您的权利
官方最新发布
STM32Cube扩展软件包
意法半导体边缘AI套件
ST - 理想汽车豪华SUV案例
ST意法半导体智能家居案例
STM32 ARM Cortex 32位微控制器
关注我们
st-img 微信公众号
st-img 手机版