概览
该文件夹下包含3个文件:
1.delay文件夹
delay文件夹内包含了delay.c和delay.h两个文件,用来实现系统的延时功能,其中包含了7个函数:
void delay_osschedlock(void);
void delay_osscheddunlock(void);
void delay_ostimedly(u32 ticks);
void SysTick_Handler(void);
void delay_init(u8 SYSCLK);
void delay_ms(u16 nms);
void delay_us(u32 nus);
delay延时的编程思想:
CM3内核的处理器,内部包含了一个SysTick定时器,这是一个24位的倒计数定时器,当计数到0时,将从RELOAD寄存器中自动装在定时初值,开始新的一轮计数。只要不将它在SysTick控制及状态寄存器中的使能位清除,就永不停歇。
μcosII的时钟:μcos运行需要一个系统时钟节拍,而这个节拍是固定的(由OS_TICKS_PER_SEC宏定义设置),比如要求5ms一次,就可以设置(OS_TICKS_PER_SEC=200),在STM32上面,一般由SysTick来提供这个节拍,也就是SysTick要设置为5ms中断一次,为μcos提供时钟节拍,而这个时钟是不能被打断的,否则就不准时了。
如何实现操作系统和我们的 delay 函数共用 SysTick 定时器?
利用时钟摘取法。
以delay_us为例,比如delay_us(50),在刚进入delay_us的时候先计算好这段延时需要等待的SysTick计数次数,这里为50 * 9(假设系统时钟为72MHz,那么SysTick每增加1,就是1/72us),然后我们就一直统计SysTick的计数变化,直到这个值变化了50 * 9,一旦检测到变化达到或者超过这个值,就说明50us的延迟到了。这样我们只是抓取了SysTick计数器的变化,并不需要修改SysTick的任何状态,就不会影响这个计数器作为μcos时钟的节拍功能。