SysTick寄存器介绍

SysTick寄存器总汇

寄存器名称 寄存器描述
CTRL SysTick控制及状态寄存器
LOAD SysTick重装载数值寄存器
VAL SysTick当前数值寄存器
CALIB SysTick校准数值寄存器

①SysTick控制及状态寄存器

位段 名称 类型 复位值 描述
16 COUNTFLAG R/W 0 如果在上次读取本寄存器后,SysTick已经计到了0,则该位为1
2 CLKSOURCE R/W 0 时钟源选择位,0=AHB/8,1=处理器时钟AHB
1 TICKINT R/W 0 1:SysTick倒数计数到0时产生SysTick异常请求,0:计数到0时无动作
0 ENABLE R/W 0 SysTick定时器的使能位

②SystTick重装载数值寄存器

位段 名称 类型 复位值 描述
23:0 RELOAD R/W 0 当倒数计数至0时,将被重装载的值

③SysTick当前数值寄存器

位段 名称 类型 复位值 描述
23:0 CURRENT R/W 0 读取时返回当前倒数计数的值,写它则使之清零,同时还会清除在SysTick控制及状态寄存器中的COUNTFLAG标志

SysTick定时实验

编程要点

1)设置重装载寄存器的值。
2)清除当前数值寄存器的值。
3)配置控制与状态寄存器。

bsp_led.c文件

#include "./led/bsp_led.h"   void LED_GPIO_Config(void)
{       GPIO_InitTypeDef GPIO_InitStructure;RCC_APB2PeriphClockCmd( LED1_GPIO_CLK | LED2_GPIO_CLK | LED3_GPIO_CLK, ENABLE);GPIO_InitStructure.GPIO_Pin = LED1_GPIO_PIN;    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;   GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(LED1_GPIO_PORT, &GPIO_InitStructure);  GPIO_InitStructure.GPIO_Pin = LED2_GPIO_PIN;GPIO_Init(LED2_GPIO_PORT, &GPIO_InitStructure);GPIO_InitStructure.GPIO_Pin = LED3_GPIO_PIN;GPIO_Init(LED3_GPIO_PORT, &GPIO_InitStructure);GPIO_SetBits(LED1_GPIO_PORT, LED1_GPIO_PIN);GPIO_SetBits(LED2_GPIO_PORT, LED2_GPIO_PIN);     GPIO_SetBits(LED3_GPIO_PORT, LED3_GPIO_PIN);
}

bsp_led.h文件

#ifndef __LED_H
#define __LED_H#include "stm32f10x.h"#define LED1_GPIO_PORT       GPIOB
#define LED1_GPIO_CLK       RCC_APB2Periph_GPIOB
#define LED1_GPIO_PIN       GPIO_Pin_5                 #define LED2_GPIO_PORT       GPIOB
#define LED2_GPIO_CLK       RCC_APB2Periph_GPIOB
#define LED2_GPIO_PIN       GPIO_Pin_0                #define LED3_GPIO_PORT        GPIOB
#define LED3_GPIO_CLK       RCC_APB2Periph_GPIOB
#define LED3_GPIO_PIN       GPIO_Pin_1                #define ON  0
#define OFF 1#define LED1(a)    if (a)  \GPIO_SetBits(LED1_GPIO_PORT,LED1_GPIO_PIN);\else       \GPIO_ResetBits(LED1_GPIO_PORT,LED1_GPIO_PIN)#define LED2(a)    if (a)  \GPIO_SetBits(LED2_GPIO_PORT,LED2_GPIO_PIN);\else       \GPIO_ResetBits(LED2_GPIO_PORT,LED2_GPIO_PIN)#define LED3(a)    if (a)  \GPIO_SetBits(LED3_GPIO_PORT,LED3_GPIO_PIN);\else       \GPIO_ResetBits(LED3_GPIO_PORT,LED3_GPIO_PIN)#define    digitalHi(p,i)       {p->BSRR=i;}
#define digitalLo(p,i)       {p->BRR=i;}    #define LED1_TOGGLE      digitalToggle(LED1_GPIO_PORT,LED1_GPIO_PIN)
#define LED1_OFF           digitalHi(LED1_GPIO_PORT,LED1_GPIO_PIN)
#define LED1_ON            digitalLo(LED1_GPIO_PORT,LED1_GPIO_PIN)#define LED2_TOGGLE        digitalToggle(LED2_GPIO_PORT,LED2_GPIO_PIN)
#define LED2_OFF           digitalHi(LED2_GPIO_PORT,LED2_GPIO_PIN)
#define LED2_ON            digitalLo(LED2_GPIO_PORT,LED2_GPIO_PIN)#define LED3_TOGGLE        digitalToggle(LED3_GPIO_PORT,LED3_GPIO_PIN)
#define LED3_OFF           digitalHi(LED3_GPIO_PORT,LED3_GPIO_PIN)
#define LED3_ON            digitalLo(LED3_GPIO_PORT,LED3_GPIO_PIN)void LED_GPIO_Config(void);#endif /* __LED_H */

bsp_SysTick.h文件

#ifndef __SYSTICK_H
#define __SYSTICK_H#include "stm32f10x.h"void SysTick_Init(void);
void Delay_us(__IO u32 nTime);
#define Delay_ms(x) Delay_us(100*x)  //单位msvoid SysTick_Delay_Us( __IO uint32_t us);
void SysTick_Delay_Ms( __IO uint32_t ms);#endif /* __SYSTICK_H */

bsp_SysTick.c文件

#include "bsp_SysTick.h"
#include "core_cm3.h"
#include "misc.h"static __IO u32 TimingDelay;/*启动系统嘀嗒定时器*/
void SysTick_Init(void)
{/* SystemCoreClock / 1000    1ms中断一次* SystemCoreClock / 100000  10us中断一次* SystemCoreClock / 1000000 1us中断一次*/if (SysTick_Config(SystemCoreClock / 100000)){ /* Capture error */ while (1);}
}/*
Delay_us(1):实现1x10us = 10us延时
*/
void Delay_us(__IO u32 nTime)
{ TimingDelay = nTime; //使能嘀嗒定时器SysTick->CTRL |=  SysTick_CTRL_ENABLE_Msk;while(TimingDelay != 0);
}//获取节拍程序,在SysTick中断函数SysTick_Handler()中调用
void TimingDelay_Decrement(void)
{if (TimingDelay != 0x00){ TimingDelay--;}
}#if 0
// 这个固件库函数在core_cm3.h中
static __INLINE uint32_t SysTick_Config(uint32_t ticks)
{ // reload 寄存器为24bit,最大值为2^24if (ticks > SysTick_LOAD_RELOAD_Msk)  return (1);// 配置reload初始值    SysTick->LOAD  = (ticks & SysTick_LOAD_RELOAD_Msk) - 1;//配置中断优先级为:1<<4-1 = 15,优先级为最低NVIC_SetPriority (SysTick_IRQn, (1<<__NVIC_PRIO_BITS) - 1); //配置counter计数器的值SysTick->VAL   = 0;//配置systick的时钟为72M//中断使能//使能systickSysTick->CTRL  = SysTick_CTRL_CLKSOURCE_Msk|SysTick_CTRL_TICKINT_Msk|SysTick_CTRL_ENABLE_Msk;                    return (0);
}
#endif// couter减一的时间等于1/systick_clk
//当counter 从reload 的值减小到0的时候,为一个循环,如果开启了中断则执行中断服务程序。
//同时CTRL的countflag位会置1
//这一个循环的时间为:reload * (1/systick_clk)void SysTick_Delay_Us( __IO uint32_t us)//SysTick微妙级延时
{uint32_t i;SysTick_Config(SystemCoreClock/1000000);for(i=0;i<us;i++){//当计数器的值减到0的时候,CRTL寄存器的位16会置1while( !((SysTick->CTRL)&(1<<16)) );}//关闭SysTick定时器SysTick->CTRL &=~SysTick_CTRL_ENABLE_Msk;
}void SysTick_Delay_Ms( __IO uint32_t ms)//SysTick毫秒级延时
{uint32_t i;    SysTick_Config(SystemCoreClock/1000);for(i=0;i<ms;i++){//当计数器的值减少到0的时候,CRTL寄存器的位16会置1//当置1时,读取该位会清0while( !((SysTick->CTRL)&(1<<16)) );}//关闭SysTick定时器SysTick->CTRL &=~ SysTick_CTRL_ENABLE_Msk;
}

main.c文件

#include "stm32f10x.h"
#include "bsp_SysTick.h"
#include "bsp_led.h"int main(void)
{   /* LED端口初始化 */LED_GPIO_Config();/* 配置SysTick 为10us中断一次*/SysTick_Init();
#if 0 for(;;){LED1( ON ); Delay_us(100000);     // 100000 * 10us = 1000ms//Delay_ms(100);LED1( OFF );LED2( ON );Delay_us(100000);      // 100000 * 10us = 1000ms//Delay_ms(100);LED2( OFF );LED3( ON );Delay_us(100000);      // 100000 * 10us = 1000ms//Delay_ms(100);LED3( OFF );}
#elsefor(;;){LED1( ON ); SysTick_Delay_Ms( 1000 );LED1( OFF );LED2( ON );SysTick_Delay_Ms( 1000 );LED2( OFF );LED3( ON );SysTick_Delay_Ms( 1000 );LED3( OFF );}
#endif
}

运行结果

STM32系统定时器闪烁LED灯相关推荐

  1. 瑞萨开发记录02:定时器闪烁LED灯(R5F104FEA芯片)

    02.定时器闪烁lED灯 一.引脚配置 1.配置LED 2.配置定时器 二.编写代码 1.定时器定时 2.LED引脚定义 3.主函数 三.烧录程序   上一篇博客记录了点亮一颗LED灯以及工程文件的配 ...

  2. 嵌入式小白学习:STM32实现定时器控制LED灯

    嵌入式小白学习:STM32实现定时器控制LED 目录 嵌入式小白学习:STM32实现定时器控制LED Part1.理论基础 Part2.环境的配置 Part3.代码的更改 Part4.实物的连线 Pa ...

  3. STM32系统定时器SysTick(只能向下递减)延时闪烁灯

    参考:stm32 系统定时器 SysTick 作者:点灯小哥 发布时间: 2021-03-10 13:46:00 网址:https://blog.csdn.net/weixin_46016743/ar ...

  4. STM32定时器控制LED灯闪烁及PWM练习

    一.STM32定时器控制LED灯闪烁 1.相关配置 1)配置RCC和SYS 2)配置IO 配置PC15,并命名为D1. 3)配置定时器 选定时器2,配置Clock Source为Internal Cl ...

  5. STM32实现定时器控制LED闪烁

    文章目录 一.定时器介绍 二.STM32C配置项目 1.新建工程 2.配置引脚 3.配置SYS 4.配置GPIO 5.配置定时器 6.配置中断 7.时钟配置 8.创建代码 三.修改keil代码 四.实 ...

  6. STM32汇编语言点亮led灯

    STM32汇编语言点亮led灯 首先,这篇blog的主要内容是在C语言中调用汇编语言写的函数.即在我们常用的标准库函数工程中,对外设(这里指led)使用汇编语言完成相关的寄存器配置和控制. 一.背景 ...

  7. STM32驱动全彩LED灯模块WS2812

    STM32驱动全彩LED灯模块WS2812 WS2812全彩LED灯模块系列,可以进行级联实现灯带的效果,MCU端通过一个管脚可以控制所有级联的LED灯的不同发光颜色显示. 级联电路 WS2811(未 ...

  8. 点亮stm32开发板的led灯

    点亮stm32开发板的led灯 简述 我使用的是STM公司stm32f103系列开发板,我们通过看原理图,对LED进行操作,以实现led灯的控制.(对于小白来说很有作用哈!废话不说,上料!) 1.查看 ...

  9. 闪烁LED灯Verilog

    1.计数器工作原理 计数器的核心元件是触发器,基本功能是对脉冲进行计数,其所能记忆脉冲最大的数目称为该计数器的模/值.计数器常用在分频.定时等处.计数器的种类很多,按照计数方式的不同可以分为二进制计数 ...

  10. STM32实现定时器和LED呼吸灯

    目录 一.实现定时器 1.定时器的介绍 1.1定时器的概念及作用 1.2定时器的分类 2.新建项目 2.1新建 2.2选择STM32F103C8T6芯片 2.3配置SYS 2.4配置RCC 2.5配置 ...

最新文章

  1. java算法面试题_【干货】经典算法面试题代码实现-Java版
  2. java plc通讯_树莓派+西门子PLC+Aliyun
  3. Java数据类型转换全解
  4. 【Flask】SQLALchemy的介绍
  5. 周昌印:忘记技术 从用户与市场考虑问题
  6. 三、Eclipse快捷键
  7. (二)spring MVC配置
  8. JavaScript 基础(十六):Navigator对象
  9. 机器学习第二回——多变量线性回归
  10. 如何在ps中调整文字的行距和间距_Wps如何调整文字字符的间距
  11. 润乾报表不显示的分析原因
  12. CentOS 5.5编译安装lnmp
  13. 工控计算机+isa接口,研华工控机IPC-610系列可提供多个PCI、ISA总线
  14. 建筑工程PPP项目财务风险控制探析
  15. 《计算机操作系统》(慕课版)课后习题
  16. CentOS 官网下载 iso 镜像
  17. 网络安全之黑客入侵的步骤
  18. Visual C++ 2008入门经典 Ivor Horton
  19. wx.getLocation接口申请
  20. C语言--指向指针的指针

热门文章

  1. Linux软件磁盘列阵RAID
  2. mac 更新系统后无法使用 git
  3. WordPress系列教程(一)----WordPress环境准备与安装
  4. HDU-6468 zyb的面试(模拟十叉树+dfs)
  5. linux nas mp4 播放器,我的NAS我的地盘 篇十:威联通NAS软件介绍与应用之QVideo篇
  6. Karma、Jasager与WiFiPineApple之间的关系
  7. 在padavan运行wifidog
  8. 百思不得姐php源码,百思不得姐源代码(xcode)
  9. m3u8\ts片段文件解密合成转换
  10. tomcat 配置文件 conf/server.xml 中的 appBase和docBase