{ .base = PMD, .pinPmIdx = 0U, //LPSPI1_SCK .pullCfg = PM_INTERNAL_PULL_NOT_ENABLED, .drvSel = PM_LOW_DRIVE_STRENGTH, .passiveFilt = false, .mux = PM_MUX_ALT3, .pinLk = false, .intCfg = PM_DMA_INT_DISABLED, .clrInt** = false, .gpioBase = NULL, .digitFilt = false, }, { .base = PMD, .pinPmIdx = 2U, //LPSPI1_SOUT .pullCfg = PM_INTERNAL_PULL_NOT_ENABLED, .drvSel = PM_LOW_DRIVE_STRENGTH, .passiveFilt = false, .mux = PM_MUX_ALT3, .pinLk = false, .intCfg = PM_DMA_INT_DISABLED, .clrInt** = false, .gpioBase = NULL, .digitFilt = false, }, { .base = PMD, .pinPmIdx = 3U, //LPSPI1_PCS0 .pullCfg = PM_INTERNAL_PULL_NOT_ENABLED, .drvSel = PM_LOW_DRIVE_STRENGTH, .passiveFilt = false, .mux = PM_MUX_AS_GPIO, .pinLk = false, .intCfg = PM_DMA_INT_DISABLED, .clrInt** = false, .gpioBase = GPIOD, .dir = GPIO_OUTPUT_DIR, .digitFilt = false, .initVal = 0U, }, 三、spi配置 复制LPSPI_MASTER_CFG_T g_spiMasterCfg = { .bitNumber = 8U, .baudBitsPer = 10000000UL, .lpspiModSrcClk = 48000000UL, .selectPcs = NULL,//LPSPI_PER_PCS0, .selectPcsPolar = LPSPI_SIGNAL_ACTIVE_HIGH, .selectClkPhase = LPSPI_CLOCK_PHASE_CFG_1ST, .clkPolar = LPSPI_CLK_SIGNAL_HIGH, .callback = NULL, .callbackParam = NULL, .pcsKeeps = false, .sendLsbFirst = false, .transferType = LPSPI_TRANSFER_DMA, .rxDMAChan = 0U, .txDMAChan = 1U };baudBitsPer:SPI波特率。由于缺乏资料,这个不知道设成多大合适,是否有上限。先设成10000000UL .lpspiModSrcClk = 48000000UL;:设置LPSPI模块的源时钟频率为48MHz。这个同上,由于缺乏资料,也不知道设成多大合适。 .selectPcs =NULL,自己控制CS 下面三个参数和DMA有关: .transferType = LPSPI_TRANSFER_DMA;:设置传输类型为直接存储器访问(DMA)。 .rxDMAChan = 0U;:设置接收DMA通道号为0。 .txDMAChan = 1U;:设置发送DMA通道号为1。 四、DMA配置 通道0配置为LPSPI1_RX,但是没有用。 通道1配置为LPSPI1_TX,用于MOSI。 复制DMA_CHANNEL_CONFIG_T g_dmaChannel0Config = { .channelPriority = DMA_CHANNEL_DEFAULT_PRIORITY, .vtChannel = DMA_CHANNEL0_NUM, .source = DMA_REQUEST_LPSPI1_RX, .callback = NULL, .callbackParam = NULL, .enableTrigger = false, }; DMA_CHANNEL_CONFIG_T g_dmaChannel1Config = { .channelPriority = DMA_CHANNEL_DEFAULT_PRIORITY, .vtChannel = DMA_CHANNEL1_NUM, .source = DMA_REQUEST_LPSPI1_TX, .callback = NULL, .callbackParam = NULL, .enableTrigger = false, };五、初始化 1、PIN 复制PINS_Init(NUM_OF_CONFIGURED_PINS0, g_spiPinsConfig);2、DMA 复制if(STATUS_SUCCESS==DMA_Init(&g_dmaState, &g_dmaInitConfig, g_dmaChannelStateArray, g_dmaChannelConfigArray, DMA_CHANNELS_COUNT)) { printf("DMA_Init success\r\n"); };3、LPSPI 复制if(STATUS_SUCCESS==LPSPI_MasterInit(LPSPI_1, &g_spiState, &g_spiMasterCfg)) { printf("LPSPI_MasterInit success\r\n"); };六、LCD驱动 SPI写一个byte 复制void SPI_WriteaByte(uint8_t spiTxBuf) { LPSPI_MasterTransferBlocking(LPSPI_1, &spiTxBuf, NULL, 1, SPI_TIMEOUT); } SPI写多个byte 复制void SPI_WriteByte(uint8_t *spiTxBuf,uint16_t len) { LPSPI_MasterTransferBlocking(LPSPI_1, spiTxBuf, NULL, len, SPI_TIMEOUT); } LCD之GPIO控制部分(CS、RS、RST、背光) 复制#define LCD_CS_SET PINS_SetPins(GPIOD,1<<3) //片选端口 D3 #define LCD_RS_SET PINS_SetPins(GPIOB,1<<2) //数据/命令 B2 #define LCD_RST_SET PINS_SetPins(GPIOD,1<<5) //复位 D5LCD写命令 复制void LCD_WR_REG(uint8_t data) { LCD_CS_CLR; LCD_RS_CLR; SPI_WriteByte(&data,1); LCD_CS_SET; }LCD写数据 复制void LCD_WR_DATA(uint8_t data) { LCD_CS_CLR; LCD_RS_SET; SPI_WriteByte(&data,1); LCD_CS_SET; } LCD写寄存器 复制void LCD_WriteReg(uint8_t LCD_Reg, uint16_t LCD_RegValue) { LCD_WR_REG(LCD_Reg); LCD_WR_DATA(LCD_RegValue); } LCD DMA清屏 复制void LCD_Clear_DMA(uint16_t Color) { unsigned int i,m; uint8_t aLine[LCD_W*2]={0}; for(i=0;i<LCD_W;i++) { aLine[2*i]=Color>>8; aLine[2*i+1]=Color; } LCD_SetWindows(0,0,lcddev.width-1,lcddev.height-1); LCD_CS_CLR; LCD_RS_SET; for(i=0;i<lcddev.height;i++) { SPI_WriteByte(aLine,LCD_W*2); } LCD_CS_SET; } 七、运行效果 感觉还有优化的空间。时钟、SPI参数还可以调一调。 调了一下LPSPI1_CLK: 复制{ .clkName = LPSPI1_CLK, .clkSrc = CLK_SRC_HSI_DIV1,//CLK_SRC_LSI_DIV2, .clkGate = true, .div = DIV_BY_ONE, .frac = MUL_BY_ONE, },选择内部高速时钟48Mhz
LPSPI_MASTER_CFG_T g_spiMasterCfg = { .bitNumber = 8U, .baudBitsPer = 10000000UL, .lpspiModSrcClk = 48000000UL, .selectPcs = NULL,//LPSPI_PER_PCS0, .selectPcsPolar = LPSPI_SIGNAL_ACTIVE_HIGH, .selectClkPhase = LPSPI_CLOCK_PHASE_CFG_1ST, .clkPolar = LPSPI_CLK_SIGNAL_HIGH, .callback = NULL, .callbackParam = NULL, .pcsKeeps = false, .sendLsbFirst = false, .transferType = LPSPI_TRANSFER_DMA, .rxDMAChan = 0U, .txDMAChan = 1U };baudBitsPer:SPI波特率。由于缺乏资料,这个不知道设成多大合适,是否有上限。先设成10000000UL .lpspiModSrcClk = 48000000UL;:设置LPSPI模块的源时钟频率为48MHz。这个同上,由于缺乏资料,也不知道设成多大合适。 .selectPcs =NULL,自己控制CS 下面三个参数和DMA有关: .transferType = LPSPI_TRANSFER_DMA;:设置传输类型为直接存储器访问(DMA)。 .rxDMAChan = 0U;:设置接收DMA通道号为0。 .txDMAChan = 1U;:设置发送DMA通道号为1。 四、DMA配置 通道0配置为LPSPI1_RX,但是没有用。 通道1配置为LPSPI1_TX,用于MOSI。 复制DMA_CHANNEL_CONFIG_T g_dmaChannel0Config = { .channelPriority = DMA_CHANNEL_DEFAULT_PRIORITY, .vtChannel = DMA_CHANNEL0_NUM, .source = DMA_REQUEST_LPSPI1_RX, .callback = NULL, .callbackParam = NULL, .enableTrigger = false, }; DMA_CHANNEL_CONFIG_T g_dmaChannel1Config = { .channelPriority = DMA_CHANNEL_DEFAULT_PRIORITY, .vtChannel = DMA_CHANNEL1_NUM, .source = DMA_REQUEST_LPSPI1_TX, .callback = NULL, .callbackParam = NULL, .enableTrigger = false, };五、初始化 1、PIN 复制PINS_Init(NUM_OF_CONFIGURED_PINS0, g_spiPinsConfig);2、DMA 复制if(STATUS_SUCCESS==DMA_Init(&g_dmaState, &g_dmaInitConfig, g_dmaChannelStateArray, g_dmaChannelConfigArray, DMA_CHANNELS_COUNT)) { printf("DMA_Init success\r\n"); };3、LPSPI 复制if(STATUS_SUCCESS==LPSPI_MasterInit(LPSPI_1, &g_spiState, &g_spiMasterCfg)) { printf("LPSPI_MasterInit success\r\n"); };六、LCD驱动 SPI写一个byte 复制void SPI_WriteaByte(uint8_t spiTxBuf) { LPSPI_MasterTransferBlocking(LPSPI_1, &spiTxBuf, NULL, 1, SPI_TIMEOUT); } SPI写多个byte 复制void SPI_WriteByte(uint8_t *spiTxBuf,uint16_t len) { LPSPI_MasterTransferBlocking(LPSPI_1, spiTxBuf, NULL, len, SPI_TIMEOUT); } LCD之GPIO控制部分(CS、RS、RST、背光) 复制#define LCD_CS_SET PINS_SetPins(GPIOD,1<<3) //片选端口 D3 #define LCD_RS_SET PINS_SetPins(GPIOB,1<<2) //数据/命令 B2 #define LCD_RST_SET PINS_SetPins(GPIOD,1<<5) //复位 D5LCD写命令 复制void LCD_WR_REG(uint8_t data) { LCD_CS_CLR; LCD_RS_CLR; SPI_WriteByte(&data,1); LCD_CS_SET; }LCD写数据 复制void LCD_WR_DATA(uint8_t data) { LCD_CS_CLR; LCD_RS_SET; SPI_WriteByte(&data,1); LCD_CS_SET; } LCD写寄存器 复制void LCD_WriteReg(uint8_t LCD_Reg, uint16_t LCD_RegValue) { LCD_WR_REG(LCD_Reg); LCD_WR_DATA(LCD_RegValue); } LCD DMA清屏 复制void LCD_Clear_DMA(uint16_t Color) { unsigned int i,m; uint8_t aLine[LCD_W*2]={0}; for(i=0;i<LCD_W;i++) { aLine[2*i]=Color>>8; aLine[2*i+1]=Color; } LCD_SetWindows(0,0,lcddev.width-1,lcddev.height-1); LCD_CS_CLR; LCD_RS_SET; for(i=0;i<lcddev.height;i++) { SPI_WriteByte(aLine,LCD_W*2); } LCD_CS_SET; } 七、运行效果 感觉还有优化的空间。时钟、SPI参数还可以调一调。 调了一下LPSPI1_CLK: 复制{ .clkName = LPSPI1_CLK, .clkSrc = CLK_SRC_HSI_DIV1,//CLK_SRC_LSI_DIV2, .clkGate = true, .div = DIV_BY_ONE, .frac = MUL_BY_ONE, },选择内部高速时钟48Mhz
DMA_CHANNEL_CONFIG_T g_dmaChannel0Config = { .channelPriority = DMA_CHANNEL_DEFAULT_PRIORITY, .vtChannel = DMA_CHANNEL0_NUM, .source = DMA_REQUEST_LPSPI1_RX, .callback = NULL, .callbackParam = NULL, .enableTrigger = false, }; DMA_CHANNEL_CONFIG_T g_dmaChannel1Config = { .channelPriority = DMA_CHANNEL_DEFAULT_PRIORITY, .vtChannel = DMA_CHANNEL1_NUM, .source = DMA_REQUEST_LPSPI1_TX, .callback = NULL, .callbackParam = NULL, .enableTrigger = false, };五、初始化 1、PIN 复制PINS_Init(NUM_OF_CONFIGURED_PINS0, g_spiPinsConfig);2、DMA 复制if(STATUS_SUCCESS==DMA_Init(&g_dmaState, &g_dmaInitConfig, g_dmaChannelStateArray, g_dmaChannelConfigArray, DMA_CHANNELS_COUNT)) { printf("DMA_Init success\r\n"); };3、LPSPI 复制if(STATUS_SUCCESS==LPSPI_MasterInit(LPSPI_1, &g_spiState, &g_spiMasterCfg)) { printf("LPSPI_MasterInit success\r\n"); };六、LCD驱动 SPI写一个byte 复制void SPI_WriteaByte(uint8_t spiTxBuf) { LPSPI_MasterTransferBlocking(LPSPI_1, &spiTxBuf, NULL, 1, SPI_TIMEOUT); } SPI写多个byte 复制void SPI_WriteByte(uint8_t *spiTxBuf,uint16_t len) { LPSPI_MasterTransferBlocking(LPSPI_1, spiTxBuf, NULL, len, SPI_TIMEOUT); } LCD之GPIO控制部分(CS、RS、RST、背光) 复制#define LCD_CS_SET PINS_SetPins(GPIOD,1<<3) //片选端口 D3 #define LCD_RS_SET PINS_SetPins(GPIOB,1<<2) //数据/命令 B2 #define LCD_RST_SET PINS_SetPins(GPIOD,1<<5) //复位 D5LCD写命令 复制void LCD_WR_REG(uint8_t data) { LCD_CS_CLR; LCD_RS_CLR; SPI_WriteByte(&data,1); LCD_CS_SET; }LCD写数据 复制void LCD_WR_DATA(uint8_t data) { LCD_CS_CLR; LCD_RS_SET; SPI_WriteByte(&data,1); LCD_CS_SET; } LCD写寄存器 复制void LCD_WriteReg(uint8_t LCD_Reg, uint16_t LCD_RegValue) { LCD_WR_REG(LCD_Reg); LCD_WR_DATA(LCD_RegValue); } LCD DMA清屏 复制void LCD_Clear_DMA(uint16_t Color) { unsigned int i,m; uint8_t aLine[LCD_W*2]={0}; for(i=0;i<LCD_W;i++) { aLine[2*i]=Color>>8; aLine[2*i+1]=Color; } LCD_SetWindows(0,0,lcddev.width-1,lcddev.height-1); LCD_CS_CLR; LCD_RS_SET; for(i=0;i<lcddev.height;i++) { SPI_WriteByte(aLine,LCD_W*2); } LCD_CS_SET; } 七、运行效果 感觉还有优化的空间。时钟、SPI参数还可以调一调。 调了一下LPSPI1_CLK: 复制{ .clkName = LPSPI1_CLK, .clkSrc = CLK_SRC_HSI_DIV1,//CLK_SRC_LSI_DIV2, .clkGate = true, .div = DIV_BY_ONE, .frac = MUL_BY_ONE, },选择内部高速时钟48Mhz
PINS_Init(NUM_OF_CONFIGURED_PINS0, g_spiPinsConfig);2、DMA 复制if(STATUS_SUCCESS==DMA_Init(&g_dmaState, &g_dmaInitConfig, g_dmaChannelStateArray, g_dmaChannelConfigArray, DMA_CHANNELS_COUNT)) { printf("DMA_Init success\r\n"); };3、LPSPI 复制if(STATUS_SUCCESS==LPSPI_MasterInit(LPSPI_1, &g_spiState, &g_spiMasterCfg)) { printf("LPSPI_MasterInit success\r\n"); };六、LCD驱动 SPI写一个byte 复制void SPI_WriteaByte(uint8_t spiTxBuf) { LPSPI_MasterTransferBlocking(LPSPI_1, &spiTxBuf, NULL, 1, SPI_TIMEOUT); } SPI写多个byte 复制void SPI_WriteByte(uint8_t *spiTxBuf,uint16_t len) { LPSPI_MasterTransferBlocking(LPSPI_1, spiTxBuf, NULL, len, SPI_TIMEOUT); } LCD之GPIO控制部分(CS、RS、RST、背光) 复制#define LCD_CS_SET PINS_SetPins(GPIOD,1<<3) //片选端口 D3 #define LCD_RS_SET PINS_SetPins(GPIOB,1<<2) //数据/命令 B2 #define LCD_RST_SET PINS_SetPins(GPIOD,1<<5) //复位 D5LCD写命令 复制void LCD_WR_REG(uint8_t data) { LCD_CS_CLR; LCD_RS_CLR; SPI_WriteByte(&data,1); LCD_CS_SET; }LCD写数据 复制void LCD_WR_DATA(uint8_t data) { LCD_CS_CLR; LCD_RS_SET; SPI_WriteByte(&data,1); LCD_CS_SET; } LCD写寄存器 复制void LCD_WriteReg(uint8_t LCD_Reg, uint16_t LCD_RegValue) { LCD_WR_REG(LCD_Reg); LCD_WR_DATA(LCD_RegValue); } LCD DMA清屏 复制void LCD_Clear_DMA(uint16_t Color) { unsigned int i,m; uint8_t aLine[LCD_W*2]={0}; for(i=0;i<LCD_W;i++) { aLine[2*i]=Color>>8; aLine[2*i+1]=Color; } LCD_SetWindows(0,0,lcddev.width-1,lcddev.height-1); LCD_CS_CLR; LCD_RS_SET; for(i=0;i<lcddev.height;i++) { SPI_WriteByte(aLine,LCD_W*2); } LCD_CS_SET; } 七、运行效果 感觉还有优化的空间。时钟、SPI参数还可以调一调。 调了一下LPSPI1_CLK: 复制{ .clkName = LPSPI1_CLK, .clkSrc = CLK_SRC_HSI_DIV1,//CLK_SRC_LSI_DIV2, .clkGate = true, .div = DIV_BY_ONE, .frac = MUL_BY_ONE, },选择内部高速时钟48Mhz
if(STATUS_SUCCESS==DMA_Init(&g_dmaState, &g_dmaInitConfig, g_dmaChannelStateArray, g_dmaChannelConfigArray, DMA_CHANNELS_COUNT)) { printf("DMA_Init success\r\n"); };3、LPSPI 复制if(STATUS_SUCCESS==LPSPI_MasterInit(LPSPI_1, &g_spiState, &g_spiMasterCfg)) { printf("LPSPI_MasterInit success\r\n"); };六、LCD驱动 SPI写一个byte 复制void SPI_WriteaByte(uint8_t spiTxBuf) { LPSPI_MasterTransferBlocking(LPSPI_1, &spiTxBuf, NULL, 1, SPI_TIMEOUT); } SPI写多个byte 复制void SPI_WriteByte(uint8_t *spiTxBuf,uint16_t len) { LPSPI_MasterTransferBlocking(LPSPI_1, spiTxBuf, NULL, len, SPI_TIMEOUT); } LCD之GPIO控制部分(CS、RS、RST、背光) 复制#define LCD_CS_SET PINS_SetPins(GPIOD,1<<3) //片选端口 D3 #define LCD_RS_SET PINS_SetPins(GPIOB,1<<2) //数据/命令 B2 #define LCD_RST_SET PINS_SetPins(GPIOD,1<<5) //复位 D5LCD写命令 复制void LCD_WR_REG(uint8_t data) { LCD_CS_CLR; LCD_RS_CLR; SPI_WriteByte(&data,1); LCD_CS_SET; }LCD写数据 复制void LCD_WR_DATA(uint8_t data) { LCD_CS_CLR; LCD_RS_SET; SPI_WriteByte(&data,1); LCD_CS_SET; } LCD写寄存器 复制void LCD_WriteReg(uint8_t LCD_Reg, uint16_t LCD_RegValue) { LCD_WR_REG(LCD_Reg); LCD_WR_DATA(LCD_RegValue); } LCD DMA清屏 复制void LCD_Clear_DMA(uint16_t Color) { unsigned int i,m; uint8_t aLine[LCD_W*2]={0}; for(i=0;i<LCD_W;i++) { aLine[2*i]=Color>>8; aLine[2*i+1]=Color; } LCD_SetWindows(0,0,lcddev.width-1,lcddev.height-1); LCD_CS_CLR; LCD_RS_SET; for(i=0;i<lcddev.height;i++) { SPI_WriteByte(aLine,LCD_W*2); } LCD_CS_SET; } 七、运行效果 感觉还有优化的空间。时钟、SPI参数还可以调一调。 调了一下LPSPI1_CLK: 复制{ .clkName = LPSPI1_CLK, .clkSrc = CLK_SRC_HSI_DIV1,//CLK_SRC_LSI_DIV2, .clkGate = true, .div = DIV_BY_ONE, .frac = MUL_BY_ONE, },选择内部高速时钟48Mhz
if(STATUS_SUCCESS==LPSPI_MasterInit(LPSPI_1, &g_spiState, &g_spiMasterCfg)) { printf("LPSPI_MasterInit success\r\n"); };六、LCD驱动 SPI写一个byte 复制void SPI_WriteaByte(uint8_t spiTxBuf) { LPSPI_MasterTransferBlocking(LPSPI_1, &spiTxBuf, NULL, 1, SPI_TIMEOUT); } SPI写多个byte 复制void SPI_WriteByte(uint8_t *spiTxBuf,uint16_t len) { LPSPI_MasterTransferBlocking(LPSPI_1, spiTxBuf, NULL, len, SPI_TIMEOUT); } LCD之GPIO控制部分(CS、RS、RST、背光) 复制#define LCD_CS_SET PINS_SetPins(GPIOD,1<<3) //片选端口 D3 #define LCD_RS_SET PINS_SetPins(GPIOB,1<<2) //数据/命令 B2 #define LCD_RST_SET PINS_SetPins(GPIOD,1<<5) //复位 D5LCD写命令 复制void LCD_WR_REG(uint8_t data) { LCD_CS_CLR; LCD_RS_CLR; SPI_WriteByte(&data,1); LCD_CS_SET; }LCD写数据 复制void LCD_WR_DATA(uint8_t data) { LCD_CS_CLR; LCD_RS_SET; SPI_WriteByte(&data,1); LCD_CS_SET; } LCD写寄存器 复制void LCD_WriteReg(uint8_t LCD_Reg, uint16_t LCD_RegValue) { LCD_WR_REG(LCD_Reg); LCD_WR_DATA(LCD_RegValue); } LCD DMA清屏 复制void LCD_Clear_DMA(uint16_t Color) { unsigned int i,m; uint8_t aLine[LCD_W*2]={0}; for(i=0;i<LCD_W;i++) { aLine[2*i]=Color>>8; aLine[2*i+1]=Color; } LCD_SetWindows(0,0,lcddev.width-1,lcddev.height-1); LCD_CS_CLR; LCD_RS_SET; for(i=0;i<lcddev.height;i++) { SPI_WriteByte(aLine,LCD_W*2); } LCD_CS_SET; } 七、运行效果 感觉还有优化的空间。时钟、SPI参数还可以调一调。 调了一下LPSPI1_CLK: 复制{ .clkName = LPSPI1_CLK, .clkSrc = CLK_SRC_HSI_DIV1,//CLK_SRC_LSI_DIV2, .clkGate = true, .div = DIV_BY_ONE, .frac = MUL_BY_ONE, },选择内部高速时钟48Mhz
void SPI_WriteaByte(uint8_t spiTxBuf) { LPSPI_MasterTransferBlocking(LPSPI_1, &spiTxBuf, NULL, 1, SPI_TIMEOUT); } SPI写多个byte 复制void SPI_WriteByte(uint8_t *spiTxBuf,uint16_t len) { LPSPI_MasterTransferBlocking(LPSPI_1, spiTxBuf, NULL, len, SPI_TIMEOUT); } LCD之GPIO控制部分(CS、RS、RST、背光) 复制#define LCD_CS_SET PINS_SetPins(GPIOD,1<<3) //片选端口 D3 #define LCD_RS_SET PINS_SetPins(GPIOB,1<<2) //数据/命令 B2 #define LCD_RST_SET PINS_SetPins(GPIOD,1<<5) //复位 D5LCD写命令 复制void LCD_WR_REG(uint8_t data) { LCD_CS_CLR; LCD_RS_CLR; SPI_WriteByte(&data,1); LCD_CS_SET; }LCD写数据 复制void LCD_WR_DATA(uint8_t data) { LCD_CS_CLR; LCD_RS_SET; SPI_WriteByte(&data,1); LCD_CS_SET; } LCD写寄存器 复制void LCD_WriteReg(uint8_t LCD_Reg, uint16_t LCD_RegValue) { LCD_WR_REG(LCD_Reg); LCD_WR_DATA(LCD_RegValue); } LCD DMA清屏 复制void LCD_Clear_DMA(uint16_t Color) { unsigned int i,m; uint8_t aLine[LCD_W*2]={0}; for(i=0;i<LCD_W;i++) { aLine[2*i]=Color>>8; aLine[2*i+1]=Color; } LCD_SetWindows(0,0,lcddev.width-1,lcddev.height-1); LCD_CS_CLR; LCD_RS_SET; for(i=0;i<lcddev.height;i++) { SPI_WriteByte(aLine,LCD_W*2); } LCD_CS_SET; } 七、运行效果 感觉还有优化的空间。时钟、SPI参数还可以调一调。 调了一下LPSPI1_CLK: 复制{ .clkName = LPSPI1_CLK, .clkSrc = CLK_SRC_HSI_DIV1,//CLK_SRC_LSI_DIV2, .clkGate = true, .div = DIV_BY_ONE, .frac = MUL_BY_ONE, },选择内部高速时钟48Mhz
void SPI_WriteByte(uint8_t *spiTxBuf,uint16_t len) { LPSPI_MasterTransferBlocking(LPSPI_1, spiTxBuf, NULL, len, SPI_TIMEOUT); } LCD之GPIO控制部分(CS、RS、RST、背光) 复制#define LCD_CS_SET PINS_SetPins(GPIOD,1<<3) //片选端口 D3 #define LCD_RS_SET PINS_SetPins(GPIOB,1<<2) //数据/命令 B2 #define LCD_RST_SET PINS_SetPins(GPIOD,1<<5) //复位 D5LCD写命令 复制void LCD_WR_REG(uint8_t data) { LCD_CS_CLR; LCD_RS_CLR; SPI_WriteByte(&data,1); LCD_CS_SET; }LCD写数据 复制void LCD_WR_DATA(uint8_t data) { LCD_CS_CLR; LCD_RS_SET; SPI_WriteByte(&data,1); LCD_CS_SET; } LCD写寄存器 复制void LCD_WriteReg(uint8_t LCD_Reg, uint16_t LCD_RegValue) { LCD_WR_REG(LCD_Reg); LCD_WR_DATA(LCD_RegValue); } LCD DMA清屏 复制void LCD_Clear_DMA(uint16_t Color) { unsigned int i,m; uint8_t aLine[LCD_W*2]={0}; for(i=0;i<LCD_W;i++) { aLine[2*i]=Color>>8; aLine[2*i+1]=Color; } LCD_SetWindows(0,0,lcddev.width-1,lcddev.height-1); LCD_CS_CLR; LCD_RS_SET; for(i=0;i<lcddev.height;i++) { SPI_WriteByte(aLine,LCD_W*2); } LCD_CS_SET; } 七、运行效果 感觉还有优化的空间。时钟、SPI参数还可以调一调。 调了一下LPSPI1_CLK: 复制{ .clkName = LPSPI1_CLK, .clkSrc = CLK_SRC_HSI_DIV1,//CLK_SRC_LSI_DIV2, .clkGate = true, .div = DIV_BY_ONE, .frac = MUL_BY_ONE, },选择内部高速时钟48Mhz
#define LCD_CS_SET PINS_SetPins(GPIOD,1<<3) //片选端口 D3 #define LCD_RS_SET PINS_SetPins(GPIOB,1<<2) //数据/命令 B2 #define LCD_RST_SET PINS_SetPins(GPIOD,1<<5) //复位 D5LCD写命令 复制void LCD_WR_REG(uint8_t data) { LCD_CS_CLR; LCD_RS_CLR; SPI_WriteByte(&data,1); LCD_CS_SET; }LCD写数据 复制void LCD_WR_DATA(uint8_t data) { LCD_CS_CLR; LCD_RS_SET; SPI_WriteByte(&data,1); LCD_CS_SET; } LCD写寄存器 复制void LCD_WriteReg(uint8_t LCD_Reg, uint16_t LCD_RegValue) { LCD_WR_REG(LCD_Reg); LCD_WR_DATA(LCD_RegValue); } LCD DMA清屏 复制void LCD_Clear_DMA(uint16_t Color) { unsigned int i,m; uint8_t aLine[LCD_W*2]={0}; for(i=0;i<LCD_W;i++) { aLine[2*i]=Color>>8; aLine[2*i+1]=Color; } LCD_SetWindows(0,0,lcddev.width-1,lcddev.height-1); LCD_CS_CLR; LCD_RS_SET; for(i=0;i<lcddev.height;i++) { SPI_WriteByte(aLine,LCD_W*2); } LCD_CS_SET; } 七、运行效果 感觉还有优化的空间。时钟、SPI参数还可以调一调。 调了一下LPSPI1_CLK: 复制{ .clkName = LPSPI1_CLK, .clkSrc = CLK_SRC_HSI_DIV1,//CLK_SRC_LSI_DIV2, .clkGate = true, .div = DIV_BY_ONE, .frac = MUL_BY_ONE, },选择内部高速时钟48Mhz
void LCD_WR_REG(uint8_t data) { LCD_CS_CLR; LCD_RS_CLR; SPI_WriteByte(&data,1); LCD_CS_SET; }LCD写数据 复制void LCD_WR_DATA(uint8_t data) { LCD_CS_CLR; LCD_RS_SET; SPI_WriteByte(&data,1); LCD_CS_SET; } LCD写寄存器 复制void LCD_WriteReg(uint8_t LCD_Reg, uint16_t LCD_RegValue) { LCD_WR_REG(LCD_Reg); LCD_WR_DATA(LCD_RegValue); } LCD DMA清屏 复制void LCD_Clear_DMA(uint16_t Color) { unsigned int i,m; uint8_t aLine[LCD_W*2]={0}; for(i=0;i<LCD_W;i++) { aLine[2*i]=Color>>8; aLine[2*i+1]=Color; } LCD_SetWindows(0,0,lcddev.width-1,lcddev.height-1); LCD_CS_CLR; LCD_RS_SET; for(i=0;i<lcddev.height;i++) { SPI_WriteByte(aLine,LCD_W*2); } LCD_CS_SET; } 七、运行效果 感觉还有优化的空间。时钟、SPI参数还可以调一调。 调了一下LPSPI1_CLK: 复制{ .clkName = LPSPI1_CLK, .clkSrc = CLK_SRC_HSI_DIV1,//CLK_SRC_LSI_DIV2, .clkGate = true, .div = DIV_BY_ONE, .frac = MUL_BY_ONE, },选择内部高速时钟48Mhz
void LCD_WR_DATA(uint8_t data) { LCD_CS_CLR; LCD_RS_SET; SPI_WriteByte(&data,1); LCD_CS_SET; } LCD写寄存器 复制void LCD_WriteReg(uint8_t LCD_Reg, uint16_t LCD_RegValue) { LCD_WR_REG(LCD_Reg); LCD_WR_DATA(LCD_RegValue); } LCD DMA清屏 复制void LCD_Clear_DMA(uint16_t Color) { unsigned int i,m; uint8_t aLine[LCD_W*2]={0}; for(i=0;i<LCD_W;i++) { aLine[2*i]=Color>>8; aLine[2*i+1]=Color; } LCD_SetWindows(0,0,lcddev.width-1,lcddev.height-1); LCD_CS_CLR; LCD_RS_SET; for(i=0;i<lcddev.height;i++) { SPI_WriteByte(aLine,LCD_W*2); } LCD_CS_SET; } 七、运行效果 感觉还有优化的空间。时钟、SPI参数还可以调一调。 调了一下LPSPI1_CLK: 复制{ .clkName = LPSPI1_CLK, .clkSrc = CLK_SRC_HSI_DIV1,//CLK_SRC_LSI_DIV2, .clkGate = true, .div = DIV_BY_ONE, .frac = MUL_BY_ONE, },选择内部高速时钟48Mhz
void LCD_WriteReg(uint8_t LCD_Reg, uint16_t LCD_RegValue) { LCD_WR_REG(LCD_Reg); LCD_WR_DATA(LCD_RegValue); } LCD DMA清屏 复制void LCD_Clear_DMA(uint16_t Color) { unsigned int i,m; uint8_t aLine[LCD_W*2]={0}; for(i=0;i<LCD_W;i++) { aLine[2*i]=Color>>8; aLine[2*i+1]=Color; } LCD_SetWindows(0,0,lcddev.width-1,lcddev.height-1); LCD_CS_CLR; LCD_RS_SET; for(i=0;i<lcddev.height;i++) { SPI_WriteByte(aLine,LCD_W*2); } LCD_CS_SET; } 七、运行效果 感觉还有优化的空间。时钟、SPI参数还可以调一调。 调了一下LPSPI1_CLK: 复制{ .clkName = LPSPI1_CLK, .clkSrc = CLK_SRC_HSI_DIV1,//CLK_SRC_LSI_DIV2, .clkGate = true, .div = DIV_BY_ONE, .frac = MUL_BY_ONE, },选择内部高速时钟48Mhz
void LCD_Clear_DMA(uint16_t Color) { unsigned int i,m; uint8_t aLine[LCD_W*2]={0}; for(i=0;i<LCD_W;i++) { aLine[2*i]=Color>>8; aLine[2*i+1]=Color; } LCD_SetWindows(0,0,lcddev.width-1,lcddev.height-1); LCD_CS_CLR; LCD_RS_SET; for(i=0;i<lcddev.height;i++) { SPI_WriteByte(aLine,LCD_W*2); } LCD_CS_SET; } 七、运行效果 感觉还有优化的空间。时钟、SPI参数还可以调一调。 调了一下LPSPI1_CLK: 复制{ .clkName = LPSPI1_CLK, .clkSrc = CLK_SRC_HSI_DIV1,//CLK_SRC_LSI_DIV2, .clkGate = true, .div = DIV_BY_ONE, .frac = MUL_BY_ONE, },选择内部高速时钟48Mhz
{ .clkName = LPSPI1_CLK, .clkSrc = CLK_SRC_HSI_DIV1,//CLK_SRC_LSI_DIV2, .clkGate = true, .div = DIV_BY_ONE, .frac = MUL_BY_ONE, },选择内部高速时钟48Mhz
收藏0 举报
本版积分规则 发表回复 回帖并转播 回帖后跳转到最后一页
84
147
3
扫码关注 21ic 官方微信
扫码关注嵌入式微处理器
扫码关注电源系统设计
扫码关注21ic项目外包
扫码浏览21ic手机版
本站介绍 | 申请友情链接 | 欢迎投稿 | 隐私声明 | 广告业务 | 网站地图 | 联系我们 | 诚聘英才
京公网安备 11010802024343号