STM32定时器详解(一)系统滴答定时器做延时函数(STM32U5系列为例)(配合cubeMX)

STM32系列文章目录

第一章 STM32定时器详解(一)(STM32U5系列为例)

待补充。。。


前言

秋招找工作终于告一段落了,看着拖延大半时间的毕设,觉得有必要加班加点赶一赶进度了,苦于毕设用到的STM32U5系列芯片资料还比较少,这里趁着毕设有用到此芯片为主控单元,也记录一下芯片的各个模块开发历程,作为经验备份及分享~

STM32U5系列MCU中定时器的概述及详解一份


一、TIM定时器概述

        STM32U575包括2个高级控制定时器、多达7个通用定时器、2个基本定时器、4个低功耗定时器、2个看门狗定时器和2个SysTick定时器。下面的表格比较了高级控制、通用定时器和基本定时器的特点:

图1

        如图1所示,STM32U5 系列中,以STM32U575,共有 11 个定时器,分为基本定时器,通用定时器和高级定时器。基本定时器 TIM6 和 TIM7 是一个 16 位的只能向上计数的定时器,只能定时, 没有外部 IO。通用定时器 TIM2/3/4/5 是一个 32 位的可以向上/下计数的定时器(TIM15/16/17为16位),可以定时,可 以输出比较,可以输入捕捉,每个定时器有四个外部 IO。高级定时器 TIM1/8 是一个 16 位的可 以向上/下计数的定时器,可以定时,可以输出比较,可以输入捕捉,还可以有三相电机互补输出信号。

        16 位和 32 位的区别是 CNT 计数器 范围不同,32 位的范围是 0 到 2^32 – 1,而 16 位的是 0 到 65535;它们支持的分频是范围是一样 的,都是 1 到 65535。不同定时支持的功能略有区别,基础定时器功能较少,TIM1 和 TIM8 高级定时器功能多些。

        多个独立通道,可用于:

– 输入捕获。

– 输出比较。

– PWM 生成(边沿和中心对齐模式)。

– 单脉冲模式输出

        发生如下事件时生成中断/DMA 请求:

– 更新:计数器上溢/下溢、计数器初始化(通过软件或内部/外部触发)

– 触发事件(计数器启动、停止、初始化或通过内部/外部触发计数)

– 输入捕获

– 输出比较

二、具体定时器功能阐述

2.1  高级控制定时器 ( TIM1、TIM8)

        高级控制定时器可以看成是一个三相PWM在六个通道上的复用。它们具有互补的PWM输出,并具有可编程的插入死区时间。它们也可以被看作是完全通用的定时器。

        四个独立的通道可以用于:

·输入捕获

·输出比较

· PWM产生(边缘或中心对齐模式)具有全调制能力( 0 ~ 100 %)

·单脉冲模式输出

        在Debug模式下,高级控制定时器计数器被冻结,PWM输出被禁用,以关闭由这些输出驱动的任何功率开关。由于通用的TIMx定时器(在接下来的章节中进行了阐述)采用了相同的体系结构,因此高级控制定时器可以通过Timer Link功能与TIMx定时器一起进行同步或事件链接。

2.2  通用定时器 (TIM2, TIM3, TIM4, TIM5, TIM15, TIM16, TIM17)

        在STM32U575xx器件中嵌入了多达7个可同步的通用定时器。每个通用定时器可以用来产生PWM输出,也可以作为一个简单的时基。

TIM2, TIM3, TIM4, and TIM5

        它们是具有32位自动装载上/下计数器和16位预分频器的全功能通用定时器。这些定时器具有4个独立的通道,用于输入捕获/输出比较、PWM或单脉冲模式输出。它们可以协同工作,也可以通过Timer Link功能与其他通用定时器进行同步或事件链接。

        计数器可以在Debug模式下冻结。它们都具有独立的DMA请求产生和支持正交编码器。

TIM15, 16 and 17

        它们是具有中距离特性的通用定时器。它们都具有16位自动加载计数器和16位预分频器。

- TIM15有两个通道和一个互补通道

- TIM16和TIM17有一个通道和一个互补通道

        所有通道均可用于输入捕获/输出比较、PWM或单脉冲模式输出。定时器之间可以通过Timer Link功能协同工作,进行同步或事件链接。定时器具有独立的DMA请求生成功能。计数器可以在Debug模式下冻结。

2.3  基本定时器 (TIM6 and TIM7)

        基本定时器主要用于DAC触发器的产生。它们也可以作为通用的16位时基。

2.4  低功耗定时器( LPTIM1、LPTIM2、LPTIM3、LPTIM4)

        设备内嵌4个低功耗定时器。这些定时器具有独立的时钟,如果它们被HSI16、MSI、LSE、LSI或外部时钟时钟时钟时钟,则以Stop模式运行。它们能够从Stop模式中唤醒系统。(LPTIM1、LPTIM3和LPTIM4在Stop 0、Stop 1和Stop 2模式下处于激活状态。LPTIM2在Stop 0和Stop 1模式下处于激活状态。)

        低功耗定时器支持以下功能:

