从滴答时钟了解STM32库操作
SysTick->CTRL |= CTRL_TICKINT_Set;这句话就是用来配置寄存器的语句, SysTick是系统定义的一个结构体如下,SysTick->CTRL即为滴答时钟的控制寄存器。
本文引用地址://m.amcfsurvey.com/article/246289.htmtypedef struct
{
__IO uint32_t CTRL;/*!< Offset: 0x000 (R/W)SysTick Control and Status Register */
__IO uint32_t LOAD;/*!< Offset: 0x004 (R/W)SysTick Reload Value Register*/
__IO uint32_t VAL;/*!< Offset: 0x008 (R/W)SysTick Current Value Register*/
__Iuint32_t CALIB; /*!< Offset: 0x
} SysTick_Type; //声明一个SysTick_Type型的结构体。
#define SysTick((SysTick_Type*)SysTick_BASE) /*!< SysTick configuration struct */
#define SysTick_BASE(SCS_BASE +0x0010UL) /*!< SysTick Base Address*/
#define SCS_BASE(0xE000E000UL) /*!< System Control Space Base Address*/
定义一个SysTick_Type类型的结构体实例SysTick,而从根本上来说这是一个地址,就是STM32芯片内部分配给滴答时钟的实际地址0xE000E000UL+0x0010UL。
CTRL_TICKINT_Set是一个宏定义,定义如下
/* CTRL TICKINT Mask */
#define CTRL_TICKINT_Set((u32)0x00000002)
#define CTRL_TICKINT_Reset((u32)0xFFFFFFFD)
至此,SysTick->CTRL |= CTRL_TICKINT_Set;这句话的意义已经很清晰了,就是给地址0xE000E000+0x0010 +0x000赋一个0x00000002的值,对应滴答时钟的CTRL寄存器的第2位置1。即为开启中断的意思。
上面讲的是用查询的方式,下面再说下中断触发。只需调用下面这个函数即可完成中断的设置。
SysTick_Config(uint32_t ticks);具体实现如下:
__STATIC_INLINE uint32_t SysTick_Config(uint32_t ticks)
{
if ((ticks - 1) > SysTick_LOAD_RELOAD_Msk)return (1);
SysTick->LOAD= ticks - 1;
NVIC_SetPriority (SysTick_IRQn, (1<<__NVIC_PRIO_BITS) - 1);
SysTick->VAL= 0;
SysTick->CTRL= SysTick_CTRL_CLKSOURCE_Msk |
SysTick_CTRL_TICKINT_Msk|
SysTick_CTRL_ENABLE_Msk;
return (0);
}
函数的参数为ticks,是要装入寄存器SysTick->LOAD的计数值,如果系统时钟为72M,把ticks赋值为SystemFrequency/10000,表示计数到720个时钟周期产生一次中断,而一个时钟周期的时间为(1/72)us,所以720x(1/72)=10us,也就实现了定时10us的功能。
NVIC_SetPriority (SysTick_IRQn, (1<<__NVIC_PRIO_BITS) - 1);为SysTick中断设置优先级。将寄存器SysTick->VAL的值清0。然后使能中断,使能SysTick定时器,时钟源选择为AHB时钟。当定时时间到时,进入中断函数
void SysTick_Handler(void)
{
//具体函数实现由用户编写。
}
通过对这样一个简单定时器的操作,我们可以初步了解到STM32库函数的使用方法,其实开发人员没必要深究库函数内部是如何处理实现的,只需要了解已经封装好的库函数,进行调用即可,因此可以大大降低开发周期,提高开发效率,更多的功能留给读者自行研究开发。
c语言相关文章:c语言教程
尘埃粒子计数器相关文章:尘埃粒子计数器原理
评论