根据您的描述,ADC1配置正常工作而ADC2/ADC3在启用中断时死机,问题可能出在DMA中断配置或资源冲突。以下是解决方案:
// 在NVIC配置中添加以下代码(确保使用正确的中断通道)
void ADC2_DMA_IRQ_Configuration(void)
{
NVIC_InitTypeDef NVIC_InitStructure;
// ADC2使用DMA2 Stream2(通道1对应ADC2)
NVIC_InitStructure.NVIC_IRQChannel = DMA2_Stream2_IRQn; // 正确的中断向量
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
}// 添加DMA2 Stream2中断处理函数
void DMA2_Stream2_IRQHandler(void)
{
if(DMA_GetITStatus(DMA2_Stream2, DMA_IT_TCIF2)) // 检查传输完成标志
{
// 你的数据处理代码
// 必须清除中断标志!
DMA_ClearITPendingBit(DMA2_Stream2, DMA_IT_TCIF2 | DMA_IT_TEIF2 | DMA_IT_DMEIF2);
}
}在初始化函数开头添加:
// 确保所有外设时钟使能
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_DMA2 | RCC_AHB1Periph_GPIOx, ENABLE); // GPIOx替换为实际端口
RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC2, ENABLE);在您的配置函数中添加:
// 启用DMA中断(在DMA初始化结构中)
DMA_InitStructure.DMA_ITConfig = DMA_IT_TC | DMA_IT_TE; // 使能传输完成和错误中断void ADC2_EXIT_TIM4_CC4_Trig_DMAConfiguration(unsigned short F_Prescaler, unsigned int F_ARR)
{
// 1. 确保时钟使能
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_DMA2, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC2, ENABLE);
// ... [保留现有GPIO/TIM/ADC配置] ...
// 2. 完善DMA配置
DMA_InitTypeDef DMA_InitStructure;
DMA_DeInit(DMA2_Stream2);
DMA_InitStructure.DMA_Channel = DMA_Channel_1; // ADC2对应通道1
DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)&(ADC2->DR);
DMA_InitStructure.DMA_Memory0BaseAddr = (uint32_t)YourBufferAddress;
DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralToMemory;
DMA_InitStructure.DMA_BufferSize = YourBufferSize;
DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;
DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;
DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;
DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;
DMA_InitStructure.DMA_Priority = DMA_Priority_High;
DMA_InitStructure.DMA_FIFOMode = DMA_FIFOMode_Disable;
DMA_InitStructure.DMA_ITConfig = DMA_IT_TC | DMA_IT_TE; // 关键!启用中断
DMA_Init(DMA2_Stream2, &DMA_InitStructure);
// 3. 配置DMA中断
ADC2_DMA_IRQ_Configuration(); // 调用前面定义的NVIC配置
// 4. 启动DMA和ADC
DMA_Cmd(DMA2_Stream2, ENABLE);
ADC_DMARequestAfterLastTransferCmd(ADC2, ENABLE);
ADC_DMACmd(ADC2, ENABLE);
// ... [TIM4配置保持不变] ...
}if(DMA_GetITStatus(DMA2_Stream2, DMA_IT_TEIF2)) {
// 处理传输错误
DMA_ClearITPendingBit(DMA2_Stream2, DMA_IT_TEIF2);
}通过以上修改应该能解决ADC2/ADC3的DMA中断死机问题。重点检查中断向量配置和标志清除操作,这是ADC1正常工作而ADC2/ADC3失败的关键差异点。
举报
更多回帖