原来我发表过一个SPI DMA的帖子,透露了一下实现SPI DMA用在emWin下的技术细节
我想:需要此功能的人,大有人在,所以今天有时间,另外发一个项目帖子,这样一来,他们就可以直接
借用了,愿给他们节省一些宝贵的时间。
特别提醒的是:
我原来的项目是用的GUI是:emWin,项目文件很大,不利于理解。
下面我发的 littleVgl 简单测试项目文件,对于你们想采用SPI DMA的功能来说,足够用的了!
1、请看LCD 接口说明:
/*----------------------------------------------------------------------------
* Simple STM32F103 using littleVgl: *
* ILI9341 display over SPI with DMA, *
* XPT2046 resistive touch panel *
* *
* ILI9341 SPI1 CONNECTIONS: *
* ------------------------------- *
* TFT_RESET PC1 *
* TFT_DC PC2 *
* TFT_CS PC0 *
* TFT_SCK PA5 *
* TFT_MISO PA6 *
* TFT_MOSI PA7 *
* *
* XPT2046 SPI2 CONNECTIONS: *
* -------------------------------- *
* TOUCH_CLK PB13 *
* TOUCH_DIN (MOSI) PB15 *
* TOUCH_DO (MISO) PB14 *
* TOUCH_CS PB12 *
* TOUCH_IRQ PA0 *
* *
* *
* *
*-------------------------------------------------------------------------*/
2、项目文件: GUI: littleVgl
lvgl_STM32F103_ILI9341_SPIDMA.rar
(6.07 MB)
//****************项目内容说明如下**************//
3、请你们自己看 ILI9341\core.c文件的内容,使用的就是:SPI_DMA
//重要函数:
void Send_DMA_Data16(uint16_t* buff, uint16_t dataSize)
{
LL_SPI_SetDataWidth(SPI1, LL_SPI_DATAWIDTH_16BIT);
LL_SPI_Disable(SPI1);
LL_DMA_DisableChannel(DMA1, LL_DMA_CHANNEL_3);
LL_DMA_ClearFlag_TC3(DMA1);
LL_DMA_ClearFlag_TE3(DMA1);
LL_SPI_EnableDMAReq_TX(SPI1);
LL_DMA_EnableIT_TC(DMA1, LL_DMA_CHANNEL_3);
LL_DMA_EnableIT_TE(DMA1, LL_DMA_CHANNEL_3);
LL_DMA_DisableChannel(DMA1, LL_DMA_CHANNEL_3);
LL_DMA_SetDataLength(DMA1, LL_DMA_CHANNEL_3, dataSize);
LL_DMA_ConfigAddresses(DMA1, LL_DMA_CHANNEL_3, (uint32_t)buff, LL_SPI_DMA_GetRegAddr(SPI1),
LL_DMA_GetDataTransferDirection(DMA1, LL_DMA_CHANNEL_3));
LL_DMA_EnableChannel(DMA1, LL_DMA_CHANNEL_3);
LL_SPI_Enable(SPI1);
while (!flag_DMA_CH3_bsy) {
}
flag_DMA_CH3_bsy = 0;
LL_DMA_DisableChannel(DMA1, LL_DMA_CHANNEL_3);
LL_SPI_Disable(SPI1);
LL_DMA_ClearFlag_TC3(DMA1);
LL_DMA_ClearFlag_TE3(DMA1);
LL_SPI_DisableDMAReq_TX(SPI1);
LL_DMA_DisableIT_TC(DMA1, LL_DMA_CHANNEL_3);
LL_DMA_DisableIT_TE(DMA1, LL_DMA_CHANNEL_3);
LL_SPI_Enable(SPI1);
LL_SPI_SetDataWidth(SPI1, LL_SPI_DATAWIDTH_8BIT);
}
void ILI9341_fillRect(uint16_t x1, uint16_t y1, uint16_t w, uint16_t h, uint16_t color)
{
uint16_t tbuf[w];
TFT_CS_RESET;
ILI9341_setAddressWindow(x1, y1, (uint16_t) (x1 + w - 1), (uint16_t) (y1 + h - 1));
TFT_DC_D
for (int x = w ; x >= 0; x--)
tbuf[x] = color;
for (y1 = h; y1 > 0; y1--)
Send_DMA_Data16(tbuf,w);
TFT_CS_SET;
}
4、DMA传输,在传输大量数据的情况下,就显示出它的巨大优势了!
=== 填充矩形功能,就是使用大量数据的情况,
=== 其它的一般功能,就采用传统的操作就可以了。
5、在项目中,还有SPI传输,采用可变的8bit, 16bit,更能体现执行效率
6、项目运行测试界面如下:
|