OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 10327|回复: 6

关于systick定时器的一些疑问的求证

[复制链接]

30

主题

155

帖子

0

精华

高级会员

Rank: 4

积分
768
金钱
768
注册时间
2012-6-14
在线时间
204 小时
发表于 2012-6-20 15:11:00 | 显示全部楼层 |阅读模式
我现在看原子哥关于systick定时器的写法,就是关于系统延时delay_ms,delay_us的实现方法,然后发现,原子哥中的写法中,并没有使用到SysTick_Handler这个中断函数,但是我在网上查到了另外一种写法,实现延时的方法是在SysTick_Handler这个中断函数中实现,那么,我在这里,有一个解释,不知道原子大哥咱不赞同:

第一种写法是使用的,STK_VAL的值减到0的时候,会重新装载STK_LOAD的值,然后产生一次中断,非原子哥例程就是在这个中断中,写了一个延时的函数出来;而原子哥的写法,主要是依据的是,STK_VAL的值减到0的时候,会重新装载STK_LOAD的值,并且STK_CSR的第16位会由0置位成1,原子哥就是利用的判断STK_CSR的第16位的改变,来写出的延时函数的,从而实现延时。

网上的例程,我摘抄一点出来作为对比:

配置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计数器

}


然后,基于这样的认识,我对原子哥的例程中进行了修改
void delay_init(u8 SYSCLK)
{
///SysTick->CTRL&=0xfffffffb;//bit2清空,选择外部时钟  HCLK/8 ///为清空CLKSOURCE位而选择外部时钟源
SysTick->CTRL&=0xfffffff9;
fac_us=SYSCLK/8;    
fac_ms=(u16)fac_us*1000;
}
红色是我修改的地方,就是将
SysTick的中断给关了,依然ok。

请问各位,不知道小弟的这种认识是不是正确的。




正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165371
金钱
165371
注册时间
2010-12-1
在线时间
2110 小时
发表于 2012-6-20 17:14:16 | 显示全部楼层
SysTick->CTRL默认值应该是0.所以你写9和写b是一个效果.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

30

主题

155

帖子

0

精华

高级会员

Rank: 4

积分
768
金钱
768
注册时间
2012-6-14
在线时间
204 小时
 楼主| 发表于 2012-6-21 09:14:59 | 显示全部楼层
回复【2楼】正点原子:
---------------------------------
那我自己对这个的认识有没有什么误区呢?是不是原子哥的这个是不开中断,而这个例程中是开中断的?
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165371
金钱
165371
注册时间
2010-12-1
在线时间
2110 小时
发表于 2012-6-21 09:33:34 | 显示全部楼层
中断与不开中断,都是可以的.
我建议不要用中断.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

30

主题

155

帖子

0

精华

高级会员

Rank: 4

积分
768
金钱
768
注册时间
2012-6-14
在线时间
204 小时
 楼主| 发表于 2012-6-21 16:10:46 | 显示全部楼层
回复【4楼】正点原子:
---------------------------------
恩,为什么呢?是为了节省一个SysTick_Handler中断吗?
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165371
金钱
165371
注册时间
2010-12-1
在线时间
2110 小时
发表于 2012-6-21 16:46:50 | 显示全部楼层
没必要.
回复 支持 反对

使用道具 举报

30

主题

155

帖子

0

精华

高级会员

Rank: 4

积分
768
金钱
768
注册时间
2012-6-14
在线时间
204 小时
 楼主| 发表于 2012-6-21 16:58:21 | 显示全部楼层
回复【6楼】正点原子:
---------------------------------
恩,谢谢原子大哥,嘿嘿
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-2-26 08:22

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表