在申请开发办的时候,是奔着这个开发板的高工作主频去的。所以这次测试主要围绕工作主频。在上次测试GPIO程序的基础上,进行了简单修改,在循环中不加 延时,直接翻转GPIO端口,然后检测端口的周期/脉冲频率。程序如下:

#include <rtthread.h>
  • #include <rtdevice.h>
  • #include "rtt_board.h"

  • void thread_entry(void *arg);

  • int main(void) {
  •     // 初始化LED使用的GPIO
  •     app_init_led_pins();

  •     // 建立线程
  •     static uint32_t led_thread_arg = 0;
  •     rt_thread_t led_thread = rt_thread_create("led_th", thread_entry, &led_thread_arg, 1024, 1, 10);

  •     // 启动线程
  •     rt_thread_startup(led_thread);

  •     return 0;
  • }

  • // LED闪烁线程
  • void thread_entry(void *arg) {
  •     while (1) {
  •         app_led_write(0, APP_LED_ON);       // 输出1
  •         app_led_write(0, APP_LED_OFF);      // 输出0
  •     }
  • }
  • 复制代码
    用示波器的检测结果:
    图片1.png
    脉冲周期是80nS左右。我的示波器是200MHz的,感觉测量结果已经不太准确了。波形也不好看,不是标准的方波了。这个测试的目的主要是看看时钟能达到什么级别。按照这个结果看,用来测量MHz级别的信号,应该没问题,虽然有些勉强。

    接下来,测试SPI的工作情况。利用HPM SDK Project Generator生成工程代码,选择的是spi_polling_master例程:

    图片2.png
    生成的例程使用SEGGER Embedded Studio集成编译器。为了测试,修改了主程序代码:
    int main(void) {
  •     uint8_t wbuff[10] = {0xa0, 0xa1, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7, 0xa8, 0xa9};
  •     uint8_t rbuff[10] = {0};
  •     spi_timing_config_t timing_config = {0};
  •     spi_format_config_t format_config = {0};
  •     spi_control_config_t control_config = {0};
  •     hpm_stat_t stat;
  •     uint32_t spi_clcok;

  •     /* bsp initialization */
  •     board_init();
  •     spi_clcok = board_init_spi_clock(BOARD_APP_SPI_BASE);
  •     board_init_spi_pins(BOARD_APP_SPI_BASE);
  •     printf("SPI-Master Polling Transfer Example\n");

  •     /* set SPI sclk frequency for master */
  •     spi_master_get_default_timing_config(&timing_config);
  •     timing_config.master_config.clk_src_freq_in_hz = spi_clcok;
  •     timing_config.master_config.sclk_freq_in_hz = BOARD_APP_SPI_SCLK_FREQ;
  •     if (status_success != spi_master_timing_init(BOARD_APP_SPI_BASE, &timing_config)) {
  •         printf("SPI master timming init failed\n");
  •         while (1) {
  •         }
  •     }
  •     printf("SPI-Master transfer timing is configured.\n");
  •     printf("SPI-Master transfer source clock frequency: %dHz\n", timing_config.master_config.clk_src_freq_in_hz);
  •     printf("SPI-Master transfer sclk frequency: %dHz\n", timing_config.master_config.sclk_freq_in_hz);

  •     /* set SPI format config for master */
  •     spi_master_get_default_format_config(&format_config);
  •     format_config.common_config.data_len_in_bits = BOARD_APP_SPI_DATA_LEN_IN_BITS;
  •     format_config.common_config.mode = spi_master_mode;
  •     format_config.common_config.cpol = spi_sclk_high_idle;
  •     format_config.common_config.cpha = spi_sclk_sampling_even_clk_edges;
  •     spi_format_init(BOARD_APP_SPI_BASE, &format_config);
  •     printf("SPI-Master transfer format is configured.\n");

  •     /* set SPI control config for master */
  •     spi_master_get_default_control_config(&control_config);
  •     control_config.master_config.cmd_enable = false;  /* cmd phase control for master */
  •     control_config.master_config.addr_enable = false; /* address phase control for master */
  •     control_config.common_config.trans_mode = spi_trans_write_only;
  •     spi_transfer_mode_print(&control_config);

  •     printf("SPI-Master transfer starts.\n");
  •     stat = spi_transfer(BOARD_APP_SPI_BASE,
  •                 &control_config,
  •                 NULL, NULL,
  •                 (uint8_t *)wbuff, ARRAY_SIZE(wbuff), (uint8_t *)rbuff, ARRAY_SIZE(rbuff));

  •     if (stat == status_success) {
  •         printf("SPI-Master transfer ends.\n");
  •     } else {
  •         printf("SPI-Master transfer error[%d]!\n", stat);
  •     }

  •     while(1) {
  •        stat = spi_transfer(BOARD_APP_SPI_BASE,
  •                   &control_config,
  •                   NULL, NULL,
  •                   (uint8_t *)wbuff, ARRAY_SIZE(wbuff), (uint8_t *)rbuff, ARRAY_SIZE(rbuff));

  •        if (stat == status_success) {
  •             printf("SPI-Master transfer ends.\n");
  •         } else {
  •             printf("SPI-Master transfer error[%d]!\n", stat);
  •         }
  •     }

  •     return 0;
  • }
  • 复制代码

    使用control_config.common_config.trans_mode = spi_trans_write_only;设置SPI为输出模式,因为后面是为了驱动SPI显示屏用的,不需要读。依旧使用串口模式烧录程序。根据电路图:


       图片3.png   


    可以在J3的MOSI和SCLK获取波形和逻辑数据。以下是逻辑数据:
    图片4.png
    由分析结果,和例程中发送的数据是一致的。可以看到,SPI的时钟周期是50nS,频率为20MHz,已经很高了。
    图片5.png
    示波器测出的波形依旧不好看,但可以看得出测量结果是一致的。
    图片6.png
    接下来,就准备用这个SPI接口驱动TFT显示屏。

    补充说明以下,程序中的串口调试输出内容依旧使用的是TX0/RX0实现的。另外一点,在烧录程序的时候,

    图片7.png
    烧录程序所在的文件夹中,一定不要有中文字符。否则,在连接串口的时候,一定会失败,这个问题是我在本次进行测试的时候发现的。