用keil C使单片机获得随机数

发布者:陈风102最新更新时间:2016-10-18 来源: eefocus关键字:keil  单片机  随机数 手机看文章 扫描二维码
随时随地手机看文章
一、前言

1、本文主要讨论系统时钟以至外设时钟之间的源流关系。介绍stm32的片上时钟系统,描述系统时钟初始化函数SystemInit()对时钟的控制(从HSE到SYSCLK,第二节)与配置(SYSCLK到外设,第三节)。

2、103与107所用时钟系统略有不同,但系统时钟(SYSCLK)都是72MHz。

3、f107应当使用25MHz晶振。若采用8MHz的晶振,搭配3.0.0版固件库,则将f107当做f103使用,不能驱动通信线产品所有功能(以太网)。

4、以太网的时钟可以参考f107数据手册,附录A2.

5、RTC时钟源来自32.768kHZ晶振。

二、系统时钟SYSCLK

本节关注SYSCLK的来源。

f107与f103时钟系统略有不同,以下讨论除非特别说明,全都针对f107,采用25MHz晶振,时钟树见附录。

1、系统时钟:SYSCLK

系统复位后,HSI振荡器被选为系统时钟(8MHz),通过软件(SystemInit()函数)将系统时钟源切换到PLLCLK。

PLLCLK的来源是外部晶振HSE,由HSE信号经过5分频、8倍频、5分频得到8MHz的PLL时钟源,将其9倍频得到72MHzPLLCLK。(若在f107上采用8MHz晶振,则将HSE信号9倍频得到PLLCLK(72MHz),即系统时钟)

2、SystemInit()函数对时钟的控制(时钟控制寄存器CR,时钟配置寄存器2CFGR2)

此函数在3.0.0与3.1.2版本固件库中是不同的。相较于f103,f107在硬件上多了两个锁相环和一个CFGR2寄存器,并且定义了CR寄存器的26~29位。3.0.0版本固件库升级为3.1.2版本,正是为了配合这种变化,并实现新增的功能。

调用3.0.0库中的SystemInit()函数,结果如下:

寄存器

CR

0101 0083

CFGR

001D 0402

CFGR2

函数未涉及此寄存器

CIR

0000 0000

 

对此不作过多讨论,这样的方式会使以太网无法使用。

调用3.1.2库中的SystemInit()函数,结果如下:

寄存器

CR

0501 0083

CFGR

001D 0402

CFGR2

0001 0644

CIR

009F 0000

前三个寄存器配置了系统时钟,CIR是对中断的设置。这样,系统时钟的来源如下图。蓝色为复位后的时钟系统,红色为软件设置的时钟。

3.1.0版本的固件库中,SystemInit()函数有bug,会在下文提到。

三、总线时钟与外设时钟。

本节关注从SYSCLK生发出的时钟(PCLK等)。

1、特性与相互关系

由系统时钟分频得AHB时钟(也称为HCLK),AHB时钟供给内核的有三路:HCLK、FCLK、系统定时器(可能需要分频,视芯片型号而定)。

①两个高速外设总线的最高时钟不同,但都来自于HCLK。

②定时器有硬件设置的分频器,所以CK_INT(internal clock,或称作TIMxCLK)并不一定等于相应总线的频率,其规则为:如果相应的APB预分频系数是1,定时器的时钟频率与所在APB总线频率一致。否则,定时器的时钟频率被设为与其相连的APB总线频率的2倍。 

③ADC时钟ADCCLK有最大限制,对于103和107,最大为14MHz。所谓最快AD时间为1M分之一秒的说法是这么来的:

TCONV = 采样时间+ 12.5个周期

采样时间设为最短的1.5个周期,这样TCONV就是14个ADCCLK周期,当ADCCLK取最大的14MHz时,TCONV的时间就是1M分之一秒。

④有个有趣的现象:系统时钟配置成72MHz时,无法实现最快ADC。这是因为由于ADCCLK的上限限制,要对PCLK2进行分频,而72M无法分频为14M,最大可用只能为12M,这样自然不能实现最快ADC。

2、SystemInit()对RCC的配置(时钟配置寄存器CFGR)

AHBCLK=HCLK=SYSCLK=72MHz

