0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看威廉希尔官方网站 视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

CW32系统滴答SysTick定时器介绍

武汉芯源半导体有限公司 2023-01-05 13:53 次阅读

Cortex-M0+处理器中内置有一个SysTick定时器,通常用于嵌入式操作系统的多任务切换,在不使用操作系统的应用中,亦可作为其它用途,如定时、计时或者为需要周期性执行的任务提供中断源。

1.SysTick工作原理

SysTick定时器内部含有一个24位的递减计数器,当计数减至0时,会从SysTick的重装载寄存器中取值作为计数器的初始值,同时可以选择在这个时候产生中断(异常号:15)。例如设置重装载寄存器为100,那么当计数减为0时,就会重新复位为100继续递减计数。

它的特点是:

• 24 位递减计数器

• 自动重装载能力

• 当计数器达到 0 时产生可屏蔽的系统中断

2.SysTick寄存器介绍

在core_cm0plus.h中展示了四种寄存器,我们将一一介绍:

typedef struct

{

__IOM uint32_t CTRL;

/*!< Offset: 0x000 (R/W)  SysTick Control and Status Register */

__IOM uint32_t LOAD;

/*!< Offset: 0x004 (R/W)  SysTick Reload Value Register */

__IOM uint32_t VAL;

/*!< Offset: 0x008 (R/W)  SysTick Current Value Register */

__IM uint32_t CALIB;

/*!< Offset: 0x00C (R/ )  SysTick Calibration Register */

} SysTick_Type;

IOM uint32_t CTRL控制寄存器:

第0位:ENABLE,SysTick使能位(0:关闭SysTick功能,1:开启SysTick功能);

第1位:TICKINT,SysTick中断使能位(0:关闭SysTick中断,1:开启SysTick中断);

第2位:CLKSOURCE,SysTick时钟选择(1:使用HCLK,0:使用参考时钟频率);

第3为:COUNTFLAG,SysTick计数比较标志,如果在上次读取本寄存器后,SysTick已经数到0了,则该位为1,如果读取该位,该位自动清零。

__IOM uint32_t LOAD重载寄存器:

24位的寄存器,最大计数0xFFFFFF。当SysTick计数器递减至0时,重载寄存器中的值就会被重装载,继续开始递减。

__IOM uint32_t VAL当前值寄存器:

24位的寄存器,读取时返回当前计数器的计数值,写任何值都会使之清零,同时还会清除SysTick 控制寄存器中的COUNTFLAG 标志。

__IM uint32_t CALIB校准值寄存器:

只读寄存器,主要存放10mS校准值,该值和MCU相关。

3.操控SysTick定时器

在MDK开发环境中,我们不必要非得去操作每一个寄存器,可以通过调用CW函数库中的函数来进行相关的操作。

void InitTick(uint32_t HclkFreq)

初始化SysTick滴答定时器,带入的参数为HCLK的频率,如HCLK为24MHz,则带入参数为24000000。该函数会调用uint32_t SysTick_Config(uint32_t ticks)函数完成SysTick定时器的相关配置并启动。SysTick默认为1mS定时器,如果需要修改定时周期,则需要修改uint32_t SysTick_Config(uint32_t ticks)函数中重装载值寄存器配置。

__STATIC_INLINE uint32_t SysTick_Config(uint32_t ticks)

初始化系统计时器及其中断,并启动。

(1) SysTick->LOAD = (uint32_t)(ticks - 1UL);

设置SysTick重装载值

(2)NVIC_SetPriority(SysTick_IRQn,

(1UL << __NVIC_PRIO_BITS) - 1UL);                        

设置SysTick定时器中断优先级

(3) Tick->VAL = 0UL;

加载SysTick计数器值

(4) SysTick->CTRL = SysTick_CTRL_CLKSOURCE_Msk |

SysTick_CTRL_TICKINT_Msk |

SysTick_CTRL_ENABLE_Msk;

设置SysTick IRQ中断使能,并开启SysTick定时器

4.Systick延时功能实现

对于mS级及以上的延时,可在完成SysTick定时器初始化后,通过SysTickDelay(uint32_t Delay)函数来实现,该函数的形参为需要延时的mS数。

对于uS级延时,一般通过调整__NOP 空指令数量来实现,不建议用SysTick定时器来实现,主要原因是M0+系统中固有的中断响应时间(压栈和出栈)、中断处理时间等会影响uS延时精度。

int main(void)

{

__RCC_GPIOC_CLK_ENABLE(); //设置HCLK为24MHz

InitTick( 24000000 ); //初始化SysTick为1mS定时器

GPIO_InitTypeDef GPIO_InitStructure1 = {0} ; //初始化对应GPIO口

GPIO_InitStructure1.Pins = GPIO_PIN_3 ;

GPIO_InitStructure1.IT = GPIO_IT_NONE;

GPIO_InitStructure1.Mode = GPIO_MODE_OUTPUT_PP;

GPIO_Init(CW_GPIOC, &GPIO_InitStructure1);

PC03_SETHIGH(); // LED灯置高电平,低电平有效

while(1)

{

PC03_TOG(); //PC03口电平反转

SysTickDelay (100);//延时100mS

PC03_TOG();//PC03口电平再次反转

SysTickDelay (100);//延时100mS

}

}

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 单片机
    +关注

    关注

    6037

    文章

    44558

    浏览量

    635245
  • mcu
    mcu
    +关注

    关注

    146

    文章

    17148

    浏览量

    351191
  • 微控制
    +关注

    关注

    1

    文章

    51

    浏览量

    14486
  • 定时器
    +关注

    关注

    23

    文章

    3248

    浏览量

    114793
