因仑“3+1”工程特种兵精英论坛

标题: 如何用MSP430器件生成随机数? [打印本页]

作者: XJzy    时间: 2015-9-29 23:57
标题: 如何用MSP430器件生成随机数?
如何用 MSP430 器件生成随机数?
大多数 MSP430 器件在交付使用时具有片上低功率 VLO 时钟,此时钟的额定值通常为数据表中大范围时钟频率(通常从 6kHz 最小值到 14kHz 最大值)。 有一份 应用说明 描述了如何根据 2xx 器件的 VLO 来生成随机数。 此份应用说明的基本概念是将 VLO 用作源 ACLK,而将 ACLK 也用作输入,此输入作为捕捉一个自由运行定时器的 Timer_A 捕捉事件。 因此,有必要首先检查器件专用数据表来分配正确的 CCR(捕捉比较寄存器),此 CCR 能够将 ACLK 用作输入事件(输入信号被内部连接至 ACLK)。
,对于 MSP430F51xx 器件,CCR1 寄存器被用来生成随机数。 此应用说明也描述了某些将随机性添加到代码中的技巧。 下面是生成 MSP430F51xx 器件随机数的示例代码:
int TI_getRandomIntegerFromVLO(void)

{

unsigned int i;

int result = 0;

// setup Timer_A

TA0CCTL1 = CM_1 + CCIS_1 + CAP;

TA0CTL |= TASSEL__SMCLK + MC__CONTINOUS;

for(i=0 ; i<16 ; i++)

{

// shift left result

result <<= 1;

// wait until Capture flag is set
while(!(TA0CCTL1 & CCIFG));
// clear flag
TA0CCTL1 &= ~CCIFG;
// check LSB
if(TA0CCR1 & 0x01)
{
result |= 0x01; }
// change the divison of timer input clock
TA0CTL = (TA0CTL & 0xFCFF) | ((TA0CCR1 & 0x03) << 8);
}
return result;
}
CCS 编译器警告 #10374-D
在 CCS v5.x 的全新 CCS 编译器中(代码生成工具/CGT),编译器将给出这样的警告: #10374-D 中断矢量 "USI" 没有一个中断句柄例程。 如果它发现有任何中断矢量未被初始化时就会给出此警告。 原因在于,这基本上是一个初始化所有中断矢量的好做法,所以在假中断意外出现时,MSP430 将会因为未将中断矢量初始化而无法获得复位。 以下示例显示了如何创建 "Traplsr" 来删除 CCS 编译器给出的关于这个问题的警告:
#include <msp430g2231.h>
int main(void)
{
WDTCTL = WDTPW + WDTHOLD; // Stop watchdog timer
P1DIR |= BIT0; // Set P1.0 to output direction

for(;;)
{
P1OUT ^= BIT0; // Toggle P1.0 using exclusive-OR
__delay_cycles(1000000);
}
}
// trap isr assignation - put all unused ISR vector here
#pragma vector = ADC10_VECTOR, NMI_VECTOR, PORT1_VECTOR, PORT2_VECTOR, \ TIMER0_A0_VECTOR, TIMER0_A1_VECTOR, USI_VECTOR, WDT_VECTOR
__interrupt void TrapIsr(void)
{
// this is a trap ISR - check for the interrupt cause here by
// checking the interrupt flags, if necessary also clear the interrupt
// flag
}





欢迎光临 因仑“3+1”工程特种兵精英论坛 (http://bbs.enlern.com/) Powered by Discuz! X3.4