不管是单片机还是实时操作系统,在应用中都会有写延时的需求,比如:点亮一个LED,然后以1S频率亮灭;不可能亮了之后delay1S,然后灭,delay1S;那这样系统就浪费了CPU资源;
可以做个系统的滴答时钟,使用定时器做个1ms的滴答,举例stm32上面就有专门的滴答定时器,叫systick;
这个滴答的周期越短,对CPU的开销就越大,这个时间根据系统的负荷调整,比如:电力系统要求遥信的分辨率为2ms,为了满足要求,滴答的周期只能设置为1ms的周期。
初始化操作之后,会1ms进入systick中断一次,但是中断里处理操作不可太多,中断会一直占用CPU的资源,直到执行完中断内容后才会释放CPU,去执行用户应用;还有一点就是中断里面执行的操作时间一定要小于中断周期时间,否则CPU会一直在中断里面运行,无法跳出来了。
中心思想就是获取当前的时间,然后通过后续更新的时间减去时标的差值,作为延时的时长;
1、初始化systick定时器
1/***************************************************************************************
2* 函数名称: SysTick_Init
3* 功能描述: RCC模块配置,为系统其它模块提供一个时基源
4* 输入参数: Systick_1us = SysTick周期 单位us
5* 输出参数: 无
6* 返 回 值: OK=成功 ERR=失败
7* 作 者:
8* 日 期:
9* 修改记录:
10* 修改人 :
11* 修改日期:
12* 修改内容:
13***************************************************************************************/
14ERR_TYPE SysTick_Init(u32 Systick_1us)
15{
16 u32 systick = 0;
17 RCC_ClocksTypeDef RCC_Clocks;
18
19/* 输入参数有效判断 */
20if(Systick_1us == 0)
21 {
22return ERR;
23 }
24
25/* 计算配置时间对应的计数次数 */
26 RCC_GetClocksFreq(&RCC_Clocks);
27 systick = RCC_Clocks.SYSCLK_Frequency / 1000000