用wordpress搭建目录网站,手机站和微网站的区别,深圳福田网站设计,微信电商网站开发一、系统滴答定时器概述 
传统定时器#xff1a;如手机闹钟#xff0c;闹钟等就是一个简单地计数器。 
定时器概念#xff1a;由时钟源计数器计数值组成的计数单元。 系统嘀嗒定时器首先是存在于内核里#xff0c;系统嘀嗒时钟假如用的是同一个内核那么里面相关的配置…一、系统滴答定时器概述 
传统定时器如手机闹钟闹钟等就是一个简单地计数器。 
定时器概念由时钟源计数器计数值组成的计数单元。 系统嘀嗒定时器首先是存在于内核里系统嘀嗒时钟假如用的是同一个内核那么里面相关的配置可能不同的就是主频。 定时器概述 平时数数的时候每次数的时间不一致 定时器可以帮助我们进行有规律的计数 可以知道每数一次的时间都是固定的 定时器的本质  数一次的时间 * 数多少次 系统滴答定时器的概述 SysTick定时器被捆绑在NVIC中用于产生SYSTICK异常异常号 15。在以前大多操作系统需要一个硬件定时器来产生操作系统需要的滴答中断作为整个系统的时基。 例如为多个任务许以不同数目的时间片确保没有一个任务能霸占系统或者把每个定时器周期的某个时间范围赐予特定的任务等还有操作系统提供的各种定时功能都与这个滴答定时器有关。因此需要一个定时器来产生周期性的中断而且最好还让用户程序不能随意访问,以维持操作系统“心跳”的节律。 后面用到操作系统的时候就可以使用系统嘀嗒作为时基单元5ms SysTick系统滴答器原理SysTick本质就是一个定时器。每来一个时钟脉冲计数一次从规定数值递减到零时,表示定时时间到。 SysTick作用 1为搭载操作系统的芯片提供心跳节拍由于芯片搭载操作系统便于维护程序很多产品都会搭载操作系统,操作系统需要一个心跳节拍。 2如果是裸机使用系统滴答定时器时可以将系统滴答定时器当做普通定时器使用。 二、系统滴答定时器框架 因为SysTick是属于内核的一部分其被捆绑在NVIC中用于产生SYSTICK异常。 滴答定时器介绍 SysTick 定时器是一个简单的递减 24 位定时器可以在处理器时钟频率或参考时钟频率上运行 (1)递减:定时器的计数器是向下递减的。1000-》0  (2) 定时器是24位计数器的计数范围。 (3) 定时器时钟来源处理器时钟频率168MHZ或参考时钟频率(168/8 21MHZ) 有上图得知滴答定时器是作为内核中NVIC的一部分的一部分 定时时间计算问题 24位递减计数器最大值224  16777216   798,915us选择21M参考时钟AHB经过8分频得到 最大计数时间ms  16777216/21*000(1毫秒计数个数)  799ms 三、系统滴答定时器相关寄存器 SysTick的控制与状态寄存器  SysTick重载值寄存器  SysTick当前值寄存器  SysTick校准值寄存器  该寄存器用于校准滴答定时器所以必须要有一个参考时钟写入TENMS中。 注意点如果使用参考时钟必须写入一校准值(厂家在芯片出场的时候已经写入) 作为查询方式的配置步骤作为延时函数 属于内核的没有时钟使能 选择时钟源清空递减计数值写入重载值开启递减计数器等待标志位关闭递减计数器 作为中断(搭载操作系统)的配置流程 Void SysTick_IRQ_Init(void) {   ①时钟源选择   ②配置自动重装载寄存器    ③清除当前计数器的值   ④使能中断模块级中断打开就行核心机中断不用SYStickz在内核里面不用使能NVIC必须响应   ⑤设置中断优先级   ⑥打开定时器 } u32 fac_us  0;
u32 fac_ms  0;
//#ifdef SYSINter
/************************************
函数功能系统嘀嗒定时器初始化
函数形参u32 nms
函数返回值void
函数说明
选择21M的时钟源
总的计数时间记一次数的时间*LOAD的值
1/21*21*1000*nms
作者
日期
************************************/
void Systick_Interrupt_Init(u32 nms,char nus)
{//1. 先选择时钟源一般选择STCLK -- 21M-- 选择好了记一次数的时间1/21M sSysTick-CTRL  ~(0x1  2);//2. 往重装载寄存器写值记多少次SysTick-LOAD   21 * pow(1000,nus) *	nms;//3. 对VAL寄存器执行写操作就可以把重装载值加载到计数器里SysTick-VAL  0;//4. 使能对应的中断标志SysTick-CTRL | 0x1  1;//5. 配置中断优先级NVIC_SetPriority(SysTick_IRQn,NVIC_EncodePriority(7-2,2,2));//6. 使能计数器SysTick-CTRL | 0x1  0;}
//7. 编写中断服务函数	
void SysTick_Handler(void)
{//清除标志位if((SysTick-CTRL  0x1  16)){if(fac_us0)fac_us--;if(fac_ms0)fac_ms--;
//		printf(123456\r\n);}
}
//#else
/************************************
函数功能延时ms
函数形参u32 nms
函数返回值void
函数说明
选择21M的时钟源
总的计数时间记一次数的时间*LOAD的值
1/21*21*1000*nms
作者
日期
************************************/
void Delay_Ms(u32 nms,u32 nus)
{//1. 先选择时钟源一般选择STCLK -- 21M-- 选择好了记一次数的时间1/21M sSysTick-CTRL  ~(0x1  2);//2. 往重装载寄存器写值记多少次SysTick-LOAD  21 * 1000 *	nms;//3. 对VAL寄存器执行写操作就可以把重装载值加载到计数器里SysTick-VAL  0;//4. 使能计数器SysTick-CTRL | 0x1  0;//5. 等待计数时间到达while(!(SysTick-CTRL  (0x1  16))){}//5. 关闭计数器SysTick-CTRL  ~(0x1  16);
}
/************************************
函数功能延时ms
函数形参u32 nms
函数返回值void
函数说明
选择21M的时钟源
总的计数时间记一次数的时间*LOAD的值
1/21*21*1000*nms
作者
日期
************************************/
void DElay_US(u32 nms, u32 nus)
{if(nus500){fac_us1;Systick_Interrupt_Init(nms,nus);}else{fac_us  nus;Systick_Interrupt_Init(1,nus);}SysTick-CTRL  ~(0x1  16);
}
/************************************
函数功能延时ms
函数形参u32 nms
函数返回值void
函数说明
选择21M的时钟源
总的计数时间记一次数的时间*LOAD的值
1/21*21*1000*nms
作者
日期
************************************/
void DElay_MS(u32 nms, u32 nus)
{if(nms500){u32 fac_ms  0;Systick_Interrupt_Init(nms,1);}else{fac_ms  nms;Systick_Interrupt_Init(nms,1);}while(fac_ms !0);SysTick-CTRL  ~(0x1  16);}