您的位置:首页 > 其它

STM32CubeMX系列教程,关于随机数发生器RNG和循环冗余校验CRC的应用

2017-04-12 15:50 741 查看
来源于:http://www.waveshare.net/study/article-655-1.html

摘要:本章介绍stm32F7系列芯片的随机数发生器(RNG)和循环冗余校验(CRC)。

一、随机数发生器(RNG)

RNG处理器是一个以连续模拟噪声为基础的随机数发生器,在主机读数时提供一个32位的随机数。

复制串口printf的工程,修改文件夹名。击STM32F746I.ioc打开STM32cubeMX的工程文件重新配置,激活随机数发生器(RNG)。





配置RNG时钟为48MHz。RNG没有参数配置。





生成报告以及代码,编译程序。在iwdg.c文件中可以看到RNG初始化函数。在stm32f7xx_hal_rng.h头文件中可以看到RNG的操作函数。

在main函数while循环中添加应用函数每隔1s打印输出一个随机数。

01
/*
USERCODEBEGINWHILE*/
02
while
(1)
03
{
04
/*
USERCODEENDWHILE*/
05
06
/*
USERCODEBEGIN3*/
07
printf(
"\n\r
Random32bitNumbers:0x%08X!!!\n\r"
,HAL_RNG_GetRandomNumber(&hrng));
08
HAL_Delay(1000);
09
}
10
/*
USERCODEEND3*/
编译程序并下载到开发板。打开串口调试助手,设置波特率为115200,串口助手上面会显示如下信息。





二、循环冗余校验(CRC)

CRC(循环冗余校验)计算单元使用一个多项式发生器从8位/16位/32位的数据字中产生CRC码。

关于CRC在这里不作详细的介绍,有兴趣详细了解的同学可以看下面的神贴:

CRC不太懂?哥救你【连载一】

CRC不太懂?哥救你【连载二】

CRC不太懂?哥救你【连载三】





复制串口printf的工程,修改文件夹名。击STM32F746I.ioc打开的工程文件重新配置,激活CRC。





CRC配置中只需设置输入数据格式(InputDataFormat)为32位数据(Words),其他为默认设置。





生成报告以及代码,编译程序。在crc.c文件中可以看到CRC初始化函数。在stm32f7xx_hal_crc.h头文件中可以看到CRC的操作函数。

在main文件前面添加数据以及数据CRC的生成值。

01
/*
USERCODEBEGINPV*/
02
/*
Privatevariables---------------------------------------------------------*/
03
#define
BUFFER_SIZE114
04
static
const
uint32_t
aDataBuffer[BUFFER_SIZE]=
05
{
06
0x00001021,
0x20423063,0x408450a5,0x60c670e7,0x9129a14a,0xb16bc18c,
07
0xd1ade1ce,
0xf1ef1231,0x32732252,0x52b54294,0x72f762d6,0x93398318,
08
0xa35ad3bd,
0xc39cf3ff,0xe3de2462,0x34430420,0x64e674c7,0x44a45485,
09
0xa56ab54b,
0x85289509,0xf5cfc5ac,0xd58d3653,0x26721611,0x063076d7,
10
0x569546b4,
0xb75ba77a,0x97198738,0xf7dfe7fe,0xc7bc48c4,0x58e56886,
11
0x78a70840,
0x18612802,0xc9ccd9ed,0xe98ef9af,0x89489969,0xa90ab92b,
12
0x4ad47ab7,
0x6a961a71,0x0a503a33,0x2a12dbfd,0xfbbfeb9e,0x9b798b58,
13
0xbb3bab1a,
0x6ca67c87,0x5cc52c22,0x3c030c60,0x1c41edae,0xfd8fcdec,
14
0xad2abd0b,
0x8d689d49,0x7e976eb6,0x5ed54ef4,0x2e321e51,0x0e70ff9f,
15
0xefbedfdd,
0xcffcbf1b,0x9f598f78,0x918881a9,0xb1caa1eb,0xd10cc12d,
16
0xe16f1080,
0x00a130c2,0x20e35004,0x40257046,0x83b99398,0xa3fbb3da,
17
0xc33dd31c,
0xe37ff35e,0x129022f3,0x32d24235,0x52146277,0x7256b5ea,
18
0x95a88589,
0xf56ee54f,0xd52cc50d,0x34e224c3,0x04817466,0x64475424,
19
0x4405a7db,
0xb7fa8799,0xe75ff77e,0xc71dd73c,0x26d336f2,0x069116b0,
20
0x76764615,
0x5634d94c,0xc96df90e,0xe92f99c8,0xb98aa9ab,0x58444865,
21
0x78066827,
0x18c008e1,0x28a3cb7d,0xdb5ceb3f,0xfb1e8bf9,0x9bd8abbb,
22
0x4a755a54,
0x6a377a16,0x0af11ad0,0x2ab33a92,0xed0fdd6c,0xcd4dbdaa,
23
0xad8b9de8,
0x8dc97c26,0x5c644c45,0x3ca22c83,0x1ce00cc1,0xef1fff3e,
24
0xdf7caf9b,
0xbfba8fd9,0x9ff86e17,0x7e364e55,0x2e933eb2,0x0ed11ef0
25
};
26
27
/*
ExpectedCRCValue*/
28
uint32_t
uwExpectedCRCValue=0x379E9F06;
29
/*
USERCODEENDPV*/
在main函数中添加用程序计算数据的CRC值并校验是否和正确的CRC值相等,打印输出校验信息。

1
/*
USERCODEBEGIN2*/
2
printf(
"\n\r
******CRCTestExample*****\n\r"
);
3
4
/*##-1-
ComparetheCRCvaluetotheExpectedone##########################*/
5
if
(HAL_CRC_Accumulate(&hcrc,
(uint32_t*)aDataBuffer,BUFFER_SIZE)!=uwExpectedCRCValue)
6
printf(
"\n\r
CRCwrongvalue\n\r"
);
7
else
8
printf(
"\n\r
CRCrightvalue\n\r"
);
9
/*
USERCODEEND2*/


编译程序并下载到开发板。打开串口调试助手,设置波特率为115200,串口助手上面会显示如下信息。





内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: