OpenEdv-开源电子网

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

系统滴答定时器SysTick 中断程序 中断用法

[复制链接]

5

主题

38

帖子

0

精华

初级会员

Rank: 2

积分
151
金钱
151
注册时间
2012-5-12
在线时间
27 小时
发表于 2012-5-18 08:39:51 | 显示全部楼层 |阅读模式

原子哥的系统滴答定时器SysTick 是用来做延时用的。可是有很多时候我们的定时器用完了,就有需要用要SysTick 来做定时器做中断。下面给大伙程序,这里初始化完,每过设定时间4ms(/时间加载)中设定)  就会进入一次中断,结合原子哥的延时程序一看就明

SysTick_init(u8 SYSCLK)
{  u16 fac_us,fac_ms;
    SysTick->CTRL&=0xfffffffb;    //bit2清空,选择外部时钟  HCLK/8
   fac_us=SYSCLK/8;     
   fac_ms=(u16)fac_us*1000;

   SysTick->LOAD=(u32)4*fac_ms;    //时间加载(SysTick->LOAD为24bit)
   SysTick->VAL =0x00;                    //清空计数器
   SysTick->CTRL |=(1<<0 |1<<1);    //开始倒数    
    /* Function successful */
}

void SysTick_Handler()  //4ms中断
{

    /* 在这里写上你要的中断程序,比如LED反复点亮之类的*/
}

做好的软件为人类服务
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2012-5-18 08:56:16 | 显示全部楼层
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

23

主题

143

帖子

1

精华

高级会员

Rank: 4

积分
933
金钱
933
注册时间
2012-4-23
在线时间
68 小时
发表于 2012-5-18 12:47:24 | 显示全部楼层
有没有使用库函数的延时程序  给一份看一下 不要寄存器直接操作的
回复 支持 反对

使用道具 举报

6

主题

58

帖子

0

精华

初级会员

Rank: 2

积分
103
金钱
103
注册时间
2012-9-17
在线时间
0 小时
发表于 2012-10-9 11:14:07 | 显示全部楼层
进不了中断,中断优先级是否要设置下
回复 支持 反对

使用道具 举报

6

主题

58

帖子

0

精华

初级会员

Rank: 2

积分
103
金钱
103
注册时间
2012-9-17
在线时间
0 小时
发表于 2012-10-9 11:15:10 | 显示全部楼层
用开发板中的中断优先级设置会报错?什么原因
回复 支持 反对

使用道具 举报

12

主题

34

帖子

0

精华

初级会员

Rank: 2

积分
103
金钱
103
注册时间
2013-10-26
在线时间
0 小时
发表于 2013-11-24 21:30:33 | 显示全部楼层
那如何设置它的优先级?
回复 支持 反对

使用道具 举报

0

主题

5

帖子

0

精华

新手上路

积分
36
金钱
36
注册时间
2013-11-8
在线时间
4 小时
发表于 2013-11-25 20:44:37 | 显示全部楼层
感谢楼主分享
回复 支持 反对

使用道具 举报

5

主题

48

帖子

0

精华

初级会员

Rank: 2

积分
125
金钱
125
注册时间
2013-10-11
在线时间
8 小时
发表于 2014-4-16 21:38:27 | 显示全部楼层
回复【2楼】正点原子:
---------------------------------
原子哥,SysTick的中断不用设置优先级也可以用是吗?
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2014-4-16 23:12:55 | 显示全部楼层
回复【8楼】支翔宇:
---------------------------------
是的,默认最低优先级
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

5

主题

48

帖子

0

精华

初级会员

Rank: 2

积分
125
金钱
125
注册时间
2013-10-11
在线时间
8 小时
发表于 2014-4-16 23:15:46 | 显示全部楼层
回复【9楼】正点原子:
---------------------------------
恩,多谢原子哥指点
回复 支持 反对

使用道具 举报

5

主题

41

帖子

0

精华

初级会员

Rank: 2

积分
81
金钱
81
注册时间
2014-5-9
在线时间
0 小时
发表于 2014-7-24 09:41:29 | 显示全部楼层
SysTick_init(u8 SYSCLK)  SYSCLK是多少呢
回复 支持 反对

使用道具 举报

3

主题

17

帖子

0

精华

新手上路

积分
49
金钱
49
注册时间
2014-7-28
在线时间
0 小时
发表于 2014-8-14 21:07:35 | 显示全部楼层
楼主你好,用了SysTick的中断后,delay_ms()和delay_us()应该就不能用了吧,那想延时的话要怎么办?用其它定时器中断吗?
回复 支持 反对

使用道具 举报

3

主题

17

帖子

0

精华

新手上路

积分
49
金钱
49
注册时间
2014-7-28
在线时间
0 小时
发表于 2014-8-15 18:58:28 | 显示全部楼层
回复【2楼】正点原子:
---------------------------------
原子哥,systick的中断服务函数里,最后还需要清除中断标志位吗
回复 支持 反对

使用道具 举报

230

主题

1950

帖子

10

精华

论坛元老

Rank: 8Rank: 8

