外设寄存器应该怎么看才对?教你一招~

cathy的头像

我们知道 STM32 有很多寄存器,看起来特别费劲,当然如果通过前面的直接查看寄存器值的方法确实可以观察数据,但在这里我要介绍一个特别方便的查看方式。

KEIL 集成的外设窗口(注意这个外设串口对 STM32F4 系列支持效果并不理想,但对 STM32F1 的支持特别好)。

首先介绍比较一般的查看方式。

进入 Debug 模式后,你应该能看到这个:

“”

System Viewer 是关于片上外设的,也就是说不同的芯片具有不同的外设。

“”

通过这个简单看看 GPIO 吧(效果和 Watch 查看没多大不同):

“”

芯片的选择是通过这个确定的:

“”

而另一个 Core Peripherals 就是关于 CM3 内核的了,只要你的芯片内核是这个,基本都一样的,比如 STM32F103RET6 和 STM32F103ZET6,都是 CM3 内核:

“”

通过它看看 System Tick Timer 好了:

“”

看到没有,这个界面和普通的寄存器查看就不同了,如果你想知道你的滴答定时器有没有开启,直接看 ENABLE 就可以了,根本不需要知道在哪个位。事实上用来查看中断寄存器更能显示它的不同:

“”

你的中断设置的优先级是多少,是否开启了,是否挂起了,是否处于活动状态,在这里一目了然。当然这里只是简单介绍,其它更多内容自己去看咯,比如你设置的中断分组情况,中断向量表偏移等内容都可以在这里查看。

再偷偷告诉你一个点,如何让程序尽快进入中断程序运行呢?试试勾选这个吧:

“”

这样在你的程序运行后马上就能到你的中断处理函数中执行了呢,是不是很方便。

通常以上窗口就是一般都能看到的,还有一些窗口如果设置不当是不能出现的,具体设置可以看 【Peripherals显示空白】这个小节内容。现在假设你已经拥有如下窗口了:

“”

这些窗口有什么好处呢?

我们知道,CM3 处理器的时钟这一块还是很复杂的,分频、倍频的都不知道到底最后时钟是多少,但有了下面这个窗口就不一样了:

“”

图片内容太多了,我们来截取一个点好了,就从最后部分介绍:

“”

看到没有,当时钟为 8 M 的时候,HCLK、PCLK1、PCLK2 等这些时钟频率就根据你的配置正确显示好了(前提是你的代码已经将时钟配置这部分内容运行完了)。那么 KEIL 是怎么知道你的外部时钟是多少呢,通过修改这个:

“”

事实上你可以直接修改这个:

“”

但是这是临时修改,下次进入 Debug 模式时读取的还会是 8 M,所以最好修改上面那个。

可能你会说,时钟频率什么的我不关心,只要程序能运行就行,但是在器件通信的时候你可不能不关心时钟频率,因为有的器件的通信频率是有要求的,比如 SPI 的通信速度要求是多少,你就得是多少,否则超出后肯定通信错误。那么如何查看呢?

比如 SPI1 的通信频率(这里要说明一点是 SPI3 好像无法显示出来,只能通过常规方法查看寄存器变量咯):

“”

“”

这里的时钟分频系数为 2,但是显示的波特率为 72M,这是为什么呢?还记得之前我把 8 M 改成 16 M 了吗?所以这里才会显示 72M,所以你要注意一点的是,如果你使用的是外部时钟,必须按前面的方法设置正确,这样SPI这里的波特率显示才正确。不过前面说了,Clock Disable,即时钟关闭了,所以这个值是没有意义的,因为没有 SPI 时钟你是无法工作的呀。

说完这个,再说说常用的外设 GPIO 好了,以 GPIOA 为例说明:

“”

看窗口,是不是相当不错呢。因为程序还没开始运行,所以所有的 IO 口都是默认设置,即都是浮空输入。我想暂时改为输出怎么样,直接修改就行了:

“”

但是你会发现改完了也没用,因为你的时钟是关闭的呀:

“”

所以如果你发现你的 IO 口没工作,看看你的时钟有没有打开吧。

现在看看有意思的 IO 输入输出状态:

“”

这个 IDR 表示输入寄存器(不可像 ODR 一样修改),如果这个 IO 口设置为输入了,那么这个可以实时显示你的 IO 口状态的(另外鱼鹰偷偷告诉你,如果在没有万用表的情况想知道输入 IO 口是高电平还是低电平,看这个就可以了,即使程序不运行也可以观察哦)。

而 ODR 表示输出寄存器,勾选了代表输出为高电平,没勾选就是低电平(前提是你的这个 IO 口已经设置为输出了),如果你想让 IO 暂时输出一个电平,那么改这个就行了,比如你想看这个 PA0 是否设置正确或者是否损坏了,结合万用表就可以知道这个引脚是否能被你控制了。

LCKR 这个是引脚的锁定寄存器,一般不怎么使用。而 Pins 这个选项是在软件仿真情况下才会出现的,这个其实和用你的万用表测量是一样的道理,只不过因为是软件仿真的缘故,所以不存在损坏的问题,如果不能控制,就说明是程序配置问题了:

“”

比如当你配置为 10M 输出的情况下,如果勾选 PA0 的 ODR,那么这个引脚的 IDR 和 Pins 自动就会勾选了。而如果你在 Pins 里勾选,就类似于你在给这个引脚直接输入一个高电平,而这个引脚本来是输出的,所以会被禁止:

“”

但是如果这个引脚是输入的,勾选 Pins 就没有问题了,并且 IDR 寄存器还能反映引脚状态呢:

“”

看完这些功能是不是感觉特别好用啊,所以说掌握了开发平台的调试手段对你的开发是非常有必要的,磨刀不误砍柴工,说的就是这个了。

另外再说一点,因为窗口太多了,只是拿其中部分窗口说明的,其他的就靠你自己去尝试了。

PWM 输出是否正常?变量的变化如何通过 KEIL 以波形的方式展现出来?

本文转载自:鱼鹰谈单片机(作者:鱼鹰Osprey)
免责声明:本文为转载文章,转载此文目的在于传递更多信息,版权归原作者所有。本文所用视频、图片、文字如涉及作品版权问题,请联系小编进行处理(联系邮箱:cathy@eetrend.com)。