OpenEdv-开源电子网

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

请教:有关SysTick定时器的中断

[复制链接]

12

主题

45

帖子

0

精华

初级会员

Rank: 2

积分
108
金钱
108
注册时间
2017-6-15
在线时间
17 小时
发表于 2017-6-15 11:57:18 | 显示全部楼层 |阅读模式
1金钱
我用函数 MY_NVIC_Init(u8 NVIC_PreemptionPriority,u8 NVIC_SubPriority,u8 NVIC_Channel,u8 NVIC_Group)
设置了TIM1.....TIM4等定时器的中断,可是却设置不了SysTick定时器的中断....不知怎么回事?
SysTick定时器不能用于中断服务吗?
恳请诸位老师指教

最佳答案

查看完整内容[请看2#楼]

当然可以有中断,参考我们UCOSII的代码,很简单啊。 SYSTICK不需要你设置其 优先级,直接开关中断即可。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2017-6-15 11:57:19 | 显示全部楼层
当然可以有中断,参考我们UCOSII的代码,很简单啊。  SYSTICK不需要你设置其 优先级,直接开关中断即可。
回复

使用道具 举报

12

主题

45

帖子

0

精华

初级会员

Rank: 2

积分
108
金钱
108
注册时间
2017-6-15
在线时间
17 小时
 楼主| 发表于 2017-6-15 12:01:45 | 显示全部楼层
怎么建立SysTick定时器的中断服务?????????
回复

使用道具 举报

51

主题

2166

帖子

2

精华

论坛元老

Rank: 8Rank: 8

积分
10656
金钱
10656
注册时间
2017-4-14
在线时间
2780 小时
发表于 2017-6-18 20:00:25 | 显示全部楼层
本帖最后由 275891381 于 2017-6-18 20:01 编辑
ygyh 发表于 2017-6-15 12:01
怎么建立SysTick定时器的中断服务?????????

[mw_shl_code=applescript,true]#include "delay.h"
#include "key.h"

volatile u32 xitong_haomiao;           //2^32/1000/3600/24=49.71天会复位
                  
           
static   u8  fac_us=0;                                                             //us延时倍乘数        
//SYSTICK的时钟固定为HCLK时钟的1/8
//中断时间time  =  ( SysTick->LOAD + 1 ) / f                        f = AHB或AHB/8            (9000-1+1)/9M=1ms
void delay_init()
{
        SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK_Div8);        //选择外部时钟  HCLK/8  9M 计数器减1为1/9000000秒
        fac_us=SystemCoreClock/8000000;                                      //9  
        SysTick->CTRL|=SysTick_CTRL_TICKINT_Msk;           //开启SYSTICK中断
        SysTick->LOAD=fac_us*1000-1;                                                     //每1/1000s中断一次        
        SysTick->CTRL|=SysTick_CTRL_ENABLE_Msk;           //开启SYSTICK   
}        

                                                                     
void delay_us(u32 nus)
{               
        u32 ticks;
        u32 told,tnow,tcnt=0;
        u32 reload=SysTick->LOAD;                                        //LOAD的值                     
        ticks=nus*fac_us;                                                           //需要的节拍数                           
        tcnt=0;
        told=SysTick->VAL;                                                //刚进入时的计数器值
        while(1)
        {
                tnow=SysTick->VAL;        
                if(tnow!=told)
                {            
                        if(tnow<told)tcnt+=told-tnow;                //这里注意一下SYSTICK是一个递减的计数器就可以了.
                        else tcnt+=reload-tnow+told;            
                        told=tnow;
                        if(tcnt>=ticks)break;                                //时间超过/等于要延迟的时间,则退出.
                }  
        }        
}

void delay_ms(u16 nms)
{                                    
         delay_us((u32)(nms*1000));                                        //普通方式延时  
}

void SysTick_Handler(void)
{        
     xitong_haomiao++;
           if(xitong_haomiao%10==0&&Key==0)
             Key=KEY_Scan(0);
}[/mw_shl_code]
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-8-18 04:05

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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