I2c1 send dma irq中断函数怎么才回起作用
时间: 2024-05-01 18:22:18 浏览: 145
要使I2C1发送DMA IRQ中断函数起作用,需要进行以下步骤:
1. 配置I2C1为DMA模式,并设置发送数据的DMA通道;
2. 配置DMA传输的数据源地址、目的地址和传输数据长度;
3. 启动DMA传输;
4. 等待DMA传输完成;
5. 在中断处理函数中执行相应的操作。
下面是一个示例代码,演示了如何使用DMA发送I2C数据并处理中断:
```c
#include "stm32f10x.h"
#define I2C1_DMA_CHANNEL_TX DMA1_Channel6
// I2C1 DMA发送完成中断处理函数
void DMA1_Channel6_IRQHandler(void)
{
if (DMA_GetITStatus(DMA1_IT_TC6))
{
// DMA传输完成,执行相应的操作
// ...
DMA_ClearITPendingBit(DMA1_IT_TC6);
}
}
int main(void)
{
// 初始化I2C1和DMA
// ...
// 配置I2C1为DMA发送模式
I2C_DMACmd(I2C1, I2C_DMAReq_Tx, ENABLE);
// 配置DMA传输的数据源地址、目的地址和传输数据长度
DMA_InitTypeDef DMA_InitStruct;
DMA_InitStruct.DMA_PeripheralBaseAddr = (uint32_t)&I2C1->DR;
DMA_InitStruct.DMA_MemoryBaseAddr = (uint32_t)tx_buffer;
DMA_InitStruct.DMA_DIR = DMA_DIR_PeripheralDST;
DMA_InitStruct.DMA_BufferSize = tx_length;
DMA_InitStruct.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
DMA_InitStruct.DMA_MemoryInc = DMA_MemoryInc_Enable;
DMA_InitStruct.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;
DMA_InitStruct.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte;
DMA_InitStruct.DMA_Mode = DMA_Mode_Normal;
DMA_InitStruct.DMA_Priority = DMA_Priority_High;
DMA_InitStruct.DMA_M2M = DMA_M2M_Disable;
DMA_Init(I2C1_DMA_CHANNEL_TX, &DMA_InitStruct);
// 配置DMA传输完成中断
DMA_ITConfig(I2C1_DMA_CHANNEL_TX, DMA_IT_TC, ENABLE);
NVIC_EnableIRQ(DMA1_Channel6_IRQn);
// 启动DMA传输
DMA_Cmd(I2C1_DMA_CHANNEL_TX, ENABLE);
while (1)
{
// 主循环
// ...
}
}
```
在上面的代码中,我们首先配置了I2C1为DMA发送模式,并设置了发送数据的DMA通道为DMA1_Channel6。然后,我们配置了DMA传输的数据源地址、目的地址和传输数据长度,并启动了DMA传输。最后,在中断处理函数DMA1_Channel6_IRQHandler中,我们处理了DMA传输完成的中断,并执行了相应的操作。
阅读全文