积分
4562
金钱
4562
注册时间
2010-12-14
在线时间
32 小时
发表于 2014-8-15 19:03:23 | 显示全部楼层
[mw_shl_code=c,true]static __IO uint32_t TimingDelay; void Delay(__IO uint32_t nTime) { TimingDelay = nTime; while(TimingDelay != 0); } void SysTick_Handler(void) { if (TimingDelay != 0x00) { TimingDelay--; } } int main(void) { … if (SysTick_Config(SystemCoreClock / 1000)) //systick时钟为HCLK,中断时间间隔1ms { while (1); } while(1) { … Delay(200);//2ms … } } [/mw_shl_code]

我是开源电子网?网站管理员,对网站有任何问题,请与我联系!QQ:389063473Email:389063473@qq.com
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2014-8-15 20:38:45 | 显示全部楼层
回复【13楼】逍遥winter:
---------------------------------
读CTRL,可以清除中断标志
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

0

主题

1

帖子

0

精华

新手入门

积分
21
金钱
21
注册时间
2015-3-18
在线时间
0 小时
发表于 2015-3-18 11:41:35 | 显示全部楼层
回复【14楼】Admin:
---------------------------------
你好,我用的是3.5的库,为什么完全参照你这个程序去点亮一个灯闪灭不行?
[mw_shl_code=c,true] #include "stm32f10x.h" unsigned int TimingDelay; void Delay(unsigned int x) { TimingDelay=x; while(TimingDelay!=0); } void TimingDelay_Decrement(void) { if (TimingDelay != 0x00) { TimingDelay--; } } int main(void) { SystemInit();//配置系统时钟 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);//使能APB2外设时钟 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB | RCC_APB2Periph_GPIOC | RCC_APB2Periph_GPIOD,ENABLE);//IO口使能设置 GPIO_InitTypeDef GPIO_InitStructure; //定义I/O口结构体 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOC, &GPIO_InitStructure); GPIO_ResetBits(GPIOC, GPIO_Pin_6); if (SysTick_Config(72000000 / 100)) //每10ms中断一次 { /* Capture error */ while (1); } while(1) { GPIO_SetBits(GPIOC, GPIO_Pin_6); Delay(100); //100*10ms=1s GPIO_ResetBits(GPIOC, GPIO_Pin_6); Delay(100); //100*10ms=1s } } [/mw_shl_code]

回复 支持 反对

使用道具 举报

2

主题

3

帖子

0

精华

新手入门

积分
31
金钱
31
注册时间
2015-4-24
在线时间
0 小时
发表于 2015-7-2 07:28:57 | 显示全部楼层
楼主在吗,为什么用寄存器的程序时,会有一个错误,初始化的错误
回复 支持 反对

使用道具 举报

11

主题

34

帖子

0

精华

初级会员

Rank: 2

积分
103
金钱
103
注册时间
2015-9-10
在线时间
1 小时
发表于 2015-9-10 22:31:27 | 显示全部楼层
回复【2楼】正点原子:
---------------------------------
求助原子哥:
?
?systick的中断,在库函数中是默认配置了最低的优先级吧?
?
?我如果是想要改为最高的优先级,是应该直接在配置systick的函数里面去改优先级?还是另外写一个systick的NVIC的init函数?
?哪一种方法比较好啊?
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2015-9-10 23:07:50 | 显示全部楼层
回复【18楼】逆鳞:
---------------------------------
默认是最低的,最高的貌似库函数有一个systick中断优先级配置的函数,你百度一下吧.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

6

主题

62

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
341
金钱
341
注册时间
2015-9-22
在线时间
32 小时
发表于 2016-11-29 22:47:30 | 显示全部楼层
本帖最后由 stm32你是我的菜噢 于 2016-11-29 22:50 编辑

可以,这也是一个方法啊
嵌入式开发微信公众号:嵌入式STM32软硬件开发
STM32交流,加好友,Q707372788
STM32交流群:383260480
回复 支持 反对

使用道具 举报

1

主题

5

帖子

0

精华

初级会员

Rank: 2

积分
53
金钱
53
注册时间
2014-5-31
在线时间
9 小时
发表于 2016-12-8 11:14:37 | 显示全部楼层
进入中断好像出不来了
回复 支持 反对

使用道具 举报

6

主题

62

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
341
金钱
341
注册时间
2015-9-22
在线时间
32 小时
发表于 2016-12-8 16:18:56 | 显示全部楼层
本帖最后由 stm32你是我的菜噢 于 2016-12-8 16:20 编辑

这个我做过一个例程的,需要的朋友找我要吧
嵌入式开发微信公众号:嵌入式STM32软硬件开发
STM32交流,加好友,Q707372788
STM32交流群:383260480
回复 支持 反对

使用道具 举报

2

主题

9

帖子

0

精华

新手上路

积分
46
金钱
46
注册时间
2017-1-5
在线时间
8 小时
发表于 2017-1-17 09:15:49 | 显示全部楼层
zoyee.l 发表于 2015-3-18 11:41
回复【14楼】Admin:
---------------------------------
你好,我用的是3.5的库,为什么完全参照你这个 ...

解决了吗,为什么我用的TimingDelay_Decrement函数都调用不到,只在Delay那里死循环
回复 支持 反对

使用道具 举报

1

主题

8

帖子

0

精华

新手上路

积分
28
金钱
28
注册时间
2017-2-12
在线时间
5 小时
发表于 2017-2-12 20:57:52 | 显示全部楼层
ibelieveit521 发表于 2017-1-17 09:15
解决了吗,为什么我用的TimingDelay_Decrement函数都调用不到,只在Delay那里死循环

解决了吗?我也是在delay里面死循环了
回复 支持 反对

使用道具 举报

Fridaydty 该用户已被删除
发表于 2017-3-26 22:18:46 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复 支持 反对

使用道具 举报

12

主题

50

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
211
金钱
211
注册时间
2014-9-13
在线时间
31 小时
发表于 2017-4-30 04:07:46 | 显示全部楼层
我也遇到这样的情况,用查询写的可以,用中断就是不行死循环在DELAY那里
回复 支持 反对

使用道具 举报

12

主题

50

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
211
金钱
211
注册时间
2014-9-13
在线时间
31 小时
发表于 2017-4-30 04:08:14 | 显示全部楼层
有谁能解答下吗?
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-8-21 18:16

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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