MM32 SysTick定时器

  • MindMotion
  • LV4工程师
  • |      2018-05-31 15:00:10
  • 浏览量 1103
  • 回复:0
来源 灵动MM32一、系统滴答SysTick定时器《Cortex-M3权威指南》中对SysTick的描述,SysTick定时器被捆绑在NVIC中,用于产生SYSTICK异常(异常号:15)。大多数操作系统需要一个硬件定时器来产生滴答中断,作为整个系统的时基。例如,为多个任务许以不同数目的时间片,确保没有一个任务霸占系统;或者把每个定时器周期的某个时间范围赐予特定的任务等,还有提供各种定时功能,都与滴答定时器有关。因此,需要一个定时器产生周期性的中断,而且最好还让用户程序不能随意访问它的寄存器,以维持操作系统的“心跳”的节奏。该定时器的时钟源可以是内部时钟(FCLK),或者是外部时钟(CM3处理器上的STCLK信号)。SysTick定时器能产生中断,异常中断。 二、SysTick工作原理SysTick定时器是一个24位的计数器,当倒计数为0时,将从RELOAD寄存器中取值作为定时器的初始值,同时可以选择在这个时候产生中断(异常号:15)。例如从RELOAD的值为100,那么当倒计数为0时,就会重新复位为100继续倒计数。 三、SysTick寄存器在 core_cm3.h 有定义 SysTick 寄存器映像 · SysTick->CTRL为控制及状态寄存器1、Bit0(ENABLE):为使能位,1使能,0关闭。2、Bit1(TICKINT):中断使能位,1使能,0关闭。3、Bit2(CLKSOURCE):时钟源设置位,0为外部时钟源(STCLK) (AHB总线时钟的1/8(HCLK/8)),1为内核时钟(FCLK) (AHB总线时钟的频率(HCLK))4、Bit16(COUNTFLAG):计数为 0 标志位,若 STK_VAL 计数至0,此标志位会被置 1。· SysTick->LOAD重装载数值寄存器· SysTick->VAL当前计数数值寄存器· SysTick->CALIB校准寄存器 四、SysTick精确延时实验· 实验内容这里我们以MM32F103CBT6为例,通过SysTick定时器做一个精确的延迟函数,让LED精确延迟1秒钟闪亮一次。 · 实验代码分析 在main函数中,我们初始化LED,在while(1)大循环中使用delay_ms做延时,让LED每个1s闪烁。 然后我们来看一下delay_init()代码如下, 在delay_init函数中我们主要是调用了SysTick_Config()函数来对systick进行了初始化配置。SysTick_Config()在core_cm3.h中源码如下: · 这个函数首先检查了装载的数是否可行,不行则直接返回1。· 将输入的参数ticks装入重装寄存器,ticks为两个中断之间的脉冲数,即相隔ticks 个时钟周期会引起一次中断 。· 设置了SysTick中断。· 将当前计数值清零。· SysTick 的时钟设置为 AHB 时钟;配置为计数至0 时引起中断;启动 SysTick。 整个配置成功则返回0,失败返回1。这里我们的参数为SystemCoreClock/1000,在本例中SystemCoreClock 为 定 义了 系 统 时 钟(SYSCLK)频率 的 宏, 即等于 AHB 的 时钟 频 率,SystemCoreClock 宏展开为数值7200 0000。所以这里输入的参数tick=72000,每72000个时钟周期中断一次,一个时钟周期的时间为1/72M,所以T=72000*(1/72000000)= 1ms,即SysTick中断会每1ms中断一次。 下面来看SysTick中断服务子函数和延时函数, 一旦我们调用了delay_ms函数,使能SysTick,就会等待在while(TimingDelay!=0),直到TimingDelay为0,而这个值会在SysTick_Handler中断服务子函数中每1ms递减一次。 · 实验现象 将程序下载到MM32Miniboard,观察LED以1s的频率闪烁。
  • 0
  • 收藏
  • 举报
  • 分享
我来回复

登录后可评论,请 登录注册

所有回答 数量:0
x
收藏成功!点击 我的收藏 查看收藏的全部帖子