STM32 SysTick小结

发布者:未来画家最新更新时间:2022-04-19 来源: eefocus关键字:STM32  SysTick  系统定时器 手机看文章 扫描二维码
随时随地手机看文章

SysTick简介

系统定时器,24位,只能递减,存在于内核,嵌套在 NVIC 中。其大部分内容可以查看 STM32F10xxx Cortex-M3编程手册-英文版。


SysTick工作过程

1.计数器在时钟驱动下从初值开始计数直到0。

2.为0时可以产生中断或置位 COUNTFLAG 标志位。

3.如果没有关闭,则初值再次开始计数,如此循环。

计数过程中,计数器的实时值可由 STK_VAL 位得到


SysTick寄存器

STK_CTRL

控制及状态寄存器,只有四个有效位:

COUNTFLAG :如果计数器计到0,此位置1;如果软件读取这个位,这个位会置0;

CLKSOURCE :时钟选择位;0=AHB/8;1=AHB。

TICKINT:中断使能;0=无动作;1=产生中断。

ENABLE : 使能寄存器。


STK_LOAD

重装载寄存器。

RELOAD: 数到0时,被重新装载的值。


STK_VAL

当前数据寄存器

CURRENT :读取时返回当前倒计时的值。


定时时间的计算

t = reload * (1/clk)

所以Clk = 72M,reload=72 时,t = 1us;


SysTick固件库编程

SysTick寄存器的结构体

结构体在 core_cm3.h 文件中。

SysTick固件库函数

配置函数在 core_cm3.h 文件中


static __INLINE uint32_t SysTick_Config(uint32_t ticks)

   //如果传入的重载值大于2^24,则跳出。

  if (ticks > SysTick_LOAD_RELOAD_Msk)  return (1);

   //把重载值装入重装载寄存 器                                                            

  SysTick->LOAD  = (ticks & SysTick_LOAD_RELOAD_Msk) - 1;

//配置中断优先级,默认为最低的优先级

  NVIC_SetPriority (SysTick_IRQn, (1<<__NVIC_PRIO_BITS) - 1);  

  //初始化计数器的值为0

  SysTick->VAL   = 0;     

  //配置时钟为72M,使能中断,使能SysTick                                     

  SysTick->CTRL  = SysTick_CTRL_CLKSOURCE_Msk | 

                   SysTick_CTRL_TICKINT_Msk   | 

                   SysTick_CTRL_ENABLE_Msk;                    

  return (0);                                                  

}


SysTick中断优先级


在上面固件库编程中,使用了 NVIC_SetPriority 来编程

在这里插入图片描述

函数的意思是,如果为内核,修改SCB寄存器;如果为外设,修改NVIC寄存器;


上面的语句


NVIC_SetPriority (SysTick_IRQn, (1<<__NVIC_PRIO_BITS) - 1);


__NVIC_PRIO_BITS 为4,也就是说,SysTick中断优先级被配置为15,即1111。这个优先级比较呢?


首先,优先级的值越大,优先级越低。在内核中,SysTick的优先级最低。和外设比较,通过中断优先级分组的规则进行比较。中断优先级对内核和外设同样适用。可见,SysTick的优先级非常低。


编写程序

单独创建一个h和c文件,加入USER的group中,并且在Configure中添加路径。


首先,因为要用到内核库中的函数,头文件中必须包含 core_cm3.h , 又因为这个头文件用到了 stm32f10x.h 中的定义,所以还要包含stm32f10x.h。

代码如下:


#ifndef _BSP_SYSTICK_H_

#define _BSP_SYSTICK_H_

#include "stm32f10x.h"

#include "core_cm3.h"

#endif

1

2

3

4

5

在bsp_systick.c 中编写一个函数可以延时1us。


void SysTick_Delay_us(uint32_t us)

{

int i = 0;

SysTick_Config(72);

for(i=0;i {

while( !((SysTick->CTRL)&(1<<16)) );

}

SysTick->CTRL &= ~SysTick_CTRL_ENABLE_Msk;


}

1

2

3

4

5

6

7

8

9

10

11

  由上面的介绍可以知道,SysTick_Config 是用来配置定时器的函数,传入的参数是重装载的值。

  当一次计数到0时COUNTFLAG 位会被置1,而COUNTFLAG 是 STK_CTRL 寄存器的第16位,使用寄存器访问这个变量就是 (SysTick->CTRL)&(1<<16)),当其置1时,跳出while循环,读取后会自动置0。

  完成指定的for循环后,实际上计时工作就已经完成了,但我们最好还是把计时器给关上。对 STK_CTRL 的 ENABLE位置0即可,即 SysTick->CTRL &= ~SysTick_CTRL_ENABLE_Msk。这样就完成了us延时的函数。

如法炮制完成ms延时。


void SysTick_Delay_ms(uint32_t ms)

