V3.5库函数下SysTick的学习使用
最初浅浅的学过一些STM32,因为当初刚从51单片机过来,还不是很适应库函数这种开发方法,所以当时我是跟着原子哥的寄存器写法做的项目,当时我还无知的认为学硬件就应该用寄存器操作,现在过了8个月我重新拾起了STM32,也渐渐地明白了库函数开发方式的优越性,于是我决定重新开始学习库函数版STM32.
我看的书是<<STM32自学笔记>>,上面的库函数版本是V2.0版本的,而如今库函数已经发展到V3.5版本,起初发现问题不是很大,当用到SysTick时才发现两个版本的差别.在V2.0版本中意法半导体提供了很多关于SysTick的驱动函数,并且有一个stm32f10x_systick.c文件,而在V3.5版本中则没有了这个文件,搜索整个库,只发现了SysTick_Config()函数和SysTick_CLKSourceConfig()函数,显然V3.5版本对SysTick的操作就不太灵活了,为什么要做这样的改动呢,这我想应该要从SysTick的设计初衷说起吧,SysTick计时器原本是为了操作系统的”嘀嗒”产生定时中断而设计的,而且是在M3内核中,这样基于M3内核的MCU都可以方便的移植RTOS,但是在很多书中都将SysTick当成定时器使用,就违背了SysTick的设计初衷了,为此ST的工程师们才削减了SysTick的函数.
废话说多了,开始正题.打开V3.5版本库函数~/Project/STM32F10x_StdPeriph_Examples/Systick文件夹,里面有关于SysTick的样例程序,打开我们可以看到
/* Setup SysTick Timer for 1 msecinterrupts.
------------------------------------------
1. The SysTick_Config() function is a CMSIS function which configure:
- The SysTick Reload register with value passed as function parameter.
- Configure the SysTick IRQ priority to the lowest value (0x0F).
- Reset the SysTick Counter register.
- Configure the SysTick Counter clock source to be Core Clock Source(HCLK).
- Enable the SysTick Interrupt.
- Start the SysTick Counter.
2. You can change the SysTick Clock source to be HCLK_Div8 by callingthe
SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK_Div8) just after the
SysTick_Config() function call. The SysTick_CLKSourceConfig() is defined
inside the misc.c file.
3. You can change the SysTick IRQ priority by calling the
NVIC_SetPriority(SysTick_IRQn,...) just after the SysTick_Config()function
call. The NVIC_SetPriority() is defined inside the core_cm3.h file.
4. To adjust the SysTick time base, use the following formula:
Reload Value = SysTick Counter Clock (Hz) x Desired Time base (s)
- Reload Value is the parameter to be passed for SysTick_Config()function
- Reload Value should not exceed 0xFFFFFF
如果我们需要配置1ms延时,V3.5版本只需要调用一个函数即可,而且参数也只有一个重载值,相比V2.0版本来说要简单许多,现在来仔细阅读一下说明,SysTick_Config函数是如何配置SysTick的,首先重载值有参数提供,将SysTick中断优先级设置为最低优先级,时钟配置为HCLK,使能SysTick中断,开启SysTick,也就是说这个函数默认开启了中断,因此我们就无法再使用查询方式来进行延时,如果你真要用,那就只能使用寄存器方式了,这样就未免让人觉得不舒服了.当然ST的工程师还留给了我们一个改变SysTick时钟源的函数SysTick_CLKSourceConfig(定义在misc.c中),可以将时钟源频率改为HCLK一分频或者是八分频,还告诉我们如何更改SysTick的中断优先级通过调用NVIC_SetPriority函数,我想这应该是属于法外开恩了吧.此外ST的工程师们还清楚明了的告诉了我们如何填重载值,重载值=时钟频率(Hz)x 延时时间(s).
比如说要产生1ms的延时,则我们就调用SysTick_Config(SystemCoreClock/1000);即可.
同时也给出了延时的方法:
/**
*@brief Inserts a delay time.
*@param nTime: specifies the delay timelength, in milliseconds.
*@retval None
*/
void Delay(__IO uint32_t nTime)
{
TimingDelay = nTime;
while(TimingDelay != 0);
}
我们可以在中断函数中写nTime—即可
void SysTick_Handler(void)
{
nTime--;
}
这样子就实现了nTime毫秒的延时. |
|