驱动板载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;
}
}
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++;
#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现象
。
---------------------
作者:pzw1758
链接:https://bbs.21ic.com/icview-3433788-1-1.html
来源:21ic.com
此文章已获得原创/原创奖标签,著作权归21ic所有,任何人未经允许禁止转载。