STM32F407的系统定时器

文章目录

  • 系统定时器SysTick
    • 滴答定时器寄存器
    • STK_CTRL 控制寄存器
    • STK_LOAD 重载寄存器
    • STK_VAL 当前值寄存器
    • STK_CALRB 校准值寄存器
  • 初始化 Systick 定时器
    • SysTick_Init
      • SysTick_CLKSourceConfig
    • delay_us寄存器
    • delay_us库函数
    • delay_xms短时
    • delay_ms长时
    • SysTick_Config

系统定时器SysTick

CM4 内核的处理和 CM3 一样,内部都包含了一个SysTick定时器。两者没有区别。其详细介绍,请参阅
《STM32F3与F4系列Cortex M4内核编程手册》第230页。

  • 系统定时器是属于 CM3 内核中的一个外设,内嵌在 NVIC 中。因为所有的 CM3 芯片都带有这个定时器,软件在不同 CM3 器件间的移植工作得以化简。

  • 系统定时器是一个 24bit 的向下递减的计数器,计数器每计数一次的时间为 1/SYSCLK,一般我们设置系统时钟 SYSCLK 等于 72M。

    • 该定时器的时钟源可以是内部时钟,或者是外部时钟。不过,STCLK 的具体来源则由芯片设计者决定
  • 当重装载数值寄存器的值递减到 0 的时候,系统定时器就产生一次中断,以此循环往复。

    • SysTick 设定初值并使能后,每经过 1 个系统时钟周期,计数值就减 1。计数到 0 时,SysTick 计数器自动重装初值并继续计数,同时内部的 COUNT FLAG 标志会置位,触发中断 (如果中断使能情况下)。
  • 只要不把它在 SysTick 控制及状态寄存器中的使能位清除,就永不停息。
    在这里插入图片描述在M4内核编程手册中这样说道:SysTick是一个24位系统定时器,它将重加载值递减到零。再在下一个时钟沿将该值重新装载到STK_LOAD寄存器中,然后根据随后的时钟进行递减。

滴答定时器寄存器

Systick 部分内容属于 NVIC 控制部分,一共有 4 个寄存器,名称和地址分别是:

STK_CTRL       0xE000E010  --  控制寄存器	
//貌似这个才是控制寄存器
STK_LOAD     0xE000E014  --  重载寄存器	
STK_VAL      0xE000E018  --  当前值寄存器	
STK_CALRB    0xE000E01C  --  校准值寄存器

在这里插入图片描述

STK_CTRL 控制寄存器

在这里插入图片描述
寄存器内有 4 个位具有意义

  • 第 0 位:ENABLE,Systick 使能位(0:关闭 Systick 功能;1:开启 Systick 功能)
  • 第 1 位:TICKINT,Systick 中断使能位(0:关闭 Systick 中断;1:开启 Systick 中断)
  • 第 2 位:CLK SOURCE,Systick 时钟源选择(0:使用 HCLK/8 作为 Systick 时钟;1:使用 HCLK 作为 Systick 时钟)
  • 第 16 位:COUNT FLAG,Systick 计数比较标志,当计数到0时,置1;定时器开始重新计数时(CLK_LOAD重新写入数值)自动清零。
    在这里插入图片描述

STK_LOAD 重载寄存器

在这里插入图片描述

Systick 是一个递减的定时器,当定时器递减至0 时,重载寄存器中的值就会被重装载,继续开始递减。STK_LOAD 重载寄存器是个24 位的寄存器最大计数0xFFFFFF。

STK_VAL 当前值寄存器

在这里插入图片描述

24 位的寄存器,读取时返回当前倒计数的值,写它则使之清零,同时还会清除在 SysTick 控制及状态寄存器中的 COUNTFLAG 标志。

STK_CALRB 校准值寄存器

SysTick calibration value register
在这里插入图片描述

  • 位31 NOREF:= 1 没有外部参考时钟(STCLK 不可用),= 0 外部参考时钟可用。
  • 位30 SKEW:= 1 校准值不是准确的1ms,= 0校准值是准确的1ms

初始化 Systick 定时器

在这里插入图片描述

SysTick_Init

void SysTick_Init(u8 SYSCLK);
SysTick_Init(72);

