注册 登录
电子工程世界-论坛 返回首页 EEWORLD首页 频道 EE大学堂 下载中心 Datasheet 专题
dyc1229的个人空间 https://home.eeworld.com.cn/space-uid-154565.html [收藏] [复制] [分享] [RSS]
日志

[N32L43X评测]5.SPI驱动LCD 1.3 ST7789

已有 758 次阅读2022-7-17 10:55

最近工作有些忙,耽误了评测进度

申请板子的时候就主要想测试一下N32的SPI性能,主频108MHz的M4内核对我有非常大的吸引力

用来刷LCD再好不过了

不过有些遗憾的是SPI模块用的是APB2的总线,只有主频的一半,而SPI模块还要从APB2总线中分频最少1半,

也就是主频的1/4,所以最快的速度只有27MHz。而我还要用USB模块,主频要用96MHz,即SPI的最高频率只有24MHz了,好遗憾啊。

目前接触到SPI刷屏比较爽的方案就是ESP32,SPI能到80MHz,刷240x240的屏很顺滑。

 

下面是驱动,详细的直接下载附件即可

void SPIConfig(void){
    SPI_InitType SPI_InitStructure;

    GPIO_InitType GPIO_InitStructure;
	
	RCC_EnableAPB2PeriphClk(RCC_APB2_PERIPH_SPI1, ENABLE);


    GPIO_InitStructure.Pin = SPI_LCD_SCK_PIN;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
    GPIO_InitStructure.GPIO_Alternate = GPIO_AF1_SPI1;
    GPIO_InitStructure.GPIO_Current = GPIO_DC_4mA;
    GPIO_InitStructure.GPIO_Pull = GPIO_No_Pull;
    GPIO_InitPeripheral(SPI_LCD_SCK_PORT, &GPIO_InitStructure);

    GPIO_InitStructure.Pin = SPI_LCD_MOSI_PIN;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
    GPIO_InitStructure.GPIO_Alternate = GPIO_AF0_SPI1;
    GPIO_InitStructure.GPIO_Current = GPIO_DC_4mA;
    GPIO_InitStructure.GPIO_Pull = GPIO_No_Pull;
    GPIO_InitPeripheral(SPI_LCD_MOSI_PORT, &GPIO_InitStructure);

    SPI_InitStructure.DataDirection = SPI_DIR_SINGLELINE_TX;
    SPI_InitStructure.SpiMode = SPI_MODE_MASTER;
    SPI_InitStructure.DataLen = SPI_DATA_SIZE_8BITS;
#if 0
    SPI_InitStructure.CLKPOL = SPI_CLKPOL_LOW;
    SPI_InitStructure.CLKPHA = SPI_CLKPHA_FIRST_EDGE;
	SPI_InitStructure.CLKPHA = SPI_CLKPHA_SECOND_EDGE;
#else
    SPI_InitStructure.CLKPOL = SPI_CLKPOL_HIGH;
    SPI_InitStructure.CLKPHA = SPI_CLKPHA_SECOND_EDGE;
#endif
    SPI_InitStructure.NSS = SPI_NSS_SOFT;
    SPI_InitStructure.BaudRatePres = SPI_BR_PRESCALER_2; // 48/4 = 12MHz
    SPI_InitStructure.FirstBit = SPI_FB_MSB;
    SPI_InitStructure.CRCPoly = 7;

    SPI_Init(SPI_LCD, &SPI_InitStructure);
    SPI_Enable(SPI_LCD, ENABLE);	
}
#if LCDTYPE == 0
void LCD_Writ_Bus(uint8_t dat) {
    // uint8_t shiftdat = 0;
    // shiftdat = shift_byte(dat);
    LCD_CS_CLR;
    // LCD_WR_SET;
    DATAOUT(dat);
    LCD_WR_CLR;
    // delay_us(5);
    LCD_WR_SET;
    LCD_CS_SET;
    LCD_DC_SET;
}
#elif LCDTYPE == 1
void LCD_Writ_Bus(uint8_t dat) {
    uint16_t retry = 0;
    /* Wait for SPIy Tx buffer empty */
    while (SPI_I2S_GetStatus(SPI_LCD, SPI_I2S_TE_FLAG) == RESET)
        ;
    /* Send SPIz data */
    SPI_I2S_TransmitData(SPI_LCD, dat);
}

#endif

 

这里就可以将之前的Shell功能用上了,上电后屏幕渐变色刷屏,键入setLcd 0后,可以停止定时刷新任务,

键入setLcd 1启动任务。

还可以键入clearLcd x 刷新想要的颜色,这些咱们之前已经讲过如何使用了。

   

对于经常编写界面的人来说,有了Shell功能,方便很多,调整字体大小,颜色,位置,就不用一遍一遍的编译,烧录,调整,再编译再烧录了。

虽然现在出现好多gui,都有设计器,不过内存占用还是有些多了,对于低分辨率的屏幕有点杀鸡用牛刀的感觉。

最近找了个uGUI,这个项目非常小巧,架构也不错,一共就2个文件,如果朋友们感兴趣,下一期咱们搞来试试

对了,例程中还有个好东西和大家分享,Vscode大家应该不陌生,EIDE就是Vscode的一个插件,可以导入MDK的工程,用Vscode写程序可太舒服了,

EIDE的功能也强大,可以脱离MDK直接编写编译程序了,而且主要是编译器可以用MDK的,这样可以避免好多不必要的麻烦。有机会这一部分也会拿出来单独做一期评测的

 

本文来自论坛,点击查看完整帖子内容。

评论 (0 个评论)

facelist doodle 涂鸦板

您需要登录后才可以评论 登录 | 注册

热门文章