dyc1229 发表于 2022-7-17 10:55

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

<p>最近工作有些忙,耽误了评测进度</p>

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

<p>用来刷LCD再好不过了</p>

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

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

<p></p>

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

<p>&nbsp;</p>

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

<pre>
<code class="language-cpp">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, &amp;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, &amp;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, &amp;SPI_InitStructure);
    SPI_Enable(SPI_LCD, ENABLE);       
}</code></pre>

<pre>
<code class="language-cpp">#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</code></pre>

<p>&nbsp;</p>

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

<p>键入setLcd 1启动任务。</p>

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

<p> &nbsp; &nbsp;</p>

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

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

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

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

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

<p>&nbsp;</p>

lugl4313820 发表于 2022-7-17 21:03

字库做得怎么样,可不可以借鉴一下。。。嘿嘿!

秦天qintian0303 发表于 2022-7-17 23:46

lugl4313820 发表于 2022-7-17 21:03
字库做得怎么样,可不可以借鉴一下。。。嘿嘿!

<p>可以用两个数组弄一个自有字库,基本一个项目百十个自就够了</p>

秦天qintian0303 发表于 2022-7-17 23:47

<p>要想刷新快,还是得并口接口</p>

xld0932 发表于 2022-7-18 09:01

lugl4313820 发表于 2022-7-17 21:03
字库做得怎么样,可不可以借鉴一下。。。嘿嘿!

<p>看我的,看我的,分享GBK中文全字库,中英文混合显示哦</p>

<p><img height="48" src="https://bbs.eeworld.com.cn/static/editor/plugins/hkemoji/sticker/facebook/loveliness.gif" width="48" /></p>

lugl4313820 发表于 2022-7-18 20:50

xld0932 发表于 2022-7-18 09:01
看我的,看我的,分享GBK中文全字库,中英文混合显示哦

<p>好的,,,,期待呀。。。</p>
页: [1]
查看完整版本: [N32L43X评测]5.SPI驱动LCD 1.3 ST7789