【GD32VW553-EVAL试用评测】LCD屏幕与随机数模块TRNG使用
[复制链接]
本帖最后由 hollyedward 于 2024-3-21 22:28 编辑
1、SPI LCD屏幕
GD32VW553H-EVAL 开发板上有一个TFT LCD 显示屏,它支持SPI 接口。在这个Demo 中,分别进行了文字测试、数字测试、画图测试和颜色测试,最终在LCD 屏上显示。
通过 SPI 协议与外部设备进行通信。 串行外设接口(Serial Peripheral Interface,缩写为 SPI)提供了基于 SPI 协议的数据发送和 接收功能,可以工作于主机或从机模式。SPI 接口支持具有硬件 CRC 计算和校验的全双工和 单工模式。
SPI 主要特征
具有全双工、半双工和单工模式的主从操作;
16位宽度,独立的发送和接收缓冲区;
8位或16位数据帧格式;
低位在前或高位在前的数据位顺序;
软件和硬件NSS管理;
硬件CRC计算、发送和校验;
发送和接收支持DMA模式;
支持SPI TI模式;
烧录LCD测试程序
运行程序后所有led闪烁一次,会依次进行文字测试、数字测试、画图测试和颜色测试
但是好像有问题,我看font_test程序里有打印汉字,屏幕没有显示出来
尝试打印4*4的格子,显示不同的颜色,但是有问题
没有显示别的颜色,字体也没显示,再琢磨看看
void draw_test(void)
{
__O uint8_t x=0;
__O uint8_t y=0;
lcd_clear(WHITE);
const uint16_t colors[] = {
YELLOW,
RED,
GREEN,
};
for(y = 0; y <= 3; y ++){
for(x = 0; x <= 3; x ++){
gui_box(x * 60, y * 60,60,60,0);
delay_1ms(100);
gui_rect(x * 60, y * 60,60,60,colors[(x + y) % 3]);
delay_1ms(100);
}
}
gui_draw_font_gbk16(250,50,RED,WHITE,"Average Temperature Is: ");
/* gui box2 */
// gui_box2(20,160,200,120,0);
// gui_box2(25,165,205,125,0);
// gui_box2(30,170,210,130,0);
// /* gui rect */
// gui_rect(10,50,110,70,YELLOW);
delay_1ms(1000);
}
默认的画图测试
void draw_test(void)
{
__O uint8_t i=0;
lcd_clear(BLUE);
gui_draw_font_gbk16(2,20,WHITE, BLUE," GUI Draw Test ");
/* gui box */
gui_box(60,90,160,160,GREEN);
/* gui box2 */
gui_box2(20,160,200,120,0);
gui_box2(25,165,205,125,0);
gui_box2(30,170,210,130,0);
/* gui rect */
gui_rect(10,50,110,70,YELLOW);
/* gui circle */
gui_circle(120,160,80,RED);
delay_1ms(1000);
}
不懂"__0"这个写法,问了gpt
在C语言中,__0是一个编译器指示器,它告诉编译器将指定的变量放在内存的特定位置。在您的代码中,__O指示器用于将变量i放在内存的第一个字节处。
之所以要这样做,是因为uint8_t类型的变量只能存储8个比特的数据。这意味着i的可能值范围为0到255。如果将i放在内存的第一个字节处,则可以确保i的值不会与其他变量冲突。
2、TRNG 随机数模块
真随机数发生器模块(TRNG)能够通过连续模拟噪声生成一个 32 位的随机数值。(那从环境里收集的噪声数据处理后算不算真随机数呢)
随机数种子由模拟电路实现。模拟种子信号输出到一个线性反馈移位寄存器(LFSR)之后在 该寄存器中转化成一个 32 位宽度的随机数。 该模拟种子由几个环形振荡器的输出生成。LFSR 由可配置的 TRNG_CLK 时钟(参考 RCU 相 关章节)驱动,因此随机数质量仅与 TRNG_CLK 时钟有关,与 HCLK 频率无关。 当有足够数量的种子被输入 LFSR 之后,LFSR 会输出 32 位数据到 TRNG_DATA 寄存器。同时,系统会监视模拟种子和 TRNG_CLK 时钟。一旦模拟种子发生错误或者时钟产生错误, TRNG_STAT 寄存器的相关状态位将被置 1,如果 TRNG_CTL 寄存器的 IE 位同时被置 1 还将 产生中断。
烧录相关例程
使用支持Hex输入的串口工具连接
当程序运行时,串口助手将显示初始信息。通过串口助手输入期望的最小值与最大值,之后会自动生成输入范围内的随机数并通过串口助手显示。
但是我这里生成了两个随机数,不应该是生成一个吗
代码查看
初始化USART接口以及TRNG外设,若TRNG三次仍未初始成功则打印错误信息至USART,进入死循环。
调用trng_random_range_get()方法生成随机数
int main(void)
{
uint8_t min,max;
uint8_t retry = 0;
/* USART configuration */
gd_eval_com_init(EVAL_COM0);
printf("\r\n /==============Gigadevice TRNG test=============/ \r\n");
/* configure TRNG module */
while((ERROR == trng_configuration()) && retry < 3) {
printf("TRNG init fail \r\n");
printf("TRNG init retry \r\n");
retry++;
}
if(3 == retry) {
/* if TRNG initialization is failed */
printf("TRNG init error \r\n");
while(1) {
}
}
/* TRNG initialization is successful */
printf("TRNG init ok \r\n");
while(1) {
/* get the random number range */
printf("Please input min num (hex format, the range is 0~0xFF): \r\n");
min = usart_data_get();
printf("The input min num is 0x%x \r\n", min);
printf("Please input max num hex format, the range is 0~0xFF): \r\n");
max = usart_data_get();
printf("The input max num is 0x%x \r\n", max);
/* input value is invalid */
if(min > max) {
printf("Please input correct num \r\n");
continue;
}
printf("Generate random num1 is 0x%x \r\n", trng_random_range_get(min, max));
printf("Generate random num2 is 0x%x \r\n", trng_random_range_get(min, max));
}
}
trng_random_range_get继续调用trng_get_true_random_data方法,trng_get_true_random_data 返回的是寄存器TRNG_DATA的值
/* registers definitions */
#define TRNG_CTL REG32(TRNG + 0x00000000U) /*!< control register */
#define TRNG_STAT REG32(TRNG + 0x00000004U) /*!< status register */
#define TRNG_DATA REG32(TRNG + 0x00000008U) /*!< data register */
|