stm32L431使用SPI+DMA
stm32L431使用SPI+DMA
1.配置SPI和DMA
1.1 使用hal库配置(stmcubmax)
配置可以按选择配置
- MOSI单线只发送数据则配置Transmit Only Master
- MOSI,MISO 双线配置Full-Duplex Master
1.2 配置DMA
如1.1图所示我配置的是只发送数据模式!
DMA配置模式Normal ,地址增长Memory,数据宽度为Byte到Byte
DMA全局中断配置,SPI中断配置可选,如果配置spi配置了MISO线接收数据可在spi接收回调函数内处理数据
void HAL_SPI_TxCpltCallback(SPI_HandleTypeDef *hspi);//发送数据完成回调函数 void HAL_SPI_RxCpltCallback(SPI_HandleTypeDef *hspi);//接收数据完成回调函数
2.keil工程配置
2.1DMA初始化函数
DMA初始化函数,使能RCC_DMA时钟,设置DMA全局中断(cubmax内配置会自动生成)
2.2SPI初始化配置
SPI初始化配置,按照自己的需求配置
2.3SPI和DMA配置关联
void HAL_SPI_MspInit(SPI_HandleTypeDef *spiHandle) //函数下是cubmax生成的GPIO配置和MDA配置,如果配置了MISO线可以配置DMA_RX __HAL_LINKDMA(&hspi2, hdmatx, hdma_spi2_tx); //HAL库宏定义,将SPI和DMA配置关联,简单理解就是互换控制句柄,有兴趣可以看看原码
2.4DMA全局中断
配置中两个函数参数效果一样
3.具体使用
这是只发送模式下的使用,配置的读取可以参考其他博主的配置
发送完成后hal库配置了回调函数这里可以自己写一个,还有一个带__weak修饰的函数,先注释掉再自己写