STM32开发(10)----CubeMX配置基本定时器

这篇具有很好参考价值的文章主要介绍了STM32开发(10)----CubeMX配置基本定时器。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。


前言

本章介绍使用STM32CubeMX对基本定时器进行配置的方法,STM32F103高性能系列设备包括基本定时器、高级控制定时器、通用定时器、看门狗定时器和 SysTick 定时器,但是STM32F103C6t6上资源比较有限(高级定时器TIM1,通用定时器TIM2和TIM3),没有真正的基本定时器,其实通用定时器和高级定时的功能是包含基本定时器的,因此如果没有使用到通用定时和高级定时的附加功能,也就是基本定时器了。本章介绍基本定时器,其他的定时器由后续章节一一介绍,最后通过示波器和打印结果来展现实现结果,如果有LED灯也可以,通过定时器来控制LED灯闪烁来观察现象。

一、定时器的介绍

定时器就像单片机的闹钟一样,定时器的核心就是计算器, 要实现计数功能,首先要给它一个时钟源,定时器根据时钟的输出信号,每隔“一秒"(一个单位时间),计数单元的数值就增加一,当计数单元数值增加到“设定的闹钟提醒时间"时,计数单元就会向中断系统发出中断申请,产生"响铃提醒",使程序跳转到中断服务函数中执行。
下面是三种定时的比较:
stm32cubemx 定时器,stm32基础教程,stm32,单片机,嵌入式硬件
我们这里给出基本定时器的框图,基本定时器比较简单,也是通用定时器和高级定时器的基础,分析基本定时器,可以很好的分解通用定时器和高级定时器。
stm32cubemx 定时器,stm32基础教程,stm32,单片机,嵌入式硬件
从上图我们可以看到基本定时器主要由下面四个部分组成:
**时钟源:**定时器时钟 TIMxCLK,即内部时钟 CK_INT所以定时器时钟,通过下图可以看到不同定时器所在的总线,从而确定他们的时钟源,STM32F103C6T6的高级定时器TIM1定时挂在APB2上,通用定时器TIM2。
stm32cubemx 定时器,stm32基础教程,stm32,单片机,嵌入式硬件
**预分频器(TIMx_PSC):**定时器时钟经过 PSC 预分频器之后,即计数器时钟 CK_CNT,用来驱动计数器计数。 PSC 是一
个16 位的预分频器,可以对定时器时钟 TIMxCLK 进行 1~65536 之间的任何一个数进行分频。具体计算方式为: CK_CNT=TIMxCLK/(PSC+1)。

下图为预分频系数从1变到2的计数器时序图:图中CK_PSC是脉冲信号,预分频系数为2,所以最下面的预分频计数器计数0,1,中间的计数器寄存器记一次数。
stm32cubemx 定时器,stm32基础教程,stm32,单片机,嵌入式硬件
**计数器(TIMx_CNT):**计数器 CNT 是一个 16 位的计数器,只能往上计数,最大计数值为 65535。当计数达到自动重装载寄存器的时候产生更新事件,并清零从头开始计数。

**自动重装载寄存器(TIMx_ARR):**自动重装载寄存器 ARR 是一个 16 位的寄存器,这里面装着计数器能计数的最大数
值。当计数到这个值的时候,如果使能了中断的话,定时器就产生溢出中断。

下图为分频系数为1,自动重装载寄存器(TIMx_ARR)为36的计数器时序图。当计数器满36则进行重装,同时触发更新事件,更新中断标志等动作。
stm32cubemx 定时器,stm32基础教程,stm32,单片机,嵌入式硬件
定时器有如下三种计数模式
**递增计数模式:**计数器从 0 计数到自动重载值,然后重新从 0 开始计数并生成计数器上溢事件。
**递减计数模式:**计数器从自动重载值开始递减到 0,然后重新从自动重载值开始计数并生成计数器下溢事件。
**中心对齐模式:**计数器从 0 开始计数到自动重载值 – 1 ,生成计数器上溢事件;然后从自动重载值开始向下计数到 1 并生成计数器下溢事件。之后从0 开始重新计数。

有了以上的基础知识,下面我们通过实验来验证一下

二、实验过程

1.实验材料

  • STM32F103C6T6最小系统开发板

stm32cubemx 定时器,stm32基础教程,stm32,单片机,嵌入式硬件

  • ST-LINK V2

stm32cubemx 定时器,stm32基础教程,stm32,单片机,嵌入式硬件

  • 杜邦线
  • 示波器

2.STM32CubeMX配置基本定时器

选择芯片stm32f103c6t6,新建工程

stm32cubemx 定时器,stm32基础教程,stm32,单片机,嵌入式硬件

设置时钟源,最小系统外部晶振8Mhz,作为外部高速HSE时钟源。由于没有外接外部低速晶振,这里低速时钟源选择旁路时钟源。

stm32cubemx 定时器,stm32基础教程,stm32,单片机,嵌入式硬件

配置时钟树,这里使用官方推荐的配置

stm32cubemx 定时器,stm32基础教程,stm32,单片机,嵌入式硬件

