在申请开发办的时候,是奔着这个开发板的高工作主频去的。所以这次测试主要围绕工作主频。在上次测试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
- }
- }
脉冲周期是80nS左右。我的示波器是200MHz的,感觉测量结果已经不太准确了。波形也不好看,不是标准的方波了。这个测试的目的主要是看看时钟能达到什么级别。按照这个结果看,用来测量MHz级别的信号,应该没问题,虽然有些勉强。
接下来,测试SPI的工作情况。利用HPM SDK Project Generator生成工程代码,选择的是spi_polling_master例程:
生成的例程使用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显示屏用的,不需要读。依旧使用串口模式烧录程序。根据电路图:
可以在J3的MOSI和SCLK获取波形和逻辑数据。以下是逻辑数据:
由分析结果,和例程中发送的数据是一致的。可以看到,SPI的时钟周期是50nS,频率为20MHz,已经很高了。
示波器测出的波形依旧不好看,但可以看得出测量结果是一致的。
接下来,就准备用这个SPI接口驱动TFT显示屏。
补充说明以下,程序中的串口调试输出内容依旧使用的是TX0/RX0实现的。另外一点,在烧录程序的时候,
烧录程序所在的文件夹中,一定不要有中文字符。否则,在连接串口的时候,一定会失败,这个问题是我在本次进行测试的时候发现的。