参考资料《 ARM Cortex™-M4F 技术参考手册》-4.5 章节 SysTick Timer(STK)

SysTick(系统滴答定时器),本质上就是一个内嵌在NVIC中的一个定时器,属于内核中的一个外设,是一个24位的向下递减的计数器,计数器每1/SYSCLK就减1,当寄存器的值减到0的时就会产生一次(硬件上的)中断,也有叫做滴答中断。主要的目的1、用来产生精确的延时。2、一般用于操作系统,用于产生时基,维持操作系统的心跳给操作系统提供一个单独的心跳(时钟)节拍。关于对于SyeTick的介绍我推荐看一下这位大神博客 https://blog.csdn.net/yx_l128125/article/details/7884423。

SysTick的寄存器总共有四个,在使用SysTick产生定时的时候,只需配置前三个寄存器,最后一个校准值寄存器不需要使用。

接下来对各个寄存器的描述

SysTick控制及状态寄存器CTRL主要用来读取当前数值寄存器里的值、选择时钟源、使能异常请求、使能定时器。

SysTick重装载数值寄存器LOAD主要是用来存储计数的值,最大为

SysTick当前数值寄存器VAL,每一个计数器每1/SYSCLK就减1,当减到0时,计数标志位置1,然后把重装载数值寄存器里的值写进当前数值寄存器,并清除计数标志位。

Sys校准数值寄存器CALIB

以上就是关于SysTick的介绍,接下来就要操作一下了,

我们要用SysTick来定时1S使LED灯状态变化一次,所以

1、首先,应先线配置SysTick相关寄存器,来产生1s的延时

2、初始化LED灯

3、编写主函数

由于Systick是嵌入在内核中的所以在硬件电路中只需要有LED模块即可,想要用SysTick实现流水灯1s切换一次状态的操作,首先就是要配置SysTick,这里我们直接用STM32官方额库函数SysTick_Config(uint32_t  ticks),在内核头文件core_cm4.h中,这个函数的功能是配置系统定时器和中断,并且打开SysTick,使计数器处于自由计数模式来产生一个周期性的中断。在这个函数中形参ticks是用来设置重装载寄存器的值,最大不能超过重装载寄存器的值,当重装载寄存器的值减到0时,就会产生一个中断,然后重装载寄存器的值又写入当前计数器中重新往下递减计数,以此循环。接下来这个库函数是给该中断配置中断优先级(关于中断优先级可以查看STM32中断及NVIC概述),然后给当前数值寄存器赋初值,接下来配置时钟源,使能中断,开启定时器。当返回0时,说明函数功能已经实现,返回1则表示失败。这个初始化函数主要是配置了SysTick中的三个寄存器:LOAD、VAL、CTRL,还调用了NVIC_SetPriority()配置中断优先级函数。

因为SysTick是内核中的外设,所以时钟选择为HCLK180MHz时钟

由于官方没有 SysTick的初始化函数,只有配置函数Config所以,我们自己简单的编写一个SysTick_Init()函数

因为HCLK为180MHz,所以当ticks=SystemFrequency/1000时(180 000 000/1000),每经过1/SystemFrequency一次,ticks的值就减1,所以计数时间为ticks/(1/SystemFrequency)=1ms,,所以我们配置的SysTick为10us进一次中断。

配置好SysTick后,我们只需要再定义一个变量来记录进入中断的次数N,N*SysTick就等于我们所要定时的时间。

nTime就是我进入SysTick中断的次数,每进入一次中断服务函数,TimingDelay就减1,当TimingDelay不等于0时,延时结束。

中断服务函数如下

关于SysTick配置已经描述完,接下来初始化LED灯。

关于LED的初始化我就不再做过多的描述,可以参考STM32固件库函数点亮LED灯,代码如下

