关于单片机体系来说,CPU和总线以及外设的时钟设置是非常重要的,因为没有时钟就没有时序,组合电路精干什么想必各位心里都清楚。其实时钟的学习这部分应该提早一些,但因为一开端时间比较短,有些急于求成,所以直接运用了万利给的例程,权且跳过了这一步。介于下面我方案要学习的使命都涉及到兆级的高速传输,例如全速USB,DMA等等,所以不能再疏忽时钟啦,必需求仔细研究一下。
我学习RCC的参考资料:
技能文档0427及其中文翻译版STM32F10xxx_Library_Manual_ChineseV2的第十五章和RM0008_CH参考手册。
预备常识:
片上总线标准品种繁复,而由ARM公司推出的AMBA片上总线受到了广阔IP开发商和SoC体系集成者的喜爱,已成为一种盛行的工业标准片上结构。AMBA标准首要包含了AHB(Advanced High performance Bus)体系总线和APB(Advanced Peripheral Bus)外围总线。二者别离适用于高速与相对低速设备的衔接。
因为时钟是一个由内而外的东西,详细设置要从寄存器开端。
RCC 寄存器结构,RCC_TypeDeff,在文件“stm32f10x_map.h”中界说如下:
typedef struct
{
vu32 CR;
vu32 CFGR;
vu32 CIR;
vu32 APB2RSTR;
vu32 APB1RSTR;
vu32 AHBENR;
vu32 APB2ENR;
vu32 APB1ENR;
vu32 BDCR;
vu32 CSR;
} RCC_TypeDef;
这些寄存器的详细界说和运用方法拜见芯片手册,在此不赘述,因为C言语的开发能够不好他们直接打交道,当然假如能够加以了解和回忆,无疑是百利而无一害。
信任仔细的朋友早就发现板子上只要8Mhz的晶振,而增强型最高作业频率为72Mhz,明显需求用PLL倍频9倍,这些设置都需求在初始化阶段完结。为了便利阐明,我借用一下例程的RCC设置函数,并用中文注释的方式加以阐明:
//在此指出上面的注释头应该是仿制过来的,写错了…不过不要紧,反正没参数需求阐明,重要的是函数体。
static void RCC_Config(void)
{
RCC_DeInit();
RCC_HSEConfig(RCC_HSE_ON);
HSEStartUpStatus = RCC_WaitForHSEStartUp();
if (HSEStartUpStatus == SUCCESS)
{
}
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_FSMC, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD | RCC_APB2Periph_GPIOE |
}
由上述程序能够看出体系时钟的设定是比较复杂的,外设越多,需求考虑的要素就越多。一起这种设定也是有规则可循的,设定参数也是有次序标准的,这是使用中应当留意的,例如PLL的设定需求在使能之前,一旦PLL使能后参数不行更改。
通过此番设置后,因为我的电路板上是8Mhz晶振,所以体系时钟为72Mhz,高速总线和低速总线2都为72Mhz,低速总线1为36Mhz,ADC时钟为12Mhz,USB时钟通过1.5分频设置就能够完成48Mhz的数据传输。
一般性的时钟设置需求先考虑体系时钟的来历,是内部RC仍是外部晶振仍是外部的振荡器,是否需求PLL。然后考虑内部总线和外部总线,最终考虑外设的时钟信号。遵从先倍频作为CPU时钟,然后在由内向外分频,下级姑息上级的准则有点儿相似PCB制图的标准化要求,在这里也相同。