OpenEdv-开源电子网

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

利用32的SysTick做精准延时

[复制链接]

23

主题

52

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
218
金钱
218
注册时间
2015-1-19
在线时间
28 小时
发表于 2016-5-18 21:46:42 | 显示全部楼层 |阅读模式
早在大二就买了一块战舰开发板,但是由于各种原因,开发一直使用51系列的,STC差不多都用了个遍,但是随着开发时间越来越长,很多需要高性能多中外设的单片机,所以从今天开始我准备定期更新自己的学习过程,并把心得分享给大家。

   兵欲善其事必先利其器,对于开发过程中使用最多的莫过于延时了,对于时序要求不高的场合我们可以通过仿真来计算出大致的延时时间,但是对于一些需要严格时序的场合就不一样了,比如通过时序获取或者设置一些传感器或者芯片等。


   战舰的开发板延时函数做的很好,兼容性也很高,但是一些初学者或许正因如此卡在这里,因为他们用别人的程序,虽然不用去读懂,但是感觉自己好像还是什么东西没有学,然而学了又看不懂,这里我用SysTick编写了us和ms级的延时函数,其实和原子用的都是状态
   查询法,但是这个更简单,然而却不支持ucos,但是你可以使用系统自带的延时(ms)或者需要us级的延时再用原子带的。

   废话不多说,上代码:
  [mw_shl_code=c,true]/*****************************
* @fileelay.h
* @brief:initializing SysTick registers as base time for delay and set us&ms delay
* @author:zx
* @date: 2016/5/18
* @version: V0.1
* @attention:none
*****************************/
#ifndef __DELAY_H
#define __DELAY_H
#include "stm32f10x.h"
extern void SysTick_Init(void);
extern void Delay_us(u32 us);
extern void Delay_ms(u32 ms);

#endif
[/mw_shl_code]
[mw_shl_code=c,true]/*****************************
* @fileelay.c
* @brief:initializing SysTick registers as base time for delay and set us&ms delay
* @author:zx
* @date: 2016/5/18
* @version: V0.1
* @attention: none
*****************************/
#include "Delay.h"

void SysTick_Init(void)
{  
    //SysTick_CLKSource_HCLK  72MHz
    SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK_Div8);  //配置SysTick时钟源为8分频 即 72MHz/8 也可选择不分频
          SysTick->CTRL &= ~SysTick_CTRL_TICKINT_Msk;          //计数器减到0时 不产生异常中断   
    SysTick->CTRL &= ~SysTick_CTRL_ENABLE_Msk;           //关定时器
          SysTick->CTRL &= ~SysTick_CTRL_COUNTFLAG_Msk;    //异常标志位清零
       
          SysTick->LOAD = 9; // 72MHz/8/9 = 1us 我要每1us产生一次异常则就在重装寄存器中存9
   
    SysTick->VAL = 0;  //默认计数器内容是0
}

void Delay_us(u32 us)
{
         SysTick->VAL = 0;
         SysTick->CTRL |= SysTick_CTRL_ENABLE_Msk; // 开定时器
         while(us--)
         {
        while(!(SysTick->CTRL&SysTick_CTRL_COUNTFLAG_Msk)); //判断标志位是否置位,没有就等待
        }
       
        SysTick->CTRL &= ~SysTick_CTRL_ENABLE_Msk; //关定时器
}

void Delay_ms(u32 ms)
{
while(ms--)
        {
     Delay_us(1000); // 延时1ms
        }
}
[/mw_shl_code]

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

使用道具 举报

23

主题

52

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
218
金钱
218
注册时间
2015-1-19
在线时间
28 小时
 楼主| 发表于 2016-5-18 21:51:51 | 显示全部楼层
这里要多唠叨几句,常用的位操作(假设向32位的寄存器R的第5位(bit4)中更新数据)

置1: R |= 0x01<<4;
清0: R &= ~(0x01<<4);
取反:R ^= 0x01<<4;


回复 支持 反对

使用道具 举报

14

主题

63

帖子

0

精华

初级会员

Rank: 2

积分
142
金钱
142
注册时间
2016-3-23
在线时间
46 小时
发表于 2016-5-18 21:54:11 | 显示全部楼层
markkkkkkkkkkkkk
回复 支持 反对

使用道具 举报

24

主题

695

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1666
金钱
1666
注册时间
2016-4-29
在线时间
266 小时
发表于 2016-5-18 21:58:31 | 显示全部楼层
嗯嗯嗯。。。我也转STM32没多久
回复 支持 反对

使用道具 举报

120

主题

7878

帖子

13

精华

资深版主

Rank: 8Rank: 8

积分
12012
金钱
12012
注册时间
2013-9-10
在线时间
427 小时
发表于 2016-5-19 00:07:08 | 显示全部楼层
好,不错,加油
回复 支持 反对

使用道具 举报

120

主题

7878

帖子

13

精华

资深版主

Rank: 8Rank: 8

积分
12012
金钱
12012
注册时间
2013-9-10
在线时间
427 小时
发表于 2016-5-19 00:07:46 | 显示全部楼层
我刚开始的也和你的差不多,后面玩系统了,就兼容了uCOS的,呵呵
回复 支持 反对

使用道具 举报

23

主题

52

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
218
金钱
218
注册时间
2015-1-19
在线时间
28 小时
 楼主| 发表于 2016-5-19 10:03:15 | 显示全部楼层
八度空间 发表于 2016-5-19 00:07
我刚开始的也和你的差不多,后面玩系统了,就兼容了uCOS的,呵呵

你是说把延时函数改成兼容模式的,就像原子的程序那样吗?
回复 支持 反对

使用道具 举报

23

主题

52

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
218
金钱
218
注册时间
2015-1-19
在线时间
28 小时
 楼主| 发表于 2016-5-19 10:09:05 | 显示全部楼层

谢谢支持,哈哈
回复 支持 反对

使用道具 举报

23

主题

52

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
218
金钱
218
注册时间
2015-1-19
在线时间
28 小时
 楼主| 发表于 2016-5-19 10:09:19 | 显示全部楼层
d1z1y2 发表于 2016-5-18 21:58
嗯嗯嗯。。。我也转STM32没多久

要坚持下去
回复 支持 反对

使用道具 举报

23

主题

52

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
218
金钱
218
注册时间
2015-1-19
在线时间
28 小时
 楼主| 发表于 2016-5-19 10:09:33 | 显示全部楼层

哈哈                  
回复 支持 反对

使用道具 举报

120

主题

7878

帖子

13

精华

资深版主

Rank: 8Rank: 8

积分
12012
金钱
12012
注册时间
2013-9-10
在线时间
427 小时
发表于 2016-5-19 10:31:23 | 显示全部楼层
黑小莓 发表于 2016-5-19 10:03
你是说把延时函数改成兼容模式的,就像原子的程序那样吗?

现在,程序把烂铜烂铁变得智能化了,人呢,一旦离开了这烂铜烂铁就不知道干啥了
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-8 16:41

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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