IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 嵌入式 -> M-Arch(7)第六个示例:时钟频率 -> 正文阅读

[嵌入式]M-Arch(7)第六个示例:时钟频率

前言

回顾下之前的章节:

  • 第一章节中我们描述了整个框架的核心设计思路以及主要的文件架构

  • 第二章节中我们基于一个简单的定时器OS实现了串口的数据打印,并完成了通用crc模块的设计和测试

  • 第三章节中我们给出了真随机数和伪随机数的概念和代码示例,并在架构上对接口进行了重构

  • 第四章节中我们回顾了FMC的基本知识,并给出了示例,后面我们将在设计IAP的时候再次使用到FMC

  • 第五章节中我们使用ADC和DMA搭建了一个通用的采样框架,并通过串口给出了采样的数据示例

  • 第六章节中我们总结了DAC的基本使用方法,并通过DAC生成了任意频率的正弦波,三角波和方波

本文我们总结下时钟的概念,并介绍下如何获取系统中各模块的时钟频率。

什么是系统时钟?

通常所说的系统时钟就是指时钟系统,它是由振荡器(信号源)、定时唤醒器、分频器等组成的电路。常用的信号源有晶体振荡器和RC振荡器,如下图所示:

a3cd8d6909906bf524a395671c3e1058.png
时钟系统

ARM的时钟系统包括4部分,分为晶体振荡器、唤醒定时器、锁相环(PLL)和VPB分频器。其中晶体振荡器为系统提供基本的时钟信号(频率为Fosc)。当复位或者处理器从掉电模式唤醒时,“唤醒定时器”要对输入的时钟信号做计数延时,使芯片内部的部件有时间进行初始化。然后Fosc被PLL提高到一个符合用户需要的频率Fcclk,Fcclk用于CPU内核。因为CPU内核通常比外设部件的工作速度要快,用户可以通过设置VPB分频器,把Fcclk信号降低到一个合适的值Fpclk,该信号用于外设部件。

信号源也就是时钟源,外部晶振的频率一般是8M,25M,可以在电路板上的晶振上看到,标号一般是Y*。在keil中需要在魔术棒的Target中进行设置:

1e0df7d997710d34bf77b8b9ffb849d0.png
Keil时钟配置

时钟是嵌入式系统的脉搏,处理器内核在时钟驱动下完成指令执行,状态变换等动作。外设部件在时钟的驱动下完成各种工作,比如串口数据的发送、A/D转换、定时器计数等等。因此时钟对于计算机系统是至关重要的,通常时钟系统出现问题也是致命的,比如振荡器不起振、振荡不稳、停振等。

什么是时钟树?

通常略微复杂的单片机系统中会给出时钟树,描述了系统中所有用到时钟的设备对应的时钟。软件中需要根据时钟树来配置硬件管脚。

以STM32F103ZE为例:

02344552962b8bd03b6c784b9da55086.png
STM32F103ZE时钟树

上图中:假设使能HSE,外部晶振为8MHZ。

1线为使用外部晶振时的系统时钟的配置:外部晶振OSC_IN A为8MHZ,在B处9倍倍频PLL,那么SYSCLK就为72MHZ。

2线为TIM2-7的时钟配置:假设:C处AHB分频为1,D处APB1分频为2,那么E的输入为36MHZ,E的输出为else X2 = 72MHZ。TIM2-7的时钟频率为72MHZ。

定时器中断

在软件设计中,我们常常需要用到软件定时,这是需要我们使用定时器来产生周期定时。

如何产生周期定时,需要用到定时器,需要用到2个参数:预分频值Prescaler和重装值Period。

预分频值决定了最小分辨率,假设72MHZ的TIM3定时器:

  • 如果我们需要1us(1MHZ)的最小分辨率,那么:Prescaler=71 (72-1)

  • 如果我们需要100us(10KHZ)的最小分辨率,那么:Prescaler=7199 (7200-1)

重装值表示计数到此数之后会产生一个定时器中断,假设Prescaler=7199(10KHZ):

  • 如果我们需要1ms的中断,那么计数到10就产生中断,Period=9 (10-1)

  • 如果我们需要10ms的中断,那么计数到100就产生中断,Period=99 (100-1)

  • 如果我们需要100ms的中断,那么计数到1000就产生中断,Period=999 (1000-1)

软件中如何读取各时钟频率?

STM32提供了库函数 RCC_GetClocksFreq

typedef?struct
{
??uint32_t?SYSCLK_Frequency;??
??uint32_t?HCLK_Frequency;????
??uint32_t?PCLK1_Frequency;???
??uint32_t?PCLK2_Frequency;???
??uint32_t?ADCCLK_Frequency;??
}RCC_ClocksTypeDef;

RCC_ClocksTypeDef?clock;
RCC_GetClocksFreq(&clock);

GD32提供了库函数 rcu_clock_freq_get

uint32_t?rcu_clock_freq_get(rcu_clock_freq_enum?clock)

参数:CK_SYS, CK_AHB, CK_APB1, CK_APB2

没有提供接口的外设频率怎么查询?

看芯片手册外设配置和时钟树自己算

以GD32的ADC为例,ADC_SYNCCTL寄存器中bit16-18为ADC的时钟频率ADCCK[2:0]:

18:16?ADCCK[2:0]?ADC时钟
这些位配置所有ADC的时钟
000:PCLK2 2分频
001:PCLK2 4分频
010:PCLK2 6分频
011:PCLK2 8分频
100:HCLK 5分频
101:HCLK 6分频
110:HCLK 10分频
111:HCLK 20分频

#define?ADC_SYNCCTL_ADCCK???????????????BITS(16,18)

那么:

  • 如果ADC配置为ADC_ADCCK_PCLK2_DIV4,那么:

    • 其寄存器值为:(ADC_SYNCCTL>>16)&0x07)=1

    • 其频率为:rcu_clock_freq_get(CK_APB2)/4

  • 如果ADC配置为ADC_ADCCK_HCLK_DIV10,那么:

    • 其寄存器值为:(ADC_SYNCCTL>>16)&0x07)=6

    • 其频率为:rcu_clock_freq_get(CK_AHB)/10

例行给出运行结果

STM32F1-COM3,GD32F4-COM9

f22af38c8ad0f9713a558edd691114e9.gif
时钟频率获取

--EOF--

例行求粉,谢谢!

f18583eecfd5219b93d300841c172a03.png
求粉
  嵌入式 最新文章
基于高精度单片机开发红外测温仪方案
89C51单片机与DAC0832
基于51单片机宠物自动投料喂食器控制系统仿
《痞子衡嵌入式半月刊》 第 68 期
多思计组实验实验七 简单模型机实验
CSC7720
启明智显分享| ESP32学习笔记参考--PWM(脉冲
STM32初探
STM32 总结
【STM32】CubeMX例程四---定时器中断(附工
上一篇文章      下一篇文章      查看所有文章
加:2021-09-24 10:44:32  更:2021-09-24 10:46:25 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 2:38:24-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码