stm32f103 dma空闲中断代码解析
时间: 2023-10-07 11:12:10 浏览: 98
STM32F103是一款强大的32位微控制器,它集成了DMA控制器,可以实现高速数据传输。当DMA传输完成后,会触发DMA空闲中断,以下是针对这一中断的代码解析。
首先,在使用DMA之前需要初始化DMA控制寄存器,设置DMA通道、DMA数据传输方向、传输数据长度等参数。接下来需要使能DMA中断和空闲中断。
```c
DMA_InitStructure.DMA_Channel = DMA_Channel_x; //DMA通道
DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)SRC_Const_Addr; //源地址
DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)DST_Addr; //目的地址
DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC; //数据传输方向
DMA_InitStructure.DMA_BufferSize = Data_Num; //传输数据长度
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_High; //DMA优先级
DMA_InitStructure.DMA_M2M = DMA_M2M_Disable; //禁止内存到内存传输
DMA_Init(DMAx_Channelx, &DMA_InitStructure); //DMA初始化
DMA_ITConfig(DMAx_Channelx, DMA_IT_TC, ENABLE); //使能DMA传输完成中断
DMA_ITConfig(DMAx_Channelx, DMA_IT_TE | DMA_IT_FE, ENABLE); //使能DMA传输错误中断
DMA_ITConfig(DMAx_Channelx, DMA_IT_HT, ENABLE); //使能DMA传输一半中断
DMA_ITConfig(DMAx_Channelx, DMA_IT_GL, ENABLE); //使能DMA全局中断
NVIC_InitStructure.NVIC_IRQChannel = DMAx_Channelx_IRQn; //DMA通道中断
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x01; //抢占优先级
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x01; //响应优先级
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //使能DMA通道中断
NVIC_Init(&NVIC_InitStructure);
```
当DMA空闲中断触发后,会执行以下中断服务函数:
```c
void DMAx_Channelx_IRQHandler(void)
{
if(DMA_GetITStatus(DMAx_IT_TCx))
{
DMA_ClearITPendingBit(DMAx_IT_TCx); //清除传输完成中断标志
}
if(DMA_GetITStatus(DMAx_IT_HTx))
{
DMA_ClearITPendingBit(DMAx_IT_HTx); //清除传输一半中断标志
}
if(DMA_GetITStatus(DMAx_IT_TEx))
{
DMA_ClearITPendingBit(DMAx_IT_TEx); //清除传输错误中断标志
}
if(DMA_GetITStatus(DMAx_IT_FEx))
{
DMA_ClearITPendingBit(DMAx_IT_FEx); //清除传输错误中断标志
}
}
```
在中断服务函数中,首先需要判断哪个中断标志被触发,然后清除标志位。在实际使用中,可以根据需要在中断服务函数中添加相应的数据处理代码。
总之,通过以上代码解析,我们可以更深入地理解STM32F103的DMA空闲中断功能,并在实际应用中更好地利用它。
阅读全文