当前位置: 首页 > article >正文

STM32 第18章 SysTick--系统定时器

时间:2024.10.26-10.27

参考资料:

《零死角玩转STM32》“SysTick--系统定时器”章节

一、学习内容

1.SysTick简介

1.1 SysTick:

系统定时器,24位,只能递减,存在于内核,嵌套在NVIC中,所有的Cortex-M内核的单片机都具有这个定时器。

官方参考手册里的介绍:

系统嘀嗒校准值固定为9000,当系统嘀嗒时钟设定为9MHz(HCLK/8的最大值),产生1ms时间基准。(系统嘀嗒校准值寄存器)

详细介绍在STM32F10xxx Cortex-M3编程手册

2.SysTick功能框图

2.1  SysTick功能框图

counter在时钟的驱动下,从reload初值开始往下递减计数到0,产生中断和置位COUNTFLAG标志。然后又从reload值开始重新递减计数,如此循环。

2.2 SysTick 寄存器

 SysTick控制及状态寄存器

 

校准寄存器使用较少,前面三个寄存器较常用

2.3 SysTick定时时间计算

1-t:

一个计数循环(counter在时钟的驱动下,从reload初值开始往下递减计数到0)的时间,跟load和CLK有关

2-CLK:

72M或者9M,又CTRL寄存器配置

3-RELOAD:

24位,用户自己配置

公式:

TIPS:一般程序都是微秒级别的

 

2.4 SysTick寄存器结构体

在固件库文件:core_cm3.h中定义

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;

 

2.5 SysTick配置库函数

在固件库文件:core_cm3.h中定义

static __INLINE uint32_t SysTick_Config(uint32_t ticks)
{ 
	//判断tick的值是否大于2^24,如果大于,则不符合规则
  if (ticks > SysTick_LOAD_RELOAD_Msk)  return (1);            /* Reload value impossible */
  //初始化reload寄存器的值                                                             
  SysTick->LOAD  = (ticks & SysTick_LOAD_RELOAD_Msk) - 1;      /* set reload register */
	//配置中断优先级,配置为1<<4-1=15,默认为最低的优先级
  NVIC_SetPriority (SysTick_IRQn, (1<<__NVIC_PRIO_BITS) - 1);  /* set Priority for Cortex-M0 System Interrupts */
 //初始化counter的值为0
 SysTick->VAL   = 0;                                          /* Load the SysTick Counter Value */
//配置systick的时钟为72M
//使能中断
//使能systick定时器
  SysTick->CTRL  = SysTick_CTRL_CLKSOURCE_Msk | 
                   SysTick_CTRL_TICKINT_Msk   | 
                   SysTick_CTRL_ENABLE_Msk;                    /* Enable SysTick IRQ and SysTick Timer */
  return (0);                                                  /* Function successful */
}

 

static __INLINE void NVIC_SetPriority(IRQn_Type IRQn, uint32_t priority)
{
  if(IRQn < 0) {
    SCB->SHP[((uint32_t)(IRQn) & 0xF)-4] = ((priority << (8 - __NVIC_PRIO_BITS)) & 0xff); } /* set Priority for Cortex-M3 System Interrupts */
  else {
    NVIC->IP[(uint32_t)(IRQn)] = ((priority << (8 - __NVIC_PRIO_BITS)) & 0xff);    }        /* set Priority for device specific Interrupts  */
}

 

 


http://www.kler.cn/news/368738.html

相关文章:

  • Python 3.13 的改进
  • K8s安装手册
  • 考研要求掌握的C语言程度(堆排序)1
  • Java面试题——微服务篇
  • GPS/北斗时空安全隔离装置(卫星时空防护装置)使用手册
  • 解决电脑更改IP地址后无法连接网络的实用指南
  • kafka-console-ui的简介及安装使用
  • OceanMind海睿思受邀参加中国信通院2024数据要素发展大会
  • 使用 Spring Doc 为 Spring REST API 生成 OpenAPI 3.0 文档
  • Web做题思路
  • python实现数据库两个表之间的更新操作(模糊匹配)示例
  • Django-cookie,session
  • 工作中用到的 Linux 总结(持续更新中...)
  • Word 删除空白页:亲测有效的方法
  • 【JavaEE】【多线程】线程池
  • 理解BERT的词向量及其初始化参数的一致性
  • Redis 集群 总结
  • 单片机中的BootLoader(使用汇编指令进行跳转)
  • Linux系列-yum软件安装包
  • 一次调整prompt的过程
  • docker常用命令整理
  • RabbitMQ几个核心概念
  • 通过页面添加国际化数据,实现vue的国际化
  • J2学习打卡
  • 分账系统适用于那些商家?
  • Spring Boot植物健康系统:绿色科技的创新