//SYSTICK的时钟固定为AHB时钟的1/8
//SYSCLK:系统时钟频率
void SysTick_Init(u8 SYSCLK)
{SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK_Div8); fac_us=SYSCLK/8;					fac_ms=(u16)fac_us*1000;				   
}								    

系统时钟是72/8M,计数一次时间1/9000000秒,换算成us就是1/9us,则计数72/8次也就是9次就是1us。

SysTick_CLKSourceConfig

设置SysTick的时钟源。可选项如下:

#define SysTick_CLKSource_HCLK_Div8    ((uint32_t)0xFFFFFFFB)
#define SysTick_CLKSource_HCLK         ((uint32_t)0x00000004)
#define IS_SYSTICK_CLK_SOURCE(SOURCE) (((SOURCE) == SysTick_CLKSource_HCLK) || \((SOURCE) == SysTick_CLKSource_HCLK_Div8))

HCLK的介绍

delay_us寄存器

void delay_us(u32 nus)
{	 u32 temp;SysTick->LOAD = 9*nus;SysTick->VAL=0X00;//清空计数器SysTick->CTRL=0X01;//使能,减到零是无动作,采用外部时钟源do{temp=SysTick->CTRL;//读取当前倒计数值}while((temp&0x01)&&(!(temp&(1<<16))));//等待时间到达//使能且没有计数到0就一直循环SysTick->CTRL=0x00; //关闭计数器SysTick->VAL =0X00; //清空计数器
}

9*nus :假设外设频率为 9M,也就是经过 8 分频,那么计数 9 次是 1us,乘以 9 的意义就是参数的时间对应的次数,也就是重装载值

  • 这里看一下判断条件,第一位是使能,16位是计数到0。
    第 16 位:COUNT FLAG,Systick 计数比较标志,当计数到0时,置1;定时器开始重新计数时(CLK_LOAD重新写入数值)自动清零。

delay_us库函数

//延时nus
//注意:nus的值,不要大于798915us(最大值即2^24/fac_us@fac_us=21)
void delay_us(u32 nus)
{		u32 temp;	    	 SysTick->LOAD=nus*fac_us; 				//时间加载	  		 SysTick->VAL=0x00;        				//清空计数器SysTick->CTRL|=SysTick_CTRL_ENABLE_Msk ; //开始倒数 	 do{temp=SysTick->CTRL;}while((temp&0x01)&&!(temp&(1<<16)));	//等待时间到达   SysTick->CTRL&=~SysTick_CTRL_ENABLE_Msk; //关闭计数器SysTick->VAL =0X00;       				//清空计数器 
}

delay_xms短时


//延时nms
//SysTick->LOAD为24位寄存器,所以,最大延时为:
//nms<=0xffffff*8*1000/SYSCLK
//SYSCLK单位为Hz,nms单位为ms
//对168M条件下,nms<=798ms 
void delay_xms(u16 nms)
{	 		  	  u32 temp;		   SysTick->LOAD=(u32)nms*fac_ms;			//时间加载(SysTick->LOAD为24bit)SysTick->VAL =0x00;           			//清空计数器SysTick->CTRL|=SysTick_CTRL_ENABLE_Msk ;          //开始倒数 do{temp=SysTick->CTRL;}while((temp&0x01)&&!(temp&(1<<16)));	//等待时间到达   SysTick->CTRL&=~SysTick_CTRL_ENABLE_Msk;       //关闭计数器SysTick->VAL =0X00;     		  		//清空计数器	  	    
} 

delay_ms长时


//延时nms 
//nms:0~65535
void delay_ms(u16 nms)
{	 	 u8 repeat=nms/540;						//这里用540,是考虑到某些客户可能超频使用,//比如超频到248M的时候,delay_xms最大只能延时541ms左右了u16 remain=nms%540;while(repeat){delay_xms(540);repeat--;}if(remain)delay_xms(remain);
} 

SysTick_Config

设置重装载值。该函数的内部就是个:SysTick->LOAD = 9*nus;
SysTick_Config 的参数是一个时钟次数,意思就是我要多少个1/fosc 时间后中断一下。

