看野火的视频,用正点原子的板子(STM32F4探索者)做系统定时器实验

本文主要是介绍看野火的视频,用正点原子的板子(STM32F4探索者)做系统定时器实验,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

1. 实验目的

    编写一个毫秒级的延时函数,控制LED的亮灭。这里的灯是LED1,端口是GPIOF,引脚是PIN10。

2. 实验流程

2.1 准备知识

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

2.1.1 SysTick功能框图如下:

    这里的STK_VAL是递减计数器,是24位的,故最大计数时间是2的24次方,STK_LOAD是重装载寄存器,最大也是2的24次方,STK_CLK是时钟,Counter是递减计数器。

    上面是野火的时钟,正点原子的时钟发生了变化,如下图(系统时钟的频率是168MHZ)

2.1.2 .SysTick定时时间计算

    如上图所示:reload代表重装载值,clk代表系统时钟频率,1/clk代表一个周期时间(就是计算器每递减一次的时间,这里是野火的时钟频率72M,原子的设置成168M即可,如果想要得到1ms,那么这个重装载的值就是设置成168000,这样就是t=168000*(1/168MHZ)=1ms。

2.1.3 .SysTick的寄存器

 主要是SysTick->CTRL:系统时钟控制寄存器,SysTick->LOAD:系统时钟重装载寄存器,SysTick->VAL:系统时钟当前值寄存器,SysTick->CALIB:系统时钟校准寄存器(基本不用),后面的函数主要是用到了前两个寄存器。

2.2 编写毫秒级延时函数

2.2.1 系统时钟配置函数

uint32_t   SysTick_Config(uint32_t ticks),要传入的参数就是重装载值。如下代码所示:

__STATIC_INLINE uint32_t   SysTick_Config(uint32_t ticks)
{
    //判断tick的值是否大于2^24  ,如果大于,则不合规则   SysTick_LOAD_RELOAD_Msk: 0xFFFFFFUL
  if ((ticks - 1) > SysTick_LOAD_RELOAD_Msk)  return (1);      /* Reload value impossible *
    //初始化reload寄存器的值
  SysTick->LOAD  = ticks - 1;                                  /* set reload register */
    
    //配置中断优先级  这里是1<<__NVIC_PRIO_BITS,__NVIC_PRIO_BITS是4,1左移就是移动2^4,要占一个周期,所有要-1
  NVIC_SetPriority (SysTick_IRQn, (1<<__NVIC_PRIO_BITS) - 1);  /* set Priority for Systick Interrupt */
 
     //初始化计数器的值count为0
    SysTick->VAL   = 0;                                          /* Load the SysTick Counter Value */
    //配置systick的时钟为168M
    //使能中断
    //使能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 */
}

想要1ms的话,直接传入16800即可。

SysTick_Config(168000); //uint32_t   ticks这里是重装载值

2.2.2 判断系统时钟是否到了1ms

    这里是判断SysTick->CTRL系统时钟控制寄存器的第16位是否为1,如果为1代表计时达到了1ms。正常情况进来(还没达到1ms),SysTick->CTRL的第16位为0和1按位与,结果是0,取反是1,程序一直等待,直到这个SysTick->CTRL的第16位为1和1按位与,结果是1,取反是0,程序结束。

while(!((SysTick->CTRL) & 1<<16)){} 

 2.2.3 如何扩展ms

这里的参数ms是最后函数要传入的参数,代表有多少个这样的1ms,通过for循环来控制时间。

  for(i = 0;i < ms;i++){
        while(!((SysTick->CTRL) & 1<<16)){}
    }

2.2.4 关闭系统时钟

    这里SysTick->CTRL &=~ SysTick_CTRL_ENABLE_Msk;就是SysTick->CTRL &=~ 1<<0;(1UL代表1unsigned long),看上面的SysTick的寄存器图,SysTick->CTRL控制器的使能位的位段是0,说明就是0位,而且复位值是0。1左移0位就是表示第0位是1,其他的位都是0,取反是第0位是0,其他的位都是1,与SysTick->CTRL的第0位进行按位与,不管这一位是0还是1,结果都是0,其他位置没有变化(因为如果其他位置上是1,和1按位与&,结果还是1;如果其他位置上是0,和1按位与&,结果还是0,就是没有变化)

SysTick->CTRL &=~ SysTick_CTRL_ENABLE_Msk;

3.代码展示

3.1 sysTick.c文件代码

void sysTick_Delay_ms(uint32_t ms){
    uint32_t i;  //定义变量i
    //1.初始化寄存器
    SysTick_Config(168000); //uint32_t ticks:72,这里是重装载值
    //判断这个传来的us
    for(i = 0;i < ms;i++){     //传入的ms就是这个1ms运行了多少次
        //读取控制状态寄存器
        while(!((SysTick->CTRL) & 1<<16)){} //按位与如果两个操作数该位上的值均为1,那结果计算的位置上结果就是1,否则结果就是为0
        //时间到了,最后到时间了就是!1就是0,就是结束while
    }
    //关闭这个定时器 :寄存器清零  置位 |=   清0是&= ~
        SysTick->CTRL &=~ SysTick_CTRL_ENABLE_Msk;  
}

3.2  main.c文件代码 

int main(void)
{

    LED_GPIO_Config();    //初始化LED

    while(1){
    GPIO_ResetBits(GPIOF,GPIO_Pin_10); //置低位,LED灯亮
    sysTick_Delay_ms(500);
    GPIO_SetBits(GPIOF,GPIO_Pin_10);//置高位,LED灯灭
    sysTick_Delay_ms(500);    

}

}

4.结果展示

延时函数

这篇关于看野火的视频,用正点原子的板子(STM32F4探索者)做系统定时器实验的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/449088

相关文章

什么是cron? Linux系统下Cron定时任务使用指南

《什么是cron?Linux系统下Cron定时任务使用指南》在日常的Linux系统管理和维护中,定时执行任务是非常常见的需求,你可能需要每天执行备份任务、清理系统日志或运行特定的脚本,而不想每天... 在管理 linux 服务器的过程中,总有一些任务需要我们定期或重复执行。就比如备份任务,通常会选在服务器资

TP-LINK/水星和hasivo交换机怎么选? 三款网管交换机系统功能对比

《TP-LINK/水星和hasivo交换机怎么选?三款网管交换机系统功能对比》今天选了三款都是”8+1″的2.5G网管交换机,分别是TP-LINK水星和hasivo交换机,该怎么选呢?这些交换机功... TP-LINK、水星和hasivo这三台交换机都是”8+1″的2.5G网管交换机,我手里的China编程has

基于Qt实现系统主题感知功能

《基于Qt实现系统主题感知功能》在现代桌面应用程序开发中,系统主题感知是一项重要的功能,它使得应用程序能够根据用户的系统主题设置(如深色模式或浅色模式)自动调整其外观,Qt作为一个跨平台的C++图形用... 目录【正文开始】一、使用效果二、系统主题感知助手类(SystemThemeHelper)三、实现细节

CentOS系统使用yum命令报错问题及解决

《CentOS系统使用yum命令报错问题及解决》文章主要讲述了在CentOS系统中使用yum命令时遇到的错误,并提供了个人解决方法,希望对大家有所帮助,并鼓励大家支持脚本之家... 目录Centos系统使用yum命令报错找到文件替换源文件为总结CentOS系统使用yum命令报错http://www.cppc

流媒体平台/视频监控/安防视频汇聚EasyCVR播放暂停后视频画面黑屏是什么原因?

视频智能分析/视频监控/安防监控综合管理系统EasyCVR视频汇聚融合平台,是TSINGSEE青犀视频垂直深耕音视频流媒体技术、AI智能技术领域的杰出成果。该平台以其强大的视频处理、汇聚与融合能力,在构建全栈视频监控系统中展现出了独特的优势。视频监控管理系统EasyCVR平台内置了强大的视频解码、转码、压缩等技术,能够处理多种视频流格式,并以多种格式(RTMP、RTSP、HTTP-FLV、WebS

不懂推荐算法也能设计推荐系统

本文以商业化应用推荐为例,告诉我们不懂推荐算法的产品,也能从产品侧出发, 设计出一款不错的推荐系统。 相信很多新手产品,看到算法二字,多是懵圈的。 什么排序算法、最短路径等都是相对传统的算法(注:传统是指科班出身的产品都会接触过)。但对于推荐算法,多数产品对着网上搜到的资源,都会无从下手。特别当某些推荐算法 和 “AI”扯上关系后,更是加大了理解的难度。 但,不了解推荐算法,就无法做推荐系

基于人工智能的图像分类系统

目录 引言项目背景环境准备 硬件要求软件安装与配置系统设计 系统架构关键技术代码示例 数据预处理模型训练模型预测应用场景结论 1. 引言 图像分类是计算机视觉中的一个重要任务,目标是自动识别图像中的对象类别。通过卷积神经网络(CNN)等深度学习技术,我们可以构建高效的图像分类系统,广泛应用于自动驾驶、医疗影像诊断、监控分析等领域。本文将介绍如何构建一个基于人工智能的图像分类系统,包括环境

水位雨量在线监测系统概述及应用介绍

在当今社会,随着科技的飞速发展,各种智能监测系统已成为保障公共安全、促进资源管理和环境保护的重要工具。其中,水位雨量在线监测系统作为自然灾害预警、水资源管理及水利工程运行的关键技术,其重要性不言而喻。 一、水位雨量在线监测系统的基本原理 水位雨量在线监测系统主要由数据采集单元、数据传输网络、数据处理中心及用户终端四大部分构成,形成了一个完整的闭环系统。 数据采集单元:这是系统的“眼睛”,

综合安防管理平台LntonAIServer视频监控汇聚抖动检测算法优势

LntonAIServer视频质量诊断功能中的抖动检测是一个专门针对视频稳定性进行分析的功能。抖动通常是指视频帧之间的不必要运动,这种运动可能是由于摄像机的移动、传输中的错误或编解码问题导致的。抖动检测对于确保视频内容的平滑性和观看体验至关重要。 优势 1. 提高图像质量 - 清晰度提升:减少抖动,提高图像的清晰度和细节表现力,使得监控画面更加真实可信。 - 细节增强:在低光条件下,抖

嵌入式QT开发:构建高效智能的嵌入式系统

摘要: 本文深入探讨了嵌入式 QT 相关的各个方面。从 QT 框架的基础架构和核心概念出发,详细阐述了其在嵌入式环境中的优势与特点。文中分析了嵌入式 QT 的开发环境搭建过程,包括交叉编译工具链的配置等关键步骤。进一步探讨了嵌入式 QT 的界面设计与开发,涵盖了从基本控件的使用到复杂界面布局的构建。同时也深入研究了信号与槽机制在嵌入式系统中的应用,以及嵌入式 QT 与硬件设备的交互,包括输入输出设