32单片机——基本定时器

STM32F103有众多的定时器,其中包括2个基本定时器(TIM6和TIM7)、4个通用定时器(TIM2~TIM5)、2个高级控制定时器(TIM1和TIM8),这些定时器彼此完全独立,不共享任何资源

1、定时原理

1.1 软件定时原理

使用纯软件(CPU死等)的方式实现定时(延时)功能

void delay_us(uint32_t us) {

us *= 72;

while(us--);

}

缺点:①延时不精准;②CPU死等(阻塞)

1.2 定时器定时原理

使用精准的时基,通过硬件的方式,实现定时功能

定时器核心就是计数器

定时器简易框图

1.3 定时器分类

常规定时器的区别

1.4 定时器特性表

2、基本定时器

2.1 简介

STM32F103有两个基本定时器TIM6和TIM7,它们的功能完全相同,资源是完全独立的,可以同时使用
其主要特性如下:16位自动重载 递增 计数器(计数值:0~65535);16位可编程预分频器(预分频系数:1~65536),用于对计数器时钟频率进行分频;还可以触发DAC的同步电路;在更新事件(计数器溢出)时,产生中断/DMA请求

2.2 框图

2.3 溢出时间计算公式

:定时器溢出时间

:定时器的时钟源频率,72Mhz

ARR:自动重装载寄存器的值

PSC:预分频寄存器的值

3、定时器中断的配置步骤

3.1 配置定时器基础工作参数

void base_tim_init(uint16_t arr,uint16_t psc); //自己写的初始化函数

3.2 定时器基础MSP初始化

__weak void HAL_TIM_Base_MspInit(TIM_HandleTypeDef *htim); //配置NVIC、CLOCK等

3.3 使能更新中断并启动计数器

HAL_StatusTypeDef HAL_TIM_Base_Start_IT(TIM_HandleTypeDef *htim);
{

TIM_TypeDef *Instance; /* 寄存器基地址 */

TIM_Base_InitTypeDef Init; /* TIM时基所需参数 */

......

#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1)

......

#endif

} TIM_HandleTypeDef;
typedef struct

{

uint32_t Prescaler; /* 预分频系数(范围:0x0000~0xFFFF) */

uint32_t CounterMode; /* 计数模式 */

uint32_t Period; /* 自动重装载值(范围:0x0000~0xFFFF) */

uint32_t ClockDivision; /* 预分频因子,高级定时器会用到 */

uint32_t RepetitionCounter;

uint32_t AutoReloadPreload; /* 自动重装载预装载使能 */

} TIM_Base_InitTypeDef;

CounterMode 如下所示:

#define TIM_COUNTERMODE_UP 0x00000000U

/* 用作向上计数器的计数器 */

#define TIM_COUNTERMODE_DOWN TIM_CR1_DIR

/*!< 用作向下计数器的计数器 */

#define TIM_COUNTERMODE_CENTERALIGNED1 TIM_CR1_CMS_0

/* 居中对齐模式1 */

#define TIM_COUNTERMODE_CENTERALIGNED2 TIM_CR1_CMS_1

/* 居中对齐模式2 */

#define TIM_COUNTERMODE_CENTERALIGNED3 TIM_CR1_CMS

/* 居中对齐模式3 */

AutoReloadPreload 如下所示:

#define TIM_AUTORELOAD_PRELOAD_DISABLE 0x00000000U

/* TIMx_ARR寄存器未缓冲 */

#define TIM_AUTORELOAD_PRELOAD_ENABLETIM_CR1_ARPE

/* TIMx_ARR寄存器已缓冲 */

3.4 设置优先级,使能中断

HAL_NVIC_SetPriority();

HAL_NVIC_EnableIRQ();

32单片机------外部中断_32中断-CSDN博客中有解释

3.5 编写中断服务函数

void TIM6_IRQHandler(void){

HAL_TIM_IRQHandler(TIM_HandleTypeDef *htim); //中断公共处理函数

}

3.6 编写定时器更新中断回调函数

__weak void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim);

例子

使用基本定时器TIM6实现精准定时,使LED1每隔500ms翻转一次,在主函数用LED0的翻转来提示程序正在运行

分析:实现500ms定时 psc:7199;arr:4999

base_time.h

#ifndef _BASE_TIME_H

#define _BASE_TIME_H

#include "./SYSTEM/sys/sys.h"

#include "./SYSTEM/delay/delay.h"

//定时器初始化

void base_tim_init(uint16_t arr,uint16_t psc);

#endif

base_time.c

#include "./BSP/TIMER/base_tim.h"
TIM_HandleTypeDef base_tim_handle; //定时器句柄

void base_tim_init(uint16_t arr,uint16_t psc){

base_tim_handle.Instance=TIM6; //寄存器基地址

base_tim_handle.Init.Prescaler=psc; //预分频系数

base_tim_handle.Init.Period=arr; //自动重装载值

base_tim_handle.Init.CounterMode=TIM_COUNTERMODE_UP; //计数模式

base_tim_handle.Init.AutoReloadPreload=TIM_AUTORELOAD_PRELOAD_ENABLE; //自动重装载预装载使能

//base_tim_handle.Init.ClockDivision= //预分频因子,高级定时器会用到

HAL_TIM_Base_Init(&base_tim_handle);

//开启定时器

HAL_TIM_Base_Start_IT(&base_tim_handle);

}

//定时器Msp回调函数

void HAL_TIM_Base_MspInit(TIM_HandleTypeDef *htim){

if(htim->Instance==TIM6){

//CLOCK

__HAL_RCC_TIM6_CLK_ENABLE();

//设置优先级

HAL_NVIC_SetPriority(TIM6_IRQn,0,0);

HAL_NVIC_EnableIRQ(TIM6_IRQn);

}

}

//中断服务函数

void TIM6_IRQHandler(void){

HAL_TIM_IRQHandler(&base_tim_handle); //中断公共处理函数

}

//定时器更新中断回调函数 定时500ms

void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim){

if(htim->Instance==TIM6){

HAL_GPIO_TogglePin(GPIOE,GPIO_PIN_5);

}

}

main.c

#include "./SYSTEM/delay/delay.h"

#include "./SYSTEM/usart/usart.h"

#include "./BSP/LED/led.h"

#include "./BSP/TIMER/base_tim.h"

int main(void){

uint8_t i=0;

HAL_Init();

sys_stm32_clock_init(RCC_PLL_MUL9); //设置系统时钟

delay_init(72);

led_init();

base_tim_init(4999,7199);

while (1){

i++;

if(i>20){

i=20;

delay_ms(100);

HAL_GPIO_TogglePin(GPIOB,GPIO_PIN_5); //LED0闪烁,指示程序正常运行

}

}

}

相关推荐
2501_9181269115 分钟前
学习所有6502写游戏动作的语句
汇编·嵌入式硬件·学习·游戏·个人开发
2501_9181269133 分钟前
学习所有6502游戏的系统
java·汇编·嵌入式硬件·学习·游戏
LCMICRO-133108477464 小时前
长芯微LD9689完全P2P替代AD9689,是一款双通道、14位、2.0 GSPS/2.6 GSPS模数转换器(ADC)
网络·单片机·嵌入式硬件·网络协议·fpga开发·硬件工程·高速adc
逐步前行11 小时前
STM32_TIM_寄存器操作
stm32·单片机·嵌入式硬件
0南城逆流012 小时前
【STM32】知识点介绍七:PWM功能
stm32·单片机·嵌入式硬件
智者知已应修善业12 小时前
【51单片机独立按键控制数码管移动反向,2片74CH573/74CH273段和位,按键按下保持原状态】2023-3-25
经验分享·笔记·单片机·嵌入式硬件·算法·51单片机
我是一棵无人问荆的小草13 小时前
单片机通电后延迟启动策略
单片机·嵌入式硬件
坏柠13 小时前
ESP32-S3 蓝牙 BLE 从零到一:广播、服务、特征,用一个智能灯的例子全讲透
嵌入式硬件
日更嵌入式的打工仔13 小时前
UART RX为什么要上拉
单片机
三佛科技-1873661339716 小时前
FT32F030F6AP7高性能32位RISC内核MCU解析(兼容STM32F030K6TP7)
stm32·单片机·嵌入式硬件