打印

深入学习SysTick定时器

[复制链接]
3689|3
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
abin0415|  楼主 | 2012-4-3 17:28 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
一,配置SysTick

//Setup SysTickTimer for 1 msec interrupts


if (SysTick_Config(SystemFrequency /1000))


{


while (1);


}

1·先看参数SystemFrequency定义为




const uint32_t SystemFrequency =SYSCLK_FREQ_72MHz;

#define SYSCLK_FREQ_72MHz
72000000

72000传入SysTick_Config



2·再看SysTickConfig,在core_cm3.h中定义。

static __INLINEuint32_t SysTick_Config(uint32_t ticks)
{
if(ticks>SYSTICK_MAXCOUNT)

return(1);
/* Reload value impossible */



SysTick->LOAD=(ticks&SYSTICK_MAXCOUNT)-1;//set reload register



/* set Priority for Cortex-M0 System Interrupts */




NVIC_SetPriority(SysTick_IRQn,(1<<__NVIC_PRIO_BITS)-1);





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






/*Enable SysTick IRQ and SysTick Timer */



SysTick->CTRL= (1 << SYSTICK_CLKSOURCE) | (1<<SYSTICK_ENABLE) |(1<<SYSTICK_TICKINT);


return(0);
/* Function successful */


}
1)函数里的SYSTICK_MAXCOUNT,宏定义为

#define SYSTICK_MAXCOUNT
((1<<24) -1)

因为SysTick提供的是一个24位,降序,零约束,写清零的计数器。

2SysTickSysTick
_Type类型的。

/* memory mapping struct for SysTick */
typedef struct
{

__IO uint32_t CTRL;
/*!< SysTick Control and Status Register*/


__IO uint32_t LOAD;
/*!< SysTick Reload Value Register
*/


__IO uint32_t VAL;
/*!< SysTick Current ValueRegister
*/


__I
uint32_t CALIB;
/*!< SysTickCalibration Register
*/

} SysTick_Type;
这句话SysTick->LOAD=(ticks&SYSTICK_MAXCOUNT)-1;是将71999赋给SysTick->LOAD;从071999正好是72000.
为何要定义结构体的四个元素:

SysTick定时器具有四个寄存器:

1,
SysTick控制及状态寄存器(地址:0XE000_E010

2,
SysTick重装载数值寄存器(地址:0XE000_E014

3,
SysTick当前数值寄存器(地址:0XE000_E018

4,
SysTick校准数值寄存器(地址:0XE000_E01C



(3) NVIC_SetPriority(SysTick_IRQn,(1<<__NVIC_PRIO_BITS)-1);
设置SysTick中断优先级为15.STM32是用四位表达的优先级,__NVIC_PRIO_BITS定义为4,1左移4-115.
4SysTick->VAL=(0x00);

当前值置0,读取时返回当前倒计数的值,写它则使之清零,同时还会清除在SysTick控制及状态寄存器中的COUNTFLAG标志。

(5)SysTick->CTRL= (1 << SYSTICK_CLKSOURCE) | (1<<SYSTICK_ENABLE) |(1<<SYSTICK_TICKINT);

file:///C:/Users/abin/AppData/Local/Temp/msohtmlclip1/01/clip_image002.jpg

#define

SYSTICK_ENABLE
0



#define
SYSTICK_TICKINT
1



#define SYSTICK_CLKSOURCE
2

使用内部时钟源(FCLK,定时器使能,SysTick倒数到0时产生SysTick异常请求。

到此,SysTick定时器就已配置完成。但是还有最重要的一步,那就是添加中断处理函数。

二,
一定要在stm32f10x_it.c的文件里的void SysTick_Handlervoid)中添加自己想要中断处理的函数。

systick.zip

993.84 KB

Systick.word.zip

114.25 KB

沙发
abin0415|  楼主 | 2012-4-3 17:33 | 只看该作者
请教各位,如何排版?并且有个图片没有贴上?刚接触STM32不久,有不对之处,望各位多多拍:lol砖。

使用特权

评论回复
板凳
na239152605| | 2012-4-4 10:44 | 只看该作者
学习了!

使用特权

评论回复
地板
airwill| | 2012-4-4 21:43 | 只看该作者
没有看见什么 "深入" 的内容.
还以为 Systick 的高级应用技巧和 os 支持方面的介绍呢

使用特权

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

本版积分规则

个人签名:细节决定成败,态度决定高度。

17

主题

2105

帖子

5

粉丝