打印

DMA不能进入中断

[复制链接]
2258|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
posaty|  楼主 | 2013-10-25 10:02 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 posaty 于 2013-10-25 10:05 编辑

目的:从USART1接收电脑串口传入的数据,通过DMA写入SRAM存储数组。DMA传输完成10个字符(指定长度)后,进入中断执行USART1输出数据到电脑串口。
问题:仅仅是进不了中断,其他都正常。
代码:
主函数,启动USART及初始化DMA:
        delay_init();
        NVIC_Configuration();          //设置NVIC中断分组2:2位抢占优先级,2位响应优先级
        uart_init(9600);                 //串口初始化为9600
        //配置DMA
        Dma_Usart_Config(DMA1_Channel5,(u32)&USART1->DR,(u32)SRAM_USART1_RX,SRAM_USART1_RX_SIZE);
        USART_DMACmd(USART1,USART_DMAReq_Rx,ENABLE);
        DMA_ITConfig(DMA1_Channel5,DMA_IT_TC,ENABLE);//启动传输完成中断        
        DMA_Cmd(DMA1_Channel5, ENABLE);         //启动DMA通道
DMA初始化:
        NVIC_InitTypeDef NVIC_InitStructure;//定义中断优先级结构体

         RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);        //使能DMA传输
        
        DMA_DeInit(DMA_CHx);   //将DMA的通道1寄存器重设为缺省值
        DMA_InitStructure.DMA_PeripheralBaseAddr = PeripheralBaseAddr;  //DMA外设ADC基地址
        DMA_InitStructure.DMA_MemoryBaseAddr = MemoryBaseAddr;  //DMA内存基地址
        DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;  //数据传输方向,外设为源地址
        DMA_InitStructure.DMA_BufferSize = BufferSize;  //DMA通道的DMA缓存的大小
        DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;  //外设地址寄存器不变
        DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;  //内存地址寄存器递增
        DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;  //外设数据宽度为8位
        DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte; //内存数据宽度为8位
        DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;  //工作在循环缓存模式
        DMA_InitStructure.DMA_Priority = DMA_Priority_Medium; //DMA通道 x拥有中优先级
        DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;  //DMA通道x没有设置为内存到内存传输

        DMA_Init(DMA_CHx, &DMA_InitStructure);  //根据DMA_InitStruct中指定的参数初始化DMA的通道USART1_Tx_DMA_Channel所标识的寄存器
         
        NVIC_InitStructure.NVIC_IRQChannel=DMA1_Channel5_IRQn;                                         
        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0;
        NVIC_InitStructure.NVIC_IRQChannelSubPriority=0;
        NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;
        NVIC_Init(&NVIC_InitStructure);
中断执行函数:放在stm32f10x_it.c文件中
        u8 i;
        if(DMA_GetITStatus(DMA1_IT_TC5))
        {
                DMA_ClearITPendingBit(DMA1_IT_TC5);
               
                for(i=0;i<SRAM_USART1_RX_SIZE;i++)
                {
                        while(USART_GetFlagStatus(USART1,USART_FLAG_TXE)==RESET);//等待传输完成否则第一位数据容易丢失
                        USART_SendData(USART1, SRAM_USART1_RX[i]);
                }
        }        
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1

主题

3

帖子

0

粉丝