一起学习STM32————实验篇 简约而不简单的Systick 定时器 大家晚上好,今天我们来学习下Systick 定时器 1. 什么是Systick呢? 常被人们称为“系统节拍时钟”。属于RAM Cortex—M3内核的一个内设,所有基于ARM Cortex—M3内核的微控制器都带Systick。 2. 大家会不会有这样的疑问,stm32有这么多的定时器,为什么ARM Cortex—M3内核要配置这样一个定时器? 主要原因是为实时操作系统提供必需的时钟节拍,当然后面我们会讲到操作系统,大家耐心等待。 3.Systick定时器结构是什么样? Systick定时器基本结构如图1,从左往右可以看到Systick的组成,首先是时钟输入源,分别是系统时钟或Systick时钟,然后从上往下看分别是校准寄存器 重装寄存器 当前计数寄存器 控制寄存器 等等,这里不再啰嗦。 4. Systick定时器是如何工作的? 首先Systick从时钟源接口获得时钟驱动,然后从重寄存器将重装值读入当前寄存器,并在时钟的驱动下进行减一计数,而Systick发生下溢的时候将计数标志置位,并在一定条件下触发Systick定时器中断,同时进行一次从装值载入操作。 下面我们使用Systick定时器产生1s的中断 1.打开新建工程,新建两个文件systick.c 与systick.h保存在APP文件夹中,然后将文件systick.c添加到工程分组APP中,如图2。 2.开始我们对Systick的操作,我们需要打开我们的固件库使用手册的PDF文档,选择18章系统定时器如图3。 3.我们需要用到以下几个库函数,如图4,我们通过困函数可以这样配置一个1s的定时间隔。 void systick_init() //初始化 { SysTick_CounterCmd(SysTick_Counter_Disable); //Sytick失能 SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK_Div8 ); //Sytick选择时钟源 SysTick_CounterCmd(SysTick_Counter_Clear); //清除Sytick计数器 SysTick_SetReload(9000 * 1000); //72M/8 9000*1000 可得到一秒的间隔。 } void systick_delay() //产生1s { SysTick_CounterCmd(SysTick_Counter_Enable); //使能 while(SysTick_GetFlagStatus(SysTick_FLAG_COUNT)==0);//等待计数至0 SysTick_CounterCmd(SysTick_Counter_Disable); //失能 SysTick_CounterCmd(SysTick_Counter_Clear); //清除Sytick计数器 } 4.我们也可以通过寄存器来操作Systick定时器,配置1us 1ms的延时函数,代码如下,以后只需要调用delay_us(参数)与delay_ms(参数)即可。 void delay_us(u32 i) { u32 temp; SysTick->LOAD=9*i; SysTick->CTRL=0x01; SysTick->VAL=0; do { temp=SysTick->CTRL; } while((temp&&0x01)&&(!(temp&(1<<16)))); SysTick->CTRL=0; SysTick->VAL=0; } void delay_ms(u32 i) { u32 temp; SysTick->LOAD=9000*i; SysTick->CTRL=0x01; SysTick->VAL=0; do { temp=SysTick->CTRL; } while((temp&&0x01)&&(!(temp&(1<<16)))); SysTick->CTRL=0; SysTick->VAL=0; } 好了,本次的Systick的讲解就到这里,下次我们学习串口的一些操作。
|