在前面的流水灯程序中我们使用了典型的软件延时法,如下图所示
这是我们常在51中使用的典型的软件延时程序,平时用起来虽然说会影响软件的效率,但是问题不大,可是在stm32中问题就来了 看看这个,为了流水灯效果,ucount的值会很大,还有一个问题在于stm32同样的晶振可以配置很多的工作频率。这样一来使得软件延时很难用,所以对于stm32我们需要设计一种新的方案来实现软件延时的效果
来认识一下今天的主角:Systick
Cortex-M3 的内核中包含一个 SysTick 时钟。SysTick 为一个 24 位递减计数器,SysTick 设定初值并使能后,每经过 1 个系统时钟周期,计数值就减 1。计数到 0 时,SysTick 计数器自动重装初值并继续计数,同时内部的 COUNTFLAG 标志会置位,触发中断 (如果中断使能情况下)。
在 STM32 的应用中,使用 Cortex-M3 内核的 SysTick 作为定时时钟,设定每一毫秒产生一次中断,在中断处理函数里对 N 减一,在Delay(N) 函数中循环检测 N 是否为 0,不为 0 则进行循环等待;若为 0 则关闭 SysTick 时钟,退出函数。
那么我们到底要怎么样才能使用Systick时钟呢?既然要使用库,肯定要在库中找了
在这里我们会发现一个问题,在stm32的标准外设库中没有Systick库,其实在ST早期的库中是存在Systick外设库的,但是在3.0之后的版本中,这个外设库被取消了,来看看应用笔记AN2953中的说明吧!
从上图我们可以看到,新版的库中把Systick的操作简化了,对其的设置只有一个SysTick_Config(uint_32t count)函数。该函数实现在core_cm3.h文件中,如下图
也就是说我们只要给SysTick_Config(count)传一个小于SYSTICK_MAXCOUNT的数,系统就会给Systick 计数器赋初值,并启动该计数器,同时打开中断。默认的时钟源是系统时钟
有个很奇怪的问题,该定时器打开之后在库中没有找到关闭该计数器及中断的方法,除非直接写寄存器,不知道哪位还有更好的办法
接下来我们就用Systick时钟来做延时,修改前面的流水灯程序
第一步:现根据硬件定义LED
第二步:在main函数中,先进行必要的初始化
第三步:启动Systick时钟
光启动了Systick时钟没用处,我们还需要写一个延时函数,接着来
第四步:打开stm32f10x_it.c 这个是ST提供的中断模板,里面是一些中断函数的原型,以后中断函数都写在这里,方便查找,我们先要在该文件中定义一个变量TimingDelay
初值为0
注意:__IO 这是库中的一个宏定义
我们可以看到其实__IO 就是 volatile 。为什么要用volatile呢,因为该变量要在中断中修改,所以用volatile来修饰,告诉编译器,我要随时改变,不要对我进行优化,这个是必须的,否则TimingDelay的值会固定不变
第五步:在SysTick中断函数中写上TimingDelay--就可以了
还有一个很重要的问题,因为我们要在main.c中调用TimingDelay变量,所以还需要在stm32f10x_it.h添加上如下声明:
接下来,就可以完成延时函数了
第六步:
这个函数很简单,先给TimingDelay附一个初值,然后一直等到TimingDelay==0是退出,否则一直循环,TimingDelay在Systick中断中自检,所以该延时函数的值总是Systick时基的nTime倍。
接下来我们就可以在while循环里写上流水灯的程序了
这里为了简化程序,我们只用了led2
因为前面我们配置的Systick时基是0.5ms,所以stick_delay(1000)延时500ms
编译一下,没问题
我们就可以把文件烧入开发板来观察实际效果了
这里有个问题,我们字么确认tick_delay(1000)的延时时间是500ms呢,虽然我们计算出来却是是这个值,但是伟人说过实践是检验真理的唯一标准
两个办法:
第一个:用示波器次两LED2上的时钟脉冲,也就是PC9脚,当然了这个办法对于很多没有示波器的个人好爱者来说说了等于没说
第二个:利用keil的逻辑分析仪,需要对项目的设置做下修改
打开项目设置,切到debug页面,如下图,选择软件仿真,按下图所示勾选
改好后确定
点击图中图标1进入调试模式,点击2打开逻辑分析一界面
点击setup,进入逻辑分析仪设置界面
点击上图红圈所示,添加需要测量的引脚,问题来了,我们该怎么输入,才能让逻辑分析仪设置好我们需要测量的引脚
先点close关闭本界面
接着点击如上图红框所示图标,在如下图处点击。
结果如下图所示
展开第一个图标,即VT,然后找到PORTA等
这就是STM32的外部端口了,呵呵。 再重新打开逻辑分析仪设置界面,输入PARTC.9。注意大小写
PORTC.9 |
设置完成后,进行全速运行,逻辑分析以显示如下
呵呵,看到结果了吧,还是相当准确的,点击In,Out,和all按钮可以调节和面显示波形的大小。至于怎么硬件仿真时使用keil的逻辑分析仪,我也不会,O(∩_∩)O哈!
图片都发布上来,需要的朋友可以到这里下载PDF档http://www.wang1jin.com/bbs/viewthread.php?tid=555&extra=
牛气活力:红牛开发板(STM32F103ZET6)配置3.2寸TFT真彩触摸屏模块 | ||
428.0元 |
文章评论(0条评论)
登录后参与讨论