ST MCU Finder
安装免费手机应用,
寻找理想的ST MCU

[STM32F0] STM32F103RET6 SPI DMA驱动ILI9341 2.8英寸屏

[复制链接]
1437|21
 楼主 | 2020-2-1 19:40 | 显示全部楼层 |阅读模式
我使用2.8寸SPI液晶屏模块,分辨率:240*320 ;TFT模块 ILI9341;

采用的是SPI DMA 驱动,使用emWin。
2.8寸SPI液晶屏模块.jpg



电路板3D如如下:

微信图片_20200201191608.jpg



微信图片_20200201191619.jpg



制作的成品如下:

微信图片_20200201191704.jpg



emWin软件界面如下:



微信图片_20200201191631.jpg

微信图片_20200201191641.jpg

微信图片_20200201191651.jpg





使用特权

评论回复

评论

LED2013 2020-2-1 20:57 回复TA
看着都觉得新鲜,高大上 
 楼主 | 2020-2-1 19:42 | 显示全部楼层
过几天,整理一下项目文件,跟大家共享。

使用特权

评论回复
 楼主 | 2020-2-1 19:46 | 显示全部楼层
不采用SPI DMA驱动,界面显示、界面转换的速度,肯定是无法接受!!!
采用DM驱动后,就非常流畅,当然也就可以作为产品使用了.

使用特权

评论回复
 楼主 | 2020-2-1 20:46 | 显示全部楼层
TFT28彩屏温控器---电原理图部分:

1、主控CPU[STM32F103RET6]:

TFT28彩屏温控器(主控CPU)_电原理图部分.jpg


2、TFT LCD 驱动接口部分:

TFT28彩屏温控器(TFT LCD)_电原理图部分.jpg

使用特权

评论回复
| 2020-2-1 20:57 | 显示全部楼层
这个电路板3D是自己画的?

使用特权

评论回复
 楼主 | 2020-2-1 21:09 | 显示全部楼层
回复楼上,3D图是自己画的,这有什么,很简单的。

使用特权

评论回复
 楼主 | 2020-2-1 21:15 | 显示全部楼层
可以给你3D pcb文件,你自己打开看。是不是我截图的效果。再给你截个图你看看:
TFT28彩屏温控器-3D效果图.jpg

使用特权

评论回复
 楼主 | 2020-2-1 21:19 | 显示全部楼层
TFT28彩屏温控器-3D效果图2.jpg

使用特权

评论回复
| 2020-2-2 12:09 | 显示全部楼层
很好,很好,支持楼主!

使用特权

评论回复
| 2020-2-2 13:53 | 显示全部楼层
字体用的是什么?

使用特权

评论回复
| 2020-2-3 14:11 | 显示全部楼层
好厉害

使用特权

评论回复
| 2020-2-3 19:48 | 显示全部楼层
是用Keil还是CubeMx下开发的?一直很好奇emwin的GUI开发方式,目前我们在用组态屏做的界面,不知道直接在STM32F10x系列上跑,效果和负载如何呢?

使用特权

评论回复
 楼主 | 2020-2-4 09:42 | 显示全部楼层
回复12楼,是在keil下开发的。

使用特权

评论回复
 楼主 | 2020-2-4 10:07 | 显示全部楼层
回复10楼:  

字体:
   开机界面:
      欢迎使用:  1、楷体[高*宽: 72*72],
      按键名称:2、楷体[高*宽:21*21],

   1路温控界面:
   2路温控界面:
      汉字标题,按键名称:1、楷体[高*宽:21*21],
      日期、时间:               2、楷体[高*宽:16*16],
      数值[设定温度]:  3、GUI_Font32B_1;
      数值[实际温度]:    4、 GUI_FontD32;

3路温控界面:
      汉字标题,1、楷体[高*宽:12*12],
      按键名称:2、楷体[高*宽:21*21],
      日期、时间:        3、楷体[高*宽:16*16],
      数值[设定温度]: 4、 GUI_Font32B_1;
      数值[实际温度]:   5、 GUI_FontD32;

还有几款字体,没有一一说明,请看用到的字体截图:
TFT28-96多路温度控制器_字体截图.jpg


另外说明: 产品支持中、英文显示切换功能。


使用特权

评论回复
| 2020-2-4 10:33 | 显示全部楼层
一如既往的很棒!

使用特权

评论回复
| 2020-2-4 10:44 | 显示全部楼层
这个可以,赞,再多些细节图效果更好

使用特权

评论回复
 楼主 | 2020-2-4 13:32 | 显示全部楼层
本帖最后由 xfcjava2 于 2020-2-4 13:41 编辑

SPI DMA 软件驱动部分代码如下:

//1. 文件名称: LCD_DisplayTask.c

#include "TFT_dma.h"

/****************************************************************************
* 功    能:     SPI1-----初始化函数
*---------------------------------------------------------------------------*
* 入口参数:nil
* 出口参数:nil
****************************************************************************/
void LCD_Flash_SPI1_Init(void)
{
    GPIO_InitTypeDef  GPIO_InitStructure;
  SPI_InitTypeDef   SPI_InitStructure;   
   
   RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOC|
                           RCC_APB2Periph_SPI1,  ENABLE);  
  //Configure SPI1 pins: SCK,and MOSI
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5|GPIO_Pin_7;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;   //复用推挽输出
  GPIO_Init(GPIOA,&GPIO_InitStructure);

   //Configure SPI1 pins: MISO
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD;   //下拉输入
  GPIO_Init(GPIOA,&GPIO_InitStructure);
  //Configure: PC.0---CS; PC.1---RESEET; PC.2---D/C;
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;  //推挽输出
  GPIO_Init(GPIOD,&GPIO_InitStructure);  
   GPIO_SetBits(GPIOC,GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2);
  // SPI1 Config
  SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;
  SPI_InitStructure.SPI_Mode = SPI_Mode_Master;
  SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;
  SPI_InitStructure.SPI_CPOL = SPI_CPOL_High;
  SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge;
  SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;   
  SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_2;
  SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;
  SPI_InitStructure.SPI_CRCPolynomial = 7;
  SPI_Init(SPI1,&SPI_InitStructure);   
  
  // SPI1 enable
  SPI_Cmd(SPI1,ENABLE);   
}

static  void  AppTaskStart (void *p_arg)
{   
    (void)p_arg;
    BSP_Init();     

    RCC_Configuration();  

   TFT28LCD_GPIO_Config();//引脚配置

   LCD_Flash_SPI1_Init();  

  SPI_LCD_DMAInit();   
  
   GUI_Init(); //GUI初始化时
  
    AppTaskCreate(); //创建应用任务,启动触摸屏任务   
  
    while(1){         
       TOP_Task();   
       OSTimeDly(100);
    }
}



//2. 文件名称:TFT_dma.h


#ifndef __TFT_DMA_H
#define __TFT_DMA_H

#include "TFT_Control.h"
#include <stm32f10x_dma.h>

#define dmaWait() while(SPI_I2S_GetFlagStatus(SPI_MASTER,SPI_I2S_FLAG_BSY) == SET);
#define dmaStartRx() DMA_Init(DMA1_Channel2, &dmaStructure); \
                              DMA_Cmd(DMA1_Channel2, ENABLE);
#define dmaStartTx() DMA_Init(DMA1_Channel3, &dmaStructure); \
                              DMA_Cmd(DMA1_Channel3, ENABLE);
void SPI_LCD_DMAInit(void);
void dmaSendCmd(u8 cmd);
void dmaSendCmdCont(u8 cmd);
void dmaReceiveDataCont8(u8 *data);
void dmaSendData8(u8 *data, u32 n);
void dmaSendData16(u16 *data, u32 n);
void dmaSendDataCont8(u8 *data, u32 n);
void dmaSendDataCont16(u16 *data, u32 n);
void dmaSendDataBuf16(void);
void dmaSendDataContBuf16(u16 *data, u32 n);
void dmaFill16(u16 color, u32 n);

#endif



//3. 文件名称:TFT_Control.h


#ifndef __TFT_CONTROL_H
#define __TFT_CONTROL_H
#include "TFT_Config.h"
#include "TFT_Commands.h"

#define TFT_DC_SET      GPIO_SetBits(GPIOC, TFT_DC_PIN);
#define TFT_DC_RESET    GPIO_ResetBits(GPIOC, TFT_DC_PIN);
#define TFT_RST_SET     GPIO_SetBits(GPIOC, TFT_RESET_PIN);
#define TFT_RST_RESET   GPIO_ResetBits(GPIOC, TFT_RESET_PIN);
#define TFT_CS_SET      GPIO_SetBits(GPIOC, TFT_CS_PIN);
#define TFT_CS_RESET    GPIO_ResetBits(GPIOC, TFT_CS_PIN);

#endif



//4. 文件名称:TFT_Config.h


#ifndef __TFT_CONFIG_H
#define __TFT_CONFIG_H

#define TFT_RESET_PIN   GPIO_Pin_1
#define TFT_DC_PIN        GPIO_Pin_2
#define TFT_CS_PIN        GPIO_Pin_0
#define TFT_CTRL_GPIO   GPIOC
#define SPI_MASTER                       SPI1
#define SPI_MASTER_CLK                RCC_APB2Periph_SPI1
#define SPI_MASTER_GPIO              GPIOA
#define SPI_MASTER_GPIO_CLK       RCC_APB2Periph_GPIOA
//#define SPI_MASTER_PIN_NSS       GPIO_Pin_4
#define SPI_MASTER_PIN_SCK          GPIO_Pin_5
#define SPI_MASTER_PIN_MISO        GPIO_Pin_6
#define SPI_MASTER_PIN_MOSI        GPIO_Pin_7

#define BLACK                0x0000      /*   0,   0,   0 */
#define NAVY                 0x000F       /*   0,   0, 128 */
#define DGREEN             0x03E0      /*   0, 128,   0 */
#define DCYAN               0x03EF      /*   0, 128, 128 */
#define MAROON            0x7800      /* 128,   0,   0 */
#define PURPLE               0x780F      /* 128,   0, 128 */
#define OLIVE                 0x7BE0      /* 128, 128,   0 */
#define COLOR_LGRAY     0xC618      /* 192, 192, 192 */
#define DGRAY                0x7BEF      /* 128, 128, 128 */
#define BLUE                   0x001F      /*   0,   0, 255 */
#define GREEN                0x07E0      /*   0, 255,   0 */
#define COLOR_CYAN       0x07FF       /*   0, 255, 255 */
#define RED                    0xF800       /* 255,   0,   0 */
#define MAGENTA            0xF81F       /* 255,   0, 255 */
#define YELLOW              0xFFE0      /* 255, 255,   0 */
#define WHITE                0xFFFF      /* 255, 255, 255 */
#define ORANGE              0xFD20      /* 255, 165,   0 */
#define GREENYELLOW     0xAFE5      /* 173, 255,  47 */
#define BROWN                0XBC40      
#define BRRED                 0XFC07  

#endif


//5. 文件名称:TFT_Commands.h


#ifndef __TFT_COMMANDS_H
#define __TFT_COMMANDS_H

/* Level 1 Commands */
#define LCD_SWRESET             0x01   /* Software Reset */
#define LCD_READ_DISPLAY_ID     0x04   /* Read display identification information */
#define LCD_RDDST               0x09   /* Read Display Status */
#define LCD_RDDPM               0x0A   /* Read Display Power Mode */
#define LCD_RDDMADCTL           0x0B   /* Read Display MADCTL */
#define LCD_RDDCOLMOD           0x0C   /* Read Display Pixel Format */
#define LCD_RDDIM               0x0D   /* Read Display Image Format */
#define LCD_RDDSM               0x0E   /* Read Display Signal Mode */
#define LCD_RDDSDR              0x0F   /* Read Display Self-Diagnostic Result */
#define LCD_SPLIN               0x10   /* Enter Sleep Mode */
#define LCD_SLEEP_OUT           0x11   /* Sleep out register */
#define LCD_PTLON               0x12   /* Partial Mode ON */
#define LCD_NORMAL_MODE_ON      0x13   /* Normal Display Mode ON */
#define LCD_DINVOFF             0x20   /* Display Inversion OFF */
#define LCD_DINVON              0x21   /* Display Inversion ON */
#define LCD_GAMMA               0x26   /* Gamma register */
#define LCD_DISPLAY_OFF         0x28   /* Display off register */
#define LCD_DISPLAY_ON          0x29   /* Display on register */
#define LCD_COLUMN_ADDR         0x2A   /* Colomn address register */
#define LCD_PAGE_ADDR           0x2B   /* Page address register */
#define LCD_GRAM                0x2C   /* GRAM register */
#define LCD_RGBSET              0x2D   /* Color SET */
#define LCD_RAMRD               0x2E   /* Memory Read */
#define LCD_PLTAR               0x30   /* Partial Area */
#define LCD_VSCRDEF             0x33   /* Vertical Scrolling Definition */
#define LCD_TEOFF               0x34   /* Tearing Effect Line OFF */
#define LCD_TEON                0x35   /* Tearing Effect Line ON */
#define LCD_MAC                 0x36   /* Memory Access Control register*/
#define LCD_VSCRSADD            0x37   /* Vertical Scrolling Start Address */
#define LCD_IDMOFF              0x38   /* Idle Mode OFF */
#define LCD_IDMON               0x39   /* Idle Mode ON */
#define LCD_PIXEL_FORMAT        0x3A   /* Pixel Format register */
#define LCD_WRITE_MEM_CONTINUE  0x3C   /* Write Memory Continue */
#define LCD_READ_MEM_CONTINUE   0x3E   /* Read Memory Continue */
#define LCD_SET_TEAR_SCANLINE   0x44   /* Set Tear Scanline */
#define LCD_GET_SCANLINE        0x45   /* Get Scanline */
#define LCD_WDB                 0x51   /* Write Brightness Display register */
#define LCD_RDDISBV             0x52   /* Read Display Brightness */
#define LCD_WCD                 0x53   /* Write Control Display register*/
#define LCD_RDCTRLD             0x54   /* Read CTRL Display */
#define LCD_WRCABC              0x55   /* Write Content Adaptive Brightness Control */
#define LCD_RDCABC              0x56   /* Read Content Adaptive Brightness Control */
#define LCD_WRITE_CABC          0x5E   /* Write CABC Minimum Brightness */
#define LCD_READ_CABC           0x5F   /* Read CABC Minimum Brightness */
#define LCD_READ_ID1            0xDA   /* Read ID1 */
#define LCD_READ_ID2            0xDB   /* Read ID2 */
#define LCD_READ_ID3            0xDC   /* Read ID3 */

/* Level 2 Commands */
#define LCD_RGB_INTERFACE       0xB0   /* RGB Interface Signal Control */
#define LCD_FRMCTR1             0xB1   /* Frame Rate Control (In Normal Mode) */
#define LCD_FRMCTR2             0xB2   /* Frame Rate Control (In Idle Mode) */
#define LCD_FRMCTR3             0xB3   /* Frame Rate Control (In Partial Mode) */
#define LCD_INVTR               0xB4   /* Display Inversion Control */
#define LCD_BPC                 0xB5   /* Blanking Porch Control register */
#define LCD_DFC                 0xB6   /* Display Function Control register */
#define LCD_ETMOD               0xB7   /* Entry Mode Set */
#define LCD_BACKLIGHT1          0xB8   /* Backlight Control 1 */
#define LCD_BACKLIGHT2          0xB9   /* Backlight Control 2 */
#define LCD_BACKLIGHT3          0xBA   /* Backlight Control 3 */
#define LCD_BACKLIGHT4          0xBB   /* Backlight Control 4 */
#define LCD_BACKLIGHT5          0xBC   /* Backlight Control 5 */
#define LCD_BACKLIGHT7          0xBE   /* Backlight Control 7 */
#define LCD_BACKLIGHT8          0xBF   /* Backlight Control 8 */
#define LCD_POWER1              0xC0   /* Power Control 1 register */
#define LCD_POWER2              0xC1   /* Power Control 2 register */
#define LCD_VCOM1               0xC5   /* VCOM Control 1 register */
#define LCD_VCOM2               0xC7   /* VCOM Control 2 register */
#define LCD_NVMWR               0xD0   /* NV Memory Write */
#define LCD_NVMPKEY             0xD1   /* NV Memory Protection Key */
#define LCD_RDNVM               0xD2   /* NV Memory Status Read */
#define LCD_READ_ID4            0xD3   /* Read ID4 */
#define LCD_PGAMMA              0xE0   /* Positive Gamma Correction register */
#define LCD_NGAMMA              0xE1   /* Negative Gamma Correction register */
#define LCD_DGAMCTRL1           0xE2   /* Digital Gamma Control 1 */
#define LCD_DGAMCTRL2           0xE3   /* Digital Gamma Control 2 */
#define LCD_INTERFACE           0xF6   /* Interface control register */

/* Extend register commands */
#define LCD_POWERA              0xCB   /* Power control A register */
#define LCD_POWERB              0xCF   /* Power control B register */
#define LCD_DTCA                0xE8   /* Driver timing control A */
#define LCD_DTCB                0xEA   /* Driver timing control B */
#define LCD_POWER_SEQ           0xED   /* Power on sequence register */
#define LCD_3GAMMA_EN           0xF2   /* 3 Gamma enable register */
#define LCD_PRC                 0xF7   /* Pump ratio control register */

#define ORIENTATION_PORTRAIT            0x48
#define ORIENTATION_LANDSCAPE           0x28
#define ORIENTATION_PORTRAIT_MIRROR     0x88
#define ORIENTATION_LANDSCAPE_MIRROR    0xE8

#define LCD_PIXEL_WIDTH       320
#define LCD_PIXEL_HEIGHT      240
#define LCD_PIXEL_COUNT    LCD_PIXEL_WIDTH * LCD_PIXEL_HEIGHT

#endif











使用特权

评论回复
 楼主 | 2020-2-4 13:45 | 显示全部楼层
//SPI DMA 软件驱动代码【续......】

//6.文件名称: lcd_spi_dma.c


#include "TFT_dma.h"

#define DMA_BUF_SIZE 2048

DMA_InitTypeDef dmaStructure;
u16  dmaBufIndex = 0;
u16  dmaBuffer[DMA_BUF_SIZE];

void SPI_LCD_DMAInit(void)
{

    RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);

    // TX
    NVIC_EnableIRQ(DMA1_Channel3_IRQn);
    DMA_ITConfig(DMA1_Channel3, DMA_IT_TC, ENABLE);

    // RX
    NVIC_EnableIRQ(DMA1_Channel2_IRQn);
    DMA_ITConfig(DMA1_Channel2, DMA_IT_TC, ENABLE);

    SPI_I2S_DMACmd(SPI_MASTER, SPI_I2S_DMAReq_Tx, ENABLE);
    SPI_I2S_DMACmd(SPI_MASTER, SPI_I2S_DMAReq_Rx, ENABLE);
}

static void dmaReceive8(u8 *data, u32 n)
{
    dmaStructure.DMA_MemoryBaseAddr = (u32) data;
    dmaStructure.DMA_BufferSize     = n;
    dmaStructure.DMA_Mode               = DMA_Mode_Normal;
    dmaStructure.DMA_MemoryInc          = DMA_MemoryInc_Enable;
    dmaStructure.DMA_DIR                = DMA_DIR_PeripheralSRC;
    dmaStructure.DMA_MemoryDataSize     = DMA_MemoryDataSize_Byte;
    dmaStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;
    dmaStartRx();
}


static void dmaSend8(u8 *data, u32 n)
{
    DMA_StructInit(&dmaStructure);
    dmaStructure.DMA_PeripheralBaseAddr = (u32) &(SPI_MASTER->DR);
    dmaStructure.DMA_Priority           = DMA_Priority_Medium;
    dmaStructure.DMA_MemoryBaseAddr = (u32) data;
    dmaStructure.DMA_BufferSize     = n;
    dmaStructure.DMA_Mode               = DMA_Mode_Normal;
    dmaStructure.DMA_MemoryInc          = DMA_MemoryInc_Enable;
    dmaStructure.DMA_DIR                = DMA_DIR_PeripheralDST;
    dmaStructure.DMA_MemoryDataSize     = DMA_MemoryDataSize_Byte;
    dmaStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;
    dmaStartTx();
}


static void dmaSendCircular16(u16 *data, u32 n)
{
    DMA_StructInit(&dmaStructure);
    dmaStructure.DMA_PeripheralBaseAddr = (u32) &(SPI_MASTER->DR);
    dmaStructure.DMA_Priority           = DMA_Priority_Medium;
    dmaStructure.DMA_MemoryBaseAddr = (u32) data;
    dmaStructure.DMA_BufferSize     = n;
    dmaStructure.DMA_Mode               = DMA_Mode_Circular;
    dmaStructure.DMA_MemoryInc          = DMA_MemoryInc_Disable;
    dmaStructure.DMA_DIR                = DMA_DIR_PeripheralDST;
    dmaStructure.DMA_MemoryDataSize     = DMA_MemoryDataSize_HalfWord;
    dmaStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;
    dmaStartTx();
}


