【前言】
在TouchGFX移植中,我使用spi的模拟、硬件SPI以及SPI+GPDMA进行了优化,在这个过程中,遇到了GPDMA只进了半传输中断,不进传输完的中断,经过问题查找后找到STM32CubeMX配置中的问题,现记录如下:
【开发环境】
1、STM32cubeMX
2、TouchGFX Designer
3、CLion
【硬件环境】
1、STM32U385RQ
2、ST7789 TFTLCD
【缘由】
1、我最起先的spi配置如下:
【注】三个GPIO的选择Pull-up,我前面没有这么配置,SCK好象是不起时序的。速度需要配置为Very High,要不分频到48MHz时,速度会上不去。
2、参数设置:
由于ST7789的命令传输是8bit的数据,所以Data Size是配置为8bit。时钟分频为2,STM32U385的SPI是挂载在APB2总线上的,最大速度为96MHz,经分频后,SPI总线最大为48MHz。
时钟极性为空闲时高电平,在第下降沿采样。
【注】我在其他的MCU中,配置为空闲时低电平,在上升沿采样才能驱动,st7789的用户手册也是这个模式,但是在STM32U385中,需要配置这样配置才能正常通信。
同时CS采用软件控制。
3、GPDMA配置:
在GPDMA中我开启了Channle0为Standard Request Mode【注】其实也可以配置为link模式,但是配置复杂一些。
在CH0中,Circular 配置为Disable,即禁用。
Request 配置为SPI1_TX,Direction为从内存到外设,最重要的是Source Date Setinng 自增长(Source Address Increment After Transfer)设为Enabled 即发送数据后,地址自增长,Data Width设置为Half Word(即16bit),长度为1。
当我认为这样设置成功后,没有设置Destination Data Setting时,开启16bit DMA传输时,只进了半传输中断。经调试是不会进发送完成中断的。前面我设置的截图如下:
进入调试模式时,在中断回调时产生了半传输中断,但是传输完中断一直不进:
后面与以前的工程进行对比,发现Destination Data Setting也需要配置为half world。经修改后,就可以正常进行传输完中断,更新标志,从而使用程序能正常运行了。
【总结】
在DMA传输中,如果配置了中断,那莫他有三种中断产生,即半传输中断、传完成中断,还有就是错误中断,这三个中断产生与处理,都需要配置好,并在回调函数处理,才能使工程正常运行。特别是我们在8bit 16bit传输有交叉时,应该时刻注意这些中断产生的条件与处理。