你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。
chrome
firefox
safari
ie8及以上
ST
意法半导体官网
STM32
中文官网
ST
全球论坛
登录/注册
首页
技术问答
话题
资源
创客秀
视频
标签
积分商城
每日签到
SysTick的时钟源
[复制链接]
taiyangshengqi
发布时间:2015-1-7 20:16
文章
文章封面:
-
文章简介:
-
我不得不说意法半导体确实有点风骚!甚至有点变态。我对ST文档 STM32F10XXX参考手册的编辑水平真是不敢恭维。手册中好多说明都是含糊不清,甚至将好多对初学者来说很重要的地方都一笔带过,让人着实摸不着头脑。比如前面我说过的关于NVIC嵌套向量中断控制器的介绍,这部分我认为是非常重要的,但当你看完他这部分介绍,你根本不会设置中断服务程序,他有哪些寄存器都不知道,更别说去设置了,NVIC的详细介绍是在Cotex-M3中有详细的介绍,不多说。今天我们说的是systick定时器。
systick定时器和我上面说的情况一样,在手册中根本没有介绍。我费了九牛二虎之力才在一个犄角格拉里找到systick定时器的英文版的说明。在Cotex-M3有介绍,为什么要找STM32的介绍,是因为功能设置上还有点区别。首先看一下systick定时器的作用,下面是Cotex-M3里的一段话:
SysTick定时器被捆绑在NVIC中,用于产生SYSTICK异常(异常号:15)。在以前,大多操作系统需要一个硬件定时器来产生操作系统需要的滴答中断,作为整个系统的时基。例如,为多个任务许以不同数目的时间片,确保没有一个任务能霸占系统;或者把每个定时器周期的某个时间范围赐予特定的任务等,还有操作系统提供的各种定时功能,都与这个滴答定时器有关。因此,需要一个定时器来产生周期性的中断,而且最好还让用户程序不能随意访问它的寄存器,以维持操作系统“心跳”的节律。
下面我们就应用SysTick定时器来裸奔,把它作为一个定时器来用,还是老一套,在寄存器头文件中添加定义寄存器:
//*****************************************************************
//* SystemTick-Register
//*******************************************************************
#define SYSTICK_TENMS (*((volatile unsigned long *)0xE000E01C))
#define SYSTICK_CURRENT (*((volatile unsigned long *)0xE000E018))
#define SYSTICK_RELOAD (*((volatile unsigned long *)0xE000E014))
#define SYSTICK_CSR (*((volatile unsigned long *)0xE000E010))
配置systick寄存器:
void SysTick_Configuration(void)
{
SYSTICK_CURRENT=0; //当前值寄存器
SYSTICK_RELOAD=20000; //重装载寄存器,系统时钟20M中断一次1mS
SYSTICK_CSR|=0x06;// HCLK作为Systick时钟,Systick中断使能位
}
中断处理:
void SysTick_Handler(void) //中断函数
{
extern unsigned long TimingDelay; // 延时时间,注意定义为全局变量
SYSTICK_CURRENT=0;
if (TimingDelay != 0x00)
TimingDelay--;
}
利用systick的延时函数:
unsigned long TimingDelay; // 延时时间,注意定义为全局变量
void Delay(unsigned long nTime) //延时函数
{
SYSTICK_CSR|=0x07; // 使能SysTick计数器
TimingDelay = nTime; // 读取延时时间
while(TimingDelay != 0); // 判断延时是否结束
SYSTICK_CSR|=0x06;// 关闭SysTick计数器
}
int main()
{
SystemInit0(); //系统(时钟)初始化
stm32_GpioSetup (); //GPIO初始化
SysTick_Configuration(); //配置systick定时器
while(1)
{
GPIO_PORTB_ODR|=(1<<5);
Delay(1000); //1S
GPIO_PORTB_ODR&=~(1<<5);
Delay(1000); //1S
}
}
完成!Delay(1000);实现了1S的精确延时,利用Delay(unsigned long nTime);配合systick定时器可以实现任意时间的精确延时,当然通过定时器TIMx也是可以这样做的,我只是用它来说明systick定时器的用法。
赞
0
收藏
0
评论
3
分享
发布时间:2015-1-7 20:16
举报
请先
登录
后回复
3个回答
AndyYau-268557
回答时间:2015-1-7 20:26:58
a0a.1 32b0c
来看你帖子了,很好,很基本。加油一起
赞
评论
回复
支持
反对
wamcncn
回答时间:2015-1-7 21:10:43
a0a.1 32b0c
本帖最后由 wambob 于 2015-1-7 21:12 编辑
有没有完整的代码,正好需要用 系统滴答做键盘扫描,不过我看NUCLEO 072的文档滴答延迟是250MS
赞
评论
回复
支持
反对
wyxy163@126.com
回答时间:2015-1-7 21:40:30
a0a.1 32b0c
提示:
作者被禁止或删除 内容自动屏蔽
赞
评论
回复
支持
反对
所属标签
关于
意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
微信公众号
手机版
快速回复
返回顶部
返回列表
有没有完整的代码,正好需要用 系统滴答做键盘扫描,不过我看NUCLEO 072的文档滴答延迟是250MS