DMA不能进入中断

[复制链接]
2640|0
 楼主| posaty 发表于 2013-10-25 10:02 | 显示全部楼层 |阅读模式
本帖最后由 posaty 于 2013-10-25 10:05 编辑

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

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

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

本版积分规则

1

主题

3

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部