打印
[STM32F1]

Stm32f01x_SysTick定时器_延时功能

[复制链接]
372|13
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
1988ChenSir|  楼主 | 2023-6-28 16:44 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
最近在看利用SysTick定时器实现延时功能,总结笔记:

Systick定时器,是一个简单的定时器,对于CM3,CM4内核芯片,都有Systick定时器。 Systick定时器常用来做延时,或者实时系统的心跳时钟。这样可以节省MCU资源,不用浪费一个定时器。

Systick定时器就是系统滴答定时器,一个24 位的倒计数定时器,计到0 时,将从RELOAD 寄存器中自动重装载定时初值。只要不把它在SysTick 控制及状态寄存器中的使能位清除,就永不停息,即使在睡眠模式下也能工作。

SysTick定时器被捆绑在NVIC中,用于产生SYSTICK异常(异常号:15)。

Systick中断的优先级也可以设置

4个Systick寄存器   

CTRL  SysTick   控制和状态寄存器
LOAD SysTick   自动重装载除值寄存器
VAL SysTick       当前值寄存器
CALIB SysTick  校准值寄存器
对于STM32,外部时钟源是 HCLK(AHB总线时钟)的1/8  ,内核时钟是 HCLK时钟 配置函数:
SysTick_CLKSourceConfig();


使用特权

评论回复
沙发
1988ChenSir|  楼主 | 2023-6-28 16:47 | 只看该作者
库函数相关

Systick 部分内容属于NVIC控制部分,一共有4个寄存器(core_cm3.h)

static __INLINE uint32_t SysTick_Config(uint32_t ticks)//ticks为计时间隔,多少个ticks/秒

SysTick->LOAD =ticks&SysTick_LOAD_RELOAD_Msk

//设置重载寄存器的值Systick是一个递减的定时器,当定时器递减至0时,重载寄存器中的值就会被重装载,继续开始递减。

使用特权

评论回复
板凳
1988ChenSir|  楼主 | 2023-6-28 16:48 | 只看该作者
STK_LOAD  重载寄存器是个24位的寄存器最大计数0xFFFFFF



SysTick->VAL=0 //当前值寄存器,是个24位的寄存器,读取时返回当前倒计数的值,写它则使之清零,同时还会清除在SysTick 控制及状态寄存器中的COUNTFLAG 标志
SysTick->CTRL |=0x06//控制寄存器,关闭Systick功能,开启Systick中断,使用HCLK作为Systick时钟

SysTick->CTRL |=0x07//开启Systick功能,开启Systick中断,使用HCLK作为Systick时钟
第0位:ENABLE,Systick 使能位  (0:关闭Systick功能;1:开启Systick功能)
第1位:TICKINT,Systick 中断使能位    (0:关闭Systick中断;1:开启Systick中断)
第2位:CLKSOURCE,Systick时钟源选择  (0:使用HCLK/8 作为Systick时钟;1:使用HCLK作为Systick时钟)
第3位:COUNTFLAG,Systick计数比较标志,如果在上次读取本寄存器后,SysTick 已经数到了0,则该位为1。如果读取该位,该位将自动清零
SysTick_CLKSourceConfig(uint32_t SysTick_CLKSource)//misc.h,选择时钟频率

使用特权

评论回复
地板
1988ChenSir|  楼主 | 2023-6-28 16:48 | 只看该作者
代码实现
#include <led.h>
#include <stm32f10x.h>
#include <sys.h>

//配置systick 寄存器
void SysTick_Configuration(void)
{
    SysTick->VAL = 0;
    SysTick->LOAD = (72000000/8000000)*1000;//´ú±íÿ¸ömsÐèÒªµÄ9000¸ösystickʱÖÓÊý
    SysTick->CTRL |= 0x06;
}
//中断处理函数
void SysTick_Handler(void) //????
{
    extern unsigned long TimingDelay; // ????,?????????
    SysTick->VAL = 0;
    if (TimingDelay != 0x00)
    TimingDelay--;
}
//systick延时函数
unsigned long TimingDelay;  //
void Delay(unsigned long nTime)  //
{
    SysTick->CTRL |=0x07;   //
    TimingDelay = nTime; //  
    while(TimingDelay != 0); //  
    SysTick->CTRL |=0x06;//  
}

int main()
{
  SystemInit();    //??(??)???
  LED_Init();
  SysTick_Configuration(); //??systick???
  while(1)
{
    GPIOA->ODR|=1<<8;
    GPIOD->ODR|=1<<2;
    Delay(1000); //1S
    GPIOA->ODR&=~(1<<8);
    GPIOD->ODR&=~(1<<2);
    Delay(1000); //1S  
                                                                              
  }
}

使用特权

评论回复
5
Clyde011| | 2024-1-23 08:24 | 只看该作者

表征负载能力的指标是负载能力和负载能力上升时间

使用特权

评论回复
6
万图| | 2024-1-23 10:20 | 只看该作者

直至电感器饱和,使开关器件烧毁。好的元器件就到唯样商城。图中的D3与N3构成的磁通复位电路,提供了泄放多余磁能的渠道

使用特权

评论回复
7
Uriah| | 2024-1-23 11:23 | 只看该作者

一些静态测试参数还包括波浪、纹波、起伏和静态输出电压精度。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

4

主题

18

帖子

0

粉丝