一、概述:
SysTick是一个简单的递减24位计数器。如果你不需要再应用程序中嵌入操作系统,SysTick可以作为简单的延时和产生周期性的中断。
状态控制寄存器的第0位可以使能计数器,当前值寄存器随着时钟一直递减,当他减到0的时候,重装载寄存器就会重新装载这只的值,计数器继续从这个值递减。
二、相关寄存器:
2.1SysTick->CTRL 状态和控制寄存器
位16:当前值寄存器递减到0,位16置1
位2:时钟源选择位,0:使用外部参考时钟;1:使用内核时钟
位1:使能SysTick中断,当前值寄存器递减到0时产生中断
位0:SysTick时钟使能
2.2SysTick->LOAD 重装载值寄存器
当前值寄存器为0时,自动将重装载值重装到当前值计数器,重装载值的大小需要自己设置。
2.3 SysTick->VAL当前值寄存器
可读可写,当计数器使能时,这个寄存器的值开始递减,使用前后注意清零。
三、SysTick逻辑图
四、时钟频率与延时
4.1时钟选择采用参考8分频的参考时钟比较准,所以此处SysTick计数器选择21M的时钟。
4.2如何延时1us时钟频率为21M,也就是1s的时间技术21M次。由此可知计数一次用了 (1/21000000)s ,用了(1/21000)ms, 用了(1/21) us,所以,1us计数21次。
4.3如何延时1ms因为1ms = 1000us,所以综上所述,1ms计数1000*21次计数,1ms也就是21000次计数
4.4最大延时24位计数器能保存的最大值 : 16777215。最大延时时间=16777215 /21=798915us=798.915ms
五、示例代码
#include 'delay.h'
#define Value_us 21#define Value_ms 21000
void delay_init(void){ SysTick->CTRL &= (1 << 2); //控制寄存器位2置0,选择8分频时钟 SysTick->CTRL &= ~(1 << 0); //关闭计数器}void delay_us(u32 num){ SysTick->LOAD = num * Value_us; SysTick->VAL = 0; SysTick->CTRL |= (1 << 0); //使能计数器 while (!(SysTick->CTRL & 1<<16)); //判断是否计数完毕 SysTick->VAL = 0; SysTick->CTRL &= ~(1 << 0); //关闭计数器 }void delay_ms(u32 num){ SysTick->LOAD = num * Value_ms; SysTick->VAL = 0; SysTick->CTRL |= (1 << 0); //使能计数器 while (!(SysTick->CTRL & 1<<16)); SysTick->VAL = 0; SysTick->CTRL &= ~(1 << 0); //关闭计数器 }
关键字:STM32 SysTick 寄存器操作
引用地址:
个人对STM32 SysTick的总结(寄存器操作)
推荐阅读最新更新时间:2024-11-10 20:29
STM32 PWM功能在关闭时GPIO电平不确定的情况
刚开始接触STM32,遇到一个项目中出现在产品调试中出现在关闭PWM输出时,GPIO电平有不确定的情况。在网上查阅资料发现大神们是这样解释的:PWM在一个脉冲没有结束时关闭输出,会导致GPIO电平不确定。 解决方法:1、在关闭PWM输出时随即将相应GPIO强制为低(这个高/低看各人的需要) tiM_Cmd(TIM3 ,DISABLE);//关闭PWM输出 TIM_ForcedOC1Config(TIM3, TIM_ForcedAction_InActive);//将PWM输出强制为低 2、在下次打开PWM时使用下面的函数 /*因前面使用PWM强制输出为低,此处需要重新打开PWM输出*/ TI
[单片机]
STM32的RTC配置和起振问题
RTC配置: 1.打开电源管理和备份寄存器时钟。这个在RCC配置中打开。 RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR | RCC_APB1Periph_BKP, ENABLE); 2.使能RTC和备份寄存器的访问(复位默认关闭)。 PWR_BackupAccessCmd(ENABLE); 3.检查电池是否断电过(是否RTC初始化过),通过的话直接跳到第4步。 if (BKP_ReadBackupRegister(BKP_DR1) != 0xA5A5) { A. BKP_DeInit();//BKP寄存器全部设为缺省值 B. RCC_LSEConfig(RCC_LS
[单片机]
STM32-(20):I2C通信(实验:读写EEPROM)
硬件电路连接 底板上的 I2C 接口 A0、A1是用来确定器件的地址的。 排针上的引脚图: 核心板上的引脚图: 通过I2C总线实现对EEPROM的读写操作的准备工作: 1、掌握芯片(目标对象)特性,才能对其正确的读和写。 2、掌握 I2C 通信,读写过程需要用到。 3、Cortex的一些操作,编程方法。 实验内容:通过I2C总线实现对EEPROM的读写操作 main.c #include stm32f10x_lib.h #include IIC.h /*------------函数的声明---------------*/ void Delay_MS(u16 dly); void RCC_Configu
[单片机]
STM32中SysTick在3.5固件库中的应用(1)
一、SysTick STM32内核中有一个系统定时器,它是一个24位递减计数器。工作原理是系统时基定时器设定初值并使能后,每经过1个系统时钟周期,计数值就减,当计数值减到0时,系统定时器会重新自动重装初值,并继续下一次计数,同时内部的COUNTFLAG标志位会置位。触发中断。 在很早的固件库中,提供了很多函数,来对SysTick进行设置,但是到了3.5版本的标准固件库中,移除了相关驱动函数,用户必须调用CMSIS 定义的函数,其中CMSIS只提供了一个Systick设置的函数,替代了STM32原来有的所有的驱动函数,这样做的目的,可能是简化Systick 的设置,可是降低了用户对SysTick的可控性。 在CMSIS中提供的函数是
[单片机]
stm32 基本定时器最简单定时配置
最近用到了定时器的定时功能,了解了下,stm32的定时器功能很强大,东西也挺多的,datasheet里也说了一大段,这个我就不详说了,这儿只说明下如何配置最简单的定时功能配置。 环境说明:MCU:stm32F4系列,用的是通用定时器TIM3 首先要知道的是TIM3 是挂载到APB1总线上的,这点详见STM32F417xx_datasheet-P.19,有个框图叫Device overview,算了,还是截个图 而APB1 的时钟是多少呢?这个得看你自己配置的多少了,一般是在SetSysClock()函数里,我这儿是系统时钟的4分频,系统时钟这儿为168MHz,所以APB1上的时钟为42MHz,这儿不要以为TIM3
[单片机]
基于STM32和CAN总线的湿度采集系统设计
1引言 现实生活中,湿度的测量和控制在纺织工业、林业、化工以及气象观测等领域中有着广泛的应用。传统的人工测试方法费时费力,因而有必要研制更智能方便的湿度测量采集系统,以便实时监测湿度,并根据所测量的数据来控制加湿器、空调器等设备的运行,确保得到合适的湿度环境。 这里提出的湿度测量采集系统是为民用设计的,可实时监测仓库,温室等对湿度有严格要求的场合下的湿度,根据检测结果对湿度加以控制,同时还具有在线修订湿度上下限,湿度显示和报警功能,并可向主控室传送数据。 2系统总体设计 湿度测量采集系统首先是一个实时性系统,需要传感器的各种测量数据能及时的显示,同时,监控系统又是一个多点检测系统,需要在不同的点布置传感器,这些传感器通过总线连
[单片机]
stm32程序中的assert_param()的说明
子程序都有assert_param(....),如下:这句到底有什么用呢???把它删了应该可以的吗?? void TIM1_TimeBaseInit(u16 TIM1_Prescaler, TIM1_CounterMode_TypeDef TIM1_CounterMode, u16 TIM1_Period, u8 TIM1_RepetitionCounter) { assert_param(IS_TIM1_COUNTER_MODE_OK(TIM1_CounterMode)); ...... } 答: 这是断言,可以删掉,只在编译的时候防
[单片机]
STM32-自学笔记(18.独立看门狗,使用到的库函数)
1.IWDG_SetPrescaler 函数原型:void IWDG_SetPrescaler(u8 IWDG_Prescaler) 功能:设置IWDG预分频值 参数:IWDG_Prescaler:IWDG预分频值 参数描述:IWDG_Prescaler IWDG_Prescaler参数 描述 IWDG_Prescaler参数 描述 IWDG_Prescaler_4 设置IWDG预分频值为4 IWDG_Prescaler_64 设置IWDG预分频值为64 IWDG_Prescaler_8 设置IWDG预分频值为8 IWDG_Prescaler_128 设置IWDG预分频值为128 IWDG_Prescaler_16 设置
[单片机]