历史上的今天
今天是:2025年04月01日(星期二)
2020年04月01日 | STM32F407ZGT6用滴答定时器实现精确延时(寄存器版)
2020-04-01 来源:eefocus
1.滴答定时器介绍
SysTick定时器被捆绑在NVIC中,用于产生SYSTICK异常(异常号: 15)。在以前,大多操作系统需要一个硬件定时器来产生操作系统需要的滴答中断,作为整个系统的时基。例如,为多个任务许以不同数目的时间片,确保没有一个任务能霸占系统;或者把每个定时器周期的某个时间范围赐予特定的任务等,还有操作系统提供的各种定时功能,都与这个滴答定时器有关。因此,需要一个定时器来产生周期性的中断,而且最好还让用户程序不能随意访问它的寄存器,以维持操作系统“心跳”的节律。
滴答定时器是ARM公司设计架构是已经集成到内核中,也就是说只要采用ARM公司设计芯片滴答定时器是通用的,写好的滴答定时器在其他的采用ARM公司设计的芯片直接可以拿来使用。
滴答定时器的时钟频率是21MHZ,采用的是递减计数的计数方式,一次定时的最长时间=1/21000000 *(2^24-1) = 799ms
2.编写滴答定时器驱动程序的思路:
①选择时钟源
选择外部的时钟源 21MHZ
通过SysTick控制及状态寄存器 第2位控制
②写入自动重装载值
写入到自动重装载寄存器中(计数器的初值)
③清空当前数值寄存器
直接对该寄存器写入0
④使能定时器
通过控制和状态寄存器的第0位实现 写1使能
⑤等待计数时间到达
隐含条件 当前数值寄存器里的值从 1--->0 这一瞬间
控制及状态寄存器的第16位就会立即变为1 读取该寄存器的
16 位清空当前的标志位
while((SysTick->CTRL & (1<<16))==0);
⑥关闭定时器
通过控制和状态寄存器的第0位实现 写0关闭
3.驱动程序头文件
#ifndef _DELAY_H
#define _DELAY_H
#include "stm32f4xx.h"
//宏定义
//函数声明
void delay_ms(u16 ms);
void delay_us(u32 us);
void delay_xms(u32 xms);
#endif
4.驱动程序源文件
#include "delay.h"
/********************
函数名: delay_ms
函数参数: u16 ms :需要延时时间 以ms为单位
函数返回值:无
函数功能: 实现滴答定时器的ms级别的延时
函数描述:
*********************/
void delay_ms(u16 ms)
{
//选择时钟(外部的时钟)
SysTick->CTRL &=~(0x1<<2);
//写入自动重装载值
SysTick->LOAD = 21000*ms;
//清空当前数值寄存器
SysTick->VAL=0;
//打开定时器开始递减计数
SysTick->CTRL |=(0x1<<0);
//等待当前数值计数器递减到0
while((SysTick->CTRL & (1<<16))==0);
//等待完成以后一次滴答计时结束关闭定时器
SysTick->CTRL &=(0x1<<0);
}
/********************
函数名: delay_us
函数参数: u32 us :需要延时时间 以us为单位
函数返回值:无
函数功能: 实现滴答定时器的us级别的延时
函数描述:
*********************/
void delay_us(u32 us)
{
//选择时钟(外部的时钟)
SysTick->CTRL &=~(0x1<<2);
//写入自动重装载值
SysTick->LOAD = 21*us; /* 21/21000000 = 1us */
//清空当前数值寄存器
SysTick->VAL=0;
//打开定时器开始递减计数
SysTick->CTRL |=(0x1<<0);
//等待当前数值计数器递减到0
while((SysTick->CTRL & (1<<16))==0);
//等待完成以后一次滴答计时结束关闭定时器
SysTick->CTRL &=(0x1<<0);
}
//实现任意ms级别的延时
//以500ms的延时为基准延时
void delay_xms(u32 xms)
{
u16 i =0;//延时的倍数循环变量
//计算整数个基准延时
for(i=0; i delay_ms(500); } //如果不是整数倍 有剩余的延时 if(xms%500!=0) //有余数 { delay_ms(xms%500); } }
史海拾趣
|
近来有很多朋友问及MAP文件,下面我就对MAP文件的一点理解和大家分享。 MAP文件是CCS软件编译后产生的有关DSP用到所有程序、数据及IO空间的一种映射文件。 一、生成方法 MAP文件主要有两种生成方法,一种是由系统自动生成,默认文 ...… 查看全部问答> |
|
在windows mobile下写输入法,那位大哥能给点资料? 在windows mobile下写输入法,那位大哥能给点资料? SIP IME输入法都可以,还想问下大家,sip能切换ime输入法吗?… 查看全部问答> |
|
EVC编程出现LINK 错误 我不能解决 希望有高人能帮我看看 谢谢了。。 error LNK2019: unresolved external symbol \"int __cdecl registerwnd(struct HINSTANCE__ *)\" (?registerwnd@@YAHPAUHINSTANCE__@@@Z) referenced in function WinMain ARMV4Rel/mytimetable.exe : fa ...… 查看全部问答> |
|
给内存里一个u32的变量赋值的操作能够被中断么?我在中断的外面对一个u32的变量赋值,会不会在外面赋值一部分的时候,进了中断。这样,我在中断里面读到的这个变量值就不准了恳请高手指教… 查看全部问答> |
|
MDK调试时串口接收数据,调试时,可以实时显示出数据么? 比如串口收到0x12 0x34 。 那么MDK的watches栏里面可以看到么? 很着急啊 多谢!!… 查看全部问答> |
|
a) 目的:基础PWM输出,以及中断配合应用。输出选用PB1,配置为TIM3_CH4,是目标板的LED6控制脚。b) 对于简单的PWM输出应用,暂时无需考虑TI ...… 查看全部问答> |




