打印
[STM32H7]

【STM32H745I-DISCO试用】4.屏幕显示Hello

[复制链接]
44|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
pzw1758|  楼主 | 2025-2-23 10:18 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 pzw1758 于 2025-2-23 10:21 编辑

驱动板载LCD参考H7固件包中BSP工程将驱动程序移植到自己的工程即可,后续主要讲解适用RNG产生随机数,使得在LCD的任意位置显示文字。
一、RNG介绍
RNG是一个基于模拟电路噪声的真随机数生成器外设,适用于加密、安全启动、密钥生成等场景。以下是其核心原理、配置方法和使用注意事项:


1. RNG的基本原理
  • 物理熵源:RNG通过模拟电路(如反向偏置的PN结)的热噪声或振荡器抖动生成随机比特流,具有不可预测性。
  • 后处理:生成的原始随机数据经过硬件后处理(如线性反馈移位寄存器或AES加密算法)消除偏差,确保符合统计学随机性标准(如FIPS 140-2)。
  • 输出速率:生成速度受熵源采集限制,通常为几十到几百kbps(具体取决于型号)。



2. RNG的主要特性
  • 真随机数:基于物理噪声,非确定性算法生成。
  • 自动健康检测:内置电路检测熵源状态,防止输出低质量随机数。
  • 中断支持:可触发中断通知数据就绪或错误(如时钟异常)。
  • 低功耗模式:部分型号支持在低功耗模式下运行。

二、屏幕任意位置显示2.1CubeMX配置:
非常简单RNG外设ENABLE即可
2.2代码实现
#ifndef _LCDSHOW_H_
#define _LCDSHOW_H_

#include "main.h"
#include "stm32_lcd.h"
#include "tim.h"
#include "stm32h745i_discovery_lcd.h"
#include "rng.h"
#include "stdio.h"

void RNG_WIDTH(uint16_t *WIDTH);
void RNG_HEIGHT(uint16_t *HEIGHT);
void RNG_COLOR(void);

#endif
​#include "lcd_show.h"

void RNG_WIDTH(uint16_t *WIDTH){
    uint16_t min = 50;
    uint16_t max = 400;
    uint32_t rng_data;
    HAL_RNG_GenerateRandomNumber(&hrng,&rng_data);
    *WIDTH = rng_data%(max-min+1)+min;
}

void RNG_HEIGHT(uint16_t *HEIGHT){
    uint16_t min = 10;
    uint16_t max = 252;
    uint32_t rng_data;
    HAL_RNG_GenerateRandomNumber(&hrng,&rng_data);
    *HEIGHT = rng_data%(max-min+1)+min;
}

void RNG_COLOR(void){
    uint16_t COLOR;
    uint16_t min = 0;
    uint16_t max = 23;
    uint32_t rng_data;
    uint32_t color_data;
    HAL_RNG_GenerateRandomNumber(&hrng,&rng_data);
    COLOR = rng_data%(max-min+1)+min;
   
    switch(COLOR){
        case 0:
            UTIL_LCD_SetTextColor(UTIL_LCD_COLOR_BLUE);
        break;
        case 1:
            UTIL_LCD_SetTextColor(UTIL_LCD_COLOR_GREEN);
        break;
        case 2:
            UTIL_LCD_SetTextColor(UTIL_LCD_COLOR_RED);
        break;
        case 3:
            UTIL_LCD_SetTextColor(UTIL_LCD_COLOR_CYAN);
        break;
        case 4:
            UTIL_LCD_SetTextColor(UTIL_LCD_COLOR_MAGENTA);
        break;
        case 5:
            UTIL_LCD_SetTextColor(UTIL_LCD_COLOR_YELLOW);
        break;
        case 6:
            UTIL_LCD_SetTextColor(UTIL_LCD_COLOR_LIGHTBLUE);
        break;
        case 7:
            UTIL_LCD_SetTextColor(UTIL_LCD_COLOR_LIGHTGREEN);
        break;
        case 8:
            UTIL_LCD_SetTextColor(UTIL_LCD_COLOR_LIGHTRED);
        break;
        case 9:
            UTIL_LCD_SetTextColor(UTIL_LCD_COLOR_LIGHTCYAN);
        break;
        case 10:
            UTIL_LCD_SetTextColor(UTIL_LCD_COLOR_LIGHTMAGENTA);
        break;
        case 11:
            UTIL_LCD_SetTextColor(UTIL_LCD_COLOR_LIGHTYELLOW);
        break;
        case 12:
            UTIL_LCD_SetTextColor(UTIL_LCD_COLOR_DARKBLUE);
        break;
        case 13:
            UTIL_LCD_SetTextColor(UTIL_LCD_COLOR_DARKGREEN);
        break;
        case 14:
            UTIL_LCD_SetTextColor(UTIL_LCD_COLOR_DARKRED);
        break;
        case 15:
            UTIL_LCD_SetTextColor(UTIL_LCD_COLOR_DARKCYAN);
        break;
        case 16:
            UTIL_LCD_SetTextColor(UTIL_LCD_COLOR_DARKMAGENTA);
        break;
        case 17:
            UTIL_LCD_SetTextColor(UTIL_LCD_COLOR_DARKYELLOW);
        break;
        case 18:
            UTIL_LCD_SetTextColor(UTIL_LCD_COLOR_LIGHTGRAY);
        break;
        case 19:
            UTIL_LCD_SetTextColor(UTIL_LCD_COLOR_GRAY);
        break;
        case 20:
            UTIL_LCD_SetTextColor(UTIL_LCD_COLOR_DARKGRAY);
        break;
        case 21:
            UTIL_LCD_SetTextColor(UTIL_LCD_COLOR_BLACK);
        break;
        case 22:
            UTIL_LCD_SetTextColor(UTIL_LCD_COLOR_BROWN);
        break;
        case 23:
            UTIL_LCD_SetTextColor(UTIL_LCD_COLOR_ORANGE);
        break;
    }
}
在主函数中每秒在任意位置显示一段“Hello World”并且每10秒清除。
if(cnt==100){
            cnt = 0;
            RNG_COLOR();
            RNG_WIDTH(&RNG_W);
            printf("RNG_WIDTH:%d\r\n",RNG_W);
            RNG_HEIGHT(&RNG_H);
            printf("RNG_HEIGHT:%d\r\n",RNG_H);
            HAL_GPIO_TogglePin(LD1_GPIO_Port,LD1_Pin);
            UTIL_LCD_DisplayStringAt(RNG_W, RNG_H, (uint8_t *)"Hello World", CENTER_MODE);
            pm_cnt++;
        }
        if(pm_cnt==10){
            pm_cnt = 0;
            UTIL_LCD_Clear(UTIL_LCD_COLOR_WHITE);
        }
        HAL_Delay(10);
        cnt++;
2.3现象


使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

5

主题

10

帖子

0

粉丝