【STM32】4-SysTick系统定时器实验

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

一、SysTick.c中部分代码解析

1、static u8 fac_us=0;

static u8  fac_us=0; //us延时倍乘数    


1.1 static含义:

static相关解释


1.2 u8含义:

typedef uint8_t  u8;

//所在位置 stm32f10x.h

typedef unsigned          char uint8_t;

//所在位置 stdint.h


即u8就是unsigned char


2、void SysTick_CLKSourceConfig(uint32_t SysTick_CLKSource)

2.1 可选参数

1、SysTick_CLKSource_HCLK

频率72MHZ

2、SysTick_CLKSource_HCLK_Div8

频率72/8=9MHZ


#define IS_SYSTICK_CLK_SOURCE(SOURCE) (((SOURCE) == SysTick_CLKSource_HCLK) ||

                                       ((SOURCE) == SysTick_CLKSource_HCLK_Div8))

                                     

3、SysTick->LOAD=nus*fac_us; //时间加载

3.1 SysTick相关定义

#define SysTick             ((SysTick_Type *)       SysTick_BASE)     /*!< SysTick configuration struct      */


被定义为SysTick_Type类型指针


3.2 SysTick_Type结构体定义

typedef struct

{

  __IO uint32_t CTRL;                         /*!< Offset: 0x00  SysTick Control and Status Register */

  __IO uint32_t LOAD;                         /*!< Offset: 0x04  SysTick Reload Value Register       */

  __IO uint32_t VAL;                          /*!< Offset: 0x08  SysTick Current Value Register      */

  __I  uint32_t CALIB;                        /*!< Offset: 0x0C  SysTick Calibration Register        */

} SysTick_Type;


3.3延时原理

SysTick 定时器也叫 SysTick 滴答定时器,它是 Cortex-M3 内核的一个外设,被嵌入在 NVIC 中。它是一个 24 位向下递减的定时器,每计数一次所需时间为1/SYSTICK,SYSTICK 是系统定时器时钟,它可以直接取自系统时钟,还可以通过系统时钟 8 分频后获取,本套程序中我们采用后者,即每计数一次所需时间为1/(72/8)us,换句话说在 1us 的时间内会计数 9 次。当定时器计数到 0 时,将从


LOAD 寄存器中自动重装定时器初值,重新向下递减计数,如此循环往复。那我们在实现延时时,仅需将目的延时时间乘以1us(或ms)内计数次数即可得到准确延时的效果。


4、SysTick->CTRL|=SysTick_CTRL_ENABLE_Msk ; //开始倒数

#define SysTick_CTRL_ENABLE_Pos             0                                             /*!< SysTick CTRL: ENABLE Position */

#define SysTick_CTRL_ENABLE_Msk            (1ul << SysTick_CTRL_ENABLE_Pos)               /*!< SysTick CTRL: ENABLE Mask */


4.1 SysTick_CTRL_ENABLE_Msk

相当于1


5、while((temp&0x01)&&!(temp&(1<<16))); //等待时间到达

do

{

temp=SysTick->CTRL;

}while((temp&0x01)&&!(temp&(1<<16))); //等待时间到达   

CTRL

CTRL寄存器


5.1 (temp&0x01)

判断CTRL是否正在工作

若CTRL正在工作,其使能位一定为1。想与后,必不为0;


5.2 !(temp&(1<<16))

若CTRL递减为0,则其16为自动置1。

1<<16 表示将1左移16位

CTRL递减为0时,两者相与必为1,取反后为0

最终(temp&0x01)&&!(temp&(1<<16))为0,结束循环。


二、SysTick_h中部分代码解析

1、u16

typedef uint16_t u16;//位于stm32f10x.h

typedef unsigned short     int uint16_t;

//位于sdint.h


即u16就是unsigned short int


2、u32

typedef uint32_t  u32;//位于stm32f10x.h

typedef unsigned           int uint32_t;

//位于sdint.h


即u32就是unsigned int uint32_t


关键字:STM32  SysTick  系统定时器 引用地址:【STM32】4-SysTick系统定时器实验

上一篇:【STM32】2-STM32中断系统(NVIC)
下一篇:【STM32】1-LED 使用GPIO点灯

推荐阅读最新更新时间:2024-11-08 10:41

