自适应网站内容做多大尺寸,seo方案书案例,wordpress 简约主题,如何优化网站信息架构目录
1. SysTick简介
2. 时钟来源
3. SysTick寄存器
3.1 CTRL—SysTick控制及状态寄存器
3.2 RELOAD—SysTick重装载数值寄存器
3.3 CURRENT—SysTick当前数值寄存器
4. systick系统定时器配置
5. 延时函数实现
5.1 延时函数编写步骤
5.2 微秒级延时函数delay_us
5.…目录
1. SysTick简介
2. 时钟来源
3. SysTick寄存器
3.1 CTRL—SysTick控制及状态寄存器
3.2 RELOAD—SysTick重装载数值寄存器
3.3 CURRENT—SysTick当前数值寄存器
4. systick系统定时器配置
5. 延时函数实现
5.1 延时函数编写步骤
5.2 微秒级延时函数delay_us
5.3 毫秒级延时函数delay_ms
5.4 秒级延时函数delay_s 1. SysTick简介
SysTick——系统定时器是属于CM3内核的一个外设内嵌在NVIC中。SysTick是一个24位的向下递减的计数器从重装载寄存器的值递减到0之后自动从RELOAD寄存器中重装载定时器初值。只要不使能systick定时器它就永不停息的一直循环计数在睡眠模式下也能使用。 systick系统滴答定时器在没有操作系统时用于延时在有操作系统时候RTOS、UCOS2通常为操作系统提供精准的定时中断1ms~50ms。 2. 时钟来源
1. AHB时钟8分频
2. FCLK内核时钟 默认选择FCLK内核时钟
3. SysTick寄存器
SysTick有4个寄存器如下图所示。 SysTick寄存器汇总(来源野火《STM32库开发实战指南》) 3.1 CTRL—SysTick控制及状态寄存器 控制及状态寄存器共计24位但只使用了其0、1、2、16位。其中第2位为是时钟选择位置1表示使用处理器时钟即系统时钟
3.2 RELOAD—SysTick重装载数值寄存器 3.3 CURRENT—SysTick当前数值寄存器 3.4 校准数值寄存器这个本节不需要暂不介绍。
此图汇总systick的寄存器。 systick寄存器图 4. systick系统定时器配置
查看core_cm3.h可以找到systick_Config()函数该函数配置了系统定时器的时钟源、重装载值和当前值。
static __INLINE uint32_t SysTick_Config(uint32_t ticks)
{ if (ticks SysTick_LOAD_RELOAD_Msk) return (1); /* Reload value impossible */SysTick-LOAD (ticks SysTick_LOAD_RELOAD_Msk) - 1; /* set reload register */NVIC_SetPriority (SysTick_IRQn, (1__NVIC_PRIO_BITS) - 1); /* set Priority for Cortex-M0 System Interrupts */SysTick-VAL 0; /* Load the SysTick Counter Value */SysTick-CTRL SysTick_CTRL_CLKSOURCE_Msk | SysTick_CTRL_TICKINT_Msk | SysTick_CTRL_ENABLE_Msk; /* Enable SysTick IRQ and SysTick Timer */return (0); /* Function successful */
} 下面是函数中使用的结构体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;
下面是函数中使用的宏定义
/* SysTick Control / Status Register Definitions */
#define SysTick_CTRL_COUNTFLAG_Pos 16 /*! SysTick CTRL: COUNTFLAG Position */
#define SysTick_CTRL_COUNTFLAG_Msk (1ul SysTick_CTRL_COUNTFLAG_Pos) /*! SysTick CTRL: COUNTFLAG Mask */#define SysTick_CTRL_CLKSOURCE_Pos 2 /*! SysTick CTRL: CLKSOURCE Position */
#define SysTick_CTRL_CLKSOURCE_Msk (1ul SysTick_CTRL_CLKSOURCE_Pos) /*! SysTick CTRL: CLKSOURCE Mask */#define SysTick_CTRL_TICKINT_Pos 1 /*! SysTick CTRL: TICKINT Position */
#define SysTick_CTRL_TICKINT_Msk (1ul SysTick_CTRL_TICKINT_Pos) /*! SysTick CTRL: TICKINT Mask */#define SysTick_CTRL_ENABLE_Pos 0 /*! SysTick CTRL: ENABLE Position */
#define SysTick_CTRL_ENABLE_Msk (1ul SysTick_CTRL_ENABLE_Pos) /*! SysTick CTRL: ENABLE Mask *//* SysTick Reload Register Definitions */
#define SysTick_LOAD_RELOAD_Pos 0 /*! SysTick LOAD: RELOAD Position */
#define SysTick_LOAD_RELOAD_Msk (0xFFFFFFul SysTick_LOAD_RELOAD_Pos) /*! SysTick LOAD: RELOAD Mask *//* SysTick Current Register Definitions */
#define SysTick_VAL_CURRENT_Pos 0 /*! SysTick VAL: CURRENT Position */
#define SysTick_VAL_CURRENT_Msk (0xFFFFFFul SysTick_VAL_CURRENT_Pos) /*! SysTick VAL: CURRENT Mask *//* SysTick Calibration Register Definitions */
#define SysTick_CALIB_NOREF_Pos 31 /*! SysTick CALIB: NOREF Position */
#define SysTick_CALIB_NOREF_Msk (1ul SysTick_CALIB_NOREF_Pos) /*! SysTick CALIB: NOREF Mask */#define SysTick_CALIB_SKEW_Pos 30 /*! SysTick CALIB: SKEW Position */
#define SysTick_CALIB_SKEW_Msk (1ul SysTick_CALIB_SKEW_Pos) /*! SysTick CALIB: SKEW Mask */#define SysTick_CALIB_TENMS_Pos 0 /*! SysTick CALIB: TENMS Position */
#define SysTick_CALIB_TENMS_Msk (0xFFFFFFul SysTick_VAL_CURRENT_Pos) /*! SysTick CALIB: TENMS Mask */
/*}*/ /* end of group CMSIS_CM3_SysTick */其中Msk表示掩码操作掩码操作指的是对一串二进制数据通过与msk的位操作达到屏蔽制定位而实现需求。 例如对一串数字的0~3位清零则可以定制一个msk00001111。对于cmd01010101则cmd ~msk 01010101 11110000 01010000. 1ul其中ul是一个后缀表示无符号长整型unsigned long。表示左移位操作例如ab表示a左移b位通常代表即.
例如CTRL寄存器其中SysTick_CTRL_CLKSOURCE_Msk 表示将1ul左移SysTick_CTRL_CLKSOURCE_Pos位即2位可得第2位的值为即第2位值为1联系上文可知CTRL的第2位为systick定时器的时钟源选择位将本位赋值1表示使用系统内核时钟。
如此便能理解systick_Config()函数了。
5. 延时函数实现
5.1 延时函数编写步骤
失能systick系统定时器即SysTick-CTRL 定时器第0位置0。将新的重加载值写入到SysTick-LOAD寄存器中。将SysTick-VAL的值置为0。使能systick系统定时器。
官方推荐代码如下参考《Cortex M3与M4权威指南.pdf》第316页
SysTick-CTRL 0; // Disable SysTick
SysTick-LOAD 0xFF; // Count from 255 to 0 (256 cycles)
SysTick-VAL 0; // Clear current value as well as count flag
SysTick-CTRL 5; // Enable SysTick timer with processor clock
while ((SysTick-CTRL 0x00010000)0);// Wait until count flag is set
SysTick-CTRL 0; // Disable SysTick
下面分别为微秒级、毫秒级、秒级延时函数示例摘自B站金善愚systick定时器讲解视频。
5.2 微秒级延时函数delay_us
#define AHB_INPUT 72 //请按RCC中设置的AHB时钟频率填写到这里单位MHzvoid delay_us(u32 uS){ //uS微秒级延时程序参考值即是延时数72MHz时最大值233015 SysTick-CTRL 0;SysTick-LOADAHB_INPUT*uS - 1;//重装计数初值当主频是72MHz72次为1微秒SysTick-VAL0x00; //清空定时器的计数器SysTick-CTRL0x00000005;//时钟源HCLK打开定时器while(!(SysTick-CTRL0x00010000)); //等待计数到0SysTick-CTRL0;//关闭定时器
}
5.3 毫秒级延时函数delay_ms
void delay_ms(u16 ms){ //mS毫秒级延时程序参考值即是延时数最大值65535 while( ms-- ! 0){delay_us(1000); //调用1000微秒的延时}
}
//或者
void delay_ms(uint32_t ms)
{while(ms --){SysTick-CTRL 0; // 关闭系统定时器后才能配置寄存器SysTick-LOAD 72000 - 1; // 设置计数值用于设置定时的时间SysTick-VAL 0; // 清空当前值还有计数标志位SysTick-CTRL 5; // 使能系统定时器工作且时钟源为系统时钟的8分频168MHz/821MHzwhile(!(SysTick-CTRL0x00010000)); //等待计数到0SysTick-CTRL 0; // 关闭系统定时器 }
}
5.4 秒级延时函数delay_s
void delay_s(u16 s){ //S秒级延时程序参考值即是延时数最大值65535 while( s-- ! 0){delay_ms(1000); //调用1000毫秒的延时}
}