STM32自学☞定时器外部时钟案例

这篇具有很好参考价值的文章主要介绍了STM32自学☞定时器外部时钟案例。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

本案例主要是通过外部时钟实现对射式红外传感器的计次,在oled显示屏上显示CNT的次数

timer_interrupt.c文件

#include "stm32f10x.h"

#include "stm32f10x_tim.h"

#include "timer_interrupt.h"

#include "stdint.h"

//初始化函数

void Timer_Init(void)

{

 /*开启时钟*/

 RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE); //开启TIM2的时钟

 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); //开启GPIOA的时钟

 /*GPIO初始化*/

 GPIO_InitTypeDef GPIO_InitStructure;

 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;

 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;

 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

 GPIO_Init(GPIOA, &GPIO_InitStructure); //将PA0引脚初始化为上拉输入

 /*外部时钟配置*/

 TIM_ETRClockMode2Config(TIM2, TIM_ExtTRGPSC_OFF, TIM_ExtTRGPolarity_NonInverted, 0x0F);

                //选择外部时钟模式2,时钟从TIM_ETR引脚输入

                //注意TIM2的ETR引脚固定为PA0,无法随意更改

                //最后一个滤波器参数加到最大0x0F,可滤除时钟信号抖动

 /*时基单元初始化*/

 TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure; //定义结构体变量

 TIM_TimeBaseInitStructure.TIM_ClockDivision = TIM_CKD_DIV1; //时钟分频,选择不分频,此参数用于配置滤波器时钟,不影响时基单元功能

 TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up; //计数器模式,选择向上计数

 TIM_TimeBaseInitStructure.TIM_Period = 10 - 1; //计数周期,即ARR的值

 TIM_TimeBaseInitStructure.TIM_Prescaler = 1 - 1; //预分频器,即PSC的值

 TIM_TimeBaseInitStructure.TIM_RepetitionCounter = 0; //重复计数器,高级定时器才会用到

 TIM_TimeBaseInit(TIM2, &TIM_TimeBaseInitStructure); //将结构体变量交给TIM_TimeBaseInit,配置TIM2的时基单元 

 /*中断输出配置*/

 TIM_ClearFlag(TIM2, TIM_FLAG_Update); //清除定时器更新标志位

                //TIM_TimeBaseInit函数末尾,手动产生了更新事件

                //若不清除此标志位,则开启中断后,会立刻进入一次中断

                //如果不介意此问题,则不清除此标志位也可

 TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE); //开启TIM2的更新中断

 /*NVIC中断分组*/

 NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //配置NVIC为分组2

                //即抢占优先级范围:0~3,响应优先级范围:0~3

                //此分组配置在整个工程中仅需调用一次

                //若有多个中断,可以把此代码放在main函数内,while循环之前

                //若调用多次配置分组的代码,则后执行的配置会覆盖先执行的配置

 /*NVIC配置*/

 NVIC_InitTypeDef NVIC_InitStructure; //定义结构体变量

 NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn; //选择配置NVIC的TIM2线

 NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //指定NVIC线路使能

 NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2; //指定NVIC线路的抢占优先级为2

 NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1; //指定NVIC线路的响应优先级为1

 NVIC_Init(&NVIC_InitStructure); //将结构体变量交给NVIC_Init,配置NVIC外设

 /*TIM使能*/

 TIM_Cmd(TIM2, ENABLE); //使能TIM2,定时器开始运行

}文章来源地址https://www.toymoban.com/news/detail-835358.html

uint16_t Timer_GetCounter(void)

{

 return TIM_GetCounter(TIM2); //返回定时器TIM2的CNT

}

timer_interrupt.h文件

#ifndef __TIMER_INTERRUPT_H

#define __TIMER_INTERRUPT_H

#include "stdint.h"

void Timer_Init(void);

uint16_t Timer_GetCounter(void);

#endif

main.c文件

#include "stm32f10x.h"

#include "stm32f10x_tim.h"

#include "delay.h"

#include "OLED.h"

#include "timer_interrupt.h"

uint16_t Num; //定义在定时器中断里自增的变量

int main(void)

{

 /*模块初始化*/

 OLED_Init(); //OLED初始化

 Timer_Init(); //定时中断初始化

 /*显示静态字符串*/

 OLED_ShowString(1, 1, "Num:"); //1行1列显示字符串Num:

 OLED_ShowString(2, 1, "CNT:"); //2行1列显示字符串CNT:

 while (1)

 {

  OLED_ShowNum(1, 5, Num, 5); //不断刷新显示Num变量

  OLED_ShowNum(2, 5, Timer_GetCounter(), 5); //不断刷新显示CNT的值

 }

}

/*TIM2中断函数*/

void TIM2_IRQHandler(void)

{

 if (TIM_GetITStatus(TIM2, TIM_IT_Update) == SET) //判断是否是TIM2的更新事件触发的中断

 {

  Num ++; //Num变量自增,用于测试定时中断

  TIM_ClearITPendingBit(TIM2, TIM_IT_Update); //清除TIM2更新事件的中断标志位

               //中断标志位必须清除

               //否则中断将连续不断地触发,导致主程序卡死

 }

}

