无聊中,用STM32F030F4P6+ILI9341+SPIFlash刷个屏

2019-12-11 18:14发布

今天翻出买来就一直吃灰的一个STM32F030小板子玩了一下。
接了个SPI flash和一个ILI9341屏幕,存了点图片,又来刷屏了。。。

STM32F030F4P6只有一个SPI,flash和LCD都接在这个SPI上。LCD的MISO没接。
CPU运行在40MHz,这样SPI时钟可以设置到10MHz,正好到ILI9341能接受的最大频率了。
ILI9341和Flash片选都选中,这样读Flash和写LCD可以同时进行了。然后用DMA把刚从flash读出的数据直接写到ILI9341里。
图片是RGB565的,分辨率128×128,8MB的flash只能存256张,刷的速度大概是38fps。6秒多就没了。

http://v.youku.com/v_show/id_XMTYyMTk2NDc4OA==.html

代码: STM32F030F4-SPI.rar (40.08 KB, 下载次数: 443) 2016-6-27 00:11 上传 点击文件名下载附件
本来想一帧一帧刷,控制到24fps的,后来感觉好像也没多少意思,就开Circular mode了,连续刷。。。

友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
53条回答
kebaojun305
1楼-- · 2019-12-15 02:23
 精彩回答 2  元偷偷看……
caixiuwen
2楼-- · 2019-12-15 06:46
gmyu 发表于 2017-5-31 23:26
请问 Circular mode 怎么开的?

下面两条语句就可以再8位和16位之间自由切换么,我一直以为是spi初始化 ...

DMA的circular mode,就在DMA寄存器里设置一个bit就能开。
这个SPI是带FIFO的,16bit的写入,就是写入两个字节到FIFO里。

03是读命令,后面3个00是地址,最后一个0000是用来产生16个时钟,把头两个字节读出来。这时候头两个字节已经在接收FIFO里了,然后片选LCD,开DMA,图片数据就发给LCD了。一次传两字节。硬件上所有MOSI连一起,MISO连一起。LCD的MISO没有连接。
gmyu
3楼-- · 2019-12-15 12:09
基本明白了,只是没看到你的8位和16位切换命令,不是要改CR的11位么,你的DMA size是多少?

我昨天完了一天ILI9225,这个带RS(数据/命令脚)的,所以可以用你的方法,之前的ili9325每次要发三个字节,所以玩不了。

我用F103跑到了36M,没啥问题,如果设置到你的128*128估计很流畅。

刚刚发现一个F207的板子,上面有winbond的25Q160,应该可以试试你的方法了。

我在想,发所有图片是不是都可以用你的方法,就是要每次初始化flash地址和LCD窗口,关闭circular mode。
gmyu
4楼-- · 2019-12-15 13:42
F207的三个spi居然只有spi1能设置到30M,其他的即使两分频也只有15M。主频都到120M了。
gmyu
5楼-- · 2019-12-15 18:30
caixiuwen 发表于 2017-6-3 10:23
DMA的circular mode,就在DMA寄存器里设置一个bit就能开。
这个SPI是带FIFO的,16bit的写入,就是写入两 ...

  uint32_t Direction;            /*!< Specifies if the data will be transferred from memory to peripheral,
                                      from memory to memory or from peripheral to memory.
                                      This parameter can be a value of @ref DMA_Data_transfer_direction              */
我用的cubemx,只能是外围到内存,内存到外围,内存到内存的设置,你这个是外围到外围,的确新奇, 是不是因为SPI的特殊性,输入输出都是在DR。 看SPI的介绍说RX只能在通道2,TX只能在3。你这搞到一个通道在cubemx里面怎么设置的?

    DMA1_Channel3 -> CNDTR = 128 * 128;
    DMA1_Channel3 -> CMAR = (uint32_t)&SPI1 -> DR;
    DMA1_Channel3 -> CPAR = (uint32_t)&SPI1 -> DR;
    DMA1_Channel3 -> CCR =  DMA_CCR_PSIZE_0 |
                            DMA_CCR_MSIZE_0 |
                            DMA_CCR_CIRC    |
                            DMA_CCR_EN;

不知哪位高手能作答一下。LZ的这种方法刷图片确实快好多。
TongIC
6楼-- · 2019-12-15 23:12
 精彩回答 2  元偷偷看……

一周热门 更多>