原子哥,请教一下,为什么我的DMA进不了中断
答案:1 悬赏:80 手机版
解决时间 2021-04-18 11:40
- 提问者网友:爱了却不能说
- 2021-04-17 18:17
原子哥,请教一下,为什么我的DMA进不了中断
最佳答案
- 五星知识达人网友:愁杀梦里人
- 2021-04-17 19:55
如果只是无法进中断,你检查下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
相关定义:
#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
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
推荐资讯