10. Systick定时器

发布者:WhisperingHeart最新更新时间:2017-11-09 来源: eefocus关键字:Systick  定时器 手机看文章 扫描二维码
随时随地手机看文章

一。Systick原理和配置方法

   Systick定时器就是系统滴答定时器,CM3 内核的处理器,内部包含了一个 SysTick 定时器, SysTick  是一个 24  位的倒计数定时器,当计到 0  时,将从 RELOAD  寄存器中自动重装载定时初值。只要不把它在 SysTick  控制及状态寄存器中的使能位清除,就永不停息,即使在睡眠状态下也能工作。

    Systick定时器被捆绑在NVIC中,用于产生SYSTICK异常(异常号:15)。

二。4个Systick相关的寄存器

CTRL        SysTick控制和状态寄存器

LOAD      SysTick自动重装载初值寄存器

VAL         SysTick当前值寄存器

CALIB      SysTick校准值寄存器

三。使用Systick查询延时n微秒的设计思路

1. 计算出产生nus需要多少时钟周期 fac_us;

例如Systick时钟为72MHz,那么产生1us延时就需要72 个时钟周期

2.计算出RELOAD寄存器的值(也就是产生相应延时所需要的时钟周期数)

RELOAD=fac_us*nus

产生nus的延时需要72*n个时钟周期,这个值就是RELOAD寄存器的值。

3.开启计数;

4.循环检测计数到0的标志位;

5.清空计数器,关闭定时器。

//初始化延迟函数

//SYSTICK 的时钟固定为 HCLK 时钟的 1/8

void delay_init()   

{

//如果 OS_CRITICAL_METHOD 定义了,说明使用 ucosII 了.

#ifdef OS_CRITICAL_METHOD     

u32 reload;

#endif

SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK_Div8);//选择外部时钟 HCLK/8

fac_us=SystemCoreClock/8000000;  //为系统时钟的 1/8, 1us需要9个时钟周期 

//如果 OS_CRITICAL_METHOD 定义了,说明使用 ucosII 了.

#ifdef OS_CRITICAL_METHOD 

reload=SystemCoreClock/8000000;    //每秒钟的计数次数  单位为 K 

reload*=1000000/OS_TICKS_PER_SEC;//根据 OS_TICKS_PER_SEC 设定溢出时间

//reload 为 24 位寄存器,最大值:16777216,在 72M 下,

//约 1.86s 左右

fac_ms=1000/OS_TICKS_PER_SEC;//代表 ucos 可以延时的最少单位

SysTick->CTRL|=SysTick_CTRL_TICKINT_Msk;      //开启 SYSTICK 中断

SysTick->LOAD=reload;    //每 1/OS_TICKS_PER_SEC 秒中断一次

SysTick->CTRL|=SysTick_CTRL_ENABLE_Msk;      //开启 SYSTICK    

#else

fac_ms=(u16)fac_us*1000;//非 ucos 下,代表每个 ms 需要的 systick 时钟数, 1ms需要9*1000个时钟周期 

#endif

}

//查询方式实现延时 nus

//nus 为要延时的 us 数.                       

void delay_us(u32 nus)

u32 temp;     

SysTick->LOAD=nus*fac_us; //时间加载       

SysTick->VAL=0x00;         //清空计数器

SysTick->CTRL|=SysTick_CTRL_ENABLE_Msk ;           //开始倒数 

do      //一直等待到时间到达

{

temp=SysTick->CTRL;

}

while(temp&0x01&&!(temp&(1<<16)));//等待时间到达

SysTick->CTRL&=~SysTick_CTRL_ENABLE_Msk;        //关闭计数器

SysTick->VAL =0X00;        //清空计数器   

}


关键字:Systick  定时器 引用地址:10. Systick定时器

上一篇:9. STM32的时钟系统
下一篇:11. GPIO原理与配置(跑马灯,蜂鸣器,按键)

推荐阅读最新更新时间:2024-03-16 15:43

