CKS32F4xx系列MCU SysTick定时器的原理及使用方法

本课将为大家讲解cks32f4xx系列产品的systick定时器原理及使用方法。systick定时器也叫systick滴答定时器,属于cortex-m4内核外设。systick定时器可以用于查询延时、中断延时以及测量函数运行时间;在实时操作系统rtos中作为滴答定时器,用于上下文切换。采用cortex-m内核的微处理都有systick定时器,方便不同处理器之间的软件移植。systick定时器时钟源可直接选取系统时钟,还可以通过系统时钟8分频后取得。
systick定时器内部是一个递减的计时器,当减到0时,将从load寄存器中自动重装定时器初始值,重新向下递减计数,如此循环往复。如果开启systick中断,当计数器减到0时,systick可以生产异常,异常编号为15。
systick定时器寄存器
systick定时器内部是一个24位向下递减的计时器,包含4个寄存器,如图。
图1 systick定时器框图
1)stk_ctrl寄存器
stk_ctrl是systick定时器的控制及状态寄存器,相应功能如下:
2) stk_load寄存器
stk_load寄存器是systick定时器的重装载数值寄存器,相应功能如下:
3)stk_val寄存器
stk_val寄存器是systick定时器的当前数值寄存器,相应功能如下:
4)stk_calib寄存器
stk_calib寄存器是systick定时器的校准数值定时器,用于利用片上硬件为软件提供校准信息,但使用情况较少。在cmsis core中,不需要使用systick校准寄存器,因为cmsis core提供了一个名为“systemcoreclock”的软件变量。此变量在系统初始化函数“systeminit()”中设置,每次更改系统时钟配置时也会更新。这种方法比使用systick calibrationregister的硬件方法灵活。校准寄存器描述如下表:
查询延时使用步骤
1)配置systick定时器时钟源
2)加载延时计数值 3)清零计数器,启动定时器开始递减计数 4)等待计数结束 5)清零计数,关闭定时器,延时结束 相关函数如下:
void systick_clksourceconfig(uint32_t systick_clksource){ if (systick_clksource == systick_clksource_hclk) { systick->ctrl |= systick_clksource_hclk; } else { systick->ctrl &= systick_clksource_hclk_div8; }}void tickdelayinit(u8 sysclk){//选择时钟源为ahb/8 systick_clksourceconfig(systick_clksource_hclk_div8);fac_us=sysclk>>3;fac_ms=((u32)sysclk*1000)>>3;}void tickdelayus(u16 nus){uint32_t temp;systick->load=nus*fac_us-1;systick->val=0x00;systick->ctrl=0x01;do{temp=systick->ctrl;}while((temp&0x01)&&!(temp&(1val =0x00; }void tickdelayms(u16 nms){ u32 temp; systick->load=nms*fac_ms -1;systick->val =0x00;systick->ctrl=0x01 ;do{temp=systick->ctrl;}while((temp&0x01)&&!(temp&(1val =0x00; }  
中断方式延时使用步骤
1)配置systick定时器时钟源
2)调用系统函数systick_config(),开启中断,配置中断间隔
3)延时函数赋值延时变量,并等待延时变量递减到0,达到精确延时效果
4)中断函数中延时变量递减到0 相关函数如下:
__static_inline uint32_t systick_config(uint32_t ticks){ if ((ticks - 1) > 0xffffff)//24位寄存器,大于该值返回错误 { return (1); } systick->load = (uint32_t)(ticks - 1);//计数到0,ticks值应减1 nvic_setpriority (systick_irqn, (1ul ctrl = (1<<2) |(1 systick->load = 0xffffffff; // 设置重装寄存器到最大值
systick->val = 0; // 清零val
systick->ctrl = 0x5; // 使能systick, 使用处理器时钟
while(systick->val != 0); // 等待重装完毕
start_time = systick->val; // 较大的起始点
testdelayfunc(); // 待测函数执行时间
stop_time = systick->val; // 获取执行结束时间
cycle_count = start_time e stop_time;//计算函数执行时间
由于systick是一个递减计数器,因此start_time的值大于stop_time。如果待测函数执行时间较长,这种情况必须启用systick异常,并使用systick处理程序来计算systick计数器下溢的次数。
总结及注意事项
systick定时器是微处理器系统内部定时器,提供精确的时间延时和计时功能。采用中断方式延时,需要考虑systick中断优先级较低,容易被打断影响延时;在嵌入式系统中,系统将使用systick计时器,应用程序中则不可在使用systick;在系统在线调试停止时,systick计时器将停止计时。


如何客观理解xR的概念和前景?
利用FPGA对大规模MIMO信道进行特性描述与实时分析
2017年AMOLED产能有望成长46%,三星的扩产仍无法满足市场
苹果发布16寸Macbook Pro,英特尔的处理器搭配AMD的显卡
怎么把clob字段转换为字符串
CKS32F4xx系列MCU SysTick定时器的原理及使用方法
AI相关专利中国数量领先 但质量方面远远比不过美国
C++中位域以及union联合详解
德信科技推出15W立体声D类音频放大器EUA2110
全系列三极管应用参数和代换大全
SK海力士和Solidigm共同开发新SSD ,希捷与群联扩充企业级SSD产品
三极管放大电路的原理
视频会议系统中常见的疑难问题解答
采用CX24430芯片为核心设计具备音频解码功能的数字电视机顶盒
咪鼠智能语音鼠标S5B 语音打字 高颜值双模 全新升级
清溢光电首次公开募股开始,拟募资4亿投建8.5代高精度掩膜版
旋涂法制备的ZnO薄膜的电学特性报告
电容器规格种类详细介绍
PLC串口通讯和基本通讯接口
电机旋转借助磁铁、磁力