{

int i = 0;

SysTick_Config(72000);

for(i=0;i {

while( !((SysTick->CTRL)&(1<<16)) );

}

SysTick->CTRL &= ~SysTick_CTRL_ENABLE_Msk;


}

————————————————

版权声明:本文为CSDN博主「IN X」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。

原文链接:https://blog.csdn.net/XZHMARS/article/details/107300052


关键字:STM32  SysTick  系统定时器 引用地址:STM32 SysTick小结

上一篇:stm32位带操作中对内存的浅显理解
下一篇:STM32中断应用总结

推荐阅读最新更新时间:2024-11-17 04:40

STM32输出调试信息-printf重定向到串口
在STM32调试过程中常常需要将调试信息输出到串口,然后通过串口助手查看输出的调试信息。一般来说,串口输出的是指定长度的十六进制字节,对于想打印的调试信息来 说,略显灵活性不足。这时候如果可以将printf重定向到串口输出,则能很好的解决这个问题。 关于printf重定向的方法有很多种,这里只讨论一种我认为相对简单实用的方法。其主要方法步骤如下: 1、配置STM32的串口,确保STM32能输出数据到串口调试助手。 void USART5_Init(void) { USART_InitTypeDef USART_InitStructure; GPIO_InitTypeDef GPIO_InitStructure;
[单片机]
stm32快速学习1——环境的建立
安装keil for arm 下载stm32固件库3.4 解压,勿乱移动解压文件内的文件,因为项目内使用的都是相对路径。 进入 STM32F10x_StdPeriph_Lib_V3.4.0\Project\STM32F10x_StdPeriph_Template\MDK-ARM 打开keil文件,修改一下这个项目模板 删除左侧的stm32_eval文件夹、doc文件夹、使用的是stm32f103RBT6(中等容量的芯片)然后MDK-ARM下的文件除了 startup_stm32f10x_md.s(根据芯片类型),其他都删除 startup_stm32f10x_md.s右键,选中include in target build 左侧最
[单片机]
STM32 IAP 无法运行用户程序的解决方法
IAP程序: 主要是设置用户程序的起始地址 APPLICATION_ADDRESS,如0x08004000,通过外设把用户代码写入FLASH的用户区。满足条件后,跳转至用户区起始地址。 解释一下跳转部分代码: /* Test if user code is programmed starting from address APPLICATION_ADDRESS */ if (((*(__IO uint32_t*)APPLICATION_ADDRESS) & 0x2FFE0000 ) == 0x20000000)// 判断栈顶地址是否在0x2000 0000 - 0x2000 2000之间 // 通过判断栈顶地址值是否正确来判
[单片机]
<font color='red'>STM32</font> IAP 无法运行用户程序的解决方法
基于STM32的FreeRTOS移植
本文讲诉基于STM32F103ZE芯片进行FreeRTOS实时操作系统的移植,分为工作准备、移植、验证 IDE:MDK OS:FreeRTOSv10.1.1 OS从FreeRTOS官网下载,我这里的版本是最新的v10.1.1 在基础工程上新建一个FreeRTOS文件夹,用于存放OS相关的源码,新工程的新建,上一篇有写到 然后就可以在工程中开始添加需要的.c文件了 添加之后,编译,然后发现有以下错误 这个错误是因为我们少了一个很重要的OS配置的头文件,可以在下载的FreeRTOS的压缩包里面的Demo里面找一份,然后copy到任意目录,我这边是copy到application目录,因为需要一些改动
[单片机]
基于<font color='red'>STM32</font>的FreeRTOS移植
如何基于Keil、STM32用C++编写流水灯程序?
通常来说,在单片机上编程,要么汇编,要么C语言,而用C++进行开发的很少,那么究竟能不能用C++开发单片机呢? 答案肯定是可以的,下面讲讲基于Keil、STM32,用C++编写流水灯程序的一些内容。 1 为什么很少用C++开发单片机 不知道大家对面向过程和面向对象的理解有多少? C语言是面向过程的语言,C++是面向对象的编程语言。结合本文来说,面向过程相比面向对象的编程,生成代码量(bin文件)更小,运行效率更高。 所以,C语言相比C++具有更小代码量(bin文件)、更快的运行速度。 当然,这里是C相对C++而言。其实,汇编相对C而言,具有更小代码量和更快的运行速度。可以参看文章:用 汇编 和 C语言 写流水灯程序有什么不
[单片机]
STM32系列芯片的命名规则
  示例:     从上面的料号可以看出以下信息:   ST品牌ARMCortex-Mx系列内核32位超值型MCU,LQFP-48封装闪存容量32KB温度范围-40℃-85℃;      1.产品系列:   STM32代表ST品牌Cortex-Mx系列内核(ARM)的32位MCU;   2.产品类型: F:通用快闪(FlashMemory);   L:低电压(1.65~3.6V);   F类型中F0xx和F1xx系列为2.0~3.6V;F2xx和F4xx系列为1.8~3.6V;   W:无线系统芯片,开发版。   3.产品子系列:   050:ARMCortex-M0内核;   051:ARMCortex-M0内核;  
[单片机]
<font color='red'>STM32</font>系列芯片的命名规则
STM32—串口通讯详解
串口通讯(Serial Communication)是一种设备间非常常用的串行通讯方式,因为它简单便捷,因此大部分电子设备都支持该通讯方式,其通讯协议可分层为协议层和物理层。物理层规定通信协议中具有机械、电子功能的特性,从而确保原始数据在物理媒体的传播;协议层主要规定通讯逻辑,统一双方的数据打包、解包标准。通俗的讲物理层规定我们用嘴巴还是肢体交流,协议层规定我们用中文还是英文交流。下面分析一下串口通讯协议的物理层和协议层。 物理层 1.通讯结构 串口通讯的物理层的主要标准是RS-232标准,其规定了信号的用途、通讯接口及信号的电平标准,其通讯结构如下: 在设备内部信号是以TTL电平标准传输的,设备之间是通过RS-232电平
[单片机]
<font color='red'>STM32</font>—串口通讯详解
STM32开发板入门教程 - 串口通讯 UART
通用同步异步收发器(USART)提供了一种灵活的方法来与使用工业标准NR 异步串行数据格式的外部设备之间进行全双工数据交换。 USART利用分数波特率发生器提供宽范围的波特率选择。 它支持同步单向通信和半双工单线通信。它也支持LIN(局部互连网),智能卡协议和IrDA(红外数据组织)SIR ENDEC规范,以及调制解调器(CTS/RTS)操作。它还允许多处理器通信。用于多缓冲器配置的DMA方式,可以实现高速数据通信。 主要特性: 全双工的,异步通信 NR 标准格式 分数波特率发生器系统 -发送和接收共用的可编程波特率,最高到4.5Mbits/s 可编程数据字长度(8位或9位)
[单片机]

推荐帖子

要做电源管理,有什么好的建议没?
功能一、检测充电器的插拔【我的想法:】可以用中断来做,这个好做功能二、检测电池的电量:只能用AD,将电压转成数字信号了,就不知道怎么实现了,不知道谁可以告诉我哪里有这个样例,以前在BSP下看到过有一个函数是分了不同的电压值,但找不到了,奇怪。功能三、长安实现开关机这个也好做、看来就是第二个了难点了,因为不是很了解---要做电源管理,有什么好的建议没?你这个只是电源管理的基础电源管理要实现就要硬件上实现各路电源独立控制,在驱动上实现休眠唤醒,
eeq619 嵌入式系统
图上这个画红圈部分应该怎么分析啊
考研真题上的一个电路,麻烦帮忙分析一下这个画红圈部分!图上这个画红圈部分应该怎么分析啊“画红圈部分应该怎么分析啊”图下面那两行文字,不是已经给出结果了么?像这个里面,射极相当于浮空,这要怎么判断bg2啊是假设它的发射结等效二极管导通还是D1导通啊?zhangke发表于2015-11-2509:44像这个里面,射极相当于浮空,这要怎么判断bg2啊是假设它的发射结等效二极管导通还是D1导通啊? 假定负载为足够大的电阻,另端接地。原题在此处确实没有交代清楚
zhangke 模拟与混合信号
高云云源编辑器在使用中文时会导致光标窜位的问题
我英文水平有限,所以很多注释都会使用中文,在使用高云云源软件自带的编辑器输入代码时,如果之前在中文输入法下输入过一个没输入法的字符再删除,然后再另一个地方输入中文,或者要写代码时忘了把中文切换成英文光标就会自动跳回到上一次输入的位置。写注释还好,如果是下边这种在代码里误使用中文输入法敲了一个字符然后删掉,再在其它地方敲代码时之前光标后的字符会被替换掉,而且无法通过CTRL+Z恢复。高云云源编辑器在使用中文时会导致光标窜位的问题已反馈给高云也~
littleshrimp 国产芯片交流
用AD控制步进电机
用的MC9S12D64单片机,采集了传感器的AD值,求大神帮忙写下程序实现步进电机随着传感器的转动而正转反转,传感器转角与电机转角为线性关系用AD控制步进电机求大神啊~~~~~先写步进电机的控制程序,实现步进电机的正反转。根据AD值和电机当前角度,进行调节。正反转已经可以实现了,就是不知道怎么根据AD和角度进行调节。。求详细指点
maskzl 单片机
EEWORLD大学堂----MIPI物理层测试(下)
MIPI物理层测试(下):https://training.eeworld.com.cn/course/2317课程主要介绍了MIPIPHY概述、MIPI联盟规定的三种不同的MIPIPHY,并针对这三种MIPIPHY分析工程师会面临哪些测试测量挑战以及发射机与接收机的测试方法。EEWORLD大学堂----MIPI物理层测试(下)
phantom7 测试/测量
【AT-START-F425测评】USB转CAN之四 完成收发测试
【AT-START-F425测评】USB转CAN预告帖https://bbs.eeworld.com.cn/thread-1199896-1-1.html【AT-START-F425测评】USB转CAN之二https://bbs.eeworld.com.cn/thread-1199901-1-1.html【AT-START-F425测评】USB转CAN之三https://bbs.eeworld.com.cn/thread-1200055-1-1.html早上起来继续搬砖,昨晚很晚
lugl4313820 国产芯片交流
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved