[学习笔记]STM32F1 SYSTICK 滴答定时器(寄存器、标准库、HAL库)
目录
0. 博主理解:
1. 实验内容及步骤:
2. 硬件说明
3. 寄存器说明
3.1 SysTick的时钟和使能:
3.2 SysTick重装载数值寄存器:
3.3 SysTick的中断优先级:
3.4 SysTick的中断函数:
4. 程序设计(寄存器)
5. 程序设计(标准库)
6. 程序设计(HAL库)
7. 实验结果
8. 源码下载
7.SYSTICK 滴答定时器
0. 博主理解:
SysTick就是一个定时器,只不过这个定时器是属于Cortex-M3内核中的(就是说所有的M3内核的芯片都有这个定时器),起到兼容的作用。这个定时器通常用于操作系统的“心跳”;在裸机中通常用其充当延时作用。
1. 实验内容及步骤:
实验内容:
通过SysTick滴答定时器实现每隔1S钟,串口输出“1S SysTick”
步骤:
1.配置SysTick控制及状态寄存器(选择时钟源、使能SysTick、使能中断);
2.配置SysTick重装载数值寄存器(装入倒计时的值);
3.配置SysTick的中断优先级;
4.配置SysTick的中断函数。
2. 硬件说明
无。
3. 寄存器说明
参考“STM32F10xxx Cortex-M3编程手册-英文版”,“Cortex-M3权威指南(中文)”
3.1 SysTick的时钟和使能:
配置SysTick控制及状态寄存器(地址:0xE000_E010)(STK_CTRL)
主要说明寄存器的第二位CLKSOURCE,0=AHB/8;1=AHB
在本实验中设置Systick定时器,选择时钟源为内核时钟(1=AHB=72M),使能Systick和SysTick异常请求(即中断)。
STK_CTRL = 0x0007;
3.2 SysTick重装载数值寄存器:
SysTick每次都会从重装载值开始减,减到0是就会产生异常,并且重新将重装载寄存器的值装到计数器里面,以此循环。建议产生中断的值不要太短,太短会导致系统频繁进入中断,增加CPU的负担。这里我们设置重装载的值为10ms。
SysTick重装载寄存器(地址:0xE000_E014,STK_LOAD)
在本实验中设置SysTick为10ms定时器,因为上一步中选择的时钟源为内核时钟(1=AHB=72M),以此当重装载值为720000时,倒计时到0的时间就为10ms。
STK_LOAD = 720000;
3.3 SysTick的中断优先级:
配置SysTick的中断优先级与外部中断优先级的寄存器不一样,严格来说SysTick的优先级为异常优先级。其寄存器如下所示
系统异常优先级寄存器阵列(地址:0xE000_ED18 - 0xE000_ED23,SHPRx)
本实验中配置SysTick的中断优先级为15,即优先级最低。
SHPR12 = 15<<4; (因为高四位才是配置优先级的有效位,所以要左移四位)
3.4 SysTick的中断函数:
在startup_stm32f10x_hd.s中可以找到SysTick的中断函数为SysTick_Handler
实验中需要定时1S,而SysTick的定时器为10ms,因此进入100次中断时,则代表以及定时了1S。定义一个变量初始值为100,进入一次中断就减1,最后减到0时,则代表以及定时了1S,再进行相应的操作。
4. 程序设计(寄存器)
源码: 这里是帅选了关键部分,详细看源码。
#define SysTick_FCLK_10ms 720000
#define SET_SYS_IP(IRQx,pp) SCB->SHP[((uint32_t)(IRQx) & 0xF)-4]= pp<<4 //设置异常优先级u16 systick_1s=100;
//SYSTICK初始化
void Systick_Config(void)
{//重装载值SysTick->LOAD = SysTick_FCLK_10ms;SysTick->CTRL = SysTick_CTRL_CLKSOURCE_Msk | //使用内部时钟72M SysTick_CTRL_TICKINT_Msk | //开启中断SysTick_CTRL_ENABLE_Msk; //使能Systick SET_SYS_IP(SysTick_IRQn,15);
}void SysTick_Handler()
{if(systick_1s!=0)systick_1s--;
}/**********************main***************************/
//主函数
int main(void)
{SET_NVIC_GROUP(NVIC_PriorityGroup_4); //中断组4Systick_Config(); //初始化SysTick定时器
………(省略)USART1_Config(115200); //串口1配置115200while (1){
………(省略)if(systick_1s == 0) //判断是否到1S{systick_1s = 100; //重新赋值1SUSART1_Sends((u8*)"1S SysTick\r\n");}}
}
5. 程序设计(标准库)
在core_cm3.h文件中已经有SysTick的配置函数了,如下所示
其配置方式与我们寄存器配置的方式一样,就不详细讲解了。
输入参数为重装载的值,即720000(10ms Systick中断)
中断函数和主函数部分与寄存器的一致。
源码:这里是帅选了关键部分,详细看源码。
#define SysTick_FCLK_10ms 720000//主函数
int main(void)
{NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4); //设置中断优先组4
………(省略)SysTick_Config(SysTick_FCLK_10ms);USART1_Config(); //串口1配置115200while (1){
………(省略)if(systick_1s == 0){systick_1s = 100; //重新赋值1SUSART1_Sends((u8*)"1S SysTick\r\n");}}
}void SysTick_Handler()
{if(systick_1s!=0)systick_1s--;
}
6. 程序设计(HAL库)
在HAL中,SysTick的配置函数与标准库的一致,在core_cm3.h文件中。
源码:这里是帅选了关键部分,详细看源码。
#define SysTick_FCLK_10ms 720000u16 systick_1s=100; void SysTick_Handler()
{if(systick_1s!=0)systick_1s--;
}/*********************main函数*****************************/
int main(void)
{HAL_Init();SystemClock_Config();SysTick_Config(SysTick_FCLK_10ms); //设置SysTick定时器10msLED_GPIOX_Config(); //LED初始化KEY_EXTI_Config(); //按键中断初始化USART1_Config(); //串口1配置115200printf("SysTick_Test\r\n");while (1){if(systick_1s == 0) //判断1S{systick_1s = 100; //重新赋值1SUSART1_Sends((u8*)"1S SysTick\r\n");}}
}}
7. 实验结果
串口助手每隔1S就会输出“1S SysTick”。
8. 源码下载
源码下载
[学习笔记]STM32F1 SYSTICK 滴答定时器(寄存器、标准库、HAL库)相关推荐
- 滴答定时器的计数模式_【高手私藏】STM32学习笔记:SysTick滴答时钟
今天我们来说说SysTick定时器.SysTick定时器在从参考手册中根本没有介绍.我费了九牛二虎之力才在一个犄角格拉里找到SysTick定时器的英文版的说明.在Cotex-M3有介绍,为什么要找ST ...
- Systick滴答定时器寄存器、delay()延时函数、SysTick_Config函数
SysTick定时器 SysTick定时器,是一个简单的定时器,对于CM3.CM4内核的芯片都有SysTick定时器.SysTick 是一个 24 位的倒计数定时器,当计数到 0 时,将从RELOAD ...
- STM32 SysTick 滴答定时器原理及应用
SysTick滴答定时器 一.功能 SysTick定时器是一个简单的定时器,CM3\CM4内核芯片都具备此定时器.SysTick定时器常用来做延时,采用实时系统时则用来做系统时钟. 无论用作延时还是用 ...
- Systick滴答定时器解析
Systick滴答定时器 Systick定时器是什么 Systick定时器,是一个简单的定时器,对于CM3,CM4内核芯片,都有Systick定时器. Systick定时器常用来做延时,或者时系统的心 ...
- STM32F4无人机Systick滴答定时器
更多交流欢迎关注作者抖音号:81849645041 目标 了解 ARM Cortex-M 系列芯片的内部时钟及定时器使用,通过配置 STM32F407 芯片的内部定时器,实现流水灯效果. 原理 Sys ...
- 滴答定时器的计数模式_Cortex-M4 Systick滴答定时器
Tickclock可以实现精确延时,在K60的datasheet中没有详细将,现在我把我找到资料分享一下,关于systick在Cortex-M4中有讲到我们大家平常在单片机开发中经常会使用到延时函数, ...
- Systick滴答定时器讲解
Systick定时器基础知识讲解: Systick定时器,是一个简单的定时器,对于CM3,CM4内核芯片,都有- Systick定时器. Systick定时器常用来做延时,或者实时系统的心跳时钟.这样 ...
- [STM32F1]STM32F103滴答定时器定时不准?)
STM32F103滴答定时器定时不准? 前几天调了1块F103ZET6的开发板,用了个系统定时器,感觉不准,最终找到原因是因为选错了时钟源. 今天来分享一下也算是给大家以后出现问题做个参考 ...
- hal库选择滴答时钟函数_stm32h7“理解hal库框架”
1.按照初始化流程调用的hal库文件 完成初始化工作需要调用到的hal库文件,如下表 序号功能调用hal库文件 1Module Selection(模块选择) Oscillator Values ad ...
最新文章
- 谈谈近况,谈谈自由职业,谈谈金饭碗
- 来客推开源商城与你浅析:B2B2C多商户商城系统
- 解决 android 高低版本 webView 里内容 自适应屏幕的终极方法
- net use 命令集合详解
- JavaScript技巧
- shiro执行多个过滤器_Shiro 实战(四) - 过滤器机制
- js高级学习笔记(b站尚硅谷)-13-作用域链
- XPS Viewer 无法设置权限账户 - 无法激活此计算机上的任何权限管理账户
- java——编程案例
- 【烈日炎炎战后端】JAVA多线程(11.2万字)
- SDS 2.0:能否让高端存储服“软”?
- 修改this指向的方法
- 12V转3.3V稳压芯片
- 什么是API接口?给大家举例说明
- 通俗易懂理解几何光学(四)光学系统中的光阑与光束限制
- 2021.05.15智能风控峰会之流量反作弊论坛-论坛笔记
- scala 环境搭建 变量 值 数据类型 元组 表达式块 语句 函数 柯里化 集合 面向对象 隐式转换
- make[2]: *** [/home/nnnn/calibration/devel/lib/libcalibrationtoolkit.so] Error 1
- Leapfrog Triejoin:最坏情况下的最优连接算法
- C++中int a和int a的区别
热门文章
- 情感分析论文阅读之《Aspect Level Sentiment Classification with Deep Memory Network》
- 如何查找自己的微信公众号主页并复制链接
- 拉卡拉智能POS的应用前景及技术方案盘点
- 扁平化图标!让total commander跟上时代潮流!
- nodejs项目实例拼车租车平台
- 上线11年公众号广告大变天!最新政策解读|西瓜数据
- 三网融合音视频新的机遇
- 关于编程与数学的名言金句——字字珠玑
- Redis 数据类型与使用命令大全以及Java使用
- caffe 训练手写字体HWDB1.1trn_gnt.zip HWDB1.1tst_gnt.zip并测试完整超详尽攻略