基于STM32U5片内GPDMA Burst传输应用示例

54b9023fa5329ee39feee1350bff9996.jpeg

【温馨提醒:手机模式下,图片可点击放大查看】

有人想使用STM32U5系列的GPDMAburst【分组、节拍、突发】传输功能,似乎遇到了点阻碍。我这里尝试下,稍作演示,仅供参考。

我用TIMER1更新事件触发DMA DMA工作在非循环模式,DMA将数据从源内存区传输到目的内存区。我先准备下面两个数组。

dd559ae82c1c6873f026d4b941928bc3.png

479c98f5c9bfdff4e9bdfd2426043e36.png

当两端访问数

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
好的,请稍等,我为您寻找相关资料。以下是一份基于LPC5516的同时使用8路SPI,并使用DMA方式传输数据的C语言程序,您可以参考: ```c #include "LPC5516.h" //定义SPI接口地址 #define SPI_MASTER_BASEADDR0 SPI0_BASE #define SPI_MASTER_BASEADDR1 SPI1_BASE #define SPI_MASTER_BASEADDR2 SPI2_BASE #define SPI_MASTER_BASEADDR3 SPI3_BASE #define SPI_MASTER_BASEADDR4 SPI4_BASE #define SPI_MASTER_BASEADDR5 SPI5_BASE #define SPI_MASTER_BASEADDR6 SPI6_BASE #define SPI_MASTER_BASEADDR7 SPI7_BASE //定义DMA控制器地址 #define GPDMA_BASEADDR DMA0_BASE //定义DMA通道号和请求信号 #define SPI_DMA_CHANNEL 0 #define SPI_DMA_REQUEST 0 //定义用于DMA传输的数据缓冲区 uint32_t txBuffer[10]; uint32_t rxBuffer[10]; //定义用于SPI传输的数据缓冲区 uint8_t spiBuffer[10]; //初始化SPI Master接口 void initSpiMaster(uint32_t spiBaseAddr, uint32_t dataWidth) { //关闭SPI操作 SPI_MASTER(spiBaseAddr).CFG = 0; //设置数据帧长度和传输模式 SPI_MASTER(spiBaseAddr).CFG = (dataWidth << SPI_CFG_SPD_SHIFT) | SPI_CFG_MSTR_MASK | SPI_CFG_CPOL_MASK | SPI_CFG_CPHA_MASK; //使能SPI操作 SPI_MASTER(spiBaseAddr).CFG |= SPI_CFG_SPI_EN_MASK; } //初始化DMA控制器 void initDmaController() { //复位DMA控制器 DMA_CTRL(GPDMA_BASEADDR) = 1; DMA_CTRL(GPDMA_BASEADDR) = 0; //为SPI DMA通道配置传输请求和主存数据宽度 DMA_CHANNEL_CFG(GPDMA_BASEADDR, SPI_DMA_CHANNEL) = (SPI_DMA_REQUEST << DMA_CHANNEL_CFG_PERIPH_REQ_EN_SHIFT) | (0x00 << DMA_CHANNEL_CFG_FLOWCNTRL_SHIFT); DMA_CHANNEL_CFG(GPDMA_BASEADDR, SPI_DMA_CHANNEL) |= (DMA_CHANNEL_CFG_DST_WIDTH_32BIT << DMA_CHANNEL_CFG_DST_WIDTH_SHIFT) | (DMA_CHANNEL_CFG_SRC_WIDTH_32BIT << DMA_CHANNEL_CFG_SRC_WIDTH_SHIFT); //使能DMA通道 DMA_CHANNEL_CFG(GPDMA_BASEADDR, SPI_DMA_CHANNEL) |= DMA_CHANNEL_CFG_ENABLE_MASK; } //执行SPI传输 void spiTransfer(uint32_t spiBaseAddr, uint8_t *txData, uint8_t *rxData, uint32_t transferSize) { //复位SPI控制器 SPI_MASTER(spiBaseAddr).CTRL = 0; //设置SPI传输数据长度和起始地址 SPI_MASTER(spiBaseAddr).TXDATCTL = (transferSize << SPI_TXDATCTL_TXSIZ_SHIFT) | SPI_TXDATCTL_EOF_MASK | SPI_TXDATCTL_RXIGNORE_MASK | SPI_TXDATCTL_FLEN(7); SPI_MASTER(spiBaseAddr).TXDATCTL |= SPI_TXDATCTL_TXPTR((uint32_t) txData) | SPI_TXDATCTL_RXPTR((uint32_t) rxData); //等待SPI传输完成 while ((SPI_MASTER(spiBaseAddr).STAT & SPI_STAT_RXRDY_MASK) == 0) ; //清除SPI状态寄存器 SPI_MASTER(spiBaseAddr).STAT = SPI_STAT_CLR_RXRDY_MASK | SPI_STAT_CLR_TXRDY_MASK; } int main() { //初始化SPI Master接口 initSpiMaster(SPI_MASTER_BASEADDR0, 8); initSpiMaster(SPI_MASTER_BASEADDR1, 8); initSpiMaster(SPI_MASTER_BASEADDR2, 8); initSpiMaster(SPI_MASTER_BASEADDR3, 8); initSpiMaster(SPI_MASTER_BASEADDR4, 8); initSpiMaster(SPI_MASTER_BASEADDR5, 8); initSpiMaster(SPI_MASTER_BASEADDR6, 8); initSpiMaster(SPI_MASTER_BASEADDR7, 8); //初始化DMA控制器 initDmaController(); //填充用于DMA传输的数据缓冲区 for (int i = 0; i < 10; i++) { txBuffer[i] = i; rxBuffer[i] = 0; } //将数据缓冲区转换为SPI缓冲区 for (int i = 0; i < 10; i++) { spiBuffer[i] = (uint8_t) (txBuffer[i] & 0xFF); } //执行SPI传输 spiTransfer(SPI_MASTER_BASEADDR0, spiBuffer, spiBuffer, 10); spiTransfer(SPI_MASTER_BASEADDR1, spiBuffer, spiBuffer, 10); spiTransfer(SPI_MASTER_BASEADDR2, spiBuffer, spiBuffer, 10); spiTransfer(SPI_MASTER_BASEADDR3, spiBuffer, spiBuffer, 10); spiTransfer(SPI_MASTER_BASEADDR4, spiBuffer, spiBuffer, 10); spiTransfer(SPI_MASTER_BASEADDR5, spiBuffer, spiBuffer, 10); spiTransfer(SPI_MASTER_BASEADDR6, spiBuffer, spiBuffer, 10); spiTransfer(SPI_MASTER_BASEADDR7, spiBuffer, spiBuffer, 10); //将SPI缓冲区转换为数据缓冲区 for (int i = 0; i < 10; i++) { rxBuffer[i] = (uint32_t) spiBuffer[i]; } //等待DMA传输完成 while ((DMA_CHANNEL_STATUS(GPDMA_BASEADDR, SPI_DMA_CHANNEL) & DMA_CHANNEL_STATUS_ACTIVE_MASK) == 1) ; return 0; } ``` 注意,该程序仅供参考。具体实现需根据您的实际需求进行修改。同时也建议您参考芯片官方提供的文档进行SPI Master和DMA控制器的配置。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值