STM32 寄存器操作 systick 滴答定时器 与中断

一、什么是 SysTick

SysTick—系统定时器是属于CM3内核中的一个外设,内嵌在NVIC中。系统定时器是一个24bit的向下递减的计数器, 计数器每计数一次的时间为1/SYSCLK,一般我们设置系统时钟SYSCLK等于72M。当重装载数值寄存器的值递减到0的时候,系统定时器就产生一次中断,以此循环往复。

因为SysTick是属于CM3内核的外设,所以所有基于CM3内核的单片机都具有这个系统定时器,使得软件在CM3单片机中可以很容易的移植。 系统定时器一般用于操作系统,用于产生时基,维持操作系统的心跳。

当然更常用的还是在裸机环境下作为延迟函数使用,本篇不介绍rtos相关的 SysTick 使用。

二、SysTick 寄存器描述

SysTick->CTRL,        --控制和状态寄存器

SysTick->LOAD,        --重装载寄存器

SysTick->VAL,          --当前值寄存器

SysTick->CALIB,        --校准值寄存器    (不常用 不做介绍)

2.1 SysTick->CTRL

2.2 SysTick->LOAD

2.3 SysTick->VAL

2.4 SysTick->CALIB

三、如何使用滴答定时器? 

3.1 初始化滴答定时器

通过设置 SysTick->CTRL 的第二位寄存器,我们可以配置滴答定时器使用外部时钟 (STCLK) 或者是 Cortex 内核时钟 (FCLK)。

所谓 Cortex 内核时钟就是如下图所示,AHB 八分频后的时钟。

在此我们配置为使用 Cortex 内核时钟,对 CTRL 第二位置 1 即可。

SysTick->CTRL&=~(1<<2);    //使用 Cortex 内核时钟

SystemCoreClock 是定义了系统时钟 (SYSCLK)频率的宏,即等于AHB 的时钟频率。笔者使用的是STM32F103x系列mcu,SystemCoreClock 被系统库配置成 72Mhz。

因为我们使了 Cortex 内核时钟。所以同样需要除 8 来当作八分频使用。

下面的代码则代表每1秒钟,SysTick会有 72000000/8= 9000000 次的计数周期。

fac_s = SystemCoreClock/8;      //为系统时钟的1/8 代表每个s完成的systick时钟数

 之后我们依次配置每秒,每毫秒,每微秒的滴答定时器周期。

//1s=1000ms=1000000=us
static u32 fac_s=0;     //一秒的滴答定时器计数周期数量
static u32 fac_ms=0;    //一毫秒的滴答定时器计数周期数量
static u32 fac_us=0;    //一微秒的滴答定时器计数周期数量void delay_init(){SysTick->CTRL&=~(1<<2);         //使用 Cortex 内核时钟fac_s = SystemCoreClock/8;      //为系统时钟的1/8 代表每个s完成的systick时钟数fac_ms = fac_s/1000;            //代表每个ms完成的systick时钟数fac_us = fac_ms/1000;           //代表每个us完成的systick时钟数
}

3.2 实现 delay_us() 函数

细看注释配合之前的寄存器描述即可看懂。

void delay_us(u32 nus)
{u32 temp;	    	 SysTick->LOAD=nus*fac_us; 					//时间加载	  		 SysTick->VAL=0x00;        					//清空计数器SysTick->CTRL|=1 ;	    //使能计数器  ENABLE位置1do{temp=SysTick->CTRL;//检查CTRL的ENABLE位和COUNTFLAG位//如果ENABLE位为0或者COUNTFLAG位为1则判断为计数结束 等待时间到达   }while((temp&0x01)&&!(temp&(1<<16)));SysTick->CTRL&=~1;	    //关闭计数器     ENABLE位置0SysTick->VAL =0X00;     //清空计数器	 
}

三、使用 SysTick 的中断

根据 SysTick->CTRL 寄存器表的提示,我们只需要把第一位置高即可开启 SysTick 异常中断。

3.1 使用库函数

在这里我们不再从头写寄存器,而是使用core_cm3.h 的库函数,并且解析其中的原理。

#include "stm32f10x.h"int main(void)
{	if (SysTick_Config(SystemCoreClock / 1000))	// ST3.5.0库版本{while (1);}for(;;){__NOP();}
}void SysTick_Handler(void)
{//每1ms中断一次
}

在下列代码中,我们的程序可以每隔 1ms 调用一次滴答定时器回调函数。

3.2 源码解析