static void BSP_CoreClockInit(void)
{ SysTick_Config(SystemCoreClock / 100);      //10ms//SysTick_Config(720000);    				//10ms
}

SystemCoreClock / 100 代表的是时钟次数,即放入重装载寄存器中的值,每计时一个数需要 1/72000000s 的时间,那么计SystemCoreClock / 100 (SystemCoreClock 为 72M)个数的时间就是 10ms,通过在中断中设置标志位达到 systick 定时中断的功能。
函数实现

__STATIC_INLINE uint32_t SysTick_Config(uint32_t ticks)
{if ((ticks - 1) > SysTick_LOAD_RELOAD_Msk)  return (1);      /* Reload value impossible */SysTick->LOAD  = ticks - 1;                                  /* set reload register */NVIC_SetPriority (SysTick_IRQn, (1<<__NVIC_PRIO_BITS) - 1);  /* set Priority for Systick Interrupt */SysTick->VAL   = 0;                                          /* Load the SysTick Counter Value */SysTick->CTRL  = SysTick_CTRL_CLKSOURCE_Msk |SysTick_CTRL_TICKINT_Msk   |SysTick_CTRL_ENABLE_Msk;                    /* Enable SysTick IRQ and SysTick Timer */return (0);                                                  /* Function successful */
}

在外设的中断优先级设置里,外设的硬件编号都是大于等于零的,内核外设的编号都小于零,相当于一个IP。

  • __NVIC_PRIO_BITS=4,因为F4使用了四位。
  • 中断处理函数IP:
