STM32 SPI DMA 的使用
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 }
STM32SPIDM 相关文章:
- STM32的SPI采用DMA方式传输测试(11-19)
- STM32学习笔记之SPI_DMA寄存器级操作(11-09)
- Windows CE 进程、线程和内存管理(11-09)
- RedHatLinux新手入门教程(5)(11-12)
- uClinux介绍(11-09)
- openwebmailV1.60安装教学(11-12)