到了这里,关于STM32自学☞定时器外部时钟案例的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • STM32单片机(六)TIM定时器 -> 第二节:TIM定时中断练习(定时器定时中断和定时器外部时钟)

    ❤️ 专栏简介:本专栏记录了从零学习单片机的过程,其中包括51单片机和STM32单片机两部分;建议先学习51单片机,其是STM32等高级单片机的基础;这样再学习STM32时才能融会贯通。 ☀️ 专栏适用人群 :适用于想要从零基础开始学习入门单片机,且有一定C语言基础的的童鞋

    2024年02月09日
    浏览(41)
  • 基于HAL库的STM32的单定时器的多路输入捕获测量脉冲频率(外部时钟实现)

    目录 写在前面 一般的做法(定时器单通道输入捕获) 以外部时钟的方式(高低频都适用) 测试效果 STM32的定时器本身有输入捕获的功能。可选择双端捕获,上升沿捕获或者是下降沿捕获。对应捕获频率来说,连续捕获上升沿或下降沿的时间间隔就是其脉冲的周期. 定时器设置频率

    2024年02月08日
    浏览(48)
  • STM32理论 —— 定时器、时钟

    以F103系列为例; 1.1.1 分类与主要功能特点 STM32F103系列单片机一共有11个定时器:: 2个 高级定时器 :TIM1、TIM8;挂载在APB2时钟总线上; 4个 通用定时器 :TIM2~TIM5;挂载在APB1时钟总线上; 2个 基本定时器 :TIM6、TIM7; 2个 看门狗定时器 ; 1个 系统嘀嗒定时器 ; 主要功能特

    2024年02月08日
    浏览(43)
  • stm32内部时钟定时器

    1、总体介绍 TIM(Timer)定时器是STM32中功能最强大,结构最复杂的一个外设,以下对其做一下简介(以stm32为例): TIM可以对输入的时钟进行计数,并在数值达到设定值时触发中断。 在STM32中定时器的基准时钟一般都是主频72MHz,并且以16位计数器,预分频器,自动重装寄存器

    2024年02月17日
    浏览(49)
  • 定时器定时中断&定时器外部时钟

    1、RCC开启时钟,此时定时器的基准时钟和整个外设的工作时钟都打开 2、选择时基单元的时钟源,对于定时中断选择内部时钟源 3、配置时基单元,包括预分频器,自动重装器,计数模式等 4、配置输出中断控制允许更新中断输出到NVIC 5、配置NVIC,在NVIC中打开定时器中断的通

    2024年02月15日
    浏览(51)
  • STM32F4基础:时钟系统、中断及定时器

            时钟系统是CPU的脉搏, 由于STM32 本身非常复杂,外设非常的多,并不是所有外设都需要系统时钟这么高的频率,比如看门狗以及 RTC 只需要几十 k 的时钟即可,因此STM32F4 的时钟系统比较复杂 ,不像简单的 51 单片机一个系统时钟就可以解决一切。         如下图所

    2023年04月09日
    浏览(40)
  • STM32 第20讲 通用定时器(简介/框图/时钟源)

    对于STM32F407有10个通用定时器,TIM2 ~ TIM5 和 TIM9 ~ TIM14。 主要特性: 16位递增、递减、中心对齐计数器(计数值:0~65535) 16位预分频器(分频系数:1~65536) 可用于触发DAC、ADC 在更新事件、触发事件、输入捕获、输出比较时,会产生中断/DMA请求 4个独立通道,可用于:输入捕

    2024年02月09日
    浏览(39)
  • STM32F103学习笔记(5.1)——定时器时钟

    STM32F103RCT6上总共有8个定时器,其中TIM1和TIM8是高级定时器,它们挂载在APB2高速总线上。而TIM2、TIM3、TIM4、TIM5是通用定时器,TIM6、TIM7是基本定时器,它们都挂载在APB1上,基本定时器的功能最少,高级定时器功能最多。所以以学习通用定时器为主。 需要参考手册第二章存储器

    2024年02月15日
    浏览(42)
  • STM32学习笔记(四)丨TIM定时器及其应用(定时中断、内外时钟源选择)

    ​  本次课程采用单片机型号为STM32F103C8T6。 ​  课程链接:江科大自化协 STM32入门教程   往期笔记链接:   STM32学习笔记(一)丨建立工程丨GPIO 通用输入输出   STM32学习笔记(二)丨STM32程序调试丨OLED的使用   STM32学习笔记(三)丨中断系统丨EXTI外部中断

    2023年04月13日
    浏览(62)
  • STM32 F103C8T6学习笔记4:时钟树、滴答计时器、定时器定时中断

    今日理解一下STM32F103 C8T6的时钟与时钟系统、滴答计时器、定时器计时中断的配置,文章提供原理,代码,测试工程下载。 目录 时钟树与时钟系统: 滴答计时器: 定时器计时中断: 测试结果: 测试工程下载: 该系统介绍在 STM32F10x-中文参考手册 P56页开始 微控制器的时钟系

    2024年02月13日
    浏览(47)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包