一,配置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位,降序,零约束,写清零的计数器。
(2)SysTick是SysTick
_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;从0到71999正好是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位-1是15.
(4)SysTick->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_Handler(void)中添加自己想要中断处理的函数。
|