本帖最后由 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]);
}
}
|