[AT32L021] 【AT-START-L021测评】+ 软件模拟方式超频驱动SPI显示屏

[复制链接]
 楼主| suncat0504 发表于 2024-12-7 10:05 | 显示全部楼层 |阅读模式
AT32L021单片机自身提供了两组SPI外设,本打算使用其中一组用来驱动一个2.0寸的TFT显示屏。
5769f2d20ce2ecbd3fcd41caf14bfa46
但由于接口中还存在其它控制线,诸如DC、RST、BL等,为了稳妥起见,打算先使用软件模拟方式完成驱动。整个程序依旧在使用ti_fullduplex_dma例程的基础上进行修改。测试中没有使用显示屏上的中文字库,所以接口中的SDO(相当于SPI接口中的MISO)就没有使用。这块SPI显示屏和开发板的连接如下:

开发板
显示屏
引脚功能
PA1
RST
硬件复位显示屏
0有效
PA2
DC
命令寄存器/数据寄存器选择
命令寄存器
数据寄存器
PA3
BL
显示屏背景灯
1有效,打开背景灯
PA4
CS
片选择,0有效
写入数据或者指令时,需要提前设置为0
PA5
SCK
SPI通讯时钟
PA7
MOSI
输出给显示屏的数据
  1. #define TFT_PORT GPIOA

  2. #define TFT_PORT_PERIPH_CLOCK CRM_GPIOA_PERIPH_CLOCK

  3. #define TFT_RST_PIN GPIO_PINS_1

  4. #define TFT_DC_PIN GPIO_PINS_2

  5. #define TFT_BL_PIN GPIO_PINS_3

  6. #define TFT_CS_PIN GPIO_PINS_4

  7. #define TFT_SCK_PIN GPIO_PINS_5

  8. #define TFT_MISO_PIN GPIO_PINS_6

  9. #define TFT_MOSI_PIN GPIO_PINS_7

主程序中的处理的代码如下:
  1. int main(void) {
  2.     uint32_t cnt=0;
  3.    
  4.     system_clock_config();        // 配置系统时钟
  5.     at32_board_init();            // 板级初始化
  6.     uart_print_init(115200);
  7.    
  8.     delay_us(100);                // 延迟
  9.    
  10.     TFT_Init();
  11.     TFT_Clear(BLACK);
  12.     TFT_ShowString(0, 0, 16, "Hello 21ic & Artery" , 0);
  13.    
  14.     while(cnt<10) {
  15.         cnt++;
  16.         TFT_ShowNum(0, 16, cnt, 8 , 16);
  17.     }
  18.    
  19.     while(1) {
  20.         gpio_bits_toggle(TFT_PORT, TFT_SCK_PIN);
  21.     }
  22.    
  23. }
在完成初始化后,显示一段字符串,以及变化的数据。然后利用死循环检测GPIO口翻转的速度。测试结果:
图片1.png

之所以追加第二部分循环的处理,本来是为了看看在模拟方式下驱动SPI驱动显示屏时,能快到什么程度,能不能接近使用SPI外设方式驱动的速度,结果最后被用来测试AT32L021单片机的超频了。按照说明书,AT32L021的最高工作主频是80MHz,这一点在雅特力提供的设计工具WorkBench上可以得到证明,如下图,当做主频设置超过80MHz的时候,显示出红色“X”,标明已经是错误了。
cb2a614de5f13bf1d0889897c884c869
事实上在选择AT32L021单片机时,工具已经做出了限制,
76f6592a909c8cb8c4943ea61c17f590
在这个错误的方式下,是没有办法得到系统时钟的设置代码的,会提示
1b77e1dc183d6102d1fa6638d4958926
于是我在设置为80MHz时得到代码样本
e64a6f72688c9a0b8616ef12ed63b2ac
534d690ec78a6c1b973c390262c05c42
将这段代码替换到例程中设置系统时钟的代码中,然后修改倍频设置,将20倍频逐步提高,最终提高到35倍时,编译后的程序,才无法被正常执行。
函数system_clock_config中,倍频设置部分的代码的测试经历
  1. /* config pll clock resource */

  2. //crm_pll_config(CRM_PLL_SOURCE_HICK, CRM_PLL_MULT_20); // 80MHz,systick=10MHz OK

  3. //crm_pll_config(CRM_PLL_SOURCE_HICK, CRM_PLL_MULT_25); // 100MHz,systick=12.5MHz OK

  4. //crm_pll_config(CRM_PLL_SOURCE_HICK, CRM_PLL_MULT_30); // 120MHz,systick=15MHz OK

  5. //crm_pll_config(CRM_PLL_SOURCE_HICK, CRM_PLL_MULT_32); // 128MHz,systick=16MHz OK

  6. //crm_pll_config(CRM_PLL_SOURCE_HICK, CRM_PLL_MULT_33); // 132MHz,systick=16.5MHz OK

  7. crm_pll_config(CRM_PLL_SOURCE_HICK, CRM_PLL_MULT_34); // 136MHz,systick=17MHz OK

  8. //crm_pll_config(CRM_PLL_SOURCE_HICK, CRM_PLL_MULT_35); // 140MHz,systick=17MHz NG

