• stm32cubemx:systick系统定时器中断与TIM定时器中断的配置及使用方法


    时钟作为单片机中十分重要的一环,没有时钟作为时间基准,我们对单片机进行编程也将变得混乱及难以把控时间度。接下来就看看怎么在stm32cubemx中查询我们自己设置的时钟吧。
    首先选择RCC,然后可以看到有HSE与LSE的选项,分别为高速时钟和低速时钟,stm32单片机内部分别有1个低速时钟与1个高速时钟,外部也可以接1个外部低速时钟与1个外部高速时钟。当我们使用内部时钟时,将其选为Disable便可,当使用外部时钟时则选Crystal/Ceramic Resonator选项。
    在这里插入图片描述
    由于我使用内部高速时钟作为时间基准,所以高速时钟和低速时钟均选“Disable”便可。接下来让我们看一下整个MCU的时钟树:在这里插入图片描述
    由图片我们可以知道现在系统时钟为8MHz,接下来就讲解一下怎么配置和使用systick定时溢出中断

    SYSTICK定时器溢出中断配置及使用:
    在这里插入图片描述
    接下来我们去NVIC中断设置中查看systick中断是否已经使能:
    在这里插入图片描述
    可以看到systick定时器中断已经默认打开且无法关断,其优先级为3(优先级数字越大其优先度越高);

    然后我们再配置1个IO口输出点亮和熄灭LED灯,可供我们更加直观的看出定时器中断正在执行吧:
    在这里插入图片描述
    接下来就可以生成keil工程了:
    在这里插入图片描述
    在这里插入图片描述
    点击右上角的GENERATE CODE生成即可去相应路径中打开工程了:
    在这里插入图片描述

    打开工程后我们找到stm32xxxx._hal.c这个文件打开,找到
    if (HAL_SYSTICK_Config(SystemCoreClock / (1000U / uwTickFreq)) > 0U)
    这段代码,如图:在这里插入图片描述
    我们更改其中的1000U该值便可更改溢出中断的时间,其计算方法为
    1秒/1000=1ms ,我将其更改为1秒/500=2ms;则每2ms将进入一次systick溢出中断,接下来我们在stm32xxxx_it.c中找到其中断服务函数
    void SysTick_Handler(void):
    在这里插入图片描述
    其中我定义了一个累加值 uint16_t systime,当累加到1000的时候,即2秒,便执行1次翻转PA15电平的操作并清除计数值(该操作最好移至main函数中执行,中断中仅执行累加计数最好,本人为了方便自己所以偷懒了^~*)。接下来便编译程序,烧录程序,查看结果,将PA15连上LED后将看到其每隔两秒便亮or灭。

    TIM普通定时器配置及使用:
    回到stm32cubemx中,我们对该工程的时钟系统不做任何改变(即仍然使用内部8M高速时钟),对TIM3进行配置如下:
    在这里插入图片描述
    首先时钟还是8MHz,经过8分频后变成1MHz,即1微妙,然后累加值设置为500,则500微妙TIM3定时器将溢出执行一次中断,接下来我们先去使能TIM3溢出中断:
    在这里插入图片描述

    之后继续生成工程,回到工程之后找到TIM3中断服务函数,把之前在systick中断服务函数中的那部分执行程序剪切过来:
    在这里插入图片描述
    别急着烧录程序,这时候我们还没有打开TIM3中断定时器呢,回到main函数中,加入此程序
    HAL_TIM_Base_Start_IT(&htim3);在这里插入图片描述
    接下来便可以烧录程序查看结果了。可以看到LED灯将以500毫秒的时间频率进行闪烁,证明TIM3溢出中断功能已经实现。

  • 相关阅读:
    从三线城市公司跳槽美团关键,啃透了腾讯T8-3手写Java高级笔记
    Spring中有哪些实例化Bean的方法呢?
    YOLO物体检测系列3:YOLOV3改进解读
    所有 WCF 超时说明
    【TA-霜狼_may-《百人计划》】图形4.3 实时阴影介绍
    信钰证券:股票抵押是好还是坏?
    这10款VS Code神仙插件,嵌入式程序员必备
    免费嵌入 NFT 数据到任何网站或平台
    Ubuntu编译安装colmap遇到的几个问题以及解决
    操作系统【OS】调度算法对比图
  • 原文地址:https://blog.csdn.net/qq_42289734/article/details/127651954