第二部分 基础篇-第11章 CC2530随机数发生器
1 理论分析
1.1 CC2530 随机数发生器简介
随机数发生器有如下功能。
产生伪随机字节,可以被 CPU 读取,或由命令选通处理器直接使用。
计算写入到 RNDH 的 CRC16 字节。
由写入到 RNDL 的值播种。
随机数发生器是一个 16 位的线性反馈移位寄存器 LFSR,带有多项式 X 16 + X15 + X 2 +1(即 CRC16) 。根据执行的操作,它使用不同级别的展开值。基本的形式(不展开)如下图所示。当 ADCCON1.RCTRL=11 时,随机数发生器就关闭。
1.2 CC2530 随机数发生器的运行
随机数发生器的运行是由 ADCCON1.RCTRL 位控制的。LFSR 的 16 位移位寄存器的当前值可以从 RNDH 和 RNDL 寄存器中读取。
1、伪随机数序列的生成
默认操作(ADCCON1.RCTRL 是 00)是命令选通处理器每次读取随机值,就通知LFSR 一次(不展开的 13x,其中通知不展开的 13x 意味着执行 13 次反馈移位的一个操作等式) 。这保证来自 LFSR 末端的 LSB 一个新的伪随机字节的有效性。更新 LFSR的另一种方式是设置 ADCCON1.RCTRL 为 01。这将每次通知 LFSR(不展开的 13x) ,且当操作完成时,ADCCON1.RCTRL 位将自动清除。
2、种子数的产生
LFSR 可以通过写入 RNDL 寄存器两次产生种子数。每次写入 RNDL 寄存器,LFSR 的 8 位 LSB 复制到 8 位 MSB,8 位 LSB 被替换为写入 RNDL 的新的数据字节。当需要一个真正的随机值,LFSR 应通过写入 RNDL 产生种子,随机值来自在 RF接收路径的 IF_ADC。要使用这种产生种子的方法,无线电必须首先上电。无线电应处于无限 TX 状态,以避免 RX 状态可能的同步检测。来自 IF_ADC 的随机值从 RF 寄存器 RFRND 中读出。读出的值作为种子值写入 RNDL 寄存器,如上所述。注意这可以在为正常任务使用无线电时完成。
请注意种子值 0x0000 或 0x8003 将总会导致 LFSR 中的值通知之后不改变,因为没有值通过 in_bit 推入,因此,不能用于随机数的产生。
3、CRC16
LFSR 也可以用于计算一个字节序列的 CRC 值。 写入 RNDH 寄存器的操作将触发一个 CRC 计算。新的字节从 MSB 末端处理,使用一个 8x 的未展开式,这样一个新的字节可以在每个时钟周期写入到 RNDH。注意在开始 CRC 计算之前,LFSR 必须通过写 RNDL 正确产生随机数。通常产生的用于 CRC 计算的种子数值应该是 0x0000 或0xFFFF。
2 实验详解
2.1 实验目的
1)、了解 CC2530 随机数发生器的功能;
2)、掌握 CC2530 的随机数发生器的使用。
2.2实验设备
硬件:PC 机一台,ZB2530(底板、核心板、仿真器、USB 线)一套;
软件:2000/XP/win7 系统,IAR 8.20 集成开发环境。
2.3实验分析
本实验用到了串口、随机数发生器相关寄存器,在此只给出随机数发生器的相关寄存器。
2.5参考代码(部分代码)
/**Includes*********************************************************************/
#include "ioCC2530.h"
#include "Uart.h"
#include "hal.h"
/**宏定义***********************************************************************/
#define KEY1 P0_4
#define LED1 P1_0
/**函数声明*********************************************************************/
void Init_RandomGenerator(void);
/**全局变量*********************************************************************/
uint Random=0;// Random Sequence
char TX_data[4];
/**
* @brief 主函数
* @param None
* @retval None
*/
void main(void)
{
uint Data_H,Data_L;
SetSysClock(); //设置系统时钟为32MHz
InitUART(); //初始化串口
Init_RandomGenerator(); //初始化随机数发生器
while(1)
{
//更新LFSR
ADCCON1 |= 0x04;
// Read Randomom register
Data_H=RNDH; //读相关寄存器
Data_L=RNDL;
Random = (((uint)Data_H << 8) | Data_L);//获取随机数
memset(TX_data, 0, sizeof(TX_data));
TX_data[0]=(char)(Random/4096); //数据处理
TX_data[1]=(char)((Random%4096)/256);
TX_data[2]=(char)(((Random%4096)%256)/16);
TX_data[3]=(char)(((Random%4096)%256)%16);
UartSend_String(TX_data,4); //串口发给电脑显示
Delayms(1000);
}
}
/**
* @brief 初始化随机数发生器
* @param None
* @retval None
*/
void Init_RandomGenerator(void)
{
/*当需要一个真正的随机值,LFSR 应通过写入RNDL 产生种子,
随机值来自在RF 接收路径的IF_ADC。要
使用这种产生种子的方法,无线电必须首先上电*/
RFRND = 0x04;
// 等待上电完毕
while( RFRND & 0x10 );
//无线电应处于无限TX 状态,以避免RX 状态可能的同步检测
RFST = 0xE2;
Delayms(1);
/*RCTRL[1:0]---控制16 位随机数发生器
[00:] 正常运行。(13X 型展开)*/
ADCCON1 &= ~0x0C;
RNDH = ADCTEST2;
/*更新LFSR 的一种方式是设置ADCCON1.RCTRL 为01。
[01:] LFSR 的时钟一次(没有展开).*/
ADCCON1 |= 0x04;
}
2.6实验现象
编译下载程序到开发板上,通过串口可以看到随机数打印出来。
【注】通过设置时,要以16进制方式查看。
附:管理随机数发生器的寄存器类型
●RNDL (0xBC) - 随机数发生器数据低字节
●RNDH (0xBD)–随机寄存器 RNDH
本章参考代码
上一篇: 大家都喜欢看”月入万元“的文章!
下一篇: 把他诱惑上楼了
推荐阅读
-
《嵌入式-STM32开发指南》第二部分 基础篇 - 第4章 定时器(HAL库)
-
第二部分 基础篇 - 第2章 Systick系统定时器
-
第二部分 基础篇-第4章 定时器 - CC2530查询方式使用定时器T1
-
第二部分 基础篇-第4章 定时器-CC2530查询方式使用定时器T3
-
《嵌入式-STM32开发指南》第二部分 基础篇 - 第2章 Systick系统定时器(HAL)
-
第二部分 基础篇 - 第10章 低功耗
-
第二部分 基础篇-第8章 CC2530系统睡眠唤醒--定时器唤醒
-
第二部分 基础篇-第11章 CC2530随机数发生器
-
第二部分 基础篇-第4章 定时器-CC2530中断方式使用定时器T3
-
第五部分 外设篇 - 基础实验 第2章 CC2530温湿度传感器DHT11