微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > STM32 SPI DMA 的使用

STM32 SPI DMA 的使用

时间:11-19 来源:互联网 点击:

equest */30 SPI1->CR2 = 1<0; //接收缓冲区DMA使能31 DMA_Cmd(DMA1_Channel2, ENABLE);32 33 34 /* DMA1 Channel3 (triggered by SPI1 Tx event) Config */35 DMA_DeInit(DMA1_Channel3); 36 DMA_InitStructure.DMA_PeripheralBaseAddr = SPI1_DR_Addr; //设置 接收外设(0x4001300C) 地址(源地址)37 DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)SPI1_TX_Buff; //设置 SRAM 存储地址(源地址)38 DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralDST; //传输方向 内存-外设39 DMA_InitStructure.DMA_BufferSize = SPI1_SendBufferSize; //设置 SPI1 接收长度40 DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable; //外设地址增量(不变)41 DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable; //内存地址增量(变化)42 DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte; //外设传输宽度(字节)43 DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte; //内存传输宽度(字节)44 DMA_InitStructure.DMA_Mode = DMA_Mode_Normal; //传输方式,一次传输完停止,不重新加载45 DMA_InitStructure.DMA_Priority = DMA_Priority_VeryHigh; //中断方式-高(三级)46 DMA_InitStructure.DMA_M2M = DMA_M2M_Disable; //内存到内存方式禁止47 DMA_Init(DMA1_Channel3, &DMA_InitStructure);48 49 DMA_ITConfig(DMA1_Channel3, DMA_IT_TC, ENABLE); //开启 DMA1_Channel3 传输完成中断50 DMA_ITConfig(DMA1_Channel3, DMA_IT_TE, ENABLE); //开启 DMA1_Channel3 传输错误中断51 /* Enable SPI1 DMA TX request */52 SPI1->CR2 = 1<1; //发送缓冲区DMA使能53 DMA_Cmd(DMA1_Channel3, DISABLE); //开启 DMA 通道 DMA1_Channel354 }

SPI发送

1 /*******************************************************************************2 * Function Name  : SPI1_Send3 * Description    : SPI1的DMA方式发送4 * Input          : SPI1_TX_Buff[SPI1_SendBufferSize]5 * Output         : None6 * Return         : None7 * Attention             : 关闭DMA通道3之前必须等待TXE为1,等待忙标志为08 *******************************************************************************/9 void SPI1_Send( u8 *buff, u32 len )10 {11     DMA1_Channel3->CPAR = SPI1_DR_Addr; //外设地址12     DMA1_Channel3->CMAR = (u32) buff; //mem地址13     DMA1_Channel3->CNDTR = len ; //传输长度14     DMA1_Channel3->CCR = (0 < 14)  // 非存储器到存储器模式15             (2 < 12)  // 通道优先级高16             (0 < 11)  // 存储器数据宽度8bit17             (0 < 10)  // 存储器数据宽度8bit18             (0 <  9)  // 外设数据宽度8bit19             (0 <  8)  // 外设数据宽度8bit20             (1 <  7)  // 存储器地址增量模式21             (0 <  6)  // 外设地址增量模式(不增)22             (0 <  5)  // 非循环模式23             (1 <  4)  // 从存储器读24             (1 <  3)  // 允许传输错误中断25             (0 <  2)  // 允许半传输中断26             (1 <  1)  // 允许传输完成中断27             (1);        // 通道开启28 }

SPI接收

1 /*******************************************************************************2 * Function Name  : SPI1_Recive3 * Description    : SPI1的DMA方式接收4 * Input          : None5 * Output         : SPI1_RX_Buff[SPI1_ReciveBufferSize]6 * Return         : None7 * Attention             : 必须要先关闭通道2,然后再配置通道2的参数8 *******************************************************************************/9 void SPI1_Recive( u8 *buff, u32 len )10 {11     DMA1_Channel2->CCR &= ~( 1 < 0 );          //关闭DMA通道212     13     DMA1_Channel2->CPAR = SPI1_DR_Addr; //外设地址14     DMA1_Channel2->CMAR = (uint32_t)buff; //mem地址15     DMA1_Channel2->CNDTR = len ; //传输长度16     DMA1_Channel2->CCR = (0 < 14)  // 非存储器到存储器模式17             (2 < 12)  // 通道优先级高18             (0 < 11)  // 存储器数据宽度8bit19             (0 < 10)  // 存储器数据宽度8bit20             (0 <  9)  // 外设数据宽度8bit21             (0 <  8)  // 外设数据宽度8bit22             (1 <  7)  // 存储器地址增量模式23             (0 <  6)  // 外设地址增量模式(不增)24             (0 <  5)  // 非循环模式25             (0 <  4)  // 传输方向 外设-内存26             (0 <  3)  // 允许传输错误中断27             (0 <  2)  // 允许半传输中断28             (1 <  1)  // 允许传输完成中断29             (1);        // 通道开启30 }

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top