配置引脚功能,先配置一个GPIO,过会使用定时器控制其输出高低电平,方便用示波器测试,我们使用通用定时器TIM2,已知TIM2挂在APB1上。
stm32cubemx 定时器,stm32基础教程,stm32,单片机,嵌入式硬件
内部时钟设置为不分频(CKD),则CK_PSC的时钟频率等于APB1的时钟频率72MHz,即72000 000Hz。若要定时时间为1s,则即可设置7200分频(预分频器寄存器 (TIMx_PSC)的值为7200-1),定时器的时钟CK_CNT的频率为10000Hz.则自动重载寄存器 (TIMx_ARR)设置为10000-1即定时为1s.TRGO为触发输出,可以触发内部ADC/DAC,这里我们没有用到这个功能,参数为默认设置。
T = (psc+1)(arr+1)/Tclk=(7200)(1000)/72us=1000ms = 1s

stm32cubemx 定时器,stm32基础教程,stm32,单片机,嵌入式硬件
在NVIC Settings框勾选开启定时器中断。优先级为默认。或者在NVIC配置中使能TIM2中断。
stm32cubemx 定时器,stm32基础教程,stm32,单片机,嵌入式硬件
Code Generator中设置只拷贝使用到的库,分离.c和.h文件

stm32cubemx 定时器,stm32基础教程,stm32,单片机,嵌入式硬件

设置好项目名称和路径,点击GENERATE CODE即可,生成后使用keil5 IDE打开。

stm32cubemx 定时器,stm32基础教程,stm32,单片机,嵌入式硬件

2.代码实现

在usart.c文件后面添加如下代码,代码中添加了#ifdef宏定义进行条件编译,如果使用GUNC编译,则PUTCHAR_PROTOTYPE 定义为int __io_putchar(int ch)函数,否则定义为int fputc(int ch, FILE *f)函数。

/* USER CODE BEGIN 0 */
#include "stdio.h"
#ifdef __GNUC__
  /* With GCC/RAISONANCE, small printf (option LD Linker->Libraries->Small printf
     set to 'Yes') calls __io_putchar() */
  #define PUTCHAR_PROTOTYPE int __io_putchar(int ch)
#else
  #define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)
#endif /* __GNUC__ */
/**
  * @brief  Retargets the C library printf function to the USART.
  * @param  None
  * @retval None
  */
PUTCHAR_PROTOTYPE
{
  /* Place your implementation of fputc here */
  /* e.g. write a character to the EVAL_COM1 and Loop until the end of transmission */
  HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, 0xFFFF);
 
  return ch;
}
/* USER CODE END 0 */

实现一个LED等间隔1s闪烁一次的功能,代码如下

int main(void)
{
  /* USER CODE BEGIN 1 */

  /* USER CODE END 1 */

  /* MCU Configuration--------------------------------------------------------*/

  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  HAL_Init();

  /* USER CODE BEGIN Init */

  /* USER CODE END Init */

  /* Configure the system clock */
  SystemClock_Config();

  /* USER CODE BEGIN SysInit */

  /* USER CODE END SysInit */

  /* Initialize all configured peripherals */
  MX_GPIO_Init();
  /* USER CODE BEGIN 2 */

  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
    /* USER CODE END WHILE */
			
    /* USER CODE BEGIN 3 */
		HAL_GPIO_TogglePin(GPIOA, GPIO_PIN_0); //PA0
		printf("TIM2 \r\n");
		HAL_Delay(1000);
  }
  /* USER CODE END 3 */
}

3.编译烧录

代码编译成功

stm32cubemx 定时器,stm32基础教程,stm32,单片机,嵌入式硬件

在下载前检查keil是否检测到ST-LINK,选择魔法棒进行设置

stm32cubemx 定时器,stm32基础教程,stm32,单片机,嵌入式硬件

如图所示,已经检测到ST-LINK 下载器

stm32cubemx 定时器,stm32基础教程,stm32,单片机,嵌入式硬件

点击load,自动下载固件

stm32cubemx 定时器,stm32基础教程,stm32,单片机,嵌入式硬件

4.硬件连接

烧录器ST-LINK V2和最小系统板的连接如图所示: 四线连接 SWDIO,GND,SWCLK,和3.3V电源

stm32cubemx 定时器,stm32基础教程,stm32,单片机,嵌入式硬件

5.实验结果

使用串口打印和示波器两种方式测试,打印可以看到周期输出,示波器可以精准的读到输出频率和时间间隔。
stm32cubemx 定时器,stm32基础教程,stm32,单片机,嵌入式硬件

stm32cubemx 定时器,stm32基础教程,stm32,单片机,嵌入式硬件

总结

本章介绍了STM32F103系列设备中基本定时器的用法,其实前面交到的PWM也是定时器的典型应用,接下来在介绍其他的定时用法。文章来源地址https://www.toymoban.com/news/detail-575093.html