PCLK1=HCLK/2=36MHz,  

PCLK2=HCLK=72MHz

TIMx(所有定时器)=PCLK1*2=PCLK2=72MHz

ADCCLK=36MHz

以上就是正常情况下SystemInit()的配置。所谓“正常”,是针对3.1.0版本固件库的bug来说的。此固件库的SetSysClockTo72函数(在system_stm32f10x.c文件中,被SystemInit调用),在配置通信线产品的PREDIV1时(或称为prediv1factor),错将5分频配置成3分频,导致芯片的系统时钟超频运行在120MHz。3.1.2版本外设固件库修正了这个bug。出错代码如下图:

 另外,在调用SystemInit()函数以后,ADCCLK是超频的(PCLK2/2, 36M),无法有保障地使用,需要调用RCC_ADCCLKConfig(RCC_PCLK2_Div6)将其配置成12MHz。这种麻烦特性到3.5.0版本固件库仍然存在,不知是什么意图。

附录:f107时钟树,或见参考手册7.2,图11


关键字:keil  单片机  随机数 引用地址:用keil C使单片机获得随机数

上一篇:基于单片机的家居安防系统设计
下一篇:C8051F340串口通信程序(UART0)

推荐阅读最新更新时间:2024-03-16 15:15

51单片机学习:定时器1实验
实验名称:定时器1实验 接线说明: 实验现象:下载程序后,D1指示灯间隔1s闪烁 注意事项: ***************************************************************************************/ #include reg52.h typedef unsigned int u16; //对系统默认数据类型进行重定义 typedef unsigned char u8; //定义LED1管脚 sbit LED1=P2^0; /********************************************************************
[单片机]
单片机键盘扫描方法两种
一、行列扫描法 矩阵式键盘的结构与工作原理: 在键盘中按键数量较多时,为了减少I/O口的占用,通常将按键排列成矩阵形式,如图1所示。在矩阵式键盘中,每条水平线和垂直线在交叉处不直接连通,而是通过一个按键加以连接。这样,一个端口(如P1口)就可以构成4*4=16个按键,比之直接将端口线用于键盘多出了一倍,而且线数越多,区别越明显,比如再多加一条线就可以构成20键的键盘,而直接用端口线则只能多出一键(9键)。由此可见,在需要的键数比较多时,采用矩阵法来做键盘是合理的。 矩阵式结构的键盘显然比直接法要复杂一些,识别也要复杂一些,上图中,列线通过电阻接正电源,并将行线所接的 单片机 的I/O口作为输出端,而列线所接的I/O口则作为输
[单片机]
<font color='red'>单片机</font>键盘扫描方法两种
c8051f005单片机PWM测试程序
c8051f005单片机PWM测试程序 //PWM输出脚P0.3 //----------------------------------------------------------------------------- // Includes //----------------------------------------------------------------------------- #include c8051f000.h // SFR declarations #include INTRINS.H #include stdio.h //------------------------
[单片机]
在VC++中用ActiveX 控件实现与单片机的串行通信
在单片机应用系统中,经常需要通过RS-232串行口与微机进行通信。目前在各种操作系统中,Microsoft的Windows较为常见,而且大多为Windows95/98等32位平台。以往在Windows平台上的串行通信多使用其提供的API函数来实现,这种方法使用起来需要许多底层设置,因而较为繁琐,并且难以理解。Microsoft推出的ActiveX技术提供了另外一种实现串行通信的方法。这种方法不仅相对较为简单,而且非常实用。尤其是Visual C++这种可视化面向对象的编程环境中,可以真正把串口看作一个对象,编程时只需简单的设置,理解起来也很容易。下面详细讨论Microsoft提供的串行通信ActiveX控件的使用方法。该控件的相应文
[单片机]
STM32单片机中断详解
中断,在单片机中占有非常重要的地位。代码默认地从上向下执行,遇到条件或者其他语句,会按照指定的地方跳转。而在单片机执行代码的过程中,难免会有一些突发的情况需要处理,这样就会打断当前的代码,待处理完突发情况之后,程序会回到被打断的地方继续执行。 1 EXTI控制器 外部中断/事件控制器(EXTI)管理了控制器的 23 个中断/事件线。每个中断/事件线都对应有一个边沿检测器,可以实现输入信号的上升沿检测和下降沿的检测。EXTI 可以实现对每个中断/事件线进行单独配置,可以单独配置为中断或者事件,以及触发事件的属性。 外部信号进入经过1的边沿检测电路,检测是否符合(有2和3的上升沿和下降沿选择寄存器决定),产生信号,然后和4软件
[单片机]
STM32<font color='red'>单片机</font>中断详解
一种以AVR单片机为核心的工频电压/频率仪设计
  1.引言   在电力生产和电气测试工作中,经常需要测量工频电压和频率。目前市面上工频电压表和频率表种类繁多,本设计与其相比具有电路简单、体积小、功耗低、性价比高等特点。利用低价位具备AVR高档单片机性能的ATmega8单片机,设计工频电压和频率两用测量仪。ATmega8单片机除了有A/D转换和定时计数器功能外,其内部的模拟比较器在测量频率电路中省了测量过零电路;I/O端口20mA驱动能力直接驱动LED数码管,省了驱动电路。使整个硬件电路非常简单。   2.硬件设计   基于ATmega8单片机工频电压/频率仪设计硬件电路如图1所示。以单片机为核心,加上少量的外部元件构成。      图1中:T1是电源变压器和电压互感
