【STM32】4-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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值