打印
[STM32F1]

(转)V3.5库函数下SysTick的学习使用

[复制链接]
1049|4
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
armxu|  楼主 | 2015-4-12 08:54 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
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毫秒的延时.
沙发
搞IT的| | 2015-4-12 11:02 | 只看该作者
楼主辛苦!感谢分享!

使用特权

评论回复
板凳
jstiger| | 2015-4-12 22:03 | 只看该作者
不错,受教了。

使用特权

评论回复
地板
zh113214| | 2015-4-12 22:13 | 只看该作者
学习学习

使用特权

评论回复
5
mmuuss586| | 2015-4-12 22:25 | 只看该作者
支持下;

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

25

主题

105

帖子

1

粉丝