STM32-高级定时器TIM1的应用
void GPIO_Configuration(void)//配置IO脚 { GPIO_InitTypeDef GPIO_InitStructure; GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOA, &GPIO_InitStructure); GPIO_InitStructure.GPIO_Pin = GPIO_Pi
[单片机]
STM32-高级<font color='red'>定时器</font>TIM1的应用
STM32普通定时器(TIM2-7)的时钟源疑问
【问题】 STM32F103的APB1最大总线时钟是AHB总线时钟的1/2,最大为36MHz,在用ST的库函数(v2.0)的时候,TIM2(普通定时器)的时钟频率为72MHz,不知道原因何在? 【问题分析】 STM32中有多达8个定时器,其中TIM1和TIM8是能够产生三对PWM互补输出的高级定时器,常用于三相电机的驱动,它们的时钟由APB2的输出产生。其它6个为普通定时器,时钟由APB1的输出产生。 下图是STM32参考手册上时钟分配图中,有关定时器时钟部分的截图: 从图中可以看出,定时器的时钟不是直接来自APB1或APB2,而是来自于输入为APB1或APB2的一个倍频器,图中的蓝色部分。 下面以定时器2~7的时钟说明这
[单片机]
STM32普通<font color='red'>定时器</font>(TIM2-7)的时钟源疑问
单片机学习心得1:89c51单片机定时器应用!
定时器的应用涉及到中断方面的知识,可以先了解中断的概念再来看定时器 如,一个16位的定时器,它所能计数的范围是0~65535,如果单片机采用的是12M的晶振,那么定时器单次最长的时间为65535((1/12)12),因为一个一个机器周期等于12个振荡周期,那么定时器加一所用的时间是1/12M*12是1us,也就是一个12MHz晶振的51单片机单次最长时间约为65ms. 定时器的控制 89c51的定时器由两个寄存器控制,分别是工作模式寄存器TMOD和控制寄存器TCON 工作模式寄存器TMOD是用于控制定时器0/1的工作模式,通过对TMOD进行赋值,则可以改变定时器的工作模式 具体各位的定义如下 当我们使用定时器功能时,就只
[单片机]
单片机学习心得1:89c51单片机<font color='red'>定时器</font>应用!
MSP430F149——定时器
前言 特点 msp430系列单片机是16位,51单片机为8位,stm32系列为32位。 位数越高代表着该单片机处理数据的能力越快,性能也就越高。32位机器处理性能好,8位机器廉价性价比高,16位机器超低功耗。就是有一个低功耗模式,可以长时间极少耗损地待机,定时唤醒cpu进行工作. 学习路线 详细理解时钟初始化配置。 熟悉基本操作IO口。 学习定时器三大功能。 学习中断的原理。 操作各种外设,模块。 MSP430内部结构 在接触一款单片机,首先应该了解其总体框架,了解其内部结构,方便后期进行学习理解。 系统时钟 在MSP430F149单片机中一共有三个时钟源: (1)LFXT1CLK,为低速/高速晶振源,通常接32.76
[单片机]
MSP430F149——<font color='red'>定时器</font>
单片机开发中断及一些理解
强制类型转换 a = 0x0000; b = 0xaa55;(uint16) a = (uint8)(b); a = 0x55; a = 0x00; b = 0x10; a = (bit)(表达式); 中断响应条件 一、中断源有中断请求; 二、此中断源的中断允许位为1; 三、CPU开中断(即EA=1); 以上三个条件同时满足时,CPU才有可能响应中断。 EA =1;开总中断 EX0=1;开外部中断0 都是IE寄存器 触发方式 电平与跳变沿 IT0 = 0; 跳边沿触发由于单片机上电所有寄存器就是0 可以不用设置 电平触发方式不好,会始终不走了停在中断当中,所以应该采用跳变沿方式 IT1 =1
[单片机]
STM32的V3.5库Systick优先级设置的问题
以前的旧版本的库通过如下函数来设置Systick的优先级。但新的V3.5的库不含该函数,查询良久才得到答案,发现网上那个不少是错误的,误人子弟。 NVIC_SystemHandlerPriorityCon fig(SystemHandler_SysTick, 0, 0); 查询结果总结如下: 1. STM32中断优先级是使用4-bit来表示的,即总共有16个级别。 2. 优先级分为2个部分:抢先优先级和子优先级,上述的4个bit可以灵活分配给抢先优先级和子优先级,比如,1个bit表示抢先优先级,则剩余3个bit表示子优先级。固件库中对应的函数是:NVIC_PriorityGroupConfig()。 3. 中断分为内核中断和芯片(S
[单片机]
Atmega16的定时器2使用
//经验正以下程序是正确的,可以实现LED 1s亮 1s灭 #include avr/io.h #include avr/interrupt.h #define uchar unsigned char #define uint unsigned int uint count; void init() { DDRB|=_BV(PB4)|_BV(PB5)|_BV(PB6)|_BV(PB7); PORTB&=~(_BV(PB4)|_BV(PB5)|_BV(PB6)|_BV(PB7)); TCNT2=155;//初值为155,即记数到255-155=100次溢出并进入定时器2中断函数 TIMSK|=_BV(TOIE2);//溢出
[单片机]
MSP430单片机定时器学习笔记
_BIS_SR(LPM2_bits + GIE) //进入LPM3低功耗模式和开总中断允许 中断 #pragma vector=TIMERA0_VECTOR __interrupt void Timer_A(void) { } TACTL timerA控制寄存器 TAR timerA计数器 CCTL0 捕获/比较控制寄存器0 CCRO 捕获/比寄存器0(具有最高中断优先级别,单独使用一个中断向量) CCTL1 捕获/比较寄存器1 CCR1 捕获/比较寄存器1 CCTL2 捕获/比较寄存器2 CCR2 捕获/比较寄存器2 TAIV 中断向量寄存器 其中,定时器,CCR2,CCR1三者共用一个中
[单片机]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved