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,表示时间配置没有问题。
总结
以上就是今天要讲的内容,本文仅仅简单介绍了定时器概念、分类及用系统滴答定时器做延时函数的简单用法。