首页 > 其他分享 >【ARM课】4-Systick

【ARM课】4-Systick

时间:2024-04-08 14:59:02浏览次数:20  
标签:temp CTRL SysTick Systick 计时器 寄存器 GPIO ARM

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.效果展示

<iframe allowfullscreen="true" data-mediaembed="csdn" frameborder="0" id="f0jB9qRv-1712558189684" src="https://live.csdn.net/v/embed/377080"></iframe>

视频

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,从而完成了延时操作。

标签:temp,CTRL,SysTick,Systick,计时器,寄存器,GPIO,ARM
From: https://blog.csdn.net/aabbcce_/article/details/137507399

相关文章

  • 如何在HarmonyOS(鸿蒙操作系统)上进行应用开发
    文章中提到的关键点包括:学习ArkTS:作者建议初学者首先学习使用ArkTS编写HelloWorld程序,并可以通过TypeScript教程来快速掌握基础语法。对于有Flutter或ReactNative开发经验的开发者来说,页面布局会比较容易上手。页面布局:作者建议根据HarmonyOS的指导文档尝试编写简单布局,......
  • 手把手教你做阅读理解题-初中中考阅读理解解题技巧013-dearMars Project
    PDF格式公众号回复关键字:ZKYD013阅读理解技巧,在帮助读者有效获取和理解文本信息方面发挥着重要作用,熟练掌握如下6个技巧,可快速突破阅读理解1预览文章结构在开始深入阅读之前,快速浏览文章的标题、段落开头和结尾,可以迅速把握文章的主题、大致内容和结构标题通常能概括文章......
  • Vscode+gcc-arm+openocd搭建STM32开发环境
    1简介尝试使用Vscode搭建STM32开发环境,自己记录一下详细的配置过程2工具下载设计到的相关软件以及资源包括Vscode软件、STM32CubeMX、mingw64以及openocd,相应的软件介绍以及下载链接如下:Vscode软件:宇宙第一编辑器,开源,插件丰富CubeMx:初始化代码生产器,HAL库mingw64:因......
  • 鸿蒙HarmonyOS实战-ArkUI组件(TextInput/TextArea)
    ......
  • 单芯片国产ARM+FPGA,复旦微FMQL20SM工业核心板正式发布!
      ......
  • OpenHarmony 4.1 Release版本正式发布,邀您体验
    春风轻拂的4月,OpenAtomOpenHarmony(以下简称“OpenHarmony”)4.1Release版本如期而至,开发套件同步升级到API11Release。相比4.0Release版本,4.1Release版本应用开发的开放能力以全新的Kit维度呈现,提供给开发者更清晰的逻辑和场景化视角;新增4000多个API,应用开发能力更加丰富;Ark......
  • JetBrains PyCharm 2024.1 (macOS, Linux, Windows) - 面向专业开发者的 Python IDE
    JetBrainsPyCharm2024.1(macOS,Linux,Windows)-面向专业开发者的PythonIDE请访问原文链接:JetBrainsPyCharm2024.1(macOS,Linux,Windows)-面向专业开发者的PythonIDE,查看最新版。原创作品,转载请保留出处。作者主页:sysin.orgJetBrainsPyCharm-面向专业开发......
  • Arm架构下麒麟操作系统安装配置Mariadb数据库
    1、安装配置JDK(1)检查机器是否已安装JDK执行java-version命令查看机器是否安装JDK,一般麒麟操作系统默认安装openjdk1.8。  (2)安装指定版本JDK如果麒麟操作系统默认安装的openjdk1.8不符合需求的话,可以卸载机器安装的openjdk1.8并按需安装所需的openjdk版本,此步骤本文不......
  • 在Linux中,SELinux和AppArmor安全模块作用是什么?
    在Linux中,SELinux(Security-EnhancedLinux)和AppArmor(ApplicationArmor)是两种强制访问控制(MAC)安全模块,它们用于提供额外的安全层,以限制程序和用户的权限,从而保护系统免受恶意软件和未授权访问的威胁。1.SELinux(Security-EnhancedLinux)作用:强制访问控制:SELinux通过强制执行......
  • ARM上面Docker模式安装chrome以及chromedriver的过程
    ARM上面Docker模式安装chrome以及chromedriver的过程背景公司里面有四台鲲鹏服务器想通过ARM的自动化进行功能遍历走查.前期提过需求,但是同时调研之后发现比较困难,作罢了.最近清明假期.想着能够实现以下.最开始的思路虽然网上有一个chromedriver的下载地址:http......