1.软件定时器和硬件定时器的区别
软件bai定时就是直接利用CPU的时钟,用计算循环的方法计时。例如假设CPU执行一个指令需要10个时钟周期,那么循环执行1000次就是10000个时钟。因为CPU的时钟间隔是恒定的,那么假设一个时钟是1微秒,则10000个时钟就是0.01秒。这种循环测试时间长度的办法在单任务系统,例如DOS下,还是相对准确的。但是在Windows这种多任务系统下由于系统调度的原因程序会被不停滴中断(好让其它任务有机会运行),这样其实就不能精确知道1000次循环究竟用了多少个时钟(因为有些时段分给别的任务了),所以在多任务环境下软件定时误差很大。一般只能达到毫秒级的准确度。
硬件定时则是基于硬件。例如定时/计数器,这个不受操作系统影响,由硬件提供时间,精度可以达到微秒级。如果更精确的时间可以使用天文台授时或者原子钟。其精度更高。
2.系统SysTicks的配置
滴答是个只有最普通的定时器功能,普通定时器功能很多,不仅仅有定时器功能滴答一般是给RTOS 用的,普通定时器一般当作外设使用。
Systick也叫系统滴答定时器,滴答定时器就是一个非常基本的倒计时定时器。它存在的意义是为系统提供一个时基,能够给操作系统提供一个硬件上的中断。使用Systick能够精准延时,对于时间要求严格的场所,意义十分重大。
void delay_init(u8 SYSCLK) //设置滴答定时器的中断周期
{
u32 reload;//定义滴答定时器的预装载值
SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK);
//选滴答定时器的时钟源为高速时钟96MHZ
reload=SYSCLK; //赋值96
reload*=1000000/configTICK_RATE_HZ; //中断周期为: 1/96M * 96M/1000
SysTick->CTRL|=SysTick_CTRL_TICKINT_Msk; //开启滴答定时器中断
SysTick->LOAD=reload; //设置预装载值
SysTick->CTRL|=SysTick_CTRL_ENABLE_Msk; //开启滴答定时器
}
注:
这是在F429 FreeRTOS开发手册上的内容:
但是MiniFly 并没有采用HAL库,同样使用Sys进行系统延时,因此没有这个限制。但是如果采用Cube,也就同时采用了HAL库, 如果需要修改滴答定时器频率时就要注意。
使用Sys进行延时并没有改变滴答定时器的预装载值,只是不断地判断当前值的变化,以判断是否达到延时值。
3.时钟配置 SYS 和 RCC