第8章 STM32F10x的主要模块设计1时钟

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

RCC寄存器组在库中的宏定义


文件中包含如下宏定义: #define PERIPH_BASE ((uint32_t)0x4000 0000) #define AHBPERIPH_BASE (PERIPH_BASE + 0x2 0000) #define RCC_BASE (AHBPERIPH_BASE + 0x1000) #define RCC ((RCC_TypeDef *) RCC_BASE) 先看外设基地址宏PERIPH_BASE,宏展开为uint32_t类型 0x4000 0000;宏RCC_BASE基地址展开为:0x4002 1000; (RCC_TypeDef *) 把RCC_BASE 地址转换为RCC_TypeDef结 构体指针类型。 RCC寄存器组中各寄存器地址是:基址+地址偏移量,如: RCC->CR 的空间地址为0x4002 1000; RCC->CFGR 的空间地址为0x4002 1004; … …
RCC寄存器组映像图
8.1. 2 RCC寄存器组在库中的宏定义

RCC寄存器组在stm32f10x.h中1081行的宏定义:
typedef struct { __IO uint32_t CR; __IO uint32_t CFGR; __IO uint32_t CIR; __IO uint32_t APB2RSTR; __IO uint32_t APB1RSTR; __IO uint32_t AHBENR; __IO uint32_t APB2ENR; __IO uint32_t APB1ENR; __IO uint32_t BDCR; __IO uint32_t CSR; #ifdef STM32F10X_CL __IO uint32_t AHBRSTR; __IO uint32_t CFGR2; #endif /* STM32F10X_CL */ … … } RCC_TypeDef;
ockToXX(void)是最底层的库函数,采用寄存器直 接配置方式配置了系统时钟,如PLL倍频以及分频系数等:
static void SetSysClockTo72(void) { __IO uint32_t StartUpCounter = 0, HSEStatus = 0; /* SYSCLK, HCLK, PCLK2 and PCLK1 configuration */ /* Enable HSE */ RCC->CR |= ((uint32_t)RCC_CR_HSEON); do { HSEStatus = RCC->CR & RCC_CR_HSERDY; StartUpCounter++; } while((HSEStatus == 0) && (StartUpCounter != HSE_STARTUP_TIMEOUT)); … …


库函数调用顺序: 启动文件 → SystemInit() → SetSysClock () → SetSysClockTo72()。
SystemInit()定义在system_stm32f10x.c文件中,其他 的配置主要在stm32f10x_rcc.c中。 初始化函数主要配置了系统时钟SYSCLK及外设时钟,如 设置时钟源、倍频、分频等控制参数,使PLL时钟、 SYSCLK(系统时钟)、AHB总线时钟、APB2总线时钟 (PCLK2)为72MHz,APB1总线时钟(PCLK1)=36MHz。
8.1. 3 RCC功能配置数据的宏定义


对寄存器每个功能的配置数据也做了宏定义,使用这些宏定义 就可配置寄存器。 在stm32f10x.h中1680行开始,RCC_CR寄存器配置数据为例:
#define #define #define #define #define #define #define #define #define #define RCC_CR_HSION ((uint32_t)0x00000001) // 内部高速时钟使能 RCC_CR_HSIRDY ((uint32_t)0x00000002) //HIS 就绪 RCC_CR_HSITRIM ((uint32_t)0x000000F8) // RCC_CR_HSICAL ((uint32_t)0x0000FF00) // RCC_CR_HSEON ((uint32_t)0x00010000)// RCC_CR_HSERDY ((uint32_t)0x00020000)// RCC_CR_HSEBYP ((uint32_t)0x00040000)// RCC_CR_CSSON ((uint32_t)0x00080000)// RCC_CR_PLLON ((uint32_t)0x01000000) // PLL 使能 RCC_CR_PLLRDY ((uint32_t)0x02000000)//
嵌入式系统与应用
Embedded System Development
第8章 STM32F10x的主要模块设计1时钟





8.1 STM32时钟与配置 8.1.1 STM32时钟系统RCC寄存器组 8.1.2 RCC寄存器组在库中的宏定义 8.1.3 RCC功能配置数据的宏定义 8.1.4 RCC的库函数 8.1.5 系统时钟初始化 8.1.6 开启关闭外设时钟
__IO宏定义core_cm3.h中:
#define __IO volatile; //volatile(易变的),用变量时 需到原地址重新存取。

uint32_t宏定义在stdin.h中:
typedef unsigned int uint32_t;

知道了结构体首地址就确定RCC 寄存器组所有32位寄存器的地址 ,0x04正好是地址偏移量,所以 把连续的寄存器组定义为结构。
8.1 STM32时钟与配置


前面的学习可知, STM32的时钟与其它外设一样,是通 过多个寄存器进行配置后才能工作的。 要配置这些寄存器就要知道各寄存器的空间地址、寄存 器各个位对应的功能,通过汇编指令才能读写各位。 本节通过剖析CMSIS库与STM32官方库的代码,学习如何 用C/C++语言,使用库来对寄存器进行读写!库开发方 式。 库的本质就是建立了一个新的软件抽象层,屏蔽底层实 现方式的差异,使得软件开发变成简单的调用函数接口 ,而不用管它的实现,大大提高开发效率。
STM32时钟系统 RCC寄存器组

时钟配置寄存器RCC_CFGR 偏移地址:0x04h;复位值:0x0000 0000h;



位26:24,MCO微控制器时钟输出:0xx没有输出,100 SYSCLK输出,101HSI输出,110HSE输出, 111PLL时钟2分 频后输出; 位22, USBPRE,USB预分频, 0:1.5分频/1直接用; 位21:18,PLLMUL:PLL倍频系数,0000:2倍,0001:3倍 ,… …; 位17,PLLXTPRE,0:HSE二分频为PLL输入/1直接用; … …


8.1.1 STM32时钟系统RCC寄存器组

每个部件都有相应的寄存器进行配置。如: 时钟控制寄存器RCC_CR 偏移地址:0x00h;复位值:0x0000 xx83h;



位31:26,保留,始终读为0; 位25,PLLRDY:1 PLL时钟就绪/0未就绪; 位24, PLLON :PLL使能, 0关闭/1使能; 位19, CSSON :时钟安全系统使能,0时钟监测器关/1开; 位18,HSEBYP:外部高速时钟旁路1/0不旁路; 位17,HSERDY:外部高速时钟就绪1/0未就绪; … … 详查STM32F10x参考手册。
uint32_t tmpreg = 0; … … tmpreg = RCC->CFGR; /* Clear PLLSRC, PLLXTPRE and PLLMUL[3:0] bits */ tmpreg &= CFGR_PLL_Mask; /* Set the PLL configuration bits */ tmpreg |= RCC_PLLSource | RCC_PLLMul; /* Store the new value */ RCC->CFGR = tmpreg;


1、SystemInit()

void SystemInit (void)
{
//对时钟寄存器RCC初始化
/* Reset the RCC clock configuration to the default reset state(for debug purpose) */ /* Set HSION bit */ RCC->CR |= (uint32_t)0x00000001; //也可用宏定义(uint32_t)RCC_CR_HSEON /* Reset SW, HPRE, PPRE1, PPRE2, ADCPRE and MCO bits */ #ifndef STM32F10X_CL RCC->CFGR &= (uint32_t)0xF8FF0000; #else RCC->CFGR &= (uint32_t)0xF0FF0000; #endif … …
STM32时钟系统 RCC寄存器组


时钟中断寄存器RCC_CIR: 偏移地址:0x08h;复位值:0x0000 0000h; APB2外设复位寄存器RCC_APB2RSTR: 偏移地址:0x0Ch;复位值:0x0000 0000h; APB1外设复位寄存器RCC_APB1RSTR: AHB外设时钟使能寄存器RCC_AHBENR: APB2外设时钟使能寄存器RCC_APB2ENR APB1外设时钟使能寄存器RCC_APB1ENR 备份域控制寄存器RCC_BDCR 控制/状态寄存器RCC_CSR。 由上看出,RCC寄存器组在内存空间中是按字、连续存储 的,只有确定了首地址,其他也就确定了。见下图:
SetSysClock();
}
//最后调用此函数
2、SetSysClock()函数
此函数中选择调用确定使用频率的函数。 static void SetSysClock(void) {#ifdef SYSCLK_FREQ_HSE SetSysClockToHSE(); #elif defined SYSCLK_FREQ_24MHz SetSysClockTo24(); #elif defined SYSCLK_FREQ_36MHz SetSysClockTo36(); #elif defined SYSCLK_FREQ_48MHz SetSysClockTo48(); #elif defined SYSCLK_FREQ_56MHz SetSysClockTo56(); #elif defined SYSCLK_FREQ_72MHz SetSysClockTo72(); //使用此项,HSE频率为8MHz #endif}

例: RCC->CR |= ((uint32_t)RCC_CR_HSEON); 相当于: RCC->CR |= (uint32_t)0x00000001;
8.1.4 RCC库函数

在stm32f10x_rcc.c库中RCC库函数:
RCC库函数
{
例 RCC_PLLConfig()库函数,378行开始:
void RCC_PLLConfig(uint32_t RCC_PLLSource, uint32_t RCC_PLLMul)
}
有了stm32f10x_rcc.c库中RCC库函数,有了外设寄存器 RCC功能配置数据的宏定义,配置时钟将是一件很容易的事 了。
8.1.5 系统时钟初始化

在startup_stm32f10x_hd.s启动文件中,调用__main函 数之前先调用了SystemInit()初始化函数。 在system_stm32f10x.c文件中宏定义系统时钟72MHz: #define SYSCLK_FREQ_72MHz 72000000
相关文档
最新文档