STM32F SysTick定时器

2023-10-29

  SysTick定时器:系统滴答定时器是一个非常基本倒计时定时器,用于在每隔一定的时间产生一个中断,即使是系统在睡眠模式下也能工作。
 它使得 OS 在各 CM3 器件之间的移植中不必修改系统定时器的代码,移植工作一下子容易多了,不用考虑最基本的时钟不一致的问题。

总结一下:SysTick_Handler()函数每1ms运行一次,运行时就调用TimingDelay_Decrement()函数,而这个函数又令变量TimingDelay减1

看相关配置 systick_config.c文件如下:
#include “stm32f4xx.h”
static __IO uint32_t TimingDelay;

void led_init(void)//LED初始化
{
GPIO_InitTypeDef GPIO_InitStructure;
/* Enable the GPIO_LED Clock /
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOE, ENABLE);
/
Configure the GPIO_LED pin */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7 | GPIO_Pin_8; //led IO 口
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT; //模式:输出
// GPIO_InitStructure.GPIO_OType = GPIO_OType_OD;
// GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; //上拉 ,硬件自带上拉电阻,故此处不需要软件上拉,若不屏蔽则 led 灯很暗
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //50M 翻转
GPIO_Init(GPIOE, &GPIO_InitStructure);
}

void TimingDelay_Decrement(void) //记得将此函数加入 stm32f4xx_it.c 文件中(第 143 行) ,并申明外部函数
{
if (TimingDelay != 0x00)
{
TimingDelay–;
}
}

void Delay(__IO uint32_t nTime)
{
TimingDelay = nTime;
while(TimingDelay != 0);
}

另外, 在 stm32f4xx_it.c 文件中, 需打开中断, 操作如下:
将stm32f4xx_it.c函数打开,并在 stm32f4xx_it.c 的前面申明 extern void TimingDelay_Decrement(void);
void SysTick_Handler(void)//Sys Tick滴答定时器中断函数
{
TimingDelay_Decrement(); // 本行程序原本是屏蔽了的,切记要打开
}

下面还有另外一个问题, Systick 究竟多长时间产生一次中断。
看 main.c 中的代码:
if (SysTick_Config(SystemCoreClock / 1000))
{
/* Capture error */
while (1);
}
我们可以猜测, 那个 1000 就是关键。 让我们把 1000 改成 100,重新编译再运行,结果是灯闪烁的速度慢了 10 倍,也就是Systick 变成了 10ms 中断一次。这样,我们就学会了怎么样来改变这个 Systick 。可是,总觉得这还有点不够,为什么会是这样呢?让我们把鼠标移到 SystemCoreClock 上去按下
F12 吧。这次跑到了 system_stm32f0xx.c 文件中去了, 这就是 User 组中的第 3 个文件。查看一下,原来符号: SystemCoreClock是一个变量,
它的值是 48000000, 也就是 48M , 这好像是个挺熟悉的数值,是什么呢?打开 STM32F051 芯片介绍的资料,原来在这儿, 48M 是该芯片运行的最高频率。
那么我们可以猜测:
( 1)在这个例子中,我们把芯片运行到了它的最高频率,即 48M
( 2) 48M 除 1000 就是 48 000,应该是将这个 48000 这个数放到了某个寄存器中,然后根据这个数来分频。也就是时钟
脉冲的频率是 48M , 然后每隔 48000 出来一个 Systick, 这样,这个 Systick 就是 1ms/次了。
讲到这里,似乎把 Systick 理解了,但其实还有更多的疑问,为什么这个芯片是运行在 48M ?既然是最高, 那肯定还有其他的值,如何设置?
好奇是人进步的阶梯,不过要是一直纠缠下去, 这一篇就没法结束了。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

STM32F SysTick定时器 的相关文章

  • Linux系统下串口调试助手putty,cutecom,xgcom

    系统 linux mint 18 3 xfce 64bit 串口驱动 ch340 系统已自带 没有测试pl2302 尝试了几个linux下的串口调试助手 这里总结一下 由于使用的是USB转串口 CH340 所以在 dev 目录下面看到的串口
  • STM32F103的低功耗模式

    一 原理 STM32F103的低功耗模式有多种 常用的有STOP模式和STANDBY模式 这两种模式都可以有效降低芯片的功耗 特别是在电池供电的场景下 可以延长电池寿命 STOP模式 主要关闭CPU SRAM和Flash时钟 只保留少数必要
  • (转载)STM32与LAN9252构建EtherCAT从站

    目录 一 项目简介 EtherCAT及项目简述 LAN9252工作模式 整体开发流程 移植要处理的问题 代码层面的工作 开发中使用的工具 二 SSC的使用 SSC简介和下载 SSC构建协议栈文件和XML 三 LAN9252的XML文件 Et
  • 智能小车运行及测速原理

    光电码盘测速原理 如何求解小车速度参数 大小与方向 测量速度方向的方法 根据A B两相脉冲的超前滞后关系确定电机旋转方向 假定A相超前于B相时 为电机正方向 则当A相滞后于B相 当前电机为反向旋转 普通测量速度大小的方法 单位时间内采集的脉
  • STM32F SysTick定时器

    SysTick定时器 系统滴答定时器是一个非常基本倒计时定时器 用于在每隔一定的时间产生一个中断 即使是系统在睡眠模式下也能工作 它使得 OS 在各 CM3 器件之间的移植中不必修改系统定时器的代码 移植工作一下子容易多了 不用考虑最基本的
  • 关于你STM32F407片内FLASH擦除失败的问题

    近日 发现STM32F407片内FLASH在写入数据时某些情况下会出现扇区擦除不成功的情况 使用正点原子的代码测试也出一样的情况 网上搜索也没找到较为理想的答案 只有一篇文章遇到同样问题 也是使用了一个不太可靠的办法 但是好在可以解决问题
  • 为什么延时函数while()没有递减

    因为有时钟中断 1ms中断一次 如何减1
  • STM32的CAN总线的接收双FIFO使用方法

    通过下面的框图我们可以看到 STM32F013有两个接收FIFO 但是实际的使用中如何让着两个FIFO都被使用呢 解决办法就在这里 1 STM32F103有0 13共14个过滤器组 每个过滤器组都可以绑定指定的FIFO 2 特别需要注意的一
  • STM32自己写printf函数方法(不用重定向)

    stm32有几个串口可以使用 当我们想用printf打印数据到上位机时 通常是使用fput重定向 当我们要多个串口使用printf格式函数时 可以在写一个类似printf的函数 include
  • 项目:水温控制系统

    使用到了 KEY OLED LED BEEP 该项目已经压缩在了E盘 stm32正点原子资料文件夹 硬件平台 大二在精密实验室焊的32主板 小知识 在以用前还要再次extern float 没有unsigned float
  • 17_外部中断实验

    目录 外部中断概述 外部中断的一般配置步骤 硬件连接图 实验源码 中途遇到问题printf打印中文乱码 外部中断概述 STM32F1的每个IO口都可以作为外部中断输入 STM32F1的中断控制器支持19个外部中断 事件请求 线0 15 对应
  • STM32使用bool型变量

    环境Keil5 编译器 include
  • STM32读取编码器数据(STM32-1)

    编码器 encoder 是将信号或数据进行编制 转换为可用以通讯 传输和存储的信号形式的设备 按照外形可以分为实心轴和空心轴 按照工作原理编码器可分为增量式和绝对式两类 增量式编码器是将位移转换成周期性的电信号 再把这个电信号转变成计数脉冲
  • 利用稳压模块设计电源电路(洞洞板手工做板)

    前言 一块12伏的电池 要进行分压以适应多路的供电要求 因此做电源电路很有必要 本文采用洞洞板 稳压模块 手工焊接 1 实物 2 原理图 3 焊接 用焊锡连线 而不是用杜邦线跳线 焊锡线粗 可以保证大电流通过 而杜邦线太细了 容易烧毁 更甚
  • STM32F407ZGT6控制舵机(采用高级定时器8)

    前言 32单片机给舵机供电不足 会出现不稳定的情况 舵机鬼畜 所以要外加电源给舵机供电 利用12v锂电池 通过稳压模块降压到5 5v 提供给舵机 稳压电路的gnd一定要接上32单片机的gnd 不共地虽然能供电但数据线无法传输数据 stm32
  • 基于STM32单片机的智能家居毕设

    文章目录 一 硬件选型 1 硬件清单 2 硬件展示 部分 二 效果展示 1 整体效果展示 2 显示屏 触摸 效果展示 三 功能分析 1 系统总体结构框图 2 主要包含的功能 四 怎么做 1 STM32单片机部分 2 语音识别与播报部分 3
  • 02-407控制底板PCB开发板资源介绍资料

    核心板 控制底板 反客 DIY 1 芯片介绍 stm32F407ZGT6 开发指南 产品 见淘宝 反客科技 核心板并没有使用STM32F407开发指南上的 因为它贵且许多功能没有用到 所以就使用反客的 芯片的一样 没事 开发板是李明枫老师画
  • STM32串口环形队列

    一 环线队列 在设计串口驱动的过程中 要遵循的两条准则是 1 尽量的减少程序运行的时间 2 尽量的减少程序所占用的内存 单片机相对于电脑来说 单片机的储存空间和电脑的存储空间根本不是一个量级 电脑并不用过多考虑内存的多少 而单片机就需要考虑
  • STM32之_keil 编译内存大小解析

    Program Size Code 28784 RO data 6480 RW data 60 ZI data 3900 的含义 1 Code 程序所占用的FLASH大小 存储在FLASH 2 RO data Read only data
  • stm32定时器输入捕获配置步骤及实例笔记

    输入捕获的一般配置步骤 初始化定时器和通道对应IO的时钟 初始化IO口 模式为输入 GPIO Init GPIO InitStructure GPIO Mode GPIO Mode IPD 初始化定时器ARR PSC TIM TimeBas

随机推荐