打印
[AT32L021]

【AT-START-L021测评】1--AT32 Work Bench基础环境+硬件SPI驱动LCD

[复制链接]
52|1
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
CD, LCD, pi, spi
前言
收到开发板已经快过年回家了,因为提前回去,导致进程一点都没有,开工后就赶快发表文章,深表歉意。


快速开发
想要快速的进行开发,不需要太多花里胡哨的工具与数据结构,只需要明确目标,然后实现即可做到快速开发。

使用过STM32的朋友都知道,CUBEMAX不需要配置外设是多方便的事情,AT32 Work Bench 也为基础环境 提出此类便捷方式开发

如下配置串口(debug),SPI,IO,时钟树等等,即可生成需要用的外设驱动。


然后实现以下驱动即可


#ifdef USE_LOG_PRINTF
#if defined(__GNUC__) && !defined(__clang__)
#define PUTCHAR_PROTOTYPE int __io_putchar(int ch)
#else
#define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)
#endif

PUTCHAR_PROTOTYPE
{
    while (usart_flag_get(USART1, USART_TDBE_FLAG) == RESET);

    usart_data_transmit(USART1, (uint16_t)ch);

    while (usart_flag_get(USART1, USART_TDC_FLAG) == RESET);

    return (ch);
}

#endif

void GC9A01_WR_DATA(uint8_t byte)
{

    spi_i2s_data_transmit(SPI1, byte);
    while (spi_i2s_flag_get(SPI1, SPI_I2S_TDBE_FLAG) == RESET) {};
}

void GC9A01_WR_CMD(uint8_t byte)
{
    gpio_bits_reset(LCD_DC_GPIO_PORT, LCD_DC_PIN); // L

    spi_i2s_data_transmit(SPI1, byte);
       
    while (spi_i2s_flag_get(SPI1, SPI_I2S_TDBE_FLAG) == RESET) {};

    gpio_bits_set(LCD_DC_GPIO_PORT, LCD_DC_PIN); // H
}

void GC9A01_WriteDataHalfWord(uint16_t data)
{
    GC9A01_WR_DATA(data >> 8);
    GC9A01_WR_DATA(data & 0xFF);
}

void GC9A01_SetAddressWindow(uint16_t x1, uint16_t y1, uint16_t x2, uint16_t y2)
{
    /* 列地址设置 */
    GC9A01_WR_CMD(0x2a);
    GC9A01_WriteDataHalfWord(x1);
    GC9A01_WriteDataHalfWord(x2);
    /* 行地址设置 */
    GC9A01_WR_CMD(0x2b);
    GC9A01_WriteDataHalfWord(y1);
    GC9A01_WriteDataHalfWord(y2);
    /* 写GRAM */
    GC9A01_WR_CMD(0x2c);
}

void gc9a01_init(void)
{
       
    gpio_bits_set(LCD_BLK_GPIO_PORT, LCD_BLK_PIN);// H
    /* RST */
    gpio_bits_set(LCD_RST_GPIO_PORT, LCD_RST_PIN);// H
    wk_delay_ms(10);
    gpio_bits_reset(LCD_RST_GPIO_PORT, LCD_RST_PIN); // L
    wk_delay_ms(20);
    gpio_bits_set(LCD_RST_GPIO_PORT, LCD_RST_PIN); // H
    wk_delay_ms(120);

    gpio_bits_reset(LCD_CS_GPIO_PORT, LCD_CS_PIN); // L
#if 1
        /************* Start Initial Sequence **********/

    GC9A01_WR_CMD(0xEF);
    GC9A01_WR_CMD(0xEB);
    GC9A01_WR_DATA(0x14);

    GC9A01_WR_CMD(0xFE);
    GC9A01_WR_CMD(0xEF);

    GC9A01_WR_CMD(0xEB);
    GC9A01_WR_DATA(0x14);

    GC9A01_WR_CMD(0x84);
    GC9A01_WR_DATA(0x40);

    GC9A01_WR_CMD(0x85);
    GC9A01_WR_DATA(0xFF);

    GC9A01_WR_CMD(0x86);
    GC9A01_WR_DATA(0xFF);

    GC9A01_WR_CMD(0x87);
    GC9A01_WR_DATA(0xFF);

    GC9A01_WR_CMD(0x88);
    GC9A01_WR_DATA(0x0A);

    GC9A01_WR_CMD(0x89);
    GC9A01_WR_DATA(0x21);

    GC9A01_WR_CMD(0x8A);
    GC9A01_WR_DATA(0x00);

    GC9A01_WR_CMD(0x8B);
    GC9A01_WR_DATA(0x80);

    GC9A01_WR_CMD(0x8C);
    GC9A01_WR_DATA(0x01);

    GC9A01_WR_CMD(0x8D);
    GC9A01_WR_DATA(0x01);

    GC9A01_WR_CMD(0x8E);
    GC9A01_WR_DATA(0xFF);

    GC9A01_WR_CMD(0x8F);
    GC9A01_WR_DATA(0xFF);

    GC9A01_WR_CMD(0xB6);
    GC9A01_WR_DATA(0x00);
    GC9A01_WR_DATA(0x20);

    GC9A01_WR_CMD(0x36);
    GC9A01_WR_DATA(0x08);

    GC9A01_WR_CMD(0x3A);
    GC9A01_WR_DATA(0x05);

    GC9A01_WR_CMD(0x90);
    GC9A01_WR_DATA(0x08);
    GC9A01_WR_DATA(0x08);
    GC9A01_WR_DATA(0x08);
    GC9A01_WR_DATA(0x08);

    GC9A01_WR_CMD(0xBD);
    GC9A01_WR_DATA(0x06);

    GC9A01_WR_CMD(0xBC);
    GC9A01_WR_DATA(0x00);

    GC9A01_WR_CMD(0xFF);
    GC9A01_WR_DATA(0x60);
    GC9A01_WR_DATA(0x01);
    GC9A01_WR_DATA(0x04);

    GC9A01_WR_CMD(0xC3);
    GC9A01_WR_DATA(0x13);
    GC9A01_WR_CMD(0xC4);
    GC9A01_WR_DATA(0x13);

    GC9A01_WR_CMD(0xC9);
    GC9A01_WR_DATA(0x22);

    GC9A01_WR_CMD(0xBE);
    GC9A01_WR_DATA(0x11);

    GC9A01_WR_CMD(0xE1);
    GC9A01_WR_DATA(0x10);
    GC9A01_WR_DATA(0x0E);

    GC9A01_WR_CMD(0xDF);
    GC9A01_WR_DATA(0x21);
    GC9A01_WR_DATA(0x0c);
    GC9A01_WR_DATA(0x02);

    GC9A01_WR_CMD(0xF0);
    GC9A01_WR_DATA(0x45);
    GC9A01_WR_DATA(0x09);
    GC9A01_WR_DATA(0x08);
    GC9A01_WR_DATA(0x08);
    GC9A01_WR_DATA(0x26);
    GC9A01_WR_DATA(0x2A);

    GC9A01_WR_CMD(0xF1);
    GC9A01_WR_DATA(0x43);
    GC9A01_WR_DATA(0x70);
    GC9A01_WR_DATA(0x72);
    GC9A01_WR_DATA(0x36);
    GC9A01_WR_DATA(0x37);
    GC9A01_WR_DATA(0x6F);

    GC9A01_WR_CMD(0xF2);
    GC9A01_WR_DATA(0x45);
    GC9A01_WR_DATA(0x09);
    GC9A01_WR_DATA(0x08);
    GC9A01_WR_DATA(0x08);
    GC9A01_WR_DATA(0x26);
    GC9A01_WR_DATA(0x2A);

    GC9A01_WR_CMD(0xF3);
    GC9A01_WR_DATA(0x43);
    GC9A01_WR_DATA(0x70);
    GC9A01_WR_DATA(0x72);
    GC9A01_WR_DATA(0x36);
    GC9A01_WR_DATA(0x37);
    GC9A01_WR_DATA(0x6F);

    GC9A01_WR_CMD(0xED);
    GC9A01_WR_DATA(0x1B);
    GC9A01_WR_DATA(0x0B);

    GC9A01_WR_CMD(0xAE);
    GC9A01_WR_DATA(0x77);

    GC9A01_WR_CMD(0xCD);
    GC9A01_WR_DATA(0x63);

    GC9A01_WR_CMD(0x70);
    GC9A01_WR_DATA(0x07);
    GC9A01_WR_DATA(0x07);
    GC9A01_WR_DATA(0x04);
    GC9A01_WR_DATA(0x0E);
    GC9A01_WR_DATA(0x0F);
    GC9A01_WR_DATA(0x09);
    GC9A01_WR_DATA(0x07);
    GC9A01_WR_DATA(0x08);
    GC9A01_WR_DATA(0x03);

    GC9A01_WR_CMD(0xE8);
    GC9A01_WR_DATA(0x34);

    GC9A01_WR_CMD(0x62);
    GC9A01_WR_DATA(0x18);
    GC9A01_WR_DATA(0x0D);
    GC9A01_WR_DATA(0x71);
    GC9A01_WR_DATA(0xED);
    GC9A01_WR_DATA(0x70);
    GC9A01_WR_DATA(0x70);
    GC9A01_WR_DATA(0x18);
    GC9A01_WR_DATA(0x0F);
    GC9A01_WR_DATA(0x71);
    GC9A01_WR_DATA(0xEF);
    GC9A01_WR_DATA(0x70);
    GC9A01_WR_DATA(0x70);

    GC9A01_WR_CMD(0x63);
    GC9A01_WR_DATA(0x18);
    GC9A01_WR_DATA(0x11);
    GC9A01_WR_DATA(0x71);
    GC9A01_WR_DATA(0xF1);
    GC9A01_WR_DATA(0x70);
    GC9A01_WR_DATA(0x70);
    GC9A01_WR_DATA(0x18);
    GC9A01_WR_DATA(0x13);
    GC9A01_WR_DATA(0x71);
    GC9A01_WR_DATA(0xF3);
    GC9A01_WR_DATA(0x70);
    GC9A01_WR_DATA(0x70);

    GC9A01_WR_CMD(0x64);
    GC9A01_WR_DATA(0x28);
    GC9A01_WR_DATA(0x29);
    GC9A01_WR_DATA(0xF1);
    GC9A01_WR_DATA(0x01);
    GC9A01_WR_DATA(0xF1);
    GC9A01_WR_DATA(0x00);
    GC9A01_WR_DATA(0x07);

    GC9A01_WR_CMD(0x66);
    GC9A01_WR_DATA(0x3C);
    GC9A01_WR_DATA(0x00);
    GC9A01_WR_DATA(0xCD);
    GC9A01_WR_DATA(0x67);
    GC9A01_WR_DATA(0x45);
    GC9A01_WR_DATA(0x45);
    GC9A01_WR_DATA(0x10);
    GC9A01_WR_DATA(0x00);
    GC9A01_WR_DATA(0x00);
    GC9A01_WR_DATA(0x00);

    GC9A01_WR_CMD(0x67);
    GC9A01_WR_DATA(0x00);
    GC9A01_WR_DATA(0x3C);
    GC9A01_WR_DATA(0x00);
    GC9A01_WR_DATA(0x00);
    GC9A01_WR_DATA(0x00);
    GC9A01_WR_DATA(0x01);
    GC9A01_WR_DATA(0x54);
    GC9A01_WR_DATA(0x10);
    GC9A01_WR_DATA(0x32);
    GC9A01_WR_DATA(0x98);

    GC9A01_WR_CMD(0x74);
    GC9A01_WR_DATA(0x10);
    GC9A01_WR_DATA(0x85);
    GC9A01_WR_DATA(0x80);
    GC9A01_WR_DATA(0x00);
    GC9A01_WR_DATA(0x00);
    GC9A01_WR_DATA(0x4E);
    GC9A01_WR_DATA(0x00);

    GC9A01_WR_CMD(0x98);
    GC9A01_WR_DATA(0x3e);
    GC9A01_WR_DATA(0x07);

    GC9A01_WR_CMD(0x35);
    GC9A01_WR_CMD(0x21);

    GC9A01_WR_CMD(0x11);
    wk_delay_ms(120);
    GC9A01_WR_CMD(0x29);
    wk_delay_ms(20);
#endif
        GC9A01_SetAddressWindow(0,0,240-1,240-1);
        for(uint32_t i=0;i<240*240;i++)
        {
                GC9A01_WriteDataHalfWord(0xa100);
        }
}


然后开发板正常连接设备,编译下载即可开出效果


下篇将由此推出其他驱动

PS:我跑demo的低功耗怎么每一个都200ua左右呢,搞不明白,哎



使用特权

评论回复
沙发
caigang13| | 2025-2-5 21:57 | 只看该作者
这是个圆形LCD吗?

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

7

主题

42

帖子

1

粉丝