#include "stm32f4xx_gpio.h"#define GPIO_R_Pin  GPIO_Pin_10
#define GPIO_R_Port GPIOH#define GPIO_G_Pin  GPIO_Pin_11
#define GPIO_G_Port GPIOH#define GPIO_B_Pin  GPIO_Pin_12
#define GPIO_B_Port GPIOH/************************控制LED灯亮灭的宏***************//*直接操作寄存器的方法控制IO*/#define  LED_PORT_OUT_HI(p,i)             { p->BSRRL = i ;}           //输出为高电平
#define  LED_PORT_OUT_LO(p,i)               { p->BSRRH = i ;}           //输出为低电平
#define  LED_PORT_OUT_Toggle(p,i)               { p->BSRRL ^= i ;}             //输出为反状态/*定义控制IO的宏*/#define LED_R_Toggle             LED_PORT_OUT_Toggle(GPIO_R_Port,GPIO_R_Pin)
#define LED_R_ON            LED_PORT_OUT_LO(GPIO_R_Port,GPIO_R_Pin)
#define LED_R_OFF           LED_PORT_OUT_HI(GPIO_R_Port,GPIO_R_Pin)#define LED_G_Toggle             LED_PORT_OUT_Toggle(GPIO_G_Port,GPIO_G_Pin)
#define LED_G_ON            LED_PORT_OUT_LO(GPIO_G_Port,GPIO_G_Pin)
#define LED_G_OFF           LED_PORT_OUT_HI(GPIO_G_Port,GPIO_G_Pin)#define LED_B_Toggle             LED_PORT_OUT_Toggle(GPIO_B_Port,GPIO_B_Pin)
#define LED_B_ON            LED_PORT_OUT_LO(GPIO_B_Port,GPIO_B_Pin)
#define LED_B_OFF           LED_PORT_OUT_HI(GPIO_B_Port,GPIO_B_Pin)#define LED_RGBOFF   LED_R_OFF;\LED_G_OFF;\LED_B_OFFvoid LED_GPIO_Config(void);
#include "bsp_led.h"/*** @brief  初始化控制LED的IO* @param  无* @retval 无*/
void LED_GPIO_Config(void)
{       /*定义一个GPIO_InitTypeDef类型的结构体*/GPIO_InitTypeDef GPIO_InitStructure;/*开启LED相关的GPIO外设时钟*/RCC_AHB1PeriphClockCmd ( LED1_GPIO_CLK|LED2_GPIO_CLK|LED3_GPIO_CLK, ENABLE); /*选择要控制的GPIO引脚*/                                                            GPIO_InitStructure.GPIO_Pin = LED1_PIN; /*设置引脚模式为输出模式*/GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;   /*设置引脚的输出类型为推挽输出*/GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;/*设置引脚为上拉模式*/GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;/*设置引脚速率为2MHz */   GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz; /*调用库函数,使用上面配置的GPIO_InitStructure初始化GPIO*/GPIO_Init(LED1_GPIO_PORT, &GPIO_InitStructure);    /*选择要控制的GPIO引脚*/                                                               GPIO_InitStructure.GPIO_Pin = LED2_PIN; GPIO_Init(LED2_GPIO_PORT, &GPIO_InitStructure); /*选择要控制的GPIO引脚*/                                                               GPIO_InitStructure.GPIO_Pin = LED3_PIN; GPIO_Init(LED3_GPIO_PORT, &GPIO_InitStructure); /*关闭RGB灯*/LED_RGBOFF;
}

配置好SysTick和LED后,接下来就开始写主函数

主函数如下

int main(void)
{/* LED 端口初始化 */LED_GPIO_Config();   /* 配置SysTick 为10us中断一次,时间到后触发定时中断,*进入stm32fxx_it.c文件的SysTick_Handler处理,通过数中断次数计时*/SysTick_Init();while(1){LED_RED; Delay_us(100000);     // 10000 * 10us = 1000ms//延时1sLED_GREEN;Delay_us(100000);      //延时1sLED_BLUE;Delay_us(100000);        //延时1s}
}

SysTick_系统定时器实现流水灯相关推荐

  1. 手把手讲解51单片机最小系统焊接、流水灯(跑马灯)编写以及烧录

    (1)首先当然是要购买"51单片机最小系统的散件",淘宝上面卖的比较多,散件的话一般二.三十元左右,其次还需要购买一个电烙铁,一般30瓦的就足够了,这里我就讲一讲51单片机散件的焊 ...

  2. 51单片机定时器实现流水灯实验

    实验内容:利用AT89C51的定时器0 方式1实现流水灯效果,并用仿真验证. 定时器0方式1的工作方式:定时器的工作方式选择由寄存器TMOD控制,方式选择通过M0和M1控制,方式1为16位定时器/计数 ...

  3. 流水灯c语言实验报告心得,嵌入式流水灯实验心得体会.docx

    嵌入式流水灯实验心得体会 嵌入式流水灯实验心得体会 篇一:嵌入式流水灯实验 实验三 GPIO输出控制实验 一. 实验目的 熟悉LPCXX系列ARM7微控制器的GPIO输入控制. 二.实验设备 ? 硬件 ...

  4. 80c51流水灯汇编语言,单片机AT89C51可控流水灯课程设计报告(汇编语言).docx

    单片机AT89C51可控流水灯课程设计报告(汇编语言).docx 目录目录1第一章 课题的意义及应用2第二章 系统的总体设计32.1 设计方法32.2 数码管显示方案32.3 键盘输入方案4第三章 硬 ...

  5. 单片机led流水灯实验c语言程序,单片机LED流水灯实验及流程图源代码详解

    利用实验室提供的单片机实验开发板的最小系统电路模块.流水灯电路模块,以及Protues仿真软件搭建电路,实现I/O口循环流水灯演示效果. LED流水灯控制电路如图2-1所示,八个LED灯D0-D7(可 ...

  6. Proteus绘制8086原理图以及编程实现流水灯

    文章目录 一.问题所在以及解决方案 二.在刚开始的时候也出现过如下的报错情况 三.编程实现LED由上到下逐个递增点亮,每隔一段时间点亮下一只,但前面的不灭. 一.问题所在以及解决方案 在上一篇文章中提 ...

  7. 基于STM32单片机流水灯仿真与程序设计

    STM32单片机流水灯仿真与程序设计 摘要 本次程序设计和仿真是基于Proteus和keil的环境对STM32F103系列单片机进行流水灯设计,通过配置STM32的GPIO工作模式,实现LED的点亮和 ...

  8. 实现流水灯以间隔500ms的时间闪烁(系统定时器SysTick实现的精确延时)

    /** ****************************************************************************** * @file main.c * ...

  9. c语言流水灯定时器延时,实现流水灯以间隔500ms的时间闪烁(系统定时器SysTick实现的精确延时)...

    /** ****************************************************************************** * @file main.c * ...

最新文章

  1. 丰田、福特们的焦虑:2018才大举杀入自动驾驶,是刚刚好还是已经晚了?
  2. [攻防世界 pwn]——pwn-100
  3. python排名分析_用Python分析了近几年胡润排行榜,我酸了……
  4. 大数据时代,还不认识这些数据分析工具?
  5. [转载]我的WafBypass之道(upload篇)
  6. 我以订披萨为例,给朋友详细讲了Java设计模式的3种工厂模式
  7. Python3 GUI:PyQt5环境搭建
  8. 这个星期压力貌似比较大啊!
  9. 力扣-973. 最接近原点的 K 个点
  10. 正在启动文档服务器,正在启动远程服务器
  11. cloc统计代码行数
  12. Transformer 权重共享
  13. java大作业私人管家系统_微软蓝天云平台:中小企业的私人管家
  14. Android Studio如何连接手机设备
  15. 2018电赛手势识别比赛经历
  16. 如果让你只推荐一本nbsp;Javaamp;nbs…
  17. 【数仓设计】宽表和窄表
  18. ABA问题(狸猫换太子)
  19. 25 个很棒的 Python 脚本(迷你项目)的集合
  20. 搜狗搜索推广Api在postman中的使用

热门文章

  1. 数据科学中费米估算法的应用:如何估算一个城市加油站的数量?
  2. 计算机组成原理实验脱机运算器,实验三:脱机运算器实验报告.pdf
  3. Java使用163和QQ邮箱发邮件
  4. 微信内H5打开小程序
  5. PMP五大过程组十大知识领域四十九大过程总结( 5+10+49)
  6. 虚拟机安装的CentOS系统不能上网解决办法
  7. GN的使用 - GN工具
  8. 频繁刷机,今日刷机为1.30.111WWE
  9. Roformer:Enhanced Transformer with rotary position embedding
  10. Nginx+Gunicorn+virtualenv+supervisord+Postgresql部署Django应用