STM32 系统滴答定时器(Systick) 彻底研究、完美解读并且免费,鄙视5个下载券的二货
更新时间:2023-11-09 17:20:01 阅读量: 教育文库 文档下载
- stm32推荐度:
- 相关推荐
STM32 系统滴答定时器(Systick) 彻底研究解读
stm32 系统滴答定时器(Systick) 彻底研究解读
SysTick 起那些 TIM 定时器可以说简单多啦~~~~~哥的心情也好了不少,嘎嘎!!
arm Cortex-M3 内核的处理器内部包含了一个 SysTick 定时器,它是一个24 位的倒计数定时器,注意,是倒计数!当计到 0 时它就会从 LOAD 寄存器中自动重装载定时初值。只要不把 CTRL 寄存器中的 ENABLE 为清 0,它就永不停息!遗憾的是,Sy sTick 定时器在《STM32 参考手册》里一个屁都没放,只有在《ARM Cortex-M3 技术参考手册》和《ARM Cortex-M3 权威指南》才找到相关寄存器的介绍。 一、SysTick 的时钟来源 我先来看看 STM32 的时钟树
The RCC feeds the Cortex Sy stemTimer (SysTick) external clock with the AHB clock(HCLK) divided by 8.The SysTick can work either with this clock or with the Cortex clock(HCLK), configurable in the Sy sTick Control and Status Register. 上面这段话的意思是,SysTick的时钟来源可以是HCLK的8分频或就是HCLK, 具体是哪种可通过配置“控制和状态寄存器(CTRL)”来选择。 二、SysTick的寄存器简介 SysTick的寄存器一共有4个。
另外还有一个校准值寄存器CALIB,暂时用不到,先不刁它! 三、SysTick的库函数
1、寄存器定义在哪里?答:在core_cm3.h中! ty pedef struct {
__IO uint32_t CTRL; __IO uint32_t LOAD; __IO uint32_t V AL; __I uint32_t CALIB; } SysTick_Ty pe; …
#define SysTick ((SysTick_Ty pe *) SysTick_BASE) 2、函数在哪里?
在V3.3的函数库中关于SysTick的函数只有两个。一个是在misc.C文件中的SysTick_CLKSourceConfig函数,它是一个时钟源配置函数;另一个是在core_cm3.h文件中的SysTick_Config函数,它的输入参数只有一个,传给了重装值寄存器LOAD,另外还将VAL寄存器清0了,此外还将CTRL寄存器中的[2:0]三位都设为了1,分别是使用HCLK时钟,允许异常请求,开启计数器。
在 misc.C 文件最后有下面一个函数 /**
*@功能: 配置 SysTick 时钟源
*@输入参数: SysTick_CLKSource: 指定 SysTick 时钟源. * 该参数可以是以下其中一个值:
* @ SysTick_CLKSource_HCLK_Div8: AHB 时钟 8 分频作为 Sy sTick 时钟源 * @ SysTick_CLKSource_HCLK: AHB 时钟作为 SysTick 时钟源. */
void SysTick_CLKSourceConfig(uint32_t Sy sTick_CLKSource) {
/* 参数检查 */
assert_param(IS_SYSTICK_CLK_SOURCE(Sy sTi ck_CLKSource)); if(SysTick_CLKSource == SysTick_CLKSource_HCLK) {
SysTick->CTRL |= SysTi ck_CLKSource_HCLK; }
else {
SysTick->CTRL &= SysTick_CLKSource_HCLK_Div8; } }
在 core_cm3.h 中有一个 SysTick_Config 函数
/* ############### Sy sTick 函数 ################### */ #if (!defined(__Vendor_Sy sTickConfig )) ||(__Vendor_SysTickConfig == 0) /**
* @功能 初始化并开启 Sy sTick 计数器及其中断 *@输入参数 ticks 两次中断间的 ticks 数值 *@返回值 1 = 失败, 0=成功
* 初始化系统滴答定时器及其中断并开启系统滴答定时器在自由运行模式下以产生周期中断 */
static __INLINE uint32_t SysTick_Config(uint32_t ticks) {
if(ticks > SysTick_LOAD_RELOAD_Msk) return(1);
/* 重装值超过了 24 位,是不可能的。返回失败值 0 */ SysTick->LOAD =(ticks & SysTick_LOAD_RELOAD_Msk) - 1; /* 设置重装载寄存器 */
NVIC_SetPriority(SysTick_IRQn, ( 1<<__NVIC_PRIO_BITS) - 1); /* 设置优先级 for Cortex-M0 系统中断 */ SysTick->VAL = 0; /* 装载计数器值(当前计数值清 0) */ SysTick->CTRL = SysTick_CTRL_CLKSOURCE_Msk |
Sy sTick_CTRL_TICKINT_Msk| SysTick_CTRL_ENABLE_Msk; /* 使能 Sy sTick 中断请求和 Sy stick 定时*/ return(0); /* 成功,返回 0 */ } #endif
3、编写一个精确延时函数!
鉴于SysTick的寄存器比较少,库函数也没写出啥玩意。所以完全有信心用寄存器的方法写出一个SysTick精确延时函数。偷学了网上的一点程序,写出了如下的函数,比网上的还精简了几行,哈哈! /* 微秒级精确延时函数 */
void Delay_us(uint32_t n) ////////延时多少微秒,n 就输入多少! {
SysTick->LOAD=72*n; //装载计数值,因为时钟 72M,72 次在 1μs SysTick->CTRL=0x00000005;//时钟来源设为为 HCLK(72M),打开定时器 while(! (SysTick->CTRL&0x00010000)); //等待计数到 0 SysTick->CTRL=0x00000004;//关闭定时器 }
编写一个点亮LED的函数测试一下。 int main(void) {
GPIO_Configuration(); while(1)
{
GPIO_SetBits(GPIOD, GPIO_Pin_3); //输出高电平 Delay_us(10); //精确延时 10μs GPIO_ResetBits(GPIOD, GPIO_Pin_3); //输出低电平 Delay_us(10); //精确延时 10μs } }
经示波器测试,发现确实很准,嘎嘎~~~△X=10.5μs,那0.5μs的误差来自哪里呢?因为要调用GPIO和Delay _us函数,包括Dealy _us函数中的几条设置语句, 所以说还是相当准的!嘎嘎 ~~~~~~~~~~
正在阅读:
STM32 系统滴答定时器(Systick) 彻底研究、完美解读并且免费,鄙视5个下载券的二货11-09
地表水环境监测方案04-10
高考语文词语拼音12-29
2015年菏泽公务员考试:行测必学技巧之速解不定方程01-17
微观参考复习题版本3 - 图文11-03
数值课设06-12
八上数学培优之全等三角形01-29
弯道跑教学设计02-23
张庆军同志在全市加快经济创新转型升级发展动员大会上讲话(2015.5)12-02
拉赞助策划书写法(精选多篇)04-09
- exercise2
- 铅锌矿详查地质设计 - 图文
- 厨余垃圾、餐厨垃圾堆肥系统设计方案
- 陈明珠开题报告
- 化工原理精选例题
- 政府形象宣传册营销案例
- 小学一至三年级语文阅读专项练习题
- 2014.民诉 期末考试 复习题
- 巅峰智业 - 做好顶层设计对建设城市的重要意义
- (三起)冀教版三年级英语上册Unit4 Lesson24练习题及答案
- 2017年实心轮胎现状及发展趋势分析(目录)
- 基于GIS的农用地定级技术研究定稿
- 2017-2022年中国医疗保健市场调查与市场前景预测报告(目录) - 图文
- 作业
- OFDM技术仿真(MATLAB代码) - 图文
- Android工程师笔试题及答案
- 生命密码联合密码
- 空间地上权若干法律问题探究
- 江苏学业水平测试《机械基础》模拟试题
- 选课走班实施方案
- 定时器
- 滴答
- 鄙视
- 解读
- 彻底
- 并且
- Systick
- 完美
- 研究
- 系统
- STM32
- 免费
- 下载