static __INLINE uint32_t SysTick_Config(uint32_t ticks)
{if (ticks > SysTick_LOAD_RELOAD_Msk)  return (1);            /* 值超过0xFFFFFF直接退出 */SysTick->LOAD  = (ticks & SysTick_LOAD_RELOAD_Msk) - 1;      /* 设置重载寄存器 与运算防止越界 */NVIC_SetPriority (SysTick_IRQn, (1<<__NVIC_PRIO_BITS) - 1);  /* 设置Cortex-M0系统中断的优先级 */SysTick->VAL   = 0;                                          /* 加载SysTick计数器值 */SysTick->CTRL  = SysTick_CTRL_CLKSOURCE_Msk |SysTick_CTRL_TICKINT_Msk   |SysTick_CTRL_ENABLE_Msk;                    /* 使能 SysTick IRQ 和 SysTick Timer */return (0);                                                  /* 函数成功 */
}

方便阅读代码,我将下边的几个宏定义也粘贴过来: 

#define SysTick_CTRL_CLKSOURCE_Pos          2                                             /*!< SysTick CTRL: CLKSOURCE Position */
#define SysTick_CTRL_CLKSOURCE_Msk         (1ul << SysTick_CTRL_CLKSOURCE_Pos)            /*!< SysTick CTRL: CLKSOURCE Mask */#define SysTick_CTRL_TICKINT_Pos            1                                             /*!< SysTick CTRL: TICKINT Position */
#define SysTick_CTRL_TICKINT_Msk           (1ul << SysTick_CTRL_TICKINT_Pos)              /*!< SysTick CTRL: TICKINT Mask */#define SysTick_CTRL_ENABLE_Pos             0                                             /*!< SysTick CTRL: ENABLE Position */
#define SysTick_CTRL_ENABLE_Msk            (1ul << SysTick_CTRL_ENABLE_Pos)               /*!< SysTick CTRL: ENABLE Mask *//* SysTick Reload Register Definitions */
#define SysTick_LOAD_RELOAD_Pos             0                                             /*!< SysTick LOAD: RELOAD Position */
#define SysTick_LOAD_RELOAD_Msk            (0xFFFFFFul << SysTick_LOAD_RELOAD_Pos)        /*!< SysTick LOAD: RELOAD Mask */

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/688041.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python学习(三):pip安装及如何加速安装第三方组件

pip全称Package Installer for Python&#xff0c;即用来安装第三方组件的工具 一.安装pip Python3中setuptools、Pip安装详解 1、安装setuptools 命令如下&#xff1a; wget --no-check-certificate https://pypi.python.org/packages/source/s/setuptools/setuptools-19.…

C语言—指针

碎碎念:做指针题的时候我仿佛回到了原点&#xff0c;总觉得目的是为了把框架搭建起来&#xff0c;我胡说的哈31 1.利用指针变量将一个数组中的数据反向输出。 /*1.利用指针变量将一个数组中的数据反向输出。*/#include <stdio.h> #include <time.h> #include <…

phpstrom创建thinkphp项目

安装php和composer 参考 安装phpstrom 创建项目 查看thinkphp版本 https://packagist.org/packages/topthink/think 打开所在项目编辑配置 即可调试运行

二维码的颜色怎么改变?轻松3步修改二维码样式

怎么修改二维码的颜色呢&#xff1f;一般我们制作的二维码或者经过系统生成的二维码大多都是黑白颜色的&#xff0c;有些小伙伴会觉得不太美观无法满足自己的使用需求。那么对于想要修改二维码样式的小伙伴&#xff0c;可以使用二维码生成器的二维码美化功能来处理&#xff0c;…

07 按键控制 LED

按键简介 按键开关是一种电子开关&#xff0c;属于电子元器件类。常见的按键开关有两种&#xff0c;第一种是轻触式按键开关&#xff08;简称轻触开关&#xff09;&#xff0c;使用时以向开关的操作方向施加压力使内部电路闭合接通&#xff0c;当撤销压力时开关断开&#xff0…

git分布式版本控制工具基本操作

Windows操作 1.1 git基本操作 1.设置用户签名 git config user.name xx git config user.email xxb163.com2.初始化本地库 git init3.查看本地库状态 git status4.添加暂存区 git add 文件名称 git add *5.提交本地库 git commit -m "描述信息" 文件6.查看版本…

《富爸爸:巴比伦最富有的人》读书笔记

目录 作者简介 感悟 经典摘录 观点&#xff1a; 支付给自己(理解是投资自己) 观点&#xff1a;源源不断地放入金币 观点&#xff1a; 把收入的一部分留给我自己 观点&#xff1a; 从专业的人士得到建议 观点&#xff1a;一旦为自己规定了任务&#xff0c;就一定要完成 …

微波炉维修笔记

微波主要是靠2.45GHz 左右的微波(12.2cm 波长)加热水分子实现食物加热 所有不要使用金属器皿进行加热&#xff0c;要么因为电磁屏蔽&#xff0c;起不到加热效果&#xff0c;要么火光四射 微波炉基本组成 借鉴姜师傅的视频 碰到不加热其它都正常的问题 1.检查高压电容 使用万…

自动驾驶中的 DCU、MCU、MPU、SOC 和汽车电子架构

自动驾驶中的 DCU、MCU、MPU 1. 分布式电子电气架构2. 域集中电子电气架构架构2.1 通用硬件定义 3. 车辆集中电子电气架构4. ADAS/AD系统方案演变进程梳理4.1 L0-L2级别的ADAS方案4.2 L2以上级别的ADAS方案 5. MCU和MPU区别5.1 MCU和MPU的区别5.2 CPU与SoC的区别5.3 举个例子 R…

【STM32】软件SPI读写W25Q64芯片

目录 W25Q64模块 W25Q64芯片简介 硬件电路 W25Q64框图 Flash操作注意事项 状态寄存器 ​编辑 指令集 INSTRUCTIONS​编辑 ​编辑 SPI读写W25Q64代码 硬件接线图 MySPI.c MySPI.h W25Q64 W25Q64.c W25Q64.h main.c 测试 SPI通信&#xff08;W25Q64芯片简介&am…

说说对BOM的理解(常见的BOM对象了解哪些)

文章目录 一、是什么二、window三、location四、navigator五、screen六、history 一、是什么 BOM (Browser Object Model)&#xff0c;浏览器对象模型&#xff0c;提供了独立于内容与浏览器窗口进行交互的对象 其作用就是跟浏览器做一些交互效果,比如如何进行页面的后退&…

四川盐亭清代古寨重现,文物建筑保护引关注

近日&#xff0c;在四川盐亭的五台山深处&#xff0c;一处历经160余年风霜的古山寨遗迹重现天日。寨门巍峨&#xff0c;文字斑驳&#xff0c;诉说着清代同治年间的历史沧桑。然而&#xff0c;岁月侵蚀下&#xff0c;文物保护刻不容缓。温湿度波动等自然因素&#xff0c;对这些珍…

森林气象火险监测站

TH-SL10在广袤无垠的森林中&#xff0c;每一片树叶、每一缕风都蕴含着大自然的秘密。而在这片生机勃勃的绿色世界里&#xff0c;森林气象火险监测站就像是守护宝藏的“千里眼”和“顺风耳”&#xff0c;时刻警惕着潜在的危险。 一、森林气象火险监测站&#xff1a;实时监测的“…

生成式 AI - Diffusion 模型的数学原理(3)

来自 论文《 Denoising Diffusion Probabilistic Model》&#xff08;DDPM&#xff09; 论文链接&#xff1a; https://arxiv.org/abs/2006.11239 Hung-yi Lee 课件整理 文章目录 一、图像生成模型本质上的共同目标二、最大似然估计三、和VAE的关联四、概率计算 一、图像生成模…

GC9008 12V 全桥驱动芯片,可替代TMI8118,应用于摄像机、消费类产品上

GC9008 是一款 12V 全桥驱动芯片&#xff0c;为提供高性价比的方案。它能提供 0.1A 的持续输出电流。可以工作在 4.5~15V 的电源电压上。 具有 PWM&#xff08;IN1/IN2&#xff09;输入接口,与行业标准器件兼容.是 SOP8封装&#xff0c;GC9008D是DIP封装 芯片特点 ● H 桥电机…

计算机服务器中了_locked勒索病毒怎么办?Encrypted勒索病毒解密数据恢复

随着网络技术的不断发展&#xff0c;数字化办公已经成为企业生产运营的根本&#xff0c;对于企业来说&#xff0c;数据至关重要&#xff0c;但网络威胁无处不在&#xff0c;近期&#xff0c;云天数据恢复中心接到很多企业的求助&#xff0c;企业的计算机服务器遭到了_locked勒索…

Python 基于 AI 动物识别技术的研究与实现,附源码

博主介绍&#xff1a;✌程序员徐师兄、7年大厂程序员经历。全网粉丝30W、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅&#x1f447;…

迁移SVN和GIT的云端数据

在新服务器搭建GIT仓库 教程很多&#xff0c;大致的流程是&#xff1a; 1. 新建linux用户密码专用于git操作 2. 新建git库的存放文件夹并在此初始化git 3. 配置git库所在目录权限 *只需要有一个库和有一个用户&#xff0c;与在windows上建库是一样的。不需要搭建类似gitla…

stable diffusion webui学习总结(2):技巧汇总

一、脸部修复&#xff1a;解决在低分辨率下&#xff0c;脸部生成异常的问题 勾选ADetailer&#xff0c;会在生成图片后&#xff0c;用更高的分辨率&#xff0c;对于脸部重新生成一遍 二、高清放大&#xff1a;低分辨率照片提升到高分辨率&#xff0c;并丰富内容细节 1、先通过…

人力资源智能化管理项目(day10:首页开发以及上线部署)

学习源码可以看我的个人前端学习笔记 (github.com):qdxzw/humanResourceIntelligentManagementProject 首页-基本结构和数字滚动 安装插件 npm i vue-count-to <template><div class"dashboard"><div class"container"><!-- 左侧内…