static void dmaSend16(u16 *data, u32 n)
{
    DMA_StructInit(&dmaStructure);
    dmaStructure.DMA_PeripheralBaseAddr = (u32) &(SPI_MASTER->DR);
    dmaStructure.DMA_Priority           = DMA_Priority_Medium;
    dmaStructure.DMA_MemoryBaseAddr = (u32) data;
    dmaStructure.DMA_BufferSize     = n;
    dmaStructure.DMA_Mode               = DMA_Mode_Normal;
    dmaStructure.DMA_MemoryInc          = DMA_MemoryInc_Enable;
    dmaStructure.DMA_DIR                = DMA_DIR_PeripheralDST;
    dmaStructure.DMA_MemoryDataSize     = DMA_MemoryDataSize_HalfWord;
    dmaStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;
    dmaStartTx();
}

void dmaSendCmd(u8 cmd)
{
    TFT_CS_RESET;
    TFT_DC_RESET;
    dmaSend8(&cmd, 1);
    dmaWait();
    TFT_CS_SET;
}


void dmaSendCmdCont(u8 cmd)
{
    TFT_DC_RESET;
    dmaSend8(&cmd, 1);
    dmaWait();
}


void dmaReceiveDataCont8(u8 *data)
{
    u8 dummy = 0xFF;
    dmaSend8(&dummy, 1);
    dmaReceive8(data, 1);
    dmaWait();
}


void dmaSendData8(u8 *data, u32 n)
{
    TFT_CS_RESET;
    TFT_DC_SET;
    dmaSend8(data, n);
    dmaWait();
    TFT_CS_SET;
}


void dmaSendDataCont8(u8 *data, u32 n)
{
    TFT_DC_SET;
    dmaSend8(data, n);
    dmaWait();
}


void dmaSendData16(u16 *data, u32 n)
{
    TFT_CS_RESET;
    TFT_DC_SET;
    dmaSend16(data, n);
    dmaWait();
    TFT_CS_SET;
}


void dmaSendDataCont16(u16 *data, u32 n)
{
    TFT_DC_SET;
    dmaSend16(data, n);
    dmaWait();
}


void dmaSendDataBuf16(void)
{
    if(dmaBufIndex == 0) return;
    TFT_DC_SET;
    dmaSend16(dmaBuffer, dmaBufIndex);
    dmaBufIndex = 0;
    dmaWait();
}


void dmaSendDataContBuf16(u16 *data, u32 n)
{
    while (n--) {
        dmaBuffer[dmaBufIndex] = *data++;
        if (dmaBufIndex == DMA_BUF_SIZE - 1) {
            dmaSendDataBuf16();
        }
        dmaBufIndex++;
    }
}

void dmaSendDataCircular16(u16 *data, u32 n)
{
    TFT_DC_SET;
    dmaSendCircular16(data, n);
    dmaWait();
}

void dmaFill16(u16 color, u32 n)
{
    TFT_CS_RESET;
    dmaSendCmdCont(LCD_GRAM);
    while (n != 0) {
        u16 ts = (u16) (n > UINT16_MAX ? UINT16_MAX : n);
        dmaSendDataCircular16(&color, ts);
        n -= ts;
    }
    TFT_CS_SET;
}

void DMA1_Channel2_IRQHandler(void)
{
    if (DMA_GetITStatus(DMA1_IT_TC2) == SET) {
        DMA_Cmd(DMA1_Channel2, DISABLE);
        DMA_ClearITPendingBit(DMA1_IT_TC2);
    }
}


void DMA1_Channel3_IRQHandler(void)
{
    if (DMA_GetITStatus(DMA1_IT_TC3) == SET) {
        DMA_Cmd(DMA1_Channel3, DISABLE);
        DMA_ClearITPendingBit(DMA1_IT_TC3);
    }
}


使用特权

评论回复
| 2020-2-4 21:45 | 显示全部楼层
楼主厉害

使用特权

评论回复
 楼主 | 2020-2-6 11:51 | 显示全部楼层
TFT2.8彩屏多路温控器_v3.0------电路板3D效果图:

电源部分:采用符合UL、CE安规认证的AC-DC模块电源;

TFT2.8-96温控器_v3.0.jpg            

使用特权

评论回复
扫描二维码,随时随地手机跟帖
您需要登录后才可以回帖 登录 | 注册

本版积分规则

我要发帖 投诉建议 创建版块 申请版主

快速回复

您需要登录后才可以回帖
登录 | 注册
高级模式

论坛热帖

在线客服 快速回复 返回顶部 返回列表