??写在前面的话:上一篇博客我们详细的介绍了STM32的时钟系统,这一篇我们来验证我们设置的是否正确,并且再进一步深化时钟的概念。也许之前的学习没怎么在意时钟,但是在做项目开发时工程师往往会特别注意时序的问题,一旦设置的不合理或者有错误,产品做成后会带来巨大的影响,因此对时钟的学习是必不可少的。
一、程序实现
??话不多说直接放代码: main.c
#include "main.h"
RCC_ClocksTypeDef clock;
int main(void)
{
RCC_GetClocksFreq(&clock);
while(1)
{
;
}
}
main.h
#ifndef __MAIN_H
#define __MAIN_H
#include "stm32f10x.h"
#endif
??程序十分简单我30s就写完了,简单的让我都怀疑,下面先来说一下怎么写出来的。 ??我们的目的是验证时钟,获取各个时钟的频率信息,我们知道在ST标准库中,封装了很多很多函数,这其中有一份文件名叫:stm32f10x_rcc.c/h的文件,这一份主要是与STM32的时钟相关的,里面包括了设置时钟频率,时钟源,开启AHB/APB1/APB2的外设时钟等等函数,可以说我们在编程时是离不开这一份文件的,如下图所示,双击点开该文件: ??直接在.c源文件里找函数是比较累人眼花的,我们先跳转到stm32f10x_rcc.h中,然后一路下拉,拉到最后面,这是ST标准库的规范,一般给函数声明的时候都会放在最后面,开头是很多很多结构体等的定义,可以直接跳过不看,如下所示: ??拉到最后就开始找我们需要的函数,像RCC_AHBPeriphClockCmd函数就是开启AHB总线上对应外设的时钟,我们这一次要找的是获取时钟频率的函数,我们小眼一瞥一下子就看到了一RCC_GetClocksFreq的函数,看名字RCC获取时钟频率,那就八九不离十就是它了,我们再跳转过去看函数本体,如下图: ??可以从ST在函数前的注释中(Returns the frequencies of different on chip clocks)可以看出 ,返回的是时钟频率,我们在看一下函数的入口参数是一个结构体:RCC_ClocksTypeDef* RCC_Clocks,我们来看一下结构体成员变量: ??没错,这就是我们需要的SYSCLK、HCLK、PCLK1、PCLK2时钟,我们只需要在main.c里定义一个RCC_ClocksTypeDef结构体变量在调用这个函数将结构体变量传进去,就完成查询时钟频率的任务。 ??然后有人就会来问了,那我调用了这个函数,怎么看最后存在结构体里的得到的时钟频率呢,那就要用到KEIL5的DEBUG功能了,看下一节。
二、KEIL5 DEBUG功能
2.1 准备步骤
??要使用DEBUG功能我们需要将下载器/仿真器连接到板子再连接到电脑,本次例程我使用的是正点原子的DAP仿真器,因此首先在魔术棒的DEBUG选项卡下设置,如下图所示: ??如果用的是ST-LINK就要选择ST-Link Debugger,仿真器不一样不会有特别大的差异的但是设置的debug方式要选择正确,然后点击右边的Settings里查看,如图: ??若在②处有显示端口,则表示连接正常,接下来点击OK退出魔术棒选项卡,点击如图的按钮: ??点击后界面将跳转到DEBUG模式下,如过之前程序没有下载到板子里,点击后会先下载程序进入板子在进入DEBUG界面,如图: ??下图是DEBUG的工具栏,①是芯片复位按钮,②是运行程序,③是停止运行,④是运行下一步,⑤是跳过运行,⑥是跳出运行,⑦是运行到光标所在处,之后的调试会用到,用到的时候再说: ??点击选择我们定义的clock,右键Add"clock"to… --Watch1,这一步是将我们定义的clock结构体添加到监视窗口1,如下图: ??可以在我们的Watch1窗口看到我们添加的clock变量,如图: ??接下来只需要点击①运行按钮,程序会自动运行,把通过函数获取到的频率值保存下来,如图: ??如图,和我们上一讲设置的频率值一样,实验成功。 ??最后我们在点击停止按钮,停止程序运行,然后再次点击DEBUG按钮退出DEBUG模式,完成本次实验。
2.2 小贴士
??1:如果把变量添加进Watch1后看不到Watch1窗口,可以在View中把窗口调用出来,如图我只打开了Watch1: ??2:如果点击运行后,Watch1里的变量没有刷新,可以点击View中的Periodic Windows Update,打开变量实时刷新:
三、小结
??本章我们结束了对STM32时钟系统的讲解,从硬件框架层面到软件层面都进行了介绍,也对DEBUG模式有了一定的认识,下一章将介绍手把手点亮LED灯,STM32入门教学。
|