typedef enum IRQn
{
/******  Cortex-M4 Processor Exceptions Numbers ****************************************************************/NonMaskableInt_IRQn         = -14,    /*!< 2 Non Maskable Interrupt                                          */MemoryManagement_IRQn       = -12,    /*!< 4 Cortex-M4 Memory Management Interrupt                           */BusFault_IRQn               = -11,    /*!< 5 Cortex-M4 Bus Fault Interrupt                                   */UsageFault_IRQn             = -10,    /*!< 6 Cortex-M4 Usage Fault Interrupt                                 */SVCall_IRQn                 = -5,     /*!< 11 Cortex-M4 SV Call Interrupt                                    */DebugMonitor_IRQn           = -4,     /*!< 12 Cortex-M4 Debug Monitor Interrupt                              */PendSV_IRQn                 = -2,     /*!< 14 Cortex-M4 Pend SV Interrupt                                    */SysTick_IRQn                = -1,     /*!< 15 Cortex-M4 System Tick Interrupt                                */
/******  STM32 specific Interrupt Numbers **********************************************************************/WWDG_IRQn                   = 0,      /*!< Window WatchDog Interrupt                                         */PVD_IRQn                    = 1,      /*!< PVD through EXTI Line detection Interrupt                         */TAMP_STAMP_IRQn             = 2,      /*!< Tamper and TimeStamp interrupts through the EXTI line             */RTC_WKUP_IRQn               = 3,      /*!< RTC Wakeup interrupt through the EXTI line                        */FLASH_IRQn                  = 4,      /*!< FLASH global Interrupt                                            */RCC_IRQn                    = 5,      /*!< RCC global Interrupt                                              */EXTI0_IRQn                  = 6,      /*!< EXTI Line0 Interrupt                                              */EXTI1_IRQn                  = 7,      /*!< EXTI Line1 Interrupt                                              */EXTI2_IRQn                  = 8,      /*!< EXTI Line2 Interrupt                                              */EXTI3_IRQn                  = 9,      /*!< EXTI Line3 Interrupt                                              */EXTI4_IRQn                  = 10,     /*!< EXTI Line4 Interrupt                                              */DMA1_Stream0_IRQn           = 11,     /*!< DMA1 Stream 0 global Interrupt                                    */DMA1_Stream1_IRQn           = 12,     /*!< DMA1 Stream 1 global Interrupt                                    */DMA1_Stream2_IRQn           = 13,     /*!< DMA1 Stream 2 global Interrupt                                    */DMA1_Stream3_IRQn           = 14,     /*!< DMA1 Stream 3 global Interrupt                                    */DMA1_Stream4_IRQn           = 15,     /*!< DMA1 Stream 4 global Interrupt                                    */DMA1_Stream5_IRQn           = 16,     /*!< DMA1 Stream 5 global Interrupt                                    */DMA1_Stream6_IRQn           = 17,     /*!< DMA1 Stream 6 global Interrupt                                    */ADC_IRQn                    = 18,     /*!< ADC1, ADC2 and ADC3 global Interrupts   

内核外设和普通外设的中断优先级比较,虽然二者不是在同一个寄存器中,但是在比较时,也是把内核外设的优先级寄存器配置按照普通的解读。

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

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

相关文章

HTML和CSS的基础-前端扫盲

想要写出一个网页&#xff0c;就需要学习前端开发&#xff08;写网页代码&#xff09;和后端开发&#xff08;服务器代码&#xff09;。 对于前端的要求&#xff0c;我们不需要了解很深&#xff0c;仅仅需要做到扫盲的程度就可以了。 写前端&#xff0c;主要用到的有&#xf…

〔001〕虚幻 UE5 发送 get、post 请求、读取 json 文件

✨ 目录 🎈 安装 varest 扩展🎈 开启 varest 扩展🎈 发送 get 请求🎈 发送 post 请求🎈 读取 json 文件🎈 安装 varest 扩展 打开 虚幻商城,搜索 varest 关键字进行检索, varest 是一个 api 调用插件,支持 http/https 请求,也支持 json 文件的读取,最关键是该…

JavaScript

一. JavaScript概述 1. ECMAScript和JavaScript的关系 1996年11月&#xff0c;JavaScript的创造者--Netscape公司&#xff0c;决定将JavaScript提交给国际标准化组织ECMA&#xff0c;希望这门语言能够成为国际标准。次年&#xff0c;ECMA发布262号标准文件&#xff08;ECMA-26…

水库大坝可视化智能远程监管方案,助力安全监测智能巡检

一、背景需求 水库大坝作为防洪度汛的重要设施&#xff0c;其安全问题直接关系到人民群众的生命财产安全。因此&#xff0c;必须加强对大坝水库的安全管理&#xff0c;对水库除险加固和运行管护要消除存量隐患&#xff0c;实现常态化管理&#xff0c;同时要配套完善重点小型水…

在Linux上编译gdal3.1.2指南

作者:朱金灿 来源:clever101的专栏 为什么大多数人学不会人工智能编程?>>> 以Ubuntu 18编译gdal3.1.2为例,编译gdal3.1.2需要先编译proj库和geos库(可选)。我选择的proj库版本为proj-7.1.0,编译proj-7.1.0需要先编译tiff库和sqlite3。我选择的sqlite3的版本为…

高性能消息中间件 - Kafka3.x(三)

文章目录 高性能消息中间件 - Kafka3.x&#xff08;三&#xff09;Kafka Broker ⭐Kafka Broker概念Zookeeper&#xff08;新版本可以不使用zk了&#xff09;⭐Zookeeper的作用 Kafka的选举1&#xff1a;Broker选举Leader⭐Broker核心参数⭐案例&#xff1a;服役新节点和退役旧…

SaaS可配置性设计要点

1 引言 考虑到系统SaaS需求&#xff0c;就成熟的SaaS应用而言&#xff0c;元数据服务是为用户提供定制和配置应用、满足其特定需求的主要手段。 可配置能力主要反映在这4个方面&#xff1a;1 程序外观&#xff1b;2 工作流程与业务规则&#xff1b;3 数据模型&#xff1b…

微信便利签怎么弄?微信中有便捷操作的便签小程序吗

微信在日常办公及生活中比较重要的作用就是&#xff1a;聊天、视频会议、语音会议等&#xff0c;这是大家认知中的微信。除了这些功能以外&#xff0c;微信中还有很多小程序&#xff0c;小程序也能够辅助大家日常的办公。 比如&#xff0c;工作中我们需要制定工作计划&#xf…

vscode开启emmet语法

需要在setting.json中添加配置 首先进入设置&#xff0c;然后点击右上角 Vue项目添加如下配置 "emmet.syntaxProfiles": { "vue-html": "html", "vue": "html" },React项目添加如下配置 "emmet.includeLanguages&quo…

一体化模型图像去雨+图像去噪+图像去模糊(图像处理-图像复原-代码+部署运行教程)

本文主要讲述了一体化模型进行去噪、去雨、去模糊&#xff0c;也就是说&#xff0c;一个模型就可以完成上述三个任务。实现了良好的图像复原功能&#xff01; 先来看一下美女复原.jpg 具体的&#xff1a; 在图像恢复任务中&#xff0c;需要在恢复图像的过程中保持空间细节…

transformers-Generation with LLMs

https://huggingface.co/docs/transformers/main/en/llm_tutorialhttps://huggingface.co/docs/transformers/main/en/llm_tutorial停止条件是由模型决定的&#xff0c;模型应该能够学习何时输出一个序列结束&#xff08;EOS&#xff09;标记。如果不是这种情况&#xff0c;则在…

Mybatis—基础操作

mybatis入门后&#xff0c;继续学习mybatis基础操作。 目录 Mybatis基础操作准备工作删除操作日志输入预编译SQLSQL注入参数占位符 新增操作基本新增添加后返回主键 更新操作查询操作根据id查询数据封装条件查询条件查询 Mybatis基础操作 准备工作 根据下面页面原型及需求&am…

vlc打开网络流(如rtmp),并查看媒体信息(如编码格式等编码信息)

打开vlc 选择媒体&#xff0c;打开网络串流 输入rtmp地址&#xff0c;点击播放 选择工具-编解码信息 可以查看节目的编码信息什么的

SpringCloud 微服务全栈体系(九)

第九章 Docker 三、Dockerfile 自定义镜像 常见的镜像在 DockerHub 就能找到&#xff0c;但是我们自己写的项目就必须自己构建镜像了。 而要自定义镜像&#xff0c;就必须先了解镜像的结构才行。 1. 镜像结构 镜像是将应用程序及其需要的系统函数库、环境、配置、依赖打包而…

Reading:Deep dive into the OnPush change detection strategy in Angular

原文连接&#xff1a;IndepthApp 今天深入阅读并总结Angualr中onPush更新策略。 1. 两种策略 & whats Lview&#xff1f; Angular 实现了两种策略来控制各个组件级别的更改检测行为。这些策略定义为Default和OnPush&#xff1a; 被定义为枚举&#xff1a; export enum…

Spring系统之IOC与AOP

前言 Spring是一个轻量级的控制反转(IoC)和面向切面(AOP)的容器框架。 IOC 1.IOC的概念 控制反转(IoCInversion of Control)IoC&#xff0c;用白话来讲&#xff0c;就是由容器控制程序之间的&#xff08;依赖&#xff09;关系&#xff0c;而非传统实现中&#xff0c;由程序代码…

python manage.py createsuperuser运行错误

我把思念作笺&#xff0c;随风而去&#xff0c;落在你常路过的那个街角… 错误复现 PS D:\教学文件\Django\djangoProject\webDemo02> python manage.py createsuperuser System check identified some issues:WARNINGS: ?: (urls.W005) URL namespace admin isnt unique…

Maven入门与开箱即用

一、初识 Maven&#xff08;了解&#xff09; 1、项目遇到的问题 构建&#xff1a;编译代码&#xff0c;运行测试&#xff0c;打包&#xff0c;部署应用&#xff0c;运行服务器等&#xff1b;依赖&#xff1a;项目依赖大量的第三方包&#xff0c;第三方包又依赖另外的包&…

OpenSSL生成CA证书

基本概念 证书类别 根证书&#xff1a;生成服务端证书&#xff0c;客户端证书的基础。自签名。服务端证书&#xff1a;由根证书签发。配置在服务器上。客户端证书&#xff1a;由根证书签发。配置在浏览器、移动APP等客户端上。 认证方式 单向认证&#xff08;Client鉴权Serv…

2022最新版-李宏毅机器学习深度学习课程-P32 Transformer

一、 seq2seq 1. 含义 输入一个序列&#xff0c;机器输出另一个序列&#xff0c;输出序列长度由机器决定。 文本翻译&#xff1a;文本至文本&#xff1b;  语音识别&#xff1a;语音至文本&#xff1b;  语音合成&#xff1a;文本至语音&#xff1b;  聊天机器人&#…