本帖最后由 Eagleson 于 2015-1-21 20:23 编辑 - O1 F& g; _& }- Y , X0 u8 `2 C( a6 w Systick就是一个定时器而已,只是它放在了NVIC中,主要的目的是为了给操作系统提供一个硬件上的中断(号称滴答中断)。滴答中断?这里来简单地解释一下。操作系统进行运转的时候,也会有“心跳”。它会根据“心跳”的节拍来工作,把整个时间段分成很多小小的时间片,每个任务每次只能运行一个“时间片”的时间长度就得退出给别的任务运行,这样可以确保任何一个任务都不会霸占整个系统不放。或者把每个定时器周期的某个时间范围赐予特定的任务等,还有操作系统提供的各种定时功能,都与这个滴答定时器有关。因此,需要一个定时器来产生周期性的中断,而且最好还让用户程序不能随意访问它的寄存器,以维持操作系统“心跳”的节律。 只要不把它在SysTick控制及状态寄存器中的使能位清除,就永不停息。 SysTick常被用来精确定时。在网上看到了大家关于讨论的systick 时钟与系统时钟的关系,有的是8分频,有的则直接使用系统时钟,那么情况究竟是什么样的呢在 下面是从stm32F4 固件库中查到的关于SysTick的说明 从上面这一段看出 Systick可以选择AHB时钟的8分频,也可以直接使用HCLK。也就是说都是支持的。 下面是时钟树 时钟树上这直接写了是8分频。 下面是在STM32F4xx DSP and Standard Peripherals Library 中查阅到的相关的说明 SysTick时钟选择函数的说明 参数选择 8分频的使用 系统时钟的使用,也就是默认的系统时钟延时为1ms 可以看出SysTick_Config 已经有了相关的配置了。 这是这个函数的定义,在core_cm3.h里面,是有返回值的,如果你设置的SystemFrequency / 1000不符合该函数要求就会返回1,这样这个while循环是跳不出的,一直在循环,只有你设置的值符合要求,程序才能跳出循环继续执行,这句话一般在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)来设置。STM32中用SysTick延时不宜在中断中使用 如果中断中调用本函数,否则会存在重入问题.另外如果屏蔽了全局中断,则不要使用此函数 在中断里面调用系统延时,操作系统任务调度就挂起了····原因主要还是中断优先级之间的影响引起的。 重入的意思就是:在一个函数没有结束之前,又再次调用这个函数。比如一个函数func()运行过程中被中断,而中断处理中又调用func(),则产生重入的问题。 |
谢谢鼓励~~
所以每天看一点
看多了就不晕了
很详细,谢谢分享!