电子产业一站式赋能平台

PCB联盟网

搜索
查看: 63|回复: 0
收起左侧

STM32 CubeMX配置定时器

[复制链接]
匿名  发表于 2024-11-2 07:12:00 |阅读模式
功能实现:采用定时器实现LED灯的闪烁,周期为1S
准备工作:1、STM32开发板(我的是STM32F103VET6)
2、STM32CubeMx软件、 IDE:Keil软件
3、按键管脚 :PA0   PC13   
4、LED管脚 :PB0   PB1   PB5
定时器简介:smt32F1系列共有8个定时器:
基本定时器(TIM6、TIM7)
通用定时器(TIM2、TIM3、TIM4、TIM5)
高级定时器(TIM1、TIM8)
SMT32F4系列共有15个定时器:
基本定时器(TIM6、TIM7)
通用定时器(TIM2、TIM3、TIM4、TIM5、TIM9~TIM14)
高级定时器(TIM1、TIM8)
基本定时器功能(TIM6、TIM7):
16位向上、向下、向上/下自动装载计数器
16位可编程(可以实时修改)预分频器,计数器时钟频率的分频系数为1~65535之间的任意数值
触发DAC的同步电路 注:此项是TIM6/7独有功能.
位于APB1总线上

通用定时器(TIM2~TIM5)的主要功能:
16位向上、向下、向上/下自动装载计数器
16位可编程(可以实时修改)预分频器,计数器时钟频率的分频系数为1~65535之间的任意数值
4 个独立通道(TIMx_CH1~4)可以用作:
                  测量输入信号的脉冲长度( 输入捕获)
                  输出比较
                  单脉冲模式输出
                  PWM输出(边缘或中间对齐模式)
支持针对定位的增量(正交)编码器和霍尔传感器电路
如下事件发生时产生中断/DMA:
               更新:计数器向上溢出/向下溢出,计数器初始化(通过软件或者内部/外部触发)
              触发事件(计数器启动、停止、初始化或者由内部/外部触发计数)
              输入捕获  
              输出比较  
位于APB1总线上

高级定时器(TIM1,TIM8)的主要功能:
高级定时器具有基本,通用定时器的所有的功能,
还具有控制交直流电动机所有的功能,
输出6路互补带死区的信号,刹车功能等等
位于APB2总线上
总括:基本定时器就是单纯的定时计数器,通用定时器多了四个通道,相对应的增加了功能,高级定时器具有基本,通用定时器的所有的功能,并且添加了其他功能

定时器计数模式通用定时器可以向上计数、向下计数、向上向下双向计数模式。
向上计数模式:计数器从0计数到自动加载值(TIMx_ARR),然后重新从0开始计数并且产生一个计数器溢出事件。
向下计数模式:计数器从自动装入的值(TIMx_ARR)开始向下计数到0,然后从自动装入的值重新开始,并产生一个计数器向下溢出事件。
中央对齐模式(向上/向下计数):计数器从0开始计数到自动装入的值-1,产生一个计数器溢出事件,然后向下计数到1并且产生一个计数器溢出事件;然后再从0开始重新计数。
简单地理解三种计数模式,可以通过下面的图形:


计数时钟的选择计数器时钟可由下列时钟源提供:
内部时钟(TIMx_CLK)
外部时钟模式1:外部捕捉比较引脚(TIx)
外部时钟模式2:外部引脚输入(TIMx_ETR) 仅适用TIM2,3,4
内部触发输入(ITRx):使用一个定时器作为另一个定时器的预分频器,如可以配置一个定时器Timer1而作为另一个定时器Timer2的预分频器。

新建工程1.1 New Project1 搜索芯片型号
2选择芯片
3创建工程



1.2设置时钟源RCC  系统时钟源选择外部晶振时钟源


设置时钟设置倍频为4,则定时器的时钟源频率为32M,这个数值需要用到计算定时器的定时周期



1.3 设置GPIO设置PB0和PB1为输出模式
[/ol]


设置定时器

使能T2中断


1选择TIM2
2定时器时钟选择内部时钟
    Clock Source(时钟来源)      
计数器设置:
Prtscaler (定时器预分频系数)  : 31999
Counter Mode(计数模式) :   Up(向上计数模式)                    
Counter Period(自动重装载值) :    499   
CKD(时钟分频因子) :No Division 不分频 (可以选择二分频和四分频   )
auto-reload-preload(自动重装载)  :    Enable 使能
定时器的定时周期
     T = (psc+1)(arr+1)/Tclkpsc 为定时器预分频系数
arr为自动重装载值
Tclk为系统时钟频率
通过计算
   T = (psc+1)(arr+1)/Tclk=(31999+1)(499+1)/32us=500ms

项目文件设置1 设置项目名称
2 选择所用IDE


生成代码为每个功能生成独立的.c和.h文件
生成代码
[/ol]

代码部分解析找到main函数,里面关于TIM2初始化的函数 MX_TIM2_Init(),进入初始化函数,查看源码




TIM_HandleTypeDef htim2;

/* TIM2 init function */
void MX_TIM2_Init(void)
{
TIM_ClockConfigTypeDef sClockSourceConfig = {0};
TIM_MasterConfigTypeDef sMasterConfig = {0};

htim2.Instance = TIM2;
htim2.Init.Prescaler = 31999;
htim2.Init.CounterMode = TIM_COUNTERMODE_UP;
htim2.Init.Period = 499;
htim2.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
htim2.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_ENABLE;
if (HAL_TIM_Base_Init(&htim2) != HAL_OK)
{
Error_Handler();
}
sClockSourceConfig.ClockSource = TIM_CLOCKSOURCE_INTERNAL;
if (HAL_TIM_ConfigClockSource(&htim2, &sClockSourceConfig) != HAL_OK)
{
Error_Handler();
}
sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET;
sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;
if (HAL_TIMEx_MasterConfigSynchronization(&htim2, &sMasterConfig) != HAL_OK)
{
Error_Handler();
}

}
[/ol]

从上面代码可以看到,先定义了一个htim2的结构体
然后是对结构体的初始化,就是我们图形化的配置
再找到stm32f1xx_it.c文件
void TIM2_IRQHandler(void)
{
/* USER CODE BEGIN TIM2_IRQn 0 */

/* USER CODE END TIM2_IRQn 0 */
HAL_TIM_IRQHandler(&htim2);
/* USER CODE BEGIN TIM2_IRQn 1 */

/* USER CODE END TIM2_IRQn 1 */
}
[/ol]上面的代码是如果TIM2中断,则调用  HAL_TIM_IRQHandler(&htim2);
进入HAL_TIM_IRQHandler(&htim2)函数,这里面的代码很长,就是不同的中断类型,进入不同的中断回调函数,这里找到 HAL_TIM_PeriodElapsedCallback(htim);


进入这个回调函数,我们看到是个虚函数,需要我们重写,在这个函数里面,就是我们需要实现的功能,但在这之前,需要在main函数里使能中断 HAL_TIM_Base_Start_IT(&htim2)
main.c中的添加代码如下:


总结,对于定时器的定时中断,相对比较简单,绝大多数功能图形化配置已经为我们配置好了,我们做的只需两步
在main函数中,开启TIM2中断,HAL_TIM_Base_Start_IT(&htim2);
重写 HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim) 函数,然后在里面实现我们需要的功能
[/ol]

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具

发表回复

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则


联系客服 关注微信 下载APP 返回顶部 返回列表