STM32系统定时器学习心得

因为它是挂靠在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);
	}
}

以上都是我自己的学习心得

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值