在申请开发办的时候,是奔着这个开发板的高工作主频去的。所以这次测试主要围绕工作主频。在上次测试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实现的。另外一点,在烧录程序的时候,
烧录程序所在的文件夹中,一定不要有中文字符。否则,在连接串口的时候,一定会失败,这个问题是我在本次进行测试的时候发现的。