delay1ms(10)改成dma中断
时间: 2023-11-20 14:05:25 浏览: 54
将 delay1ms(10)
改为 DMA 中断需要进行一定的修改和调整。需要首先确定使用的 DMA 控制器和通道,然后进行 DMA 初始化和配置。以下是一个示例代码:
void dma_send_data(void)
{
// 定义发送数据
uint8_t data[] = {0x1b, 0x2a, 0x3c, 0x4d, 0x5e};
// DMA 初始化
stc_dma_config_t stcDmaConfig;
Dma_ConfigStructInit(&stcDmaConfig);
stcDmaConfig.u32DataWidth = DmaDataWidth8;
stcDmaConfig.u32BlockSize = sizeof(data);
stcDmaConfig.u32TransferCnt = 1;
stcDmaConfig.u32SrcAddr = (uint32_t)data;
stcDmaConfig.u32DestAddr = (uint32_t)&M0P_UART0->SBUF;
stcDmaConfig.enTransferMode = DmaBlockTransfer;
stcDmaConfig.u32SrcInc = DmaIncByte;
stcDmaConfig.u32DestInc = DmaIncNone;
stcDmaConfig.u32IntEn = DmaIntEnable;
Dma_InitChannel(DMA_CHANNEL, &stcDmaConfig);
// 使能 DMA 通道
Dma_EnableChannel(DMA_CHANNEL);
while (1)
{
// 等待 DMA 传输完成
while (Reset == Dma_GetIntFlag(DMA_CHANNEL));
// 清除 DMA 中断标志位
Dma_ClearIntFlag(DMA_CHANNEL);
// 延时 10 毫秒
delay1ms(10);
}
}
在此代码中,我们首先定义了要发送的数据,然后使用 stc_dma_config_t
结构体进行 DMA 初始化和配置。在配置中,我们指定了数据宽度为 8 位,传输单元长度为数据数组的长度,传输次数为 1,源地址为数据数组的地址,目的地址为 UART0 的发送缓冲器地址,传输模式为块传输,源地址自增为 1 字节,目的地址不自增,使能 DMA 中断。然后,我们使用 Dma_InitChannel
函数进行 DMA 通道初始化,再使用 Dma_EnableChannel
函数使能 DMA 通道。
在无限循环中,我们使用 while
循环等待 DMA 传输完成。如果 DMA 中断标志位被设置,说明 DMA 传输已经完成,我们可以使用 Dma_ClearIntFlag
函数清除中断标志位。然后,我们再使用 delay1ms
函数延时 10 毫秒。这个过程会一直循环执行下去,直到程序被终止或者函数内部有跳出循环的逻辑。
相关推荐














