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

[复制链接]
3872|7
 楼主| DreamLovely 发表于 2025-2-5 21:27 | 显示全部楼层 |阅读模式
前言
收到开发板已经快过年回家了,因为提前回去,导致进程一点都没有,开工后就赶快发表文章,深表歉意。


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

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

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

Snipaste_2025-02-05_20-12-07.png
然后实现以下驱动即可
Snipaste_2025-02-05_21-15-43.png

  1. #ifdef USE_LOG_PRINTF
  2. #if defined(__GNUC__) && !defined(__clang__)
  3. #define PUTCHAR_PROTOTYPE int __io_putchar(int ch)
  4. #else
  5. #define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)
  6. #endif

  7. PUTCHAR_PROTOTYPE
  8. {
  9.     while (usart_flag_get(USART1, USART_TDBE_FLAG) == RESET);

  10.     usart_data_transmit(USART1, (uint16_t)ch);

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

  12.     return (ch);
  13. }

  14. #endif

  15. void GC9A01_WR_DATA(uint8_t byte)
  16. {

  17.     spi_i2s_data_transmit(SPI1, byte);
  18.     while (spi_i2s_flag_get(SPI1, SPI_I2S_TDBE_FLAG) == RESET) {};
  19. }

  20. void GC9A01_WR_CMD(uint8_t byte)
  21. {
  22.     gpio_bits_reset(LCD_DC_GPIO_PORT, LCD_DC_PIN); // L

  23.     spi_i2s_data_transmit(SPI1, byte);
  24.        
  25.     while (spi_i2s_flag_get(SPI1, SPI_I2S_TDBE_FLAG) == RESET) {};

  26.     gpio_bits_set(LCD_DC_GPIO_PORT, LCD_DC_PIN); // H
  27. }

  28. void GC9A01_WriteDataHalfWord(uint16_t data)
  29. {
  30.     GC9A01_WR_DATA(data >> 8);
  31.     GC9A01_WR_DATA(data & 0xFF);
  32. }

  33. void GC9A01_SetAddressWindow(uint16_t x1, uint16_t y1, uint16_t x2, uint16_t y2)
  34. {
  35.     /* 列地址设置 */
  36.     GC9A01_WR_CMD(0x2a);
  37.     GC9A01_WriteDataHalfWord(x1);
  38.     GC9A01_WriteDataHalfWord(x2);
  39.     /* 行地址设置 */
  40.     GC9A01_WR_CMD(0x2b);
  41.     GC9A01_WriteDataHalfWord(y1);
  42.     GC9A01_WriteDataHalfWord(y2);
  43.     /* 写GRAM */
  44.     GC9A01_WR_CMD(0x2c);
  45. }

  46. void gc9a01_init(void)
  47. {
  48.        
  49.     gpio_bits_set(LCD_BLK_GPIO_PORT, LCD_BLK_PIN);// H
  50.     /* RST */
  51.     gpio_bits_set(LCD_RST_GPIO_PORT, LCD_RST_PIN);// H
  52.     wk_delay_ms(10);
  53.     gpio_bits_reset(LCD_RST_GPIO_PORT, LCD_RST_PIN); // L
  54.     wk_delay_ms(20);
  55.     gpio_bits_set(LCD_RST_GPIO_PORT, LCD_RST_PIN); // H
  56.     wk_delay_ms(120);

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

  60.     GC9A01_WR_CMD(0xEF);
  61.     GC9A01_WR_CMD(0xEB);
  62.     GC9A01_WR_DATA(0x14);

  63.     GC9A01_WR_CMD(0xFE);
  64.     GC9A01_WR_CMD(0xEF);

  65.     GC9A01_WR_CMD(0xEB);
  66.     GC9A01_WR_DATA(0x14);

  67.     GC9A01_WR_CMD(0x84);
  68.     GC9A01_WR_DATA(0x40);

  69.     GC9A01_WR_CMD(0x85);
  70.     GC9A01_WR_DATA(0xFF);

  71.     GC9A01_WR_CMD(0x86);
  72.     GC9A01_WR_DATA(0xFF);

  73.     GC9A01_WR_CMD(0x87);
  74.     GC9A01_WR_DATA(0xFF);

  75.     GC9A01_WR_CMD(0x88);
  76.     GC9A01_WR_DATA(0x0A);

  77.     GC9A01_WR_CMD(0x89);
  78.     GC9A01_WR_DATA(0x21);

  79.     GC9A01_WR_CMD(0x8A);
  80.     GC9A01_WR_DATA(0x00);

  81.     GC9A01_WR_CMD(0x8B);
  82.     GC9A01_WR_DATA(0x80);

  83.     GC9A01_WR_CMD(0x8C);
  84.     GC9A01_WR_DATA(0x01);

  85.     GC9A01_WR_CMD(0x8D);
  86.     GC9A01_WR_DATA(0x01);

  87.     GC9A01_WR_CMD(0x8E);
  88.     GC9A01_WR_DATA(0xFF);

  89.     GC9A01_WR_CMD(0x8F);
  90.     GC9A01_WR_DATA(0xFF);

  91.     GC9A01_WR_CMD(0xB6);
  92.     GC9A01_WR_DATA(0x00);
  93.     GC9A01_WR_DATA(0x20);

  94.     GC9A01_WR_CMD(0x36);
  95.     GC9A01_WR_DATA(0x08);

  96.     GC9A01_WR_CMD(0x3A);
  97.     GC9A01_WR_DATA(0x05);

  98.     GC9A01_WR_CMD(0x90);
  99.     GC9A01_WR_DATA(0x08);
  100.     GC9A01_WR_DATA(0x08);
  101.     GC9A01_WR_DATA(0x08);
  102.     GC9A01_WR_DATA(0x08);

  103.     GC9A01_WR_CMD(0xBD);
  104.     GC9A01_WR_DATA(0x06);

  105.     GC9A01_WR_CMD(0xBC);
  106.     GC9A01_WR_DATA(0x00);

  107.     GC9A01_WR_CMD(0xFF);
  108.     GC9A01_WR_DATA(0x60);
  109.     GC9A01_WR_DATA(0x01);
  110.     GC9A01_WR_DATA(0x04);

  111.     GC9A01_WR_CMD(0xC3);
  112.     GC9A01_WR_DATA(0x13);
  113.     GC9A01_WR_CMD(0xC4);
  114.     GC9A01_WR_DATA(0x13);

  115.     GC9A01_WR_CMD(0xC9);
  116.     GC9A01_WR_DATA(0x22);

  117.     GC9A01_WR_CMD(0xBE);
  118.     GC9A01_WR_DATA(0x11);

  119.     GC9A01_WR_CMD(0xE1);
  120.     GC9A01_WR_DATA(0x10);
  121.     GC9A01_WR_DATA(0x0E);

  122.     GC9A01_WR_CMD(0xDF);
  123.     GC9A01_WR_DATA(0x21);
  124.     GC9A01_WR_DATA(0x0c);
  125.     GC9A01_WR_DATA(0x02);

  126.     GC9A01_WR_CMD(0xF0);
  127.     GC9A01_WR_DATA(0x45);
  128.     GC9A01_WR_DATA(0x09);
  129.     GC9A01_WR_DATA(0x08);
  130.     GC9A01_WR_DATA(0x08);
  131.     GC9A01_WR_DATA(0x26);
  132.     GC9A01_WR_DATA(0x2A);

  133.     GC9A01_WR_CMD(0xF1);
  134.     GC9A01_WR_DATA(0x43);
  135.     GC9A01_WR_DATA(0x70);
  136.     GC9A01_WR_DATA(0x72);
  137.     GC9A01_WR_DATA(0x36);
  138.     GC9A01_WR_DATA(0x37);
  139.     GC9A01_WR_DATA(0x6F);

  140.     GC9A01_WR_CMD(0xF2);
  141.     GC9A01_WR_DATA(0x45);
  142.     GC9A01_WR_DATA(0x09);
  143.     GC9A01_WR_DATA(0x08);
  144.     GC9A01_WR_DATA(0x08);
  145.     GC9A01_WR_DATA(0x26);
  146.     GC9A01_WR_DATA(0x2A);

  147.     GC9A01_WR_CMD(0xF3);
  148.     GC9A01_WR_DATA(0x43);
  149.     GC9A01_WR_DATA(0x70);
  150.     GC9A01_WR_DATA(0x72);
  151.     GC9A01_WR_DATA(0x36);
  152.     GC9A01_WR_DATA(0x37);
  153.     GC9A01_WR_DATA(0x6F);

  154.     GC9A01_WR_CMD(0xED);
  155.     GC9A01_WR_DATA(0x1B);
  156.     GC9A01_WR_DATA(0x0B);

  157.     GC9A01_WR_CMD(0xAE);
  158.     GC9A01_WR_DATA(0x77);

  159.     GC9A01_WR_CMD(0xCD);
  160.     GC9A01_WR_DATA(0x63);

  161.     GC9A01_WR_CMD(0x70);
  162.     GC9A01_WR_DATA(0x07);
  163.     GC9A01_WR_DATA(0x07);
  164.     GC9A01_WR_DATA(0x04);
  165.     GC9A01_WR_DATA(0x0E);
  166.     GC9A01_WR_DATA(0x0F);
  167.     GC9A01_WR_DATA(0x09);
  168.     GC9A01_WR_DATA(0x07);
  169.     GC9A01_WR_DATA(0x08);
  170.     GC9A01_WR_DATA(0x03);

  171.     GC9A01_WR_CMD(0xE8);
  172.     GC9A01_WR_DATA(0x34);

  173.     GC9A01_WR_CMD(0x62);
  174.     GC9A01_WR_DATA(0x18);
  175.     GC9A01_WR_DATA(0x0D);
  176.     GC9A01_WR_DATA(0x71);
  177.     GC9A01_WR_DATA(0xED);
  178.     GC9A01_WR_DATA(0x70);
  179.     GC9A01_WR_DATA(0x70);
  180.     GC9A01_WR_DATA(0x18);
  181.     GC9A01_WR_DATA(0x0F);
  182.     GC9A01_WR_DATA(0x71);
  183.     GC9A01_WR_DATA(0xEF);
  184.     GC9A01_WR_DATA(0x70);
  185.     GC9A01_WR_DATA(0x70);

  186.     GC9A01_WR_CMD(0x63);
  187.     GC9A01_WR_DATA(0x18);
  188.     GC9A01_WR_DATA(0x11);
  189.     GC9A01_WR_DATA(0x71);
  190.     GC9A01_WR_DATA(0xF1);
  191.     GC9A01_WR_DATA(0x70);
  192.     GC9A01_WR_DATA(0x70);
  193.     GC9A01_WR_DATA(0x18);
  194.     GC9A01_WR_DATA(0x13);
  195.     GC9A01_WR_DATA(0x71);
  196.     GC9A01_WR_DATA(0xF3);
  197.     GC9A01_WR_DATA(0x70);
  198.     GC9A01_WR_DATA(0x70);

  199.     GC9A01_WR_CMD(0x64);
  200.     GC9A01_WR_DATA(0x28);
  201.     GC9A01_WR_DATA(0x29);
  202.     GC9A01_WR_DATA(0xF1);
  203.     GC9A01_WR_DATA(0x01);
  204.     GC9A01_WR_DATA(0xF1);
  205.     GC9A01_WR_DATA(0x00);
  206.     GC9A01_WR_DATA(0x07);

  207.     GC9A01_WR_CMD(0x66);
  208.     GC9A01_WR_DATA(0x3C);
  209.     GC9A01_WR_DATA(0x00);
  210.     GC9A01_WR_DATA(0xCD);
  211.     GC9A01_WR_DATA(0x67);
  212.     GC9A01_WR_DATA(0x45);
  213.     GC9A01_WR_DATA(0x45);
  214.     GC9A01_WR_DATA(0x10);
  215.     GC9A01_WR_DATA(0x00);
  216.     GC9A01_WR_DATA(0x00);
  217.     GC9A01_WR_DATA(0x00);

  218.     GC9A01_WR_CMD(0x67);
  219.     GC9A01_WR_DATA(0x00);
  220.     GC9A01_WR_DATA(0x3C);
  221.     GC9A01_WR_DATA(0x00);
  222.     GC9A01_WR_DATA(0x00);
  223.     GC9A01_WR_DATA(0x00);
  224.     GC9A01_WR_DATA(0x01);
  225.     GC9A01_WR_DATA(0x54);
  226.     GC9A01_WR_DATA(0x10);
  227.     GC9A01_WR_DATA(0x32);
  228.     GC9A01_WR_DATA(0x98);

  229.     GC9A01_WR_CMD(0x74);
  230.     GC9A01_WR_DATA(0x10);
  231.     GC9A01_WR_DATA(0x85);
  232.     GC9A01_WR_DATA(0x80);
  233.     GC9A01_WR_DATA(0x00);
  234.     GC9A01_WR_DATA(0x00);
  235.     GC9A01_WR_DATA(0x4E);
  236.     GC9A01_WR_DATA(0x00);

  237.     GC9A01_WR_CMD(0x98);
  238.     GC9A01_WR_DATA(0x3e);
  239.     GC9A01_WR_DATA(0x07);

  240.     GC9A01_WR_CMD(0x35);
  241.     GC9A01_WR_CMD(0x21);

  242.     GC9A01_WR_CMD(0x11);
  243.     wk_delay_ms(120);
  244.     GC9A01_WR_CMD(0x29);
  245.     wk_delay_ms(20);
  246. #endif
  247.         GC9A01_SetAddressWindow(0,0,240-1,240-1);
  248.         for(uint32_t i=0;i<240*240;i++)
  249.         {
  250.                 GC9A01_WriteDataHalfWord(0xa100);
  251.         }
  252. }