[单片机]
一种以AVR<font color='red'>单片机</font>为核心的工频电压/频率仪设计
基于STC12C2051单片机的智能太阳能路灯设计
简介:太阳能路灯的应用具有重要的现实意义,尤其是靠小规模火力发电或季节性水力发电的地区,更应大力发展太阳能电力。太阳能路灯以其先进、稳定、智能、成熟的控制技术及显著的节能特性、简便的维护方式等特点得到推广。随着太阳能照明灯具产品的普及,很多应用项目存在质量和售后服务问题。 太阳能路灯的应用具有重要的现实意义,尤其是靠小规模火力发电或季节性水力发电的地区,更应大力发展太阳能电力。太阳能路灯以其先进、稳定、智能、成熟的控制技术及显著的节能特性、简便的维护方式等特点得到推广。随着太阳能照明灯具产品的普及,很多应用项目存在质量和售后服务问题。因此,需及时分析原因、规范市场,使太阳能路灯市场健康有序地发展。太阳能是地球上最为直接、普遍、
[单片机]
基于STC12<font color='red'>C</font>2051<font color='red'>单片机</font>的智能太阳能路灯设计
8051单片机指令定义详解——ACALL addr11(1)
8051单片机指令定义详解 (ACALL addr11) 符号说明 符 号 说 明 表示数据传送方向 () 表示单元的内容 (()) 表示间接寻址的内容 rrr 8个工作寄存器之一;000=R0,001=R1等 dddddddd 数据位 aaaaaaaa
[单片机]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
  • 学习ARM开发(16)
    ARM有很多东西要学习,那么中断,就肯定是需要学习的东西。自从CPU引入中断以来,才真正地进入多任务系统工作,并且大大提高了工作效率。采 ...
  • 学习ARM开发(17)
    因为嵌入式系统里全部要使用中断的,那么我的S3C44B0怎么样中断流程呢?那我就需要了解整个流程了。要深入了解,最好的方法,就是去写程序 ...
  • 学习ARM开发(18)
    上一次已经了解ARM的中断处理过程,并且可以设置中断函数,那么它这样就可以工作了吗?答案是否定的。因为S3C44B0还有好几个寄存器是控制中 ...
  • 嵌入式系统调试仿真工具
    嵌入式硬件系统设计出来后就要进行调试,不管是硬件调试还是软件调试或者程序固化,都需要用到调试仿真工具。 随着处理器新品种、新 ...
  • 最近困扰在心中的一个小疑问终于解惑了~~
    最近在驱动方面一直在概念上不能很好的理解 有时候结合别人写的一点usb的例子能有点感觉,但是因为arm体系里面没有像单片机那样直接讲解引脚 ...
  • 学习ARM开发(1)
  • 学习ARM开发(2)
  • 学习ARM开发(4)
  • 学习ARM开发(6)
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved