ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

STM32学习(五)—— 时钟体系

STM32学习(五)—— 时钟体系 一、什么是晶振晶振的全称叫做晶体振荡器是晶体石英和电子元件组成晶振有一个非常重要的特性机电效应压电效应一般晶振会提供高度稳定的频率振荡频率是固定的一般晶振的频率有8MHZ、12MHZ、25MHZ、11.0592MHZ..... 晶振的单位是HZ频率单位时间内振荡的次数。二、什么是时钟时钟相当于处理器的”心脏“外部晶振经过振荡会产生高速稳定的信号由芯片的引脚输入芯片内部再经过芯片内部的频率放大器进行放大或者缩小最终变成各种总线的时钟频率处理器的外设都是由时钟控制的举个例子交响乐团 指挥思考时钟信号是由什么产生的时钟信号是由时钟源产生的比如外部晶振产生的时钟信号就是时钟源的一种但是有点外设不需要太高的时钟频率所以STM32提供了多种时钟源给用户使用。 参考STM32中文参考手册第6章 一共有5种时钟源。HSEHigh Speed External 高速外部时钟特点是精度高一般可以作为系统时钟HSI High Speed Internal 高度内部时钟频率为16MHZ的RC振荡器优点是成本低缺点是精 度低容易收温度的影响适合小家电使用LSELow Speed External 低速外部时钟频率未32.768KHZ的晶振可以驱动RTC实时时钟优点是功耗低精度高LSI Low Speed Internal 低速内部时钟频率未32KHZ的RC振荡器可以驱动独立看门狗和低功耗唤醒功能PLL倍频锁相环由HSE或HSI振荡器提供时钟信号一般可以作为系统时钟使用三、STM32时钟树四、PLL参数的修改大家可以看到标准库中使用的外部晶振是25MHZ而开发平台实际使用的是8MHZ所以如果不去修改工程的PLL参数会导致芯片的运行频率是错误的所以需要修改PLL参数可以去system_stm32f4xx.c和stm32f4xx.h两个文件中修改。—— 修改stm32f4xx.h的123行把25改为8 修改外部晶振的频率根据开发板—— 修改system_stm32f4xx.c的316行的PLL参数修改PLL_M的值 把25改为8需要注意的是不是所有产品都需要PLL因为使用PLL会增大功耗减少产品的续航能力智能手表、手机锁屏项目经验根据实际的情况来修改PLL的参数这样就可以降低功耗或者提高性能一般修改PLL_N的值192~432针对高性能模式、平衡模式、低功耗模式以手机为例高性能模式 如果修改PLL_N的值为432则主频会达到216MHZ最高位多少MHZ?平衡模式 如果修改PLL_N的值位336则主频会达到168MHZ低功耗模式 如果修改PLL_N的值位192则主频会降到84MHZ最低能降到多少MHZ注意如果芯片主频超过168MHZ就是超频工作增加芯片功耗以及会导致芯片发烫谨慎使用。四、STM32的启动过程一般大家都知道程序的入口是main函数但是在主程序运行之前是需要先运行一个启动文件xxx.s对于STM32F407ZET6来说汇编文件为startup_stm32f40_41xxx.s当然不同的芯片型号所使用的汇编文件是不一样的。启动文件的功能如下1. 配置系统的栈空间栈是一种特殊的线性表特殊在用户只能在栈的一端进行操作栈顶另一端操作不了如果没有数据进入栈空间称为空栈如果写入数据称为入栈如果读取数据称为出栈栈空间的分配是动态分配是自上向下。栈空间是由编译器来自动分配和释放的栈空间一般存储局部变量存储函数调用过程中的传递的参数、保护现场对于启动文件中的栈空间默认是1KB但是如果大家写的程序比较大用到的局部变量比较多就必须修改栈空间的大小。如果栈空间的大小不修改会导致栈溢出让程序出现位置问题相当于Linux开发中的段错误。注意栈空间可以由用户手动调整但是不能超过内部SRAM的大小192KB)2. 配置系统的堆空间THUMB 指的是 THUMB 指令集是 ARM 以前的指令集THUMB 指令集是 16bitARM现在使用的是 THUMB-2 指令集是 32bit的也就意味着 THUMB-2 指令集包含 THUMB 指令集。对于堆空间一般是动态分配的由用户来分配如Linux系统学习的malloc函数但是堆空间在 STM32 中使用较少。3. 配置系统的向量表向量表指的是中断源表向量其实就是内核发生的异常的源头启动文件中的向量表的地址都是从Flash空间的首地址开始0x00000000存储的是栈顶指针0x00000004存储的是复位程序地址向量表可以参考STM32F4中午参考手册的第十章。4. 复位程序分析【weak】指的是弱声明如果外部文件中重新定义了该函数则优先使用外部文件中的如果外部文件中没重新定义则默认使用启动文件中也就是说该函数不是唯一的。思考是否可以改变函数的入口答案是可以的可以修改为自己指定的函数接口中5. 中断服务函数的分析一旦发生了异常内核就需要去响应何处理异常需要跳转到对应的中断服务函数中执行功能中断复位函数是由用户在外部文件中来重新定义。如果用户开启某个外设的中断但是没有编写对应的中断服务函数或者中断服务函数名字写错了就回导致程序一直运行汇编文件中定义的中断服务函数但是预定义的中断服务函数内部是空的所以就会跳转到无限循环导致程序卡死。注意用户在使用外设中断外部中断、定时器中断、串口中断、看门狗中断.......的时候中断服务函数的名字必须在汇编文件中查找不能随意定义。6. 用户堆栈初始化分析如果启动MicroLIB库这个库属于KEIL公司自带的库会替换标准C库这个微型库会对代码进行高度优化所以生产的可执行文件的体积会减小但是缺点是微型库的功能没有标准C库多。
返回列表