到了这里,关于STM32开发(10)----CubeMX配置基本定时器的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • STM32使用CubeMx配置定时器输出PWM

            项目中经常使用到STM32来输出PWM,每次配置过后过不了多久就会忘记,稍微需要对配置做出修改时都要翻很久的手册,所以决定结合实例把PWM配置的详细步骤记录下来,这样在下次配置时可以很快的捡起来。         本文档的行文结构如下,首先,说明实际需

    2024年02月03日
    浏览(65)
  • 搭建stm32电机控制代码框架(二)——Stm32CubeMx配置定时器

    搭建了基础的环境,配置了一个简单的工程后,CubeMx的基本操作就会了。然后基于这个操作往下推进,开始对关键模块定时器的攻略,这个部分需要先熟悉一下Stm32的定时器基本原理。 《STM32参考手册》中仅对定时器的介绍就已经占了100多页,这里就不一一展开,挑一些关键

    2024年02月06日
    浏览(79)
  • STM32高级定时器输出指定数量PWM(STM32CubeMx配置)

    高级定时器中有一个重复计数器,本实验输出指定个数PWM就是利用了重复计数器的特性,先来看看重复计数器的特性是什么: 计数器每次上溢或下溢都能使重复计数器减1,减到0时,再发生一次溢出就会产生更新事件 这是什么意思呢,这里举个例子比如说我设定重复计数器的

    2024年02月02日
    浏览(86)
  • 基于STM32CubeMX和keil采用STM32F407的基本定时器中断实现LED闪烁

    定时器有三种,基本定时器,通用定时器,以及高级定时器。 这篇博客以最简单的基本定时器为例,实现LED的闪烁。 后面两种定时器的用法后面再写。 实现功能: TIM6控制LED每隔0.5s变一次状态。 TIM7控制LED1常量2s后熄灭。 因为都是用到LED,所以和上一篇基于STM32CubeMX与keil采

    2024年02月04日
    浏览(58)
  • 基于CubeMX(hal库)stm32中hrtim高分辨率定时器的基本使用(自存)

    1、选通道 单通道输出or双通道输出 2、Timer A~F配置 (Master Timer不用管) 比较值Compare 个人感觉跟CCR差不多的意思, 注意不要大于上面的Period就行 设置上升沿和下降沿时间: 若想让上设Compare=CCR 如图设置 即可 即在 计数到Compare1时拉低,计数溢出时拉高 所以上图输出频率10kHz占

    2024年02月04日
    浏览(54)
  • 野火STM32电机系列(五)Cubemx配置高级定时器TIM1

    鸽了一段时间,放心不会断的哈,目前仅仅是显示屏坏了,不影响后面项目 前文已经配置了GPIO、编码器 本节讲解CubeMX高级定时器TIM1配置带死区的6路互补的PWM 同时配置信号触发后续ADC采集 板子引角的原理图如下 对应的: Motor1--U+--PA8--TIM1_CH1 Motor1--U---PB13--TIM1_CH1N Motor1--V+--

    2024年02月15日
    浏览(66)
  • 【STM32】定时器1触发ADC多(规则)通道采样+DMA(CUBEMX配置)

    在用单片机做电源控制时不得不提ADC采集,离散系统是有固定的执行周期的,所以我们采样也是要固定时间去采样。然后就是我希望pwm波(定时器1产出)的频率与采样频率一致。 我下面演示的是G431CBU6,当然其他芯片也大差不差了。 说一下大致流程,TIM1触发ADC采样,然后

    2024年02月01日
    浏览(46)
  • 【HAL库】STM32CubeMX开发----非阻塞延时实验----SysTick(滴答定时器)中断

    STM32CubeMX 下载和安装 详细教程 【HAL库】STM32CubeMX开发----STM32F103/F207/F407----目录 HAL库 有自带的 ms级 延时函数: HAL_Delay(); 缺点: 这是 阻塞延时 方式,就是延时期间,什么都不能干,这样很浪费资源。 这篇文章主要介绍,利用 SysTick(滴答定时器)中断 实现 非阻塞延时 的实验

    2024年02月16日
    浏览(49)
  • STM32CUBEMX配置 定时器中断 和 上升沿中断(实现检测1s以内的脉冲个数)

    ———————————————————————————————————— ⏩ 大家好哇!我是小光,嵌入式爱好者,一个想要成为系统架构师的大三学生。 ⏩最近在开发一个STM32H723ZGT6的板子,使用STM32CUBEMX做了很多驱动,包括ADC、UART、RS485、EEPROM(IIC)、FLASH(SPI)等等。

    2024年02月16日
    浏览(36)
  • 初出茅庐的小李博客之STM32CubeMx配置定时器的编码器模式

    上次文章写了编码器是如何工作的,今天就来用STM32F103C8T6的TIM3的通道1跟通道2编写一个编码器识别程序。 话不多说,上教程! 选择外部高速时钟源HSE 选择中断模式触发下降沿有效 默认是上拉输入 添加用户标签为SWITCH 使能NVIC配置 选择编码器模式 分频值设置为2-1 计数值设

    2024年02月12日
    浏览(38)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包