一、随机数发生器(RNG)
RNG处理器是一个以连续模拟噪声为基础的随机数发生器,在主机读数时提供一个32位的随机数。
复制串口printf的工程,修改文件夹名。击STM32F746I.ioc打开STM32cubeMX的工程文件重新配置,激活随机数发生器(RNG)。
配置RNG时钟为48MHz。RNG没有参数配置。
生成报告以及代码,编译程序。在iwdg.c文件中可以看到RNG初始化函数。在stm32f7xx_hal_rng.h头文件中可以看到RNG的操作函数。
在main函数while循环中添加应用函数每隔1s打印输出一个随机数。
01 | /*
USERCODEBEGINWHILE*/ |
07 | printf( "\n\r
Random32bitNumbers:0x%08X!!!\n\r" ,HAL_RNG_GetRandomNumber(&hrng)); | 编译程序并下载到开发板。打开串口调试助手,设置波特率为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的生成值。
02 | /*
Privatevariables---------------------------------------------------------*/ |
04 | static const uint32_t
aDataBuffer[BUFFER_SIZE]= |
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 |
28 | uint32_t uwExpectedCRCValue=0x379E9F06; | 在main函数中添加用程序计算数据的CRC值并校验是否和正确的CRC值相等,打印输出校验信息。
2 | printf( "\n\r ******CRCTestExample*****\n\r" ); |
4 | /*##-1- ComparetheCRCvaluetotheExpectedone##########################*/ |
5 | if (HAL_CRC_Accumulate(&hcrc, (uint32_t*)aDataBuffer,BUFFER_SIZE)!=uwExpectedCRCValue) |
6 | printf( "\n\r CRCwrongvalue\n\r" ); |
8 | printf( "\n\r CRCrightvalue\n\r" ); |
编译程序并下载到开发板。打开串口调试助手,设置波特率为115200,串口助手上面会显示如下信息。
|