一、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寄存器
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】2-STM32中断系统(NVIC)
下一篇:【STM32】1-LED 使用GPIO点灯
推荐阅读最新更新时间:2024-11-08 10:41
设计资源 培训 开发板 精华推荐
- AD587JQ 作为 CMOS 双路 DAC 的 10V 基准的典型应用电路
- 使用 Cypress Semiconductor 的 CY7C9689 的参考设计
- 使用 Richtek Technology Corporation 的 RT8813A 的参考设计
- EPR-85 - 2W 充电器
- LT6656AIS6-3.3、3.3V ADC 电压基准和桥式激励电源的典型应用
- 可配置 PMSM 无传感器磁场定向控制参考设计
- 使用 Microchip Technology 的 TCL1117 的参考设计
- 使用 Diodes Incorporated 的 PAM2400 的参考设计
- AM3GH-1205DZ ±5V DC/DC转换器的典型应用
- 使用 Analog Devices 的 REF192 的参考设计