systick优先级的优先级是高还是低

11996人阅读
SysTick_Config(SystemFrequency / 10)&& 函数的形参就是systick重装定时器的值。
systck计数频率为每秒次,所以7200000次就是1/10秒,也就是100ms。
SysTick是1个24bit递减计数器,通过对SysTick控制与状态寄存器的设置,可选择HCLK时钟(72M)或HCLK的8分频(9M,缺省是这个)作为SysTick的时钟源。
SysTick的重装寄存器决定了定时器频率。
若SysTick的时钟源是72M,&& SystemFrequency = Hz
所以 SysTick_Config(SystemFrequency / 1000); 就是1ms时基。
//&&&& 1/1000 s=1ms
STM32中sysTick的设置(转)&
我不得不说意法半导体确实有点风骚!甚至有点变态。我对ST文档&STM32F10XXX参考手册的编辑水平真是不敢恭维。手册中好多说明都是含糊不清,甚至将好多对初学者来说很重要的地方都一笔带过,让人着实摸不着头脑。比如前面我说过的关于NVIC嵌套向量中断控制器的介绍,这部分我认为是非常重要的,但当你看完他这部分介绍,你根本不会设置中断服务程序,他有哪些寄存器都不知道,更别说去设置了,NVIC的详细介绍是在Cotex-M3中有详细的介绍,不多说。今天我们说的是systick定时器。&
systick定时器和我上面说的情况一样,在手册中根本没有介绍。我费了九牛二虎之力才在一个犄角格拉里找到systick定时器的英文版的说明。在Cotex-M3有介绍,为什么要找STM32的介绍,是因为功能设置上还有点区别。首先看一下systick定时器的作用,下面是Cotex-M3里的一段话:&
SysTick定时器被捆绑在NVIC中,用于产生SYSTICK异常(异常号:15)。在以前,大多操作系统需要一个硬件定时器来产生操作系统需要的滴答中断,作为整个系统的时基。例如,为多个任务许以不同数目的时间片,确保没有一个任务能霸占系统;或者把每个定时器周期的某个时间范围赐予特定的任务等,还有操作系统提供的各种定时功能,都与这个滴答定时器有关。因此,需要一个定时器来产生周期性的中断,而且最好还让用户程序不能随意访问它的寄存器,以维持操作系统“心跳”的节律。&
Cortex‐M3处理器内部包含了一个简单的定时器。因为所有的CM3芯片都带有这个定时器,软件在不同&CM3器件间的移植工作得以化简。该定时器的时钟源可以是内部时钟(FCLK,CM3上的自由运行时钟),或者是外部时钟(&CM3处理器上的STCLK信号)。不过,STCLK的具体来源则由芯片设计者决定,因此不同产品之间的时钟频率可能会大不相同,你需要检视芯片的器件手册来决定选择什么作为时钟源。(知道我为什么找ST关于systick的说明了吧)。&
下面介绍STM32中的systick,Systick&部分内容属于NVIC控制部分,一共有4个寄存器,名称和地址分别是:&
STK_CSR,&&&&&&&&0xE000E010&&--&&控制寄存器&
STK_LOAD,&&&&&0xE000E014&&--&&重载寄存器&
STK_VAL,&&&&&&&&0xE000E018&&--&&当前值寄存器&
STK_CALRB,&&&0xE000E01C&&--&&&校准值寄存器&
首先看STK_CSR控制寄存器:寄存器内有4个位t具有意义&
第0位:ENABLE,Systick&使能位&&(0:关闭Systick功能;1:开启Systick功能)&
第1位:TICKINT,Systick&中断使能位&&&&(0:关闭Systick中断;1:开启Systick中断)&
第2位:CLKSOURCE,Systick时钟源选择&&(0:使用HCLK/8&作为Systick时钟;1:使用HCLK作为Systick时钟)&
第3位:COUNTFLAG,Systick计数比较标志,如果在上次读取本寄存器后,SysTick&已经数到了0,则该位为1。如果读取该位,该位将自动清零&
STK_LOAD&&重载寄存器:&
Systick是一个递减的定时器,当定时器递减至0时,重载寄存器中的值就会被重装载,继续开始递减。STK_LOAD&&重载寄存器是个24位的寄存器最大计数0xFFFFFF。&
STK_VAL当前值寄存器:&
也是个24位的寄存器,读取时返回当前倒计数的值,写它则使之清零,同时还会清除在SysTick&控制及状态寄存器中的COUNTFLAG&标志。&
STK_CALRB&&校准值寄存器:&
这个寄存器好像目前的水平我还用不到,大体意思明白点,把英文说明放这吧:&
位31&NOREF&:1=没有外部参考时钟(STCLK&不可用)0=外部参考时钟可用&
位30&SKEW:1=校准值不是准确的1ms&0=校准值是准确的1ms&
位[23:0]&:Calibration&value&
Indicates&the&calibration&value&when&the&SysTick&counter&runs&on&HCLK&max/8&as&external&clock.&The&value&is&product&dependent,&please&refer&to&the&Product&Reference&Manual,&SysTick&Calibration&Value&section.&When&HCLK&is&programmed&at&the&maximum&frequency,&the&SysTick&period&is&1ms.&If&calibration&information&is&not&known,&calculate&the&calibration&value&required&from&the&frequency&of&the&processor&clock&or&external&clock.&
SysTick定时器除了能服务于操作系统之外,还能用于其它目的:如作为一个闹铃,用于测量时间等。要注意的是,当处理器在调试期间被喊停(halt)时,则SysTick定时器亦将暂停运作。&
下面我们就应用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&TimingD&//&延时时间,注意定义为全局变量&
SYSTICK_CURRENT=0;&
if&(TimingDelay&!=&0x00)&
TimingDelay--;&
利用systick的延时函数:&
unsigned&long&TimingD&&//&延时时间,注意定义为全局变量&
void&Delay(unsigned&long&nTime)&&//延时函数&
SYSTICK_CSR|=0x07;&&&//&使能SysTick计数器&
TimingDelay&=&nT&//&读取延时时间&
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定时器的用法。&
__________________________
学习学习 kill&stm32
&&&&&&&&&&&&&
&&&&&&&&&编辑&&删除&&&&
【1楼】&jan828 jan
积分:<span style="color:#
等级:------
STK_CSR控制寄存器&(原文件名:D.jpg)&
STK_LOAD&&重载寄存器&(原文件名:3766309wDDo.jpg)&
STK_VAL当前&#20540;寄存器:&(原文件名:SW.jpg)&
STK_CALRB&&校准&#20540;寄存器:&(原文件名:.jpg)&
__________________________
学习学习 kill&stm32
NVIC_SetPriority(SysTick_IRQn, n);
n=0x00~0x03 设置Systick为抢占优先级0
n=0x04~0x07 设置Systick为抢占优先级1
n=0x08~0x0B 设置Systick为抢占优先级2
n=0x0C~0x0F 设置Systick为抢占优先级3
NVIC_SetPriority函数指定中断优先级的寄存器位(STM32只用4位来表示优先级)的数据,例如中断优先级组设置为了2,即高2位用于指定抢占式优先级,低2位用于指定响应优先级,0x00~0x03高2位为0,所以抢占优先级为0;0x04~0x07高2位为1,所以抢占优先级为1,以此类推。 &
static __INLINE uint32_t SysTick_Config(uint32_t ticks)
if (ticks & SYSTICK_MAXCOUNT)
return (1);
SysTick-&LOAD
(ticks & SYSTICK_MAXCOUNT) - 1;
NVIC_SetPriority (SysTick_IRQn, (1&&__NVIC_PRIO_BITS) - 1);
SysTick-&VAL
SysTick-&CTRL = (1 && SYSTICK_CLKSOURCE) | (1&&SYSTICK_ENABLE) | (1&&SYSTICK_TICKINT);
return (0);
这是这个函数的定义,在core_cm3.h里面,是有返回&#20540;的,如果你设置的SystemFrequency / 1000不符合该函数要求就会返回1,这样这个while循环是跳不出的,一直在循环,只有你设置的&#20540;符合要求,程序才能跳出循环继续执行,这句话一般在SysTick_Config(SystemCoreClock / 1000);这句之后,上面这句已经配置好Systick的定时时间为1ms,紧接着 while(SysTick_Config(SystemFrequency / 1000)); 是判断你配置的定时频率是否可以实现,如果可以就继续往下执行,如果不可以就一直停在这里。
SysTick_Config(uint32_t&ticks):设置系统嘀嗒时钟并使能中断
&&&&&&&&&在STM32中与CM3内核描述不太一样,这个时钟源有两个选择:AHB/8和AHB,在该函数中是选择了HCLK(SysTick_CTRL_CLKSOURCE_Msk),
所以定时时间=ticks&/&HCLK,当要定时10ms,而HCLK为24MHz时,ticks&=&10000&*&24&=&240000。
&&&&&&&&&如果需要选择HCLK/8,可以直接修改这个函数,或在这个函数后跟随misc中的SysTick_CLKSourceConfig(uint32_t&SysTick_CLKSource)来设置。
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:24598次
排名:千里之外
转载:10篇
(2)(1)(1)(8)(4)ucosii中的systick和OSTimeDly
单片机&嵌入式
单片机应用
嵌入式操作系统
学习工具&教程
学习和开发单片机的必备工具
(有问必答)
(带你轻松入门)
电子元件&电路模块
当前位置: >>
>> 浏览文章
ucosii中的systick和OSTimeDly
&&& OSTimeDly(x)函数和SYSTick系统时钟,这两个为整个系统的关键点,同时也是我开始学习uC/OS-ii到现在碰到的最难理解的问题,可能是一直都处于裸机奔跑状态,对OS还是感觉到很陌生,一时间很难去接收这样一个非常伟大的东西。
&&& 首先是systick的介绍,systick为系统时钟,作为uC/OS-ii的嘀嗒时钟,也许有人会问什么是嘀嗒时钟?就是这个时钟不会停止,一直在运行,它好像是uC/OS-ii的心脏一样,保证它不会死掉,可能又有人问,一般的单片机不是有时钟嘛,代码一样在运行,为什么要要这么个玩意---嘀嗒时钟!我开始学习uC/OS-ii的时候也是这种感觉,当时没有人去讲解,自己不停的在那里想,看书啥的,后来通过写一个2个任务的代码就明白了这个嘀嗒时钟的重要性,如果系统中移植了OS,那么就得把OS和用户应用程序代码(也就是任务)作为2个部分看待,所以我们可以看作系统需要两个时钟,我是这么理解的,具体是怎么样的,在以后的博文中会细细说来!
&&& 假如我们将systick设置为10ms(根据处理器的clock而定),也就是每10ms的时候会进入systick中断,systick这个功能可由一般的定时器取代,在这个中断服务程序中会执行OSTimeTick和OSIntExit两个函数(可能结合源代码看)。
&&& 在介绍这两个函数之前需要先对OSTimeDly(x)进行相应的说明,OSTimeDly(x)为系统延时,假如在某个任务中对其进行调用,表示这个任务已经由运行状态转换到等待状态了(任务比较常规的状态为等待、就绪和运行这3个,另外2个:休眠和中断相对那3个状态而言显得就不是这么突出了),并且会做一次任务调度(什么是调度?不用纠结很多,就是把处于就绪态的任务通过某一算法转移到运行态),使就绪态中(所有的任务通过OSTaskCreate()函数使其处于就绪状态)最高优先级的任务处于运行状态,同时会将该任务TCB中的OSTCBDly参数设置为x(注意是全局变量),系统任务的状态转移如下图1所示,这个转移图非常重要,如果还没有意识到它的重要性,那么表示看书看的还不够,还得继续:
图1:uC/OS-ii状态转移图
前面提到了systick中断服务程序中的两个函数OSTimeTick和OSIntExit,每次进入systick中断都会在函数OSTimeTick中对OSTCBDly(OSTCBDly为任务调用OSTimeDly(x)函数中的x)进行减1操作,当这个值减到0的时候,uC/OS-ii会将该任务由等待状态PUSH到就绪状态(注意这里不是任务切换),OSIntExit函数会获得就绪表中优先级较高的任务的prio值,并且判断具有这个prio值的任务是不是当初那个被中断了的任务,如果不是则需要获得这个新任务的TCB指针并且执行中断级的任务切换使其处于运行状态,如果是当初那个给中断了的任务,则需要继续执行这个任务,不会进行任务切换。
【】【】【】【】
上一篇:下一篇:
CopyRight @
单片机教程网
, All Rights Reserved嵌入式 ARM STM32 SysTick设置优先级时,为什么不用设置优先级分组?_百度知道
嵌入式 ARM STM32 SysTick设置优先级时,为什么不用设置优先级分组?
为什么不用设置优先级分组NVIC_SetPriority(SysTick_IRQn?答案最好有引申的依据?是按默认为分组?还是说内核中断是不用优先级分组的, 4); SysTick设置优先级时
我有更好的答案
是按应用设计需要而定的,是否设置或设置为哪个优先级,都可以设置优先级的SysTick 与其它中断一样
内核中断为什么不用设置优先级分组?
内核中断为什么不用设置优先级分组?可以设置优先级,这个我知道。
你在哪里看的“内核中断不用设置优先级分组”?
void SysTick_Init(void) { SystemFrequency &#47; us 中断一次 if (SysTick_Config(SystemCoreClock &#47; 100000)){while (1);}SysTick-&CTRL &= ~ SysTick_CTRL_ENABLE_M}
我说了,“是否设置或设置为哪个优先级,是按应用设计需要而定的”,你贴的函数,里面没有设置 SysTick 中断优先级,那只是因为“该应用的 SysTick 中断所需要的优先级”与“Cortex-M3 的 SysTick 默认优先级”相同,函数中不用重复设置而已。 但不同的应用,所需要的 SysTick 优先级不可能都只需要默认优先级,所以你的问题:“嵌入式 ARM STM32 SysTick设置优先级时,为什么不用设置优先级分组?”显然只是局限在你这个具体应用中,而不能笼统的这样提。 注:Cortex-M3 上电时除了 NMI、HardFault 之外的各个中断优先级默认值都是 0。
SysTick_Config() {NVIC_SetPriority (SysTick_IRQn, (1&&__NVIC_PRIO_BITS) - 1);}上面if语句是有设置优先级的。我的疑问在于优先级分组,不是优先级设置是如果不进行优先级分组,那么它的默认优先级分组是哪一组?
其他类似问题
为您推荐:
stm32的相关知识
等待您来回答
下载知道APP
随时随地咨询
出门在外也不愁

我要回帖

更多关于 ucos systick优先级 的文章

 

随机推荐