打印
[AT32L021]

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

[复制链接]
798|4
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
AT32L021单片机自身提供了两组SPI外设,本打算使用其中一组用来驱动一个2.0寸的TFT显示屏。

但由于接口中还存在其它控制线,诸如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
输出给显示屏的数据
#define TFT_PORT GPIOA

#define TFT_PORT_PERIPH_CLOCK CRM_GPIOA_PERIPH_CLOCK

#define TFT_RST_PIN GPIO_PINS_1

#define TFT_DC_PIN GPIO_PINS_2

#define TFT_BL_PIN GPIO_PINS_3

#define TFT_CS_PIN GPIO_PINS_4

#define TFT_SCK_PIN GPIO_PINS_5

#define TFT_MISO_PIN GPIO_PINS_6

#define TFT_MOSI_PIN GPIO_PINS_7

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


之所以追加第二部分循环的处理,本来是为了看看在模拟方式下驱动SPI驱动显示屏时,能快到什么程度,能不能接近使用SPI外设方式驱动的速度,结果最后被用来测试AT32L021单片机的超频了。按照说明书,AT32L021的最高工作主频是80MHz,这一点在雅特力提供的设计工具WorkBench上可以得到证明,如下图,当做主频设置超过80MHz的时候,显示出红色“X”,标明已经是错误了。

事实上在选择AT32L021单片机时,工具已经做出了限制,

在这个错误的方式下,是没有办法得到系统时钟的设置代码的,会提示

于是我在设置为80MHz时得到代码样本


将这段代码替换到例程中设置系统时钟的代码中,然后修改倍频设置,将20倍频逐步提高,最终提高到35倍时,编译后的程序,才无法被正常执行。
函数system_clock_config中,倍频设置部分的代码的测试经历
/* config pll clock resource */

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

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

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

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

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

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

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

因此这块开发板在以能正常驱动显示屏的前提下,显示可以被超频到136MHz,比手册规定的设置,足足提高了70%,表现十分惊异啊。下图是在132MHz下经过逻辑分析仪检测的结果:

约771ms之前是复位显示屏、驱动显示字符串以及变换的数字的波形;约771ms之后是单纯测试GPIO口翻转速度的波形。


在132MHz主频下,模拟SPI的时钟周期是260ns,GPIO口的翻转周期是140ns。在136MHz下,模拟SPI的时钟周期也依旧是260ns(估计是已经超出我的逻辑分析仪的检测能力了)。

按照260ns计算,在这种超频状态下,软件模拟SPI的通讯速度可以达到3.8MHz(按位计算的)。
这个超频的处理,在使用原来例程中的主频设置中,
    /* reset crm */
    crm_reset();

    /* config flash psr register */
    flash_psr_set(FLASH_WAIT_CYCLE_2);

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

    /* config ldo voltage */
    pwc_ldo_output_voltage_set(PWC_LDO_OUTPUT_1V2);

    crm_clock_source_enable(CRM_CLOCK_SOURCE_HEXT, TRUE);

    /* wait till hext is ready */
    while(crm_hext_stable_wait() == ERROR)
    {
    }

    /* config pll clock resource */
    //crm_pll_config(CRM_PLL_SOURCE_HEXT, CRM_PLL_MULT_10);    //  80MHz
    //crm_pll_config(CRM_PLL_SOURCE_HEXT, CRM_PLL_MULT_12);    //  96MHz  OK 可以运行   100nS
    //crm_pll_config(CRM_PLL_SOURCE_HEXT, CRM_PLL_MULT_15);       // 120MHz  OK 可以运行  80nS
    crm_pll_config(CRM_PLL_SOURCE_HEXT, CRM_PLL_MULT_17);       // 136MHz  OK 可以运行  
    //crm_pll_config(CRM_PLL_SOURCE_HEXT, CRM_PLL_MULT_18);       // 144MHz  不能运行  
   
    /* enable pll */
    crm_clock_source_enable(CRM_CLOCK_SOURCE_PLL, TRUE);

    /* wait till pll is ready */
    while(crm_flag_get(CRM_PLL_STABLE_FLAG) != SET)
    {
    }

    /* config ahbclk */
    crm_ahb_div_set(CRM_AHB_DIV_1);

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

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

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

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

    /* update system_core_clock global variable */
    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 | 只看该作者
超频运行,芯片用手触摸,也没有发热迹象

使用特权

评论回复
5
沉浮的茶叶| | 2024-12-18 15:00 | 只看该作者
我也经常超频,感觉MCU超点好像也没问题

使用特权

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

本版积分规则

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

130

主题

3870

帖子

5

粉丝