1148|1

40

帖子

0

TA的资源

一粒金砂(中级)

楼主
 

【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 */

 

此帖出自GD32 MCU论坛

最新回复

感谢分享!   详情 回复 发表于 2024-5-14 09:12
点赞 关注
 

回复
举报

6992

帖子

11

TA的资源

版主

沙发
 

感谢分享!

此帖出自GD32 MCU论坛
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/8 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表