因为它是挂靠在NVIC上属于内核里面的所以需要在内核手册中查看它的介绍
通过SysTick定时器的简化框图来进行配置
从上图可以看出只需要配置控制和状态寄存器就可以。而控制和状态寄存器中有四个位,只需要对这四个位进行相应的配置就能完成对SysTick定时器的配置(如果不配置中断)
SysTick控制及状态寄存器表
下面是配置的代码部分,分别给了相应的注释部分
头文件代码:
#ifndef _SYSTICK_H_
#define _SYSTICK_H_
//头文件
#include "stm32f4xx.h"
#include <stdio.h>
//函数声明
void Systick_Delay_us(uint32_t nus);
void Systick_Interrupt_us(uint32_t nus);
#endif
源文件代码:
#include "systick.h"
/*
* 配置流程
*1.选择时钟源 168MHz、21MHz
*2.设置重载值 次数-1
*3.(设置中断)
*4.清除计数标志
*5.使能计数器
*6.等待计数标志开启
*7.关闭计数器
* 16777215 * 1/21us = 798915us = 798ms
* 16777215 * 1/168us = 99864us = 99ms
*/
/**
* 函数功能:这是一个用来延时的函数
* 函数参数:nus
* 函数返回值 None
*/
void Systick_Delay_us(uint32_t nus)
{
SysTick->CTRL &= ~(1 << 2); //选择时钟源21
SysTick->LOAD = (21 *nus-1); //时钟源 * 真实次数 -1
SysTick->VAL = 0; //清除计数标志 = 写任意数清除
SysTick->CTRL |= 1 << 0; //使能计数器
while((SysTick->CTRL & 1 << 16) == 0); //等待计数标志为1
SysTick->CTRL &= ~(1 << 0); //关闭计数器
}
/**
* 函数功能:通过设置nus产生中断
* 函数参数:nus
* 函数返回值 None
*/
void Systick_Interrupt_us(uint32_t nus)
{
SysTick->CTRL &= ~(1 << 2);
SysTick->LOAD = (21 *nus-1);
SysTick->CTRL |= 1 << 1; //中断使能
SysTick->VAL = 0;
SysTick->CTRL |= 1 << 0;
NVIC_SetPriority(SysTick_IRQn, NVIC_EncodePriority(7-2, 1, 0)); //设置中断优先级
NVIC_EnableIRQ(SysTick_IRQn); //使能中断
}
/**
* 函数功能:中断服务函数
* 函数参数:None
* 函数返回值 None
*/
void SysTick_Handler(void)
{
if(SysTick->CTRL & 1 << 16)
{
SysTick->VAL = 0; //清除计数标志(让它重新计数)
printf("FUNCTION is executed!\r\n");
}
}
主函数代码:(main.h中包含了systick.h)
#include "main.h"
int main(void)
{
printf("Hello World!\r\n");
Systick_Interrupt_us(500000); //500毫秒每次
while(1)
{
printf("1\r\n");
Systick_Delay_us(500000);
printf("2\r\n");
Systick_Delay_us(500000);
}
}
以上都是我自己的学习心得