前言
收到开发板已经快过年回家了,因为提前回去,导致进程一点都没有,开工后就赶快发表文章,深表歉意。
快速开发
想要快速的进行开发,不需要太多花里胡哨的工具与数据结构,只需要明确目标,然后实现即可做到快速开发。
使用过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左右呢,搞不明白,哎
|