| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 嵌入式 -> STM32F407 SysTick简介 -> 正文阅读 |
|
[嵌入式]STM32F407 SysTick简介 |
一.系统定时器 1.简介 SysTick:系统定时器(又叫滴答定时器),24位,只能递减,存在于内核,嵌套在NVIC中,所有的cortex-M内核的单片机都具有这个定时器。 《STM32中文参考手册》P108 RCC 向 Cortex 系统定时器 (SysTick) 馈送 8 分频的 AHB 时钟 (HCLK)。SysTick 可使用此时钟作为时钟源,也可使用 HCLK 作为时钟源,具体可在 SysTick 控制和状态寄存器中配置。 也就是SysTick的时钟可以有168M,也可以有21M。 2.工作原理 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?? 3.频率的概念 物质在1s内完成周期性变化的次数叫做频率,常用f表示。为了纪念德国物理学家赫兹的贡献,人们把频率的单位命名为赫兹,简称“赫”,符号为HZ。 我们的时钟频率168M? 等于168000000hz? 也就是说完成168000000次计数就是1s 1s=1000ms=1000000us 怎么样使用SysTick实现1us的延时? 假如我们默认时钟,那么systick的时钟为AHB的时钟168M 8分频,就是21M 也就是1S计数21x10^6,即1x10^6us计数这么多次,可得1us计数21次。也是计数21次就可以延时1us 二.最大定时时间 1.确定最大的计数值2^24 -1,若计算到0,则进行2^24次计数。 1000ms Tmax -------- = -------- 168000000 2^24 Tmax = 2^24 *1000ms/168000000 = 99.86ms。 2.测试结果 初始化系统定时器,1S 内核触发 1000 次中断,说白了定时 1ms,能够成功 SysTick_Config(SystemCoreClock/1000); 初始化系统定时器,1S 内核触发 10 次中断,说白了定时 100ms,现象失败 SysTick_Config(SystemCoreClock/10); 初始化系统定时器,1S 内核触发 11 次中断,说白了定时 90.90ms,能够成功 SysTick_Config(SystemCoreClock/11); 总结:填写中断频率值不能小于11,否则定时时间不准确。 SysTick_Config(SystemCoreClock/11); 3.系统定时器的用途
二.延时函数 1.相关寄存器 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??? SysTick->CTRL 的各位定义如图 所示: SysTick-> LOAD 的定义如图?所示: SysTick-> VAL 的定义如图? 所示: 2.毫秒级延时函数 void delay_ms(uint32_t ms) { ? ? while(ms --) ? ?{ SysTick->CTRL = 0; // 关闭系统定时器后才能配置寄存器 SysTick->LOAD = 21000; // 设置计数值,用于设置定时的时间 SysTick->VAL = 0; // 清空当前值还有计数标志位 SysTick->CTRL = 1; // 使能系统定时器工作,且时钟源为系统时钟的8分频(168MHz/8=21MHz) while ((SysTick->CTRL & (1<<16))==0); // 等待系统定时器计数完毕 SysTick->CTRL = 0; // 关闭系统定时器 ? ? } } 3.微秒和毫秒延时的优化[拓展],官方代码没有想到意外关闭的问题 int32_t delay_us(uint32_t nus) { uint32_t temp; SysTick->CTRL = 0; SysTick->LOAD = (nus*21)-1; SysTick->VAL = 0; SysTick->CTRL = 1; while(1) { temp=SysTick->CTRL; //检测count flag if (SysTick->CTRL & 0x00010000) break; //检测系统定时器是否意外关闭 if((SysTick->CTRL & 0x1)==0) return -1; } SysTick->CTRL = 0; return 0; } int32_t delay_ms(uint32_t nms) { uint32_t t = nms; uint32_t temp; while(t--) { SysTick->CTRL = 0; SysTick->LOAD = 21000-1; SysTick->VAL = 0; SysTick->CTRL = 1; while(1) { temp=SysTick->CTRL; //检测count flag if(SysTick->CTRL & 0x00010000) break; //检测系统定时器是否意外关闭 if((SysTick->CTRL & 0x1)==0) return -1; ? ? ? } } SysTick->CTRL = 0; return 0; } |
|
嵌入式 最新文章 |
基于高精度单片机开发红外测温仪方案 |
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年11日历 | -2024/11/25 18:15:40- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |