🚀 优质资源分享 🚀
学习路线指引(点击解锁) | 知识定位 | 人群定位 |
---|---|---|
🧡 Python实战微信订餐小程序 🧡 | 进阶级 | 本课程是python flask+微信小程序的完美结合,从项目搭建到腾讯云部署上线,打造一个全栈订餐系统。 |
💛Python量化交易实战💛 | 入门级 | 手把手带你打造一个易扩展、更安全、效率更高的量化交易系统 |
一、分析程序的目的
最近我在移植实时系统是遇到了一些问题,所以决定深入了解系统时钟的配置过程,当然想要学好stm32的小伙伴也有必要学习好时钟系统的配置,所以我将学习的过程再次记录,有写得不好的地方,望小伙伴指出。
之前我已经记录过一篇关于时钟系统的文章,对程序中不了解的地方可以看我之前的笔记“STM32时钟系统的配置寄存器和源码分析”。
这里我用的芯片是STM32F103C8T6,用的库函数是厂家提供的案例中提取出来的,这里可能和其他型号的mcu有细微差别,但是原理都是一样的。
二、程序执行的过程
当系统复位信号发生的时候,程序将执行复位中断函数,而在复位中断函数中是先执行SystemInit函数后在执行__main函数,如下图所示:
系统调用SystemInit函数后完成系统时钟的配置,系统时钟配置的过程如下所示:
从图中可知,在系统时钟配置的第三步有多个函数可以选择,这里可以根据自己的需求选择相应的配置流程,只需要在stm32f10x.h文件中定义相应的宏即可(默认配置为72MHz),如下图所示:
在分析程序之前,需要了解一下相关寄存器的地址以及相应寄存器的作用,如下所示:
typedef struct
{
__IO uint32\_t CR; // HSI、HSE、CSS、PLL等的使能和就绪标志位
__IO uint32\_t CFGR; // PLL等的时钟源选择,分频系数设定
__IO uint32\_t CIR; // 清除/使能时钟就绪中断
__IO uint32\_t APB2RSTR; // APB2线上外设复位寄存器
__IO uint32\_t APB1RSTR; // APB1线上外设复位寄存器
__IO uint32\_t AHBENR; // DMA、SDIO等时钟使能
__IO uint32\_t APB2ENR; // APB2线上外设时钟使能
__IO uint32\_t APB1ENR; // APB1线上外设时钟使能
__IO uint32\_t BDCR; // 备用域控制寄存器
__IO uint32\_t CSR; // 控制状态寄存器
} RCC_TypeDef;
以上的寄存器都是相对RCC寄存器进行偏移的,如下图所示:
通过查找stm32f10x.h文件中的定义可以知道寄存器RCC的地址,如下所示:
RCC = RCC_BASE = AHBPERIPH_BASE + 0x1000 = PERIPH_BASE(0x40000000) + 0x20000 = 0x40021000
三、SystemInit函数
程序如下所示:
<