文章目录
一、SysTick.c中部分代码解析
1、static u8 fac_us=0;
static u8 fac_us=0; //us延时倍乘数
1.1 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寄存器
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