新闻中心

EEPW首页 > 模拟技术 > 牛人业话 > 从滴答时钟了解STM32库操作

从滴答时钟了解STM32库操作

作者:areak时间:2014-05-04来源:电子产品世界收藏

  SysTick->CTRL |= CTRL_TICKINT_Set;这句话就是用来配置寄存器的语句, SysTick是系统定义的一个结构体如下,SysTick->CTRL即为滴答时钟的控制寄存器。

本文引用地址:http://www.eepw.com.cn/article/246289.htm

typedef 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    */

  __I  uint32_t CALIB; /*!< Offset: 0x00C (R/ )  SysTick Calibration Register        */

} 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,而从根本上来说这是一个地址,就是芯片内部分配给滴答时钟的实际地址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)

{

//具体函数实现由用户编写。

}

  通过对这样一个简单的操作,我们可以初步了解到的使用方法,其实开发人员没必要深究内部是如何处理实现的,只需要了解已经封装好的,进行调用即可,因此可以大大降低开发周期,提高开发效率,更多的功能留给读者自行研究开发。

c语言相关文章:c语言教程


尘埃粒子计数器相关文章:尘埃粒子计数器原理

上一页 1 2 下一页

关键词: STM32 库函数 定时器

评论


相关推荐

技术专区

关闭