【ARM课】4-Systick

1.cubemx设置

参考文章

【STM32】HAL库-系统滴答定时器SysTick

时钟设置

在这里插入图片描述

将HCLK设置为最大频率72MHz

在这里插入图片描述

NVIC设置

在这里插入图片描述

Time base: System tick timer 优先级默认为15,可以自己修改,没有其他中断的时候也可以不修改

2.使用函数

电平翻转
void HAL_GPIO_TogglePin(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin)

3.代码

第二篇文章有写微妙级别的延时函数,这次再写个毫秒级别的延时函数。

微秒级延时函数

void delay_us(int32_t nus)
{
    int32_t temp;
    // 假设系统时钟为72MHz,SysTick计时器每1/72微秒递减一次
    SysTick->LOAD = 72 * nus - 1; // 设置LOAD的值为需要的微秒数乘以72,然后减去1
    SysTick->VAL = 0x00; // 清空计数器
    SysTick->CTRL = 0x01; // 使能SysTick,采用内核时钟源

    do
    {
        temp = SysTick->CTRL; // 读取当前控制寄存器的值
    }
    while((temp & 0x01) && (!(temp & (1 << 16)))); // 等待计时器标志位,直到计时结束

    SysTick->CTRL = 0x00; // 关闭计数器
    SysTick->VAL = 0x00; // 清空计数器
}

毫秒级延时函数

void delay_ms(int32_t nms)
{
    int32_t temp;
    // 假设系统时钟为72MHz,每毫秒的时钟周期数为72000
    // SysTick计时器每1/72MHz递减一次,即每14.2222ns递减一次
    // 因此,每毫秒需要72000个时钟周期
    SysTick->LOAD = (uint32_t)(72000 * nms - 1);
    SysTick->VAL = 0x00; // 清空计数器
    SysTick->CTRL = 0x01; // 使能SysTick,采用内核时钟源

    do
    {
        temp = SysTick->CTRL;
    }
    while((temp & 0x01) && (!(temp & (1 << 16)))); // 等待时间到达

    SysTick->CTRL = 0x00; // 关闭计数器
    SysTick->VAL = 0x00; // 清空计数器
}

main里面的判断

    while (1) 
    {
    /* USER CODE END WHILE */
    	HAL_GPIO_TogglePin(LED4_GPIO_Port,LED4_GPIO_PIN);
    	HAL_GPIO_TogglePin(LED5_GPIO_Port,LED5_GPIO_PIN);
    	delay_ms(500);
    /* USER CODE BEGIN 3 */
    }

4.效果展示

视频

5.代码解释

delay_msdelay_us里面有寄存器操作,搬运手册上对这几个寄存器的解读。

在这里插入图片描述

SysTick Control and Status Register (SysTick->CTRL)

这个寄存器用于控制SysTick定时器的启动和停止,并提供一个状态位来指示定时器是否到达零。它的主要字段包括:

  • ENABLE: 位0,用于启用或禁用SysTick计时器。设置为1时启用计时器,设置为0时禁用。
  • TICKINT: 位1,控制SysTick达到零时是否触发中断。设置为1时,达到零值会触发中断。
  • CLKSOURCE: 位2,选择SysTick的时钟源。设置为1时,使用系统时钟;设置为0时,使用外部参考时钟。
  • COUNTFLAG: 位16,这是一个读取清除标志,当计数器从非零递减到零时设置。读取此寄存器会清除该位。

SysTick Reload Value Register (SysTick->LOAD)

这个寄存器用于设置SysTick定时器的倒计时起始值。当计时器启用并从LOAD寄存器的值递减到0时,如果启用了中断(TICKINT为1),则会产生一个中断。

  • RELOAD: 位[23:0],用于设置计时器的重新加载值。这个值决定了计时器倒计时的长度。

SysTick Current Value Register (SysTick->VAL)

此寄存器包含当前计时器的倒计时值。写任何值到此寄存器会清除计时器值并清除COUNTFLAG位。

  • CURRENT: 位[23:0],显示当前计数值。写入此寄存器会清零计数器和COUNTFLAG位。

这些寄存器联合使用,可以实现精确的时间延迟功能。例如,在配置SysTick->LOAD寄存器以设置所需的延迟时间,然后启动计时器通过设置SysTick->CTRL的ENABLE位。SysTick->VAL可以用于在延时期间随时读取当前计时器值,或者用于清零计时器。通过检查SysTick->CTRL的COUNTFLAG位,可以确定计时器是否已经倒计时到0,从而完成了延时操作。

  • 22
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值