在AM1705的工程中,有个地方需要使用随机数,但找不到好的方法,就讲方式转到了定时器上,配置一个定时器,读取其计数寄存器值来作为随机数来处理。当然为了更像随机数,可以讲该寄存器值再重新做个计算,当然这都是比较开放的了。
AM1705有两个64位定时器,每个计数器可以配置成为2个32位定时器,这里我只需要32位定时器。(TIMER0(又可分为TIM12和TIM34),TIMER1(同样分为TIM12和TIM34两个))
另关于时钟源, 可选择时钟源有两个,一个是Interal clock(内部时钟,实际上是接到PLL之前的时钟,在我工程里用的实际上就是外部高速时钟,我接的是24M,该外部高速时钟,最高30M);另一个是TM64P_IN12的时钟(是芯片的一个时钟输入管脚)。
其他应用可参考 AM1705 Technical Reference Manual 技术参考手册
#define TIMER1_BASE 0x01C21000
//TIMER1-TIM12
void timer3_config(void)
{
// out32((TIMER1_BASE + 0x04), 0x00000001);//EMUMGT=1,定时器自由运行
out32((TIMER1_BASE + 0x24), 0x00000007);//TGCR,TIMEMODE=dual32 chainned,TIM12RS=1,TIM34RS=1,将TIMER1配置为两个32位计时器
out32((TIMER1_BASE + 0x18), 0xFFFFFFFF);//PRD12,timer period,设置计数器TIMER1-TIM12上限值为0xffffffff
// out32((TIMER1_BASE + 0x1C), 0xFFFFFFFF);//PRD34,prescaler value
// out32((TIMER1_BASE + 0x20), 0x00800080);//TCR->ENAMODE12=0x2,The timer is enabled continuously, TIMn increments until the timer counter matches the period,resets the timer counter to 0 on the cycle after matching and continues.
out32((TIMER1_BASE + 0x20), 0x00000080);//CLKSRC12 = 0x0,选用Internal Clock为时钟源(即为接到PLL上的时钟,我用的是外部高速晶振24M,该时钟最高好像只能30M,另外一种时钟源是一个叫TM64P_IN12的时钟输入管脚)TCR->ENAMODE12=0x2,The timer is enabled continuously, TIMn increments until the timer counter matches the period,resets the timer counter to 0 on the cycle after matching and continues.,将计数模式设置为连续,自动清零
// out32((TIMER1_BASE + 0x34), 0x00FFFFFF);//REL12,reload register12
// out32((TIMER1_BASE + 0x38), 0x00FFFFFF);//REL34,reload register34
}
u32 GetTimer3Count(void)
{
return(in32(TIMER1_BASE + 0x10));
}
另有AM335X系列(cortex-a8内核)获取系统时钟计数器的方式,可以在CSDN下载中搜索“AM335X(Cortex-A8)读取时钟计数寄存器值(随机数,GCC)”,里面有现成代码。