因此这块开发板在以能正常驱动显示屏的前提下,显示可以被超频到136MHz,比手册规定的设置,足足提高了70%,表现十分惊异啊。下图是在132MHz下经过逻辑分析仪检测的结果:
09dc6b7e8d9f2708276e6184b4c25a76
约771ms之前是复位显示屏、驱动显示字符串以及变换的数字的波形;约771ms之后是单纯测试GPIO口翻转速度的波形。
08c071157033f2676477c6c92ce9310f
e4b0becb038ac16b90d8754c8372224f
在132MHz主频下,模拟SPI的时钟周期是260ns,GPIO口的翻转周期是140ns。在136MHz下,模拟SPI的时钟周期也依旧是260ns(估计是已经超出我的逻辑分析仪的检测能力了)。
19a6afaea06afdd8ba711adc38fda785
按照260ns计算,在这种超频状态下,软件模拟SPI的通讯速度可以达到3.8MHz(按位计算的)。
这个超频的处理,在使用原来例程中的主频设置中,
  1.     /* reset crm */
  2.     crm_reset();

  3.     /* config flash psr register */
  4.     flash_psr_set(FLASH_WAIT_CYCLE_2);

  5.     /* enable pwc periph clock */
  6.     crm_periph_clock_enable(CRM_PWC_PERIPH_CLOCK, TRUE);

  7.     /* config ldo voltage */
  8.     pwc_ldo_output_voltage_set(PWC_LDO_OUTPUT_1V2);

  9.     crm_clock_source_enable(CRM_CLOCK_SOURCE_HEXT, TRUE);

  10.     /* wait till hext is ready */
  11.     while(crm_hext_stable_wait() == ERROR)
  12.     {
  13.     }

  14.     /* config pll clock resource */
  15.     //crm_pll_config(CRM_PLL_SOURCE_HEXT, CRM_PLL_MULT_10);    //  80MHz
  16.     //crm_pll_config(CRM_PLL_SOURCE_HEXT, CRM_PLL_MULT_12);    //  96MHz  OK 可以运行   100nS
  17.     //crm_pll_config(CRM_PLL_SOURCE_HEXT, CRM_PLL_MULT_15);       // 120MHz  OK 可以运行  80nS
  18.     crm_pll_config(CRM_PLL_SOURCE_HEXT, CRM_PLL_MULT_17);       // 136MHz  OK 可以运行  
  19.     //crm_pll_config(CRM_PLL_SOURCE_HEXT, CRM_PLL_MULT_18);       // 144MHz  不能运行  
  20.    
  21.     /* enable pll */
  22.     crm_clock_source_enable(CRM_CLOCK_SOURCE_PLL, TRUE);

  23.     /* wait till pll is ready */
  24.     while(crm_flag_get(CRM_PLL_STABLE_FLAG) != SET)
  25.     {
  26.     }

  27.     /* config ahbclk */
  28.     crm_ahb_div_set(CRM_AHB_DIV_1);

  29.     /* config apb2clk, the maximum frequency of APB1/APB2 clock is 80 MHz  */
  30.     crm_apb2_div_set(CRM_APB2_DIV_1);

  31.     /* config apb1clk, the maximum frequency of APB1/APB2 clock is 80 MHz  */
  32.     crm_apb1_div_set(CRM_APB1_DIV_1);

  33.     /* select pll as system clock source */
  34.     crm_sysclk_switch(CRM_SCLK_PLL);

  35.     /* wait till pll is used as system clock source */
  36.     while(crm_sysclk_switch_status_get() != CRM_SCLK_PLL)
  37.     {
  38.     }

  39.     /* update system_core_clock global variable */
  40.     system_core_clock_update();
最高是可以使用17倍倍频的,和前面的测试结果是一致的。
以前,经常有人乐忠于对计算机的CPU进行超频,但无论怎么超频,也没有我这次对AT32L021的超频这么抢眼。AT32L021的表现超乎想象,看来手册标记的最高工作主频的上限是有点保守了。

呐咯密密 发表于 2024-12-8 10:43 | 显示全部楼层
超频后的显示效果正常吗
 楼主| suncat0504 发表于 2024-12-8 14:43 | 显示全部楼层
一切正常,没任何毛病
 楼主| suncat0504 发表于 2024-12-8 14:44 | 显示全部楼层
超频运行,芯片用手触摸,也没有发热迹象
沉浮的茶叶 发表于 2024-12-18 15:00 | 显示全部楼层
我也经常超频,感觉MCU超点好像也没问题
您需要登录后才可以回帖 登录 | 注册

本版积分规则

认证:大连伊飞特信息技术有限公司软件工程师
简介:本人于1993年毕业于大连理工大学。毕业后从事单片机开发工作5年,之后转入软件开发工作至今。

158

主题

4505

帖子

6

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