浅析STM32中SysTick在3.5固件库中的应用

来源:本站
导读:目前正在解读《浅析STM32中SysTick在3.5固件库中的应用》的相关信息,《浅析STM32中SysTick在3.5固件库中的应用》是由用户自行发布的知识型内容!下面请观看由(电工技术网 - www.9ddd.net)用户发布《浅析STM32中SysTick在3.5固件库中的应用》的详细说明。
简介:浅析STM32中SysTick在3.5固件库中的应用

最近一直在忙STM32的学习,在学习中遇到了不少问题,也经过各种尝试解决问题,在这里我通过博文的形式写出来,也希望能够帮到遇见同样问题的人们。对于STM32系列的芯片,有一个好处就是官方给出了一个固件库,这个能够很方便大家伙的编程。省去了使用寄存器的方法。但是固件库的学习也有很多让人麻烦的地方。比如更新速度快,这样大家可以在一棵树上吊死。只认一个版本的固件库。在这里我所用的是3.5标准固件库。

STM32内核中有一个系统定时器,它是一个24位递减计数器。工作原理是系统时基定时器设定初值并使能后,每经过1个系统时钟周期,计数值就减,当计数值减到0时,系统定时器会重新自动重装初值,并继续下一次计数,同时内部的COUNTFLAG标志位会置位。触发中断。

在很早的固件库中,提供了很多函数,来对SysTick进行设置,但是到了3.5版本的标准固件库中,移除了相关驱动函数,用户必须调用CMSIS 定义的函数,其中CMSIS只提供了一个Systick设置的函数,替代了STM32原来有的所有的驱动函数,这样做的目的,可能是简化Systick 的设置,可是降低了用户对SysTick的可控性。

在CMSIS中提供的函数是 SysTick_Config(uint32_t ticks); 该函数设置了自动重载入计数器(LOAD)的值,SysTick IRQ的优先级,复位了计数器(VAL)的值,开始计数并打开SysTick IRQ中断。SysTick时钟默认使用系统时钟。

其中这个函数定义在Core_cm3.h中 ,源代码如下所示:

static __INLINE uint32_t SysTick_Config(uint32_t ticks)

{

if (ticks > SysTick_LOAD_RELOAD_Msk) return (1);

SysTick->LOAD = (ticks & SysTick_LOAD_RELOAD_Msk) - 1; /* 设置初值*/

NVIC_SetPriority (SysTick_IRQn, (1<<__NVIC_PRIO_BITS) - 1); /* 设置中断优先级*/

SysTick->VAL = 0; /* Load the SysTick Counter Value */

SysTick->CTRL = SysTick_CTRL_CLKSOURCE_Msk |

SysTick_CTRL_TICKINT_Msk |

SysTick_CTRL_ENABLE_Msk; /* 使能Systick中断,和Systick 定时器*/

return (0); }

从上面的函数中可以看出,这个函数把Systick的初值,中断优先级,使能中断,开启定时器都完成了。大大简化了程序。

其中ticks 代表的是初值。例如系统时钟是72Mhz 那么要产生1ms的时基,那么我们可以这样去写。

SysTick_Config(SystemCoreClock/1000); 当然也可以写成:SysTick_Config(72000);

了解了这些,我们可以用它来做一个简单的延时函数delay_ms(u16 time);

代码如下:

void delay_ms(u16 time)

{

nTime=time ; /nTime 是个全局变量 可设 extern u16 nTime;/

while(nTime);

}

在 中断函数中直接 加入nTime--;

在主函数 初始化过程中 加入 SysTick_Config(72000);

这样就OK 了 试试吧。

提醒:《浅析STM32中SysTick在3.5固件库中的应用》最后刷新时间 2024-03-14 01:14:03,本站为公益型个人网站,仅供个人学习和记录信息,不进行任何商业性质的盈利。如果内容、图片资源失效或内容涉及侵权,请反馈至,我们会及时处理。本站只保证内容的可读性,无法保证真实性,《浅析STM32中SysTick在3.5固件库中的应用》该内容的真实性请自行鉴别。