STM32外部中断和IWDG
实验平台:正点原子战舰开发板 系统:windows 7 64位 编译器:MDK 4.72a 参考例程:ATK串口例程,野火ISO串口例程 外部中断 中断主要分为两种: 1、系统异常中断也可以说的内核异常,这类异常中断有些是不可以控制的,如RESET,NMI,FAULT. 2、外部中断,这些中断都是可以设置的,每个GPIO都可以被设置为中断。 一、NVIC控制器 当要使用中断时候都要对NVIC进行设置 void NVIC_Init(NVIC_InitTypeDef* NVIC_InitStruct); NVIC_IRQChannel 需要配置的中断线 NVIC_IRQChannelCmd 使能或关闭相应中断向量的
[单片机]
STM32 HSE LSE晶振官方推荐
我打算选择 HSE : HC-49S-8 MHz贴片 LSE : DMX-26S 32768HZ贴片
[单片机]
<font color='red'>STM32</font> HSE LSE晶振官方推荐
窗口看门狗实验——WWDG
概述: 什么是窗口看门狗? 之所以称为窗口就是因为其喂狗时间是一个有上下限的范围内(窗口),你可以通过设定相关寄存器,设定其上限时间(下限固定)。喂狗的时间不能过早也不能过晚。 而独立看门狗限制喂狗时间在0-x内,x由相关寄存器决定。喂狗的时间不能过晚。 为什么要窗口看门狗? 对于一般的看门狗,程序可以在它产生复位前的任意时刻刷新看门狗,但这有一个隐患,有可能程序跑乱了又跑回到正常的地方,或跑乱的程序正好执行了刷新看门狗操作,这样的情况下一般的看门狗就检测不出来了; 如果使用窗口看门狗,程序员可以根据程序正常执行的时间设置刷新看门狗的一个时间窗口,保证不会提前刷新看门狗也不会滞后刷新看门狗,这样可以检测出程序没有按
[单片机]
窗口看门狗实验——WWDG
stm32专题二十五:实现基本定时器定时
利用基本定时器定时过程: 1 开启基本定时器的时钟; 2 定义时基初始化结构体,然后只需要配置分频系数PSC和重装载计数值ARR,其他结构体成员不用管; 3 开启定时器中断,这里要选择为定时器更新中断; 4 使能定时器。 接下来是配置过程,非常简单。 bsp_BasicTim.c #include bsp_BasicTim.h // 中断优先级配置 static void BASIC_TIM_NVIC_Config(void) { NVIC_InitTypeDef NVIC_InitStructure; NVIC_PriorityGroupConfig(NVIC_PriorityGrou
[单片机]
STM32学习笔记-配置串口,printf重定向
串口的配置(以stm32f103c8t6串口1为例) USART_InitTypeDef chuanko; RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE); RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE); chuanko.USART_BaudRate=9600; chuanko.USART_WordLength=USART_WordLength_8b; chuanko.USART_StopBits=USART_StopBits_1; chuanko.USART_Parity=USAR
[单片机]
STM32硬件SPI驱动0.96寸的OLED
1.OLED相关 参见—- 51 软件模拟SPI驱动OLED 2.硬件SPI 参见—- SPI专题(二)——STM32驱动FLASH(W25Q64) 3.驱动程序 驱动程序参照51单片机进行移植,只不过模拟的SPI换成STM32硬件SPI,不用再写时序部分的代码。对于STM32的硬件SPI,我们在驱动FLASH中已有介绍,这里就不再做介绍。 OLED引脚部分定义: #ifndef __OLED_H #define __OLED_H #include spi.h #include stm32f10x.h #include stm32f10x_conf.h #define Max_Column
[单片机]
stm32常用数据类型 U8、U16、U32到底代表什么?
在Keil MDK 开发环境里,比如一个 无符号32位整形数据会有很多种表示方法: 1.unsigned int 32 (C语言标准表达方法) 2.uint32_t ; 3.u32; 这三种方式都是在表达同一个意思。可为什么ST的开发人员要搞的这么乱呢? 其实ST 搞这么多花样,无非是想开发人员在写代码时定义数据类型能少写几个符号,然后又因为前后版本升级,为了兼容旧版本(主要是V2.0)才会出现这么多表示方法。不管他怎么换,都是基于标准C来的,看清楚以下几个文件你就OK了:core_cm3.h ;stm32f10x.h ; stdint.h; 其中每个文件大概作用如下: stdint.h 这
[单片机]
STM32工程上printf()函数的方法实现
针对STM32的串口编程,可以通过USART1向计算机的串口调试助手打印数据,或者接收计算机串口调试助手的数据。 下面,我们可以实现STM32工程上的printf()函数了,方便用于程序开发中调试信息的打印。 方法1:使用MicroLIB库 1.1 KEIL-MDK中的Use MicroLIB选项 在MDK开发环境中, MicroLib是缺省c库的备选库,它可装入少量内存中,与嵌入式应用程序配合使用,且这些应用程序不在操作系统中运行。MicroLib进行了高度优化以使代码变得很小,功能比缺省c库少,不具备某些ISO C特性,部分库函数的运行速度也比较慢,如内存拷贝函数memcpy()。 MicroLib与缺
[单片机]
<font color='red'>STM32</font>工程上printf()函数的方法实现
小广播
设计资源 培训 开发板 精华推荐

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

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

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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