查看: 1408|回复: 0
打印 上一主题 下一主题

如何用MSP430器件生成随机数?

[复制链接]
跳转到指定楼层
沙发
发表于 2015-9-29 23:57:13 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
如何用 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
}
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 加入因仑

本版积分规则

快速回复 返回顶部 返回列表