| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 嵌入式 -> STM32 系统定时器--SysTick -> 正文阅读 |
|
[嵌入式]STM32 系统定时器--SysTick |
目录 SysTick:系统定时器,24位,只能递减,存在于内核,嵌套在NVIC中。 所有的Cortex-M内核的单片机都具有这个定时器。通过系统定时器,我们可以实现精准的软件延时(毫秒、微秒级)。 一、结构图与寄存器重装载寄存器:存放初始值 ??STK_CLK:时钟 counter在时钟的驱动下,从reload初值开始往下递减计数到0(这样为一个循环),产生中断和置位COUNTFLAG标志。然后又从reload值开始重新递减计数,如此循环。 其相关寄存器在M3编程手册里面: 1.STK_CTRL寄存器(控制及状态寄存器):第2位:AHB指的是高速总线时钟—HCLK,为72M,这一位置0,时钟就是9M,这一位置1,时钟就是72M。第1位:置0,不产生中断;置1,产生中断。 2. STK_LOAD寄存器(重装载数值寄存器),存放一个24位的初始值。 3. STK_VAL寄存器(当前数值寄存器)。 二、SysTick定时时间计算首先,我们要确定3个变量。 ? 1-t:一个计数循环的时间(从初始值递减到0所用的时间),跟reload(存放初始值的寄存器)和CLK有关 ? 2-CLK:72M或者9M,由STK_CTRL寄存器配置 ? 3-RELOAD(初始值):24位,用户自己配置 t = reload * ( 1/clk ) Clk = 72M时,t = (72) *(1/ 72 M )= 1US Clk = 72M时,t = (72000) *(1/ 72 M )= 1MS 三、Systick-系统定时器配置程序SysTick寄存器结构体:在固件库文件:core_cm3.h中定义 SysTick配置库函数:在固件库文件:core_cm3.h中定义 SysTick配置中断优先级:在固件库文件:core_cm3.h中定义 SysTick配置的过程(此程序已经写好): 步骤如下: ?1.判断自己规定的初始值是否超过了最大值。 ?2.初始化reload寄存器的值(确定初始值)。 ?3.配置systick的中断优先级。
systick中断优先级配置的是scb->shprx寄存器(内核的);而外设的中断优先级配置的是nvic->iprx,有优先级分组,有抢占优先级和子优先级的说法。 ?如何更改systick中断优先级:我们看一下中断优先级的第二个形参;:__NVIC_PRIO_BITS,官网给的备注是:STM32使用4位作为优先级,所以这个形参的官网给的值是4。在这个函数中,1左移4位,就是16,16-1=15。总共有4个位来表示优先级,15就是“1111”,也就是说,systick中断这个优先级永远是最低的。 比较内核和外设的中断优先级:自己先确定好外设的NVIC分组,systick就套用相同的分组方法。内核外设的中断优先级的四个位按照外设的中断优先级来分组来解析,即人为的分出抢占优先级和子优先级。例如:前面这个15,解析成4个位就为:1111。如果NVIC分组选择的是组1,即第一个1代表着主优先级,后面三个1代表着子优先级。这个时候,如果你想提高systick中断的优先级的话,就更改主/子优先级的大小,比外设的主/子优先级高就行(也就是上面4位2进制的数变低)。 所以:我们只需要更改“__NVIC_PRIO_BITS”这个变量的大小即可。 4.读取当前计数的值,计数器值清0(VAL寄存器)。 5.配置systick的时钟为AHB时钟,使能systick的中断,使能systick。 四、实验设计1-编写一个微秒延时函数 ?2-编写一个毫秒延时函数 方法有两种:通过查询标志位来写延时函数,通过使能中断来写延时函数 (1)?通过查询标志位来写延时函数? 先定义一个变量,循环一轮(1ms/us),然后在for循环里面等待到了我们规定的延时的时间(CTRL寄存器寄存器第16位为1),就完成了延时。
?(2)通过使能中断来写延时函数? 定义一个全局变量(毫秒和微秒要分开用),先把我们要延时的这个数值赋给这个全局变量,然后走一轮循环;在中断服务函数里面,找到systick的中断服务函数,每进一次中断这个全局变量就减一;建立while循环,减到了0之后失能systick。 中断函数文件内:
延时函数文件内:
|
|
嵌入式 最新文章 |
基于高精度单片机开发红外测温仪方案 |
89C51单片机与DAC0832 |
基于51单片机宠物自动投料喂食器控制系统仿 |
《痞子衡嵌入式半月刊》 第 68 期 |
多思计组实验实验七 简单模型机实验 |
CSC7720 |
启明智显分享| ESP32学习笔记参考--PWM(脉冲 |
STM32初探 |
STM32 总结 |
【STM32】CubeMX例程四---定时器中断(附工 |
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年12日历 | -2024/12/28 18:04:19- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |
数据统计 |