RT-Thead移植时缺少SystemCoreClockUpdate函数
一、问题
在移植 RT-Thead 时,需要获取mcu当前的 HCLK 时钟频率来设置滴答时钟,而我使用的库函数中刚好缺少SystemCoreClockUpdate函数。
我之前在RT-Thread移植到stm32中是直接忽视SystemCoreClockUpdate函数的调用直接给SystemCoreClock赋值为72000000,如下图所示:
对于不熟悉时钟系统的小伙伴,在遇到使用的系统时钟不是72MHz时,产生的错误可能无法解决,所以我决定把SystemCoreClockUpdate函数重写一下,解决之前遗留的问题。
二、SystemCoreClockUpdate函数
SystemCoreClockUpdate()作用:是用来更新SystemCoreClock 变量,在每次配置系统时钟后,都需要使用SystemCoreClockUpdate()更新SystemCoreClock 变量,确保配置滴答时钟时正确。
M3系列的mcu默认情况下:SystemCoreClock = 72000000(72MHz)
SystemCoreClockUpdate函数实现:主要是通过确定系统的时钟源以及相应的分频系数计算出系统的HCLK频率
三、SystemCoreClockUpdate程序
void SystemCoreClockUpdate (void)
{
uint32_t tmp = 0, pllmull = 0, pllsource = 0, pllxtpre = 0;
/* 获取SYSCLK源 */
tmp = RCC->CFGR & RCC_CFGR_SWS;
switch (tmp)
{
case 0x00: /* HSI用作系统时钟 */
SystemCoreClock = HSI_Value;
break;
case 0x04: /* HSE用作系统时钟 */
SystemCoreClock = HSI_Value;
break;
case 0x08: /* PLL用作系统时钟 */
/* 获取PLL时钟源、PLL倍频系数、HSE分频系数 */
pllmull = RCC->CFGR & RCC_CFGR_PLLMULL;
pllsource = RCC->CFGR & RCC_CFGR_PLLSRC;
pllxtpre = RCC->CFGR & RCC_CFGR_PLLXTPRE ;
// 将倍频系数复制到pllmull,便于计算
pllmull = pllmull >> 18;
if (pllmull <= 0x0D)
{
pllmull += 2;
}
else
{
/* PLL倍增系数=PLL输入时钟*16 */
pllmull = 16;
}
if (pllsource == 0x00)
{
/* HSI震荡时钟经过2分频后作为PLL输入时钟源 */
SystemCoreClock = (HSI_Value >> 1) * pllmull;
}
else
{ /* HSE作为PLL时钟输入 */
/* HSE作为PLL时钟输入时,HSE分频系数是1还是2 */
if (pllxtpre == 0x00)
{
SystemCoreClock = HSI_Value * pllmull;
}
else
{
SystemCoreClock = (HSI_Value >> 1) * pllmull;
}
}
break;
default:
SystemCoreClock = HSI_Value;
break;
}
/* 计算HCLK时钟频率 */
/* 获取AHB分频系数 */
tmp = AHBPrescTable[((RCC->CFGR & RCC_CFGR_HPRE) >> 4U)];
/* HCLK时钟频率 */
SystemCoreClock >>= tmp;
}
这里的SystemCoreClockUpdate 函数是按照我自己的理解来编写的,和其他库文件中提供的函数有一些区别。有不对的地方忘各位指出。
需要在system_stm32f10x.c文件中定义下面两个变量,如下所示:
uint32_t SystemCoreClock = SystemFrequency;
__I uint8_t AHBPrescTable[16] = {0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 4, 6, 7, 8, 9};
完成后在将SystemCoreClockUpdate函数添加至文件中,如下图所示:
这里的程序我就不一行一行的分析的,如果有不明白的可以看我之前的笔记“STM32时钟系统配置程序源码深入分析”
RT-Thead移植时缺少SystemCoreClockUpdate函数的更多相关文章
- 搭建(WSTMart)php电商环境时缺少fileinfo函数
搭建WSTMart环境步骤: 第一步:安装phpstudy,一键安装即可 第二步:把下好的系统源码,放到一个文件夹中,并放到刚刚安装好的phpstudy下WWW文件夹下,如WWW>WSTMart ...
- 采用指数退避算法实现ajax请求的重发,全部完成时触发回调函数
目录: 0.Chrome扩展开发(Gmail附件管理助手)系列之〇——概述 1.Chrome扩展开发之一——Chrome扩展的文件结构 2.Chrome扩展开发之二——Chrome扩展中脚本的运行机制 ...
- cocos2dx android版本移植时的Error format not a string literal and no format arguments解决方案
原文地址 : http://www.cnblogs.com/hhuang2012/p/3336911.html cocos2dx android版本移植时的Error format not a str ...
- 基类中定义的虚函数在派生类中重新定义时,其函数原型,包括返回类型、函数名、参数个数、参数类型及参数的先后顺序,都必须与基类中的原型完全相同 but------> 可以返回派生类对象的引用或指针
您查询的关键词是:c++primer习题15.25 以下是该网页在北京时间 2016年07月15日 02:57:08 的快照: 如果打开速度慢,可以尝试快速版:如果想更新或删除快照,可以投诉快照. ...
- PHP环境搭建时缺少php7apache2_4.dll怎么办
PHP环境搭建时缺少php7apache2_4.dll怎么办 下载的文件有问题! 1.在PHP官网点击Download下载时不管选择哪个版本的都有两个类型 如果需要 php7apache2_4.dl ...
- 39 编写一个函数,输入n为偶数时,调用函数求1/2+1/4+...+1/n,当输入n为奇数时,调用函数1/1+1/3+...+1/n(利用指针函数)
题目:编写一个函数,输入n为偶数时,调用函数求1/2+1/4+...+1/n,当输入n为奇数时,调用函数1/1+1/3+...+1/n(利用指针函数) public class _039PrintFu ...
- C#绑定事件时使用匿名函数
当使用一些临时的函数 可以预知这些函数基本不会被复用时 可以使用匿名函数简化代码 public static void startCoupons() { //绑定一些事件 userGetCoupon ...
- 已安全化的ActiveX控件卸载时出现"DllUnregisterServer函数出错,错误代码:0x80070002"问题解决
已安全化的ActiveX控件卸载时出现"DllUnregisterServer函数出错,错误代码:0x80070002"问题解决 情况一:当该控件未注册或者已经卸载时,你尝试卸 ...
- 编写一个函数,输入n为偶数时,调用函数求1/2+1/4+...+1/n,当输入n为奇数时,调用函数1/1+1/3+...+1/n(利用指针函数)
*题目:编写一个函数,输入n为偶数时,调用函数求1/2+1/4+...+1/n,当输入n为奇数时,调用函数1/1+1/3+...+1/n(利用指针函数) public class 第三十九题按条件计算 ...
- Lazy Stored Properties--无括号时为匿名函数
第一次使用的时候进行计算和初始化,后面的引用不在进行计算. A lazy stored property is a property whose initial value is not calcul ...
随机推荐
- PowerDesigner操作要点
一.PowerDesigner解决name和code同步问题 工具-常规选项-General Options-Dialog-Name to Code mirroring√去掉 二.PowerDesi ...
- OGNL表达式注入分析
OGNL基础 依赖 <dependency> <groupId>ognl</groupId> <artifactId>ognl</artifact ...
- ET介绍——Actor Location
Actor Location Actor模型只需要知道对方的InstanceId就能发送消息,十分方便,但是有时候我们可能无法知道对方的InstanceId,或者是一个Actor的InstanceId ...
- 一文读懂java中的Reference和引用类型
目录 简介 强引用Strong Reference 软引用Soft Reference 弱引用weak Reference 虚引用PhantomReference Reference和Referenc ...
- 重磅官宣,OpenHarmony技术峰会来了
技术构筑万物智联 创新使能行业发展 2月25日 第一届开放原子开源基金会OpenHarmony技术峰会即将启幕 众多行业大咖齐聚深圳 开启一场"技术硬核"探索盛宴 亮点拉满,我 ...
- 深入理解 C++ 语法:从基础知识到高级应用
C++ 语法 让我们将以下代码分解以更好地理解它: 示例 #include <iostream> using namespace std; int main() { cout <&l ...
- 部署解压版mysql
1.检查系统是否安装过mysql //检查系统中有无安装过mysql rpm -qa|grep mysql //查询所有mysql 对应的文件夹,全部删除 whereis mysql find / - ...
- Yolov5代码详解——detect.py
首先执行扩展包的导入: import argparse import os import platform import sys from pathlib import Path import t ...
- 开源相机管理库Aravis例程学习(一)——单帧采集single-acquisition
目录 简介 源码 函数说明 arv_camera_new arv_camera_acquisition arv_camera_get_model_name arv_buffer_get_image_w ...
- 鸿蒙HarmonyOS实战-ArkUI组件(Menu)
一.Menu组件 Menu组件是一种常见的用户界面(UI)控件,用于在移动应用程序中显示可选项列表.它通常由一系列链接或按钮组成,以帮助用户导航和选择所需的操作.Menu组件可以在水平或垂直方向上呈现 ...