
STM32 DMA无法进入中断
目的:从USART1接收电脑串口传入的数据,通过DMA写入SRAM存储数组。DMA传输完成10个字符(指定长度)后,进入中断执行USART1输出数据到电脑串口。问题:仅仅...
目的:从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通道 展开
问题:仅仅是进不了中断,其他都正常。
代码:
主函数,启动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通道 展开
展开全部
如果只是无法进中断,你检查下NVIC的中断映射是否配置,我用的是DMA发送,给你参考下。
相关定义:
#define USART1_Tx_DMA_Channel DMA1_Channel4
#define USART1_Tx_DMA_STREAM DMA2_Stream7
#define USART1_Tx_DMA_TCIF DMA1_FLAG_TC4
#define USART1_Rx_DMA_Channel DMA1_Channel5
#define USART1_Rx_DMA_FLAG DMA1_FLAG_TC5
#define USART1_DR_Base ((uint32_t)&USART1->DR)
代码:
#ifdef USART1_USE_DMA_MODE
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE); //使能DMA1时钟
#ifdef USART1_DMA_TX
NVIC_InitStructure.NVIC_IRQChannel = DMA1_Channel4_IRQn; //设置中断通道
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; //主优先级设置
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; //设置优先级
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //打开中断
NVIC_Init(&NVIC_InitStructure);
DMA_DeInit(USART1_Tx_DMA_Channel);
DMA_InitStructure.DMA_PeripheralBaseAddr = USART1_DR_Base;
DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)m_UartDCB.pSendBuff;
DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralDST;
DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;
DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;
DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte;
DMA_InitStructure.DMA_Mode = DMA_Mode_Normal;
DMA_InitStructure.DMA_Priority = DMA_Priority_VeryHigh;
DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;
DMA_Init(USART1_Tx_DMA_Channel, &DMA_InitStructure); //配置DMA1
DMA_ITConfig(USART1_Tx_DMA_Channel, DMA_IT_TC, ENABLE); //使能DMA发送中断
#endif //_USART_DMA_TX__
#endif //USE_DMA_MODE
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询