Snipaste_2025-02-05_21-14-53.png
然后开发板正常连接设备,编译下载即可开出效果
df8eb3c9d22b1edf7119ededf2c272a.jpg

下篇将由此推出其他驱动

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



caigang13 发表于 2025-2-5 21:57 来自手机 | 显示全部楼层
这是个圆形LCD吗?

评论

是的,GC9A01  发表于 2025-2-6 11:03
muyichuan2012 发表于 2025-2-6 09:34 | 显示全部楼层
关于功耗测试,楼主可以参考这篇帖子看看 https://bbs.21ic.com/icview-3421376-1-1.html

评论

参考了,我跑的是固件包里提供的PWR例程,没有一个低于200ua的(3V3),led全关了也是一样,哎  发表于 2025-2-6 11:04
ZenithSeeker 发表于 2025-7-19 12:57 | 显示全部楼层
muyichuan2012 发表于 2025-2-6 09:34
关于功耗测试,楼主可以参考这篇帖子看看 https://bbs.21ic.com/icview-3421376-1-1.html ...

好的,我也来看下功耗,雅特力的Work Bench确实很好用
暖心小太阳 发表于 2025-7-22 10:24 | 显示全部楼层
看起来你已经成功地在AT32开发板上实现了基础环境和SPI驱动LCD的配置,这是一个不错的开始!期待看到你接下来的其他驱动测评。
中国龙芯CDX 发表于 2025-7-22 22:46 | 显示全部楼层
AT32 Work Bench基础环境
您需要登录后才可以回帖 登录 | 注册

本版积分规则

7

主题

43

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部