· 16位自加载寄存器的16位上行计数器

· 8个可能的分频因子( 1、2、4、8、16、32、64、128)的3位预分频器

·可选时钟

        -内部时钟源:LSE,LSI,HSI16,MSIK ( LPTIM1、LPTIM3、LPTIM4仅)或APB时钟(仅LPTIM2 )

         - LPTIM输入(工作时无LP振荡器运行,用于脉冲计数器应用)的外部时钟源

其它功能如下:· 16位ARR自动加载寄存器· 16位捕获/比较寄存器·连续/单发模式·可选软/硬件输入触发器·可编程数字毛刺滤波器·可配置输出:脉冲,PWM ·可配置I / O极性·编码器模式·重复计数器·多达2个独立通道:-输入捕获- PWM生成(边对齐模式) -单脉冲模式输出· 10事件中断生成·以下事件DMA请求生成:-更新事件-输入捕获

2.5 Sys Tick定时器(系统滴答定时器)

信任区的Cortex - M33内嵌两个SysTick定时器。当信任区激活时,有两个SysTick定时器可用:

• SysTick, secure instance

• SysTick, nonsecure instance

        当信任区被禁用时,只有一个SysTick定时器可用。该定时器(安全的或非安全的)专用于实时操作系统,但也可作为标准的向下计数器。它的特点:

· 24位下拉计数器

· 自动重装载能力

·当计数器达到0时可屏蔽的系统中断的产生

·可编程时钟源

至于红外接口( IRTIM )、看门狗( IWDG )、窗口看门狗( WWDG )之后酌情补充。

三、用系统定时器配置延时函数

3.1 stm32cubeMX配置

第一步配置SYSCLK时钟,选用8MHz无源晶振,时钟树中将SYSCLK配置为72MHz。

3.2 声明并定义延时函数

在bsp_systick.h头文件中(自己创建),声明如下函数:

#ifndef __SYSTICK_H
#define __SYSTICK_H

#include "stm32u5xx.h"

typedef uint32_t  u32;

void SysTick_Init(void);//系统滴答定时初始化
void Delay_us(__IO u32 nTime);//最小单位为10μs
#define Delay_ms(x) Delay_us(100*x)	 //毫秒延时函数»ms
void TimingDelay_Decrement(void);//递减函数
#endif /* __SYSTICK_H */

函数的定义在bsp_systick.c文件中,如下所示:

#include "bsp_systick.h"

static __IO u32 TimingDelay;

/**
调用HAL库系统滴答定时器初始化函数
  */
void SysTick_Init(void)
{
	/* SystemFrequency / 1000    1ms
	 * SystemFrequency / 100000	 10us进入一次中断
	 * SystemFrequency / 1000000 1us
	 */
	if (HAL_SYSTICK_Config(SystemCoreClock / 100000))
	{ 
		/* Capture error */ 
		while (1);
	}
}

/**  
  *		@arg nTime: Delay_us( 1 ) 表示延时为 1 * 10us = 10us
  */
void Delay_us(__IO u32 nTime)
{ 
	TimingDelay = nTime;	

	while(TimingDelay != 0);
}

/**
    在 SysTick_Handler()中被调用
  */
void TimingDelay_Decrement(void)
{
	if (TimingDelay != 0x00)
	{ 
		TimingDelay--;
	}
}
/*********************************************END OF FILE**********************/

其中SystemCoreClock即为72MHz

3.3 主函数调用实现延时功能

首先包含头文件:

#include "bsp_systick.h"

主函数中调用:

int main(void)
{

  HAL_Init();
  SystemClock_Config();
  MX_GPIO_Init();

	SysTick_Init();//调用该初始化函数

  MX_ICACHE_Init();
  MX_MEMORYMAP_Init();
  MX_USART2_UART_Init();	

  while (1)
  {

		HAL_GPIO_TogglePin (LED_GPIO_Port ,LED_Pin);
			printf("****HAL_ADC_Start_DMA22222222****\r\n");
	  Delay_us(100000);    	// 10000 * 10us = 1000ms
	
//		HAL_GPIO_WritePin(LED_GPIO_Port,LED_Pin,GPIO_PIN_SET);
//	  HAL_Delay(1000);
//    printf("****HAL_ADC_Start_DMA****\r\n");
//	  HAL_GPIO_WritePin(LED_GPIO_Port,LED_Pin,GPIO_PIN_RESET);
//	  HAL_Delay(1000);		

  }

}

实现LED灯交替闪烁,间隔时间为1S(100000×10μs)。

间隔时间与HAL_Delay时间相同,都为1S,表示时间配置没有问题。


总结

        以上就是今天要讲的内容,本文仅仅简单介绍了定时器概念、分类及用系统滴答定时器做延时函数的简单用法。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值