收藏 人收藏

    评论

    相关推荐

    求助,关于STM32F030K6低功耗停止模式下SysTick的问题求解

    定时器,停止模式就会被唤醒。 有点疑惑,滴答定时器这个时钟从哪来的?进入停止模式后SYSCLK的时钟来源是哪个提供的?
    发表于 07-23 08:11

    定时器的工作方式介绍

    定时器是计算机和嵌入式系统中常见的一种硬件模块,用于实现定时和计数功能。定时器的工作方式通常由一组寄存来控制,这些寄存
    的头像 发表于 07-12 10:29 952次阅读

    鸿蒙开发系统基础能力:Timer定时器

    设置一个定时器,该定时器定时器到期后执行一个函数。
    的头像 发表于 06-28 11:33 1000次阅读
    鸿蒙开发<b class='flag-5'>系统</b>基础能力:Timer<b class='flag-5'>定时器</b>

    【项目展示】基于CW32的遥控循迹小车

    CW32循迹小车.zip_免费高速下载|百度网盘-分享无限制  一、概述 CW32循迹、遥控小车具有循迹和遥控两种功能,小车的硬件模块由CW32F030C8T6小蓝板、智能小车控制底板、BT04-E
    的头像 发表于 05-31 17:33 1316次阅读
    【项目展示】基于<b class='flag-5'>CW32</b>的遥控循迹小车

    CW32数字电压电流表软件教程-实验四:数码管动态显示

    显示不同的值需要用到CW32定时器功能,在定时器的中断服务程序里面执行显示刷新的动作。有关CW32定时器和中断的相关知识请查看链接:【
    的头像 发表于 05-31 15:23 519次阅读
    <b class='flag-5'>CW32</b>数字电压电流表软件教程-实验四:数码管动态显示

    CW32使用DMA单通道、定时器触发ADC实现了多路AD采集

    本测试样例基于CW32F030C8T6MCU,使用DMA单通道、定时器触发ADC实现了12路AD采集。
    的头像 发表于 05-24 09:29 846次阅读
    <b class='flag-5'>CW32</b>使用DMA单通道、<b class='flag-5'>定时器</b>触发ADC实现了多路AD采集

    如何实现一个软件定时器

    在Linux,uC/OS,FreeRTOS等操作系统中,都带有软件定时器,原理大同小异。典型的实现方法是:通过一个硬件定时器产生固定的时钟节拍,每次硬件定时器中断到,就对一个全局的时间
    的头像 发表于 04-29 11:00 652次阅读

    CW32量产烧录工具

    本节主要介绍CW32微控制的烧录CW-Writer,以及与之配合的软件CW-Programm
    的头像 发表于 04-25 15:22 1405次阅读
    <b class='flag-5'>CW32</b>量产烧录工具

    CW32快速开发入门

    CW32快速开发入门
    的头像 发表于 04-24 18:56 1966次阅读
    <b class='flag-5'>CW32</b>快速开发入门

    操作FreeRTOS时,执行__WFI()导致系统滴答中断无法唤醒设备怎么解决?

    内核时钟全部关闭了,导致滴答中断无法触发,不知道是不是这样的原因 2、如果__WFI()无法使用滴答中断唤醒,那能否用普通定时器唤醒,怎么样能够让普通定时器去替代
    发表于 04-24 08:29

    s7200定时器的五种故障介绍

    定时器或CPU故障:如果定时器本身或PLC的CPU出现故障,也可能导致定时器无法复位。此时,需要检查定时器和CPU的工作状态,确保其正常运行。
    的头像 发表于 04-03 17:08 2472次阅读

    ​PLC定时器介绍

    定时器是PLC中重要的编程元件,是累计时间增量的内部器件。大部分自动控制领域都需要定时器进行延时控制,灵活地使用定时器可以编制出复杂的控制程序。
    发表于 03-22 12:36 2387次阅读
    ​PLC<b class='flag-5'>定时器</b><b class='flag-5'>介绍</b>

    使用555定时器的可调双定时器电路

    定时器 IC 555 是最通用和最常用的 IC 之一,因为它的应用范围更广,如 PWM放大器、延迟定时器、开关电路、占空比选择、时钟脉冲发生等。这也可用于各种应用,如精确
    的头像 发表于 02-25 15:16 2223次阅读
    使用555<b class='flag-5'>定时器</b>的可调双<b class='flag-5'>定时器</b>电路

    555定时器的基本功能 555定时器的工作原理及其应用

    555定时器是一种非常常见和常用的集成电路,它具有广泛的应用领域,例如计时、频率分频、脉冲宽度调制等。本文将详细介绍555定时器的基本功能、工作原理以及应用。 一、555定时器的基本功
    的头像 发表于 01-18 11:12 1.5w次阅读

    单片机定时器的用法

    本章以CW32通用定时器为例介绍单片机定时器的用法。
    的头像 发表于 01-04 10:37 1412次阅读
    单片机<b class